This commit is contained in:
zhang zhuo 2025-11-21 17:46:57 +08:00
parent 92d959937f
commit 7082310c4a
6 changed files with 354 additions and 18 deletions

View File

@ -21,6 +21,9 @@ use App\Request\Menu as mRequest;
use App\Request\Post as pRequest;
use App\Request\Role as rRequest;
use App\Request\GenTable as gtRequest;
use App\Model\AssetCategory as acModel;
use App\Request\AssetCategory as acRequest;
use App\Model\Asset as asModel;
use App\Utils\AppInfoHelper;
use App\Utils\CpuHelper;
use App\Utils\DiskInfoHelper;
@ -28,9 +31,11 @@ use App\Utils\Ip;
use App\Utils\MemoryHelper;
use App\Utils\Param;
use App\Utils\RedisInfoHelper;
use App\Utils\Str;
use App\Utils\SystemHelper;
use Hyperf\Context\ApplicationContext;
use Hyperf\DbConnection\Db;
use Hyperf\Filesystem\FilesystemFactory;
use Hyperf\HttpServer\Annotation\Controller;
use Hyperf\HttpServer\Annotation\DeleteMapping;
use Hyperf\HttpServer\Annotation\GetMapping;
@ -595,6 +600,10 @@ class System extends Base
$prefix = config("databases.default.prefix");
// 表名
$table_name = str_replace($prefix, "", $table['table_name']);
preg_match_all('/([a-zA-Z])[a-zA-Z]*/', $table_name, $m);
$name1 = implode('', $m[1]);
$name2 = lcfirst(str_replace(' ', '', ucwords(str_replace('_', ' ', $table_name))));
$module_name = $table['module_name'];
$controller_name = $table['controller_name'];
// 搜搜字段
@ -623,11 +632,131 @@ class System extends Base
$data = [
'model.php' => $this->render->getContents('templates/model.php.twig', compact("table_name", "fields", "controller_name", "query_fields", "list_fields")),
'request.php' => $this->render->getContents('templates/request.php.twig', compact("controller_name", "insert_fields", "fields", "required_fields", "edit_fields")),
'controller.php' => $this->render->getContents('templates/controller.php.twig', compact("controller_name", "module_name", "query_fields", "insert_fields", "edit_fields", "table_name")),
'controller.php' => $this->render->getContents('templates/controller.php.twig', compact("controller_name", "module_name", "query_fields", "insert_fields", "edit_fields", "table_name", "name1", "name2")),
'api.ts' => $this->render->getContents('templates/api.ts.twig', compact('table_name')),
'index.vue' => $this->render->getContents('templates/index.vue.twig', compact('table_name', 'list_fields', 'query_fields')),
'save.vue' => $this->render->getContents('templates/save.vue.twig', compact('table_name', 'insert_fields', 'required_fields'))
];
return $this->success("模板信息", $data);
}
#[GetMapping(path: "asset_category/list")]
#[Auth(needAuth: false)]
public function assetCategoryList()
{
$param['belong_id'] = $this->account()['belong_id'];
$param['account_type'] = $this->account()['account_type'];
return $this->success("资源分类列表", acModel::list($param));
}
#[PostMapping(path: "asset_category/add")]
#[Auth(needAuth: false)]
public function assetCategoryAdd()
{
$request = $this->container->get(acRequest::class);
$request->scene('add')->validateResolved();
$data = Param::only(["category_name", "pid" => 0, "rank"]);
$data['belong_id'] = $this->account()['belong_id'];
$data['account_type'] = $this->account()['account_type'];
return $this->toAjax(acModel::add($data));
}
#[PutMapping(path: "asset_category/edit")]
#[Auth(needAuth: false)]
public function assetCategoryEdit()
{
$request = $this->container->get(acRequest::class);
$request->scene('edit')->validateResolved();
$data = Param::only(["category_id", "category_name", "pid" => 0, "rank"]);
return $this->toAjax(acModel::edit($data));
}
#[DeleteMapping(path: "asset_category/del")]
#[Auth(needAuth: false)]
public function assetCategoryDel()
{
$ids = $this->request->input("ids");
return $this->toAjax(acModel::del($ids));
}
#[GetMapping(path: "asset/list")]
#[Auth(needAuth: false)]
public function assetList()
{
$param = Param::only(["category_id", "ori_name", "type", "limit" => 10]);
$param['belong_id'] = $this->account()['belong_id'];
$param['account_type'] = $this->account()['account_type'];
$param['account_id'] = $this->accountId();
return $this->success("资源列表", asModel::list($param));
}
#[PutMapping(path: "asset/move")]
#[Auth(needAuth: false)]
public function assetMove()
{
$data = Param::only(["category_id", "ids" => []]);
return $this->toAjax(asModel::move($data));
}
#[PutMapping(path: "asset/edit")]
#[Auth(needAuth: false)]
public function assetEdit()
{
$data = Param::only(["asset_id", "ori_name", "category_id"]);
return $this->toAjax(asModel::edit($data));
}
#[DeleteMapping(path: "asset/del")]
#[Auth(needAuth: false)]
public function assetDel()
{
$ids = $this->request->input("ids");
return $this->toAjax(asModel::del($ids));
}
// 文件上传
#[PostMapping(path: "asset/upload")]
#[Auth(needAuth: false)]
public function assetUpload(FilesystemFactory $factory)
{
// 判断文件是否存在
if (!$this->request->hasFile('file')) {
return $this->error('文件不存在!');
}
$file = $this->request->file('file');
// 移动文件到文件夹
$path = 'upload' . DIRECTORY_SEPARATOR . date("Ym") . DIRECTORY_SEPARATOR . date("d") . DIRECTORY_SEPARATOR;
// 文件二进制信息
$stream = fopen($file->getRealPath(), 'r');
// 文件名称
$filename = md5(date("YmdHis") . rand(1000, 9999)) . "." . $file->getExtension();
// 获取文件存储位置信息
$local = $factory->get('local');
$local->writeStream($path . $filename, $stream);
fclose($stream);
$fileData = [
'file_name' => $filename,
'ori_name' => $file->getClientFilename(),
'url' => $path . $filename,
'type' => Str::fileType($file->getExtension()),
'mime' => $file->getMimeType(),
'size' => $file->getSize(),
'create_time' => date("Y-m-d H:i:s")
];
$category_id = $this->request->post('category_id', 0);
$fileData['account_type'] = $this->account()['account_type'];
$fileData['belong_id'] = $this->account()['belong_id'];
$fileData['category_id'] = $category_id;
$fileData['account_id'] = $this->accountId();
// 上传成功 记录
$res = asModel::add($fileData);
$fileData['asset_id'] = $res;
if ($res) {
return $this->success("上传成功", $fileData);
}
return $this->error("上传失败");
}
}

