diff --git a/app/admin/controller/v1/Navigation.php b/app/admin/controller/v1/Navigation.php deleted file mode 100644 index 1315642d..00000000 --- a/app/admin/controller/v1/Navigation.php +++ /dev/null @@ -1,57 +0,0 @@ -order(['sort' => 'asc', 'id' => 'asc']) - ->select(); - - return success('获取成功', $types); - } - - // 导航分页 - public function index() - { - $param = request()->get([ - 'name', - 'nav_id', - 'created_at', - 'page/d' => 1, - 'size/d' => 10, - ]); - - $navigations = SysNavigationItemModel::withoutField([ - 'created_at', - 'updated_at' - ]) - ->with(['navigation' => function ($query) { - $query->field(['id', 'name' => 'nav_name']); - }]) - ->withSearch(['name', 'created_at'], [ - 'name' => $param['name']??null, - 'created_at' => $param['created_at']??null - ]) - ->navId($param['nav_id']??null) - ->order(['sort' => 'asc', 'id' => 'asc']) - ->paginate([ - 'page' => $param['page'], - 'list_rows' => $param['size'], - ]) - ->bindAttr('navigation', ['nav_name']) - ->hidden(['nav_id', 'navigation']); - - return success('获取成功', $navigations); - } -} diff --git a/app/admin/controller/v1/NavigationItem.php b/app/admin/controller/v1/NavigationItem.php new file mode 100644 index 00000000..44689611 --- /dev/null +++ b/app/admin/controller/v1/NavigationItem.php @@ -0,0 +1,178 @@ +order(['sort' => 'asc', 'id' => 'asc']) + ->select(); + + return success('获取成功', $types); + } + + // 导航列表树 + public function index() + { + $param = request()->get([ + 'name', + 'nav_id', + 'created_at' + ]); + + $navigations = SysNavigationItemModel::field([ + 'id', + 'pid', + 'nav_id', + 'name', + 'sort', + 'blank', + 'status' + ]) + ->with(['navigation' => function ($query) { + $query->field(['id', 'name' => 'nav_name']); + }]) + ->withSearch(['name', 'created_at'], [ + 'name' => $param['name']??null, + 'created_at' => $param['created_at']??null + ]) + ->navId($param['nav_id']??null) + ->order(['sort' => 'asc', 'id' => 'asc']) + ->select() + ->bindAttr('navigation', ['nav_name']) + ->hidden(['nav_id', 'navigation']); + + return success('获取成功', array_to_tree($navigations->toArray(), 0, 'pid')); + } + + // 导航详情 + public function read() + { + $id = request()->param('id'); + + $nav = SysNavigationItemModel::field([ + 'id', + 'pid', + 'nav_id', + 'sort', + 'status', + 'blank', + 'created_at' + ]) + ->with(['navigation' => function ($query) { + $query->field(['id', 'name' => 'nav_name']); + }]) + ->bypk($id) + ->find(); + if (empty($nav)) { + return error('导航不存在'); + } + $nav = $nav->bindAttr('navigation', ['nav_name'])->hidden(['nav_id', 'navigation']); + + return success('获取成功', $nav); + } + + // 导航新增 + public function save() + { + $post = request()->post([ + 'pid', + 'nav_id', + 'name', + 'icon', + 'link_type', + 'link', + 'sort', + 'blank' => 0, + 'status' => 1 + ]); + + $validate = new NavigationItemValidate; + if (!$validate->scene('add')->check($post)) { + return error($validate->getError()); + } + + $nav_item = SysNavigationItemModel::create($post); + if ($nav_item->isEmpty()) { + return error('操作失败'); + } + return success('操作成功'); + } + + // 导航更新 + public function update() + { + $id = request()->param('id'); + $put = request()->put([ + 'pid', + 'nav_id', + 'name', + 'icon', + 'link_type', + 'link', + 'sort', + 'blank' => 0, + 'status' => 1 + ]); + + $validate = new NavigationItemValidate; + if (!$validate->scene('edit')->check(array_merge($put, ['id' => $id]))) { + return error($validate->getError()); + } + + $nav_item = SysNavigationItemModel::bypk($id)->find(); + if (empty($nav_item)) { + return error('请确认要操作对象是否存在'); + } + + if (!$nav_item->save($put)) { + return error('操作失败'); + } + return success('操作成功'); + } + + // 设置排序值 + public function sort() + { + $id = request()->param('id'); + $sort = request()->post('sort'); + + $nav = SysNavigationItemModel::bypk($id)->find(); + if (empty($nav)) { + return error('请确认要操作对象是否存在'); + } + + $nav->sort = $sort; + if (!$nav->save()) { + return error('操作失败'); + } + return success('操作成功'); + } + + // 导航删除 + public function delete() + { + $id = request()->param('id'); + + $nav = SysNavigationItemModel::bypk($id)->find(); + if (empty($nav)) { + return error('请确认要操作对象是否存在'); + } + + if (!$nav->delete()) { + return error('操作失败'); + } + return success('操作成功'); + } +} diff --git a/app/admin/model/v1/SysNavigationItemModel.php b/app/admin/model/v1/SysNavigationItemModel.php index 3a6f6d43..81516a0b 100644 --- a/app/admin/model/v1/SysNavigationItemModel.php +++ b/app/admin/model/v1/SysNavigationItemModel.php @@ -3,13 +3,13 @@ declare (strict_types = 1); namespace app\admin\model\v1; -use think\Model; +use app\common\model\SysNavigationItemBaseModel; /** * 导航数据模型 * @mixin \think\Model */ -class SysNavigationItemModel extends Model +class SysNavigationItemModel extends SysNavigationItemBaseModel { // 关联导航 public function navigation() diff --git a/app/admin/route/v1.php b/app/admin/route/v1.php index 1ff7f5bb..5c282061 100644 --- a/app/admin/route/v1.php +++ b/app/admin/route/v1.php @@ -412,11 +412,28 @@ Route::group('v1', function () { // 导航管理 Route::group('navigation', function() { - // 导航数据类型 - Route::get('link/type', 'Navigation/linkType'); + Route::group('items', function() { + // 导航数据类型 + Route::get('link/type', 'NavigationItem/linkType'); - // 导航分页 - Route::get('index', 'Navigation/index'); + // 导航分页 + Route::get('index', 'NavigationItem/index'); + + // 导航详情 + Route::get('read/:id', 'NavigationItem/read'); + + // 导航新增 + Route::post('save', 'NavigationItem/save'); + + // 导航更新 + Route::put('update/:id', 'NavigationItem/update'); + + // 导航设置排序值 + Route::post('sort/:id', 'NavigationItem/sort'); + + // 导航删除 + Route::delete('delete/:id', 'NavigationItem/delete'); + }); }); })->prefix('v1.'); diff --git a/app/admin/validate/v1/NavigationItemValidate.php b/app/admin/validate/v1/NavigationItemValidate.php new file mode 100644 index 00000000..bf2dbff7 --- /dev/null +++ b/app/admin/validate/v1/NavigationItemValidate.php @@ -0,0 +1,58 @@ + ['规则1','规则2'...] + * + * @var array + */ + protected $rule = [ + 'id' => 'require|integer', + 'nav_id' => 'require|integer', + 'pid' => 'integer', + 'name' => 'require|max:64', + 'icon' => 'max:64', + 'link_type' => 'require|integer', + 'link' => 'max:255', + 'sort' => 'integer', + 'blank' => 'in:0,1', + 'status' => 'require|in:1,-1', + ]; + + /** + * 定义错误信息 + * 格式:'字段名.规则名' => '错误信息' + * + * @var array + */ + protected $message = [ + 'id.require' => 'ID不能为空', + 'id.integer' => 'ID必须为整数', + 'nav_id.require' => '导航ID不能为空', + 'nav_id.integer' => '导航ID必须为整数', + 'pid.integer' => '父级ID必须为整数', + 'name.require' => '导航名称不能为空', + 'name.max' => '导航名称最多不能超过64个字符', + 'icon.max' => '图标最多不能超过64个字符', + 'link_type.require' => '链接类型不能为空', + 'link_type.integer' => '链接类型必须为整数', + 'link.max' => '链接最多不能超过255个字符', + 'sort.integer' => '排序必须为整数', + 'blank.in' => '是否新窗口打开只能是0或1', + 'status.require' => '状态不能为空', + 'status.in' => '状态只能是1或-1', + ]; + + // 定义场景 + protected $scene = [ + 'add' => ['nav_id', 'pid', 'name', 'icon', 'link_type', 'link', 'sort', 'blank', 'status'], + 'edit' => ['id', 'nav_id', 'pid', 'name', 'icon', 'link_type', 'link', 'sort', 'blank', 'status'], + ]; +} diff --git a/app/common/model/SysNavigationItemBaseModel.php b/app/common/model/SysNavigationItemBaseModel.php index b3efcd92..44b4ca62 100644 --- a/app/common/model/SysNavigationItemBaseModel.php +++ b/app/common/model/SysNavigationItemBaseModel.php @@ -3,13 +3,11 @@ declare (strict_types = 1); namespace app\common\model; -use think\Model; - /** * 导航数据模型 * @mixin \think\Model */ -class SysNavigationItemBaseModel extends Model +class SysNavigationItemBaseModel extends BaseModel { // 表名 protected $name = 'sys_navigation_item';