diff --git a/app/admin/controller/channel/Manage.php b/app/admin/controller/channel/Manage.php new file mode 100644 index 0000000..7d9b7a3 --- /dev/null +++ b/app/admin/controller/channel/Manage.php @@ -0,0 +1,89 @@ +model = new \app\common\model\ChannelManage(); + } + + /** + * 查看 + * @throws Throwable + */ + public function index(\Webman\Http\Request $request): \support\Response + { + $response = $this->initializeBackend($request); + if ($response !== null) { + return $response; + } + + if ($request->get('select') || $request->post('select')) { + $this->_select(); + return $this->success(); + } + + /** + * 1. withJoin 不可使用 alias 方法设置表别名,别名将自动使用关联模型名称(小写下划线命名规则) + * 2. 以下的别名设置了主表别名,同时便于拼接查询参数等 + * 3. paginate 数据集可使用链式操作 each(function($item, $key) {}) 遍历处理 + */ + list($where, $alias, $limit, $order) = $this->queryBuilder(); + $res = $this->model + ->withJoin($this->withJoinTable, $this->withJoinType) + ->visible(['admin' => ['username']]) + ->alias($alias) + ->where($where) + ->order($order) + ->paginate($limit); + + return $this->success('', [ + 'list' => $res->items(), + 'total' => $res->total(), + 'remark' => get_route_remark(), + ]); + } + + /** + * 白名单(页面按钮规则,用于菜单规则中配置按钮权限) + * 实际编辑通过 edit 接口提交 ip_white 字段 + */ + public function whitelist(\Webman\Http\Request $request): \support\Response + { + $response = $this->initializeBackend($request); + if ($response !== null) { + return $response; + } + return $this->success(); + } + + /** + * add、edit、del、sortable 已由父类 Backend 实现,无需重写即可直接使用 + * 若需重写,请确保调用 initializeBackend($request) 并传入 Request 参数 + * 若模型有 admin_id 字段需自动填充,可设置 protected bool $autoFillAdminId = true + */ +} \ No newline at end of file diff --git a/app/common/model/ChannelManage.php b/app/common/model/ChannelManage.php new file mode 100644 index 0000000..cd1621e --- /dev/null +++ b/app/common/model/ChannelManage.php @@ -0,0 +1,84 @@ + 'integer', + 'update_time' => 'integer', + 'ip_white' => 'json', + ]; + + + /** + * 获取 IP 白名单,统一返回字符串数组格式 + * 兼容:["127.0.0.1"]、[{"value":"127.0.0.1"}]、[{"127.0.0.1":""}] + */ + public function getipWhiteAttr($value): array + { + $arr = is_array($value) ? $value : (!$value ? [] : json_decode($value, true)); + if (!is_array($arr)) { + return []; + } + $result = []; + foreach ($arr as $item) { + if (is_string($item)) { + $result[] = $item; + } elseif (is_array($item)) { + if (isset($item['value'])) { + $result[] = $item['value']; + } else { + $key = array_key_first($item); + if ($key !== null && $key !== '') { + $result[] = $key; + } + } + } + } + return array_values(array_filter($result)); + } + + /** + * 写入 IP 白名单,存储格式 ["127.0.0.1","192.168.1.1"] + */ + public function setipWhiteAttr($value): array + { + $arr = is_array($value) ? $value : []; + $result = []; + foreach ($arr as $ip) { + $ip = is_string($ip) ? trim($ip) : ''; + if ($ip !== '') { + $result[] = $ip; + } + } + return array_values($result); + } + + /** + * 创建时自动生成密钥:strtoupper(md5(name+id)) + */ + protected static function onAfterInsert($model): void + { + $pk = $model->getPk(); + $secret = strtoupper(md5($model->name . $model->$pk)); + $model->where($pk, $model->$pk)->update(['secret' => $secret]); + } + + public function admin(): \think\model\relation\BelongsTo + { + return $this->belongsTo(\app\admin\model\Admin::class, 'admin_id', 'id'); + } +} \ No newline at end of file diff --git a/app/common/validate/ChannelManage.php b/app/common/validate/ChannelManage.php new file mode 100644 index 0000000..5e0b3b3 --- /dev/null +++ b/app/common/validate/ChannelManage.php @@ -0,0 +1,31 @@ + [], + 'edit' => [], + ]; + +} diff --git a/web/src/components/table/fieldRender/ipWhiteList.vue b/web/src/components/table/fieldRender/ipWhiteList.vue new file mode 100644 index 0000000..ef5224d --- /dev/null +++ b/web/src/components/table/fieldRender/ipWhiteList.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/web/src/lang/backend/en/channel/manage.ts b/web/src/lang/backend/en/channel/manage.ts new file mode 100644 index 0000000..ff9514b --- /dev/null +++ b/web/src/lang/backend/en/channel/manage.ts @@ -0,0 +1,15 @@ +export default { + id: 'id', + name: 'name', + ip_white: 'ip_white', + ip_placeholder: 'Please enter IP address', + whitelist: 'Whitelist', + title: 'title', + remark: 'remark', + admin_id: 'admin_id', + admin__username: 'username', + secret: 'secret', + create_time: 'create_time', + update_time: 'update_time', + 'quick Search Fields': 'id', +} diff --git a/web/src/lang/backend/zh-cn/channel/manage.ts b/web/src/lang/backend/zh-cn/channel/manage.ts new file mode 100644 index 0000000..d508bef --- /dev/null +++ b/web/src/lang/backend/zh-cn/channel/manage.ts @@ -0,0 +1,15 @@ +export default { + id: 'ID', + name: '渠道名', + ip_white: 'IP白名单', + ip_placeholder: '请输入IP地址', + whitelist: '白名单', + title: '标题', + remark: '备注', + admin_id: '管理员', + admin__username: '用户名', + secret: '密钥', + create_time: '创建时间', + update_time: '修改时间', + 'quick Search Fields': 'ID', +} diff --git a/web/src/views/backend/channel/manage/index.vue b/web/src/views/backend/channel/manage/index.vue new file mode 100644 index 0000000..d00f750 --- /dev/null +++ b/web/src/views/backend/channel/manage/index.vue @@ -0,0 +1,182 @@ + + + + + diff --git a/web/src/views/backend/channel/manage/popupForm.vue b/web/src/views/backend/channel/manage/popupForm.vue new file mode 100644 index 0000000..c778936 --- /dev/null +++ b/web/src/views/backend/channel/manage/popupForm.vue @@ -0,0 +1,154 @@ + + + + + diff --git a/web/src/views/backend/channel/manage/whitelistPopup.vue b/web/src/views/backend/channel/manage/whitelistPopup.vue new file mode 100644 index 0000000..28e4584 --- /dev/null +++ b/web/src/views/backend/channel/manage/whitelistPopup.vue @@ -0,0 +1,107 @@ + + + + +