79
app/Model/Asset.php Normal file
View File

@ -0,0 +1,79 @@
<?php
declare(strict_types=1);
namespace App\Model;
/**
* @property int $asset_id
* @property int $account_type
* @property int $belong_id
* @property int $account_id
* @property int $category_id
* @property string $file_name
* @property string $ori_name
* @property string $url
* @property string $type
* @property string $mime
* @property string $size
* @property string $create_time
* @property string $update_time
* @property string $deleted_at
*/
class Asset extends Model
{
/**
* The table associated with the model.
*/
protected ?string $table = 'asset';
protected string $primaryKey = 'asset_id';
/**
* The attributes that are mass assignable.
*/
protected array $fillable = [];
/**
* The attributes that should be cast to native types.
*/
protected array $casts = ['asset_id' => 'integer', 'account_type' => 'integer', 'belong_id' => 'integer', 'account_id' => 'integer', 'category_id' => 'integer'];
public static function list(array $param)
{
$model = (new self());
if (isset($param['account_type']) && $param['account_type'] != '') {
$model = $model->where('account_type', $param['account_type']);
}
if (isset($param['belong_id']) && $param['belong_id'] != '') {
$model = $model->where('belong_id', $param['belong_id']);
}
if (isset($param['account_id']) && $param['account_id'] != '') {
$model = $model->where('account_id', $param['account_id']);
}
if (isset($param['category_id']) && $param['category_id'] != '') {
$model = $model->where('category_id', $param['category_id']);
}
if (isset($param['ori_name']) && $param['ori_name'] != '') {
$model = $model->where('ori_name', "like", "%{$param['ori_name']}%");
}
if (isset($param['type']) && $param['type'] != '') {
$model = $model->where('type', $param['type']);
}
return $model->orderByDesc("asset_id")
->select(["asset_id", "file_name", "ori_name", "url", "type", "mime", "size", "create_time"])
->paginate((int)$param['limit']);
}
public static function move(array $data)
{
if (!isset($data['ids']) || count($data['ids']) == 0) {
return false;
}
return self::whereIn('asset_id', $data['ids'])->update([
'category_id' => $data['category_id']
]);
}
}

View File

@ -0,0 +1,50 @@
<?php
declare(strict_types=1);
namespace App\Model;
/**
* @property int $category_id
* @property string $category_name
* @property int $account_type
* @property int $belong_id
* @property int $pid
* @property int $rank
* @property string $create_time
* @property string $update_time
* @property string $deleted_at
*/
class AssetCategory extends Model
{
/**
* The table associated with the model.
*/
protected ?string $table = 'asset_category';
protected string $primaryKey = 'category_id';
/**
* The attributes that are mass assignable.
*/
protected array $fillable = [];
/**
* The attributes that should be cast to native types.
*/
protected array $casts = ['category_id' => 'integer', 'account_type' => 'integer', 'belong_id' => 'integer', 'pid' => 'integer', 'rank' => 'integer'];
public static function list(array $param)
{
$model = (new self());
if (isset($param['account_type']) && $param['account_type'] != '') {
$model = $model->where('account_type', $param['account_type']);
}
if (isset($param['belong_id']) && $param['belong_id'] != '') {
$model = $model->where('belong_id', $param['belong_id']);
}
return $model
->select(["category_id", "category_name", "pid"])
->get();
}
}

View File

@ -0,0 +1,48 @@
<?php
namespace App\Request;
use Hyperf\Validation\Request\FormRequest;
class AssetCategory extends FormRequest
{
protected array $scenes = [
'add' => ["category_name", "pid", "rank"],
'edit' => ["category_name", "pid", "rank", "category_id"],
];
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*/
public function rules(): array
{
return [
'category_id' => 'required',
'category_name' => 'required',
'account_type' => 'required',
'belong_id' => 'required',
'pid' => 'required',
'rank' => 'required',
'create_time' => 'required',
'update_time' => 'required',
'deleted_at' => 'required',
];
}
public function messages(): array
{
return [
'category_name.required' => '分类名称必传!',
'pid.required' => '上级分类必传!',
'rank.required' => '排序必传!',
];
}
}

View File

@ -124,4 +124,34 @@ class Str
return "text";
}
}
public static function fileType($ext): string
{
switch (strtolower($ext)) {
case 'bmp':
case 'jpg':
case 'jpeg':
case 'png':
case 'gif':
return "image";
case 'avi':
case 'mp4':
case 'flv':
return "video";
case 'doc':
case 'docx':
return "wold";
case 'xls':
case 'xlsx':
return "excel";
case 'ppt':
case 'pptx':
return "ppt";
case 'mp3':
case 'wav':
return "audio";
default:
return "other";
}
}
}

View File

@ -6,8 +6,8 @@
namespace {{ module_name }};
use App\Annotation\Auth;
use App\Model\{{ controller_name }} as {{ table_name | slice(0, 1) }}Model;
use App\Request\{{ controller_name }} as {{ table_name | slice(0, 1) }}Request;
use App\Model\{{ controller_name }} as {{ name1 }}Model;
use App\Request\{{ controller_name }} as {{ name1 }}Request;
use App\Utils\Param;
use Hyperf\HttpServer\Annotation\Controller;
use Hyperf\HttpServer\Annotation\DeleteMapping;
@ -20,52 +20,52 @@ class {{ controller_name }} extends Base
{
#[GetMapping(path: "{{ table_name }}/list")]
#[Auth(auth: "{{ table_name }}:list")]
public function {{ table_name }}List()
public function {{ name2 }}List()
{
$param = Param::only([{% for field in query_fields %}"{{ field.column_name }}"{% if not loop.last %}, {% endif %}{% endfor %}]);
return $this->success({{ table_name | slice(0, 1) }}Model::list($param));
$param = Param::only([{% for field in query_fields %}"{{ field.column_name }}"{% if not loop.last %}, {% endif %}{% endfor %}, "limit"=>10]);
return $this->success({{ name1 }}Model::list($param));
}
#[GetMapping(path: "{{ table_name }}/option")]
#[Auth(needAuth: false)]
public function {{ table_name }}Option()
public function {{ name2 }}Option()
{
return $this->success({{ table_name | slice(0, 1) }}Model::options());
return $this->success({{ name1 }}Model::options());
}
#[GetMapping(path: "{{ table_name }}/info")]
#[Auth(auth: "{{ table_name }}:info")]
public function {{ table_name }}Info()
public function {{ name2 }}Info()
{
$id = $this->request->input("id");
return $this->success({{ table_name | slice(0, 1) }}Model::getById());
return $this->success({{ name1 }}Model::getById());
}
#[PostMapping(path: "{{ table_name }}/add")]
#[Auth(auth: "{{ table_name }}:add")]
public function {{ table_name }}Add()
public function {{ name2 }}Add()
{
$request = $this->container->get({{ table_name | slice(0, 1)}}Request::class);
$request = $this->container->get({{ name1 }}Request::class);
$request->scene('add')->validateResolved();
$data = Param::only([{% for field in insert_fields %}"{{ field.column_name }}"{% if not loop.last %}, {% endif %}{% endfor %}]);
return $this->toAjax({{ table_name | slice(0, 1) }}Model::add($data));
return $this->toAjax({{ name1 }}Model::add($data));
}
#[PutMapping(path: "{{ table_name }}/edit")]
#[Auth(auth: "{{ table_name }}:edit")]
public function {{ table_name }}Edit()
public function {{ name2 }}Edit()
{
$request = $this->container->get({{ table_name | slice(0, 1)}}Request::class);
$request = $this->container->get({{ name1 }}Request::class);
$request->scene('edit')->validateResolved();
$data = Param::only([{% for field in edit_fields %}"{{ field.column_name }}"{% if not loop.last %}, {% endif %}{% endfor %}]);
return $this->toAjax({{ table_name | slice(0, 1) }}Model::edit($data));
return $this->toAjax({{ name1 }}Model::edit($data));
}
#[DeleteMapping(path: "{{ table_name }}/del")]
#[Auth(auth: "{{ table_name }}:del")]
public function {{ table_name }}Del()
public function {{ name2 }}Del()
{
$ids = $this->request->input("ids");
return $this->toAjax({{ table_name | slice(0, 1) }}Model::del($ids));
return $this->toAjax({{ name1 }}Model::del($ids));
}
}