From d9dc31e388464642964ba557bb5e225ac8467340 Mon Sep 17 00:00:00 2001 From: zhenhui <1276357500@qq.com> Date: Mon, 30 Mar 2026 14:45:09 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=B8=A0=E9=81=93=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/controller/auth/Admin.php | 59 ++++-- app/admin/controller/channel/Manage.php | 110 ----------- app/admin/controller/routine/AdminInfo.php | 2 +- app/admin/lang/en/auth/admin.php | 2 - app/admin/lang/zh-cn/auth/admin.php | 2 - app/admin/library/Auth.php | 2 +- app/admin/model/Admin.php | 22 ++- app/api/controller/v1/Auth.php | 17 +- app/common/controller/Backend.php | 9 + app/common/library/AgentJwt.php | 2 +- app/common/model/ChannelManage.php | 84 -------- app/common/validate/ChannelManage.php | 31 --- app/functions.php | 2 +- web/src/lang/backend/en/auth/admin.ts | 3 - web/src/lang/backend/en/channel/manage.ts | 15 -- web/src/lang/backend/zh-cn/auth/admin.ts | 3 - web/src/lang/backend/zh-cn/channel/manage.ts | 15 -- web/src/stores/adminInfo.ts | 1 - web/src/stores/interface/index.ts | 2 - web/src/views/backend/auth/admin/index.vue | 7 - .../views/backend/auth/admin/popupForm.vue | 24 --- .../views/backend/channel/manage/index.vue | 182 ------------------ .../backend/channel/manage/popupForm.vue | 154 --------------- .../backend/channel/manage/whitelistPopup.vue | 101 ---------- 24 files changed, 71 insertions(+), 780 deletions(-) delete mode 100644 app/admin/controller/channel/Manage.php delete mode 100644 app/common/model/ChannelManage.php delete mode 100644 app/common/validate/ChannelManage.php delete mode 100644 web/src/lang/backend/en/channel/manage.ts delete mode 100644 web/src/lang/backend/zh-cn/channel/manage.ts delete mode 100644 web/src/views/backend/channel/manage/index.vue delete mode 100644 web/src/views/backend/channel/manage/popupForm.vue delete mode 100644 web/src/views/backend/channel/manage/whitelistPopup.vue diff --git a/app/admin/controller/auth/Admin.php b/app/admin/controller/auth/Admin.php index 18f3dbf..ffa102f 100644 --- a/app/admin/controller/auth/Admin.php +++ b/app/admin/controller/auth/Admin.php @@ -17,7 +17,7 @@ class Admin extends Backend { protected ?object $model = null; - protected array|string $preExcludeFields = ['create_time', 'update_time', 'password', 'salt', 'login_failure', 'last_login_time', 'last_login_ip', 'agent_id']; + protected array|string $preExcludeFields = ['create_time', 'update_time', 'password', 'salt', 'login_failure', 'last_login_time', 'last_login_ip', 'agent_id', 'agent_api_secret', 'channel_id']; protected array|string $quickSearchField = ['username', 'nickname']; @@ -25,8 +25,6 @@ class Admin extends Backend protected string $dataLimitField = 'id'; - protected array $withJoinTable = ['channel']; - protected function initController(Request $request): ?Response { $this->model = new AdminModel(); @@ -46,8 +44,7 @@ class Admin extends Backend list($where, $alias, $limit, $order) = $this->queryBuilder(); $res = $this->model ->withoutField('login_failure,password,salt') - ->withJoin($this->withJoinTable, $this->withJoinType ?? 'LEFT') - ->visible(['channel' => ['name']]) + ->withJoin($this->withJoinTable ?? [], $this->withJoinType ?? 'LEFT') ->alias($alias) ->where($where) ->order($order) @@ -81,13 +78,9 @@ class Admin extends Backend 'mobile' => 'regex:/^1[3-9]\d{9}$/|unique:admin,mobile', 'group_arr' => 'required|array', ]; - if ($this->auth->isSuperAdmin()) { - $rules['channel_id'] = 'required|integer|min:1'; - } $messages = [ 'username.regex' => __('Please input correct username'), 'password.regex' => __('Please input correct password'), - 'channel_id.required' => __('Please select channel'), ]; Validator::make($data, $rules, $messages)->validate(); } catch (ValidationException $e) { @@ -95,14 +88,6 @@ class Admin extends Backend } } - if (!$this->auth->isSuperAdmin()) { - $currentChannelId = (int) ($this->auth->model->channel_id ?? 0); - if ($currentChannelId <= 0) { - return $this->error(__('Current admin has no channel bound')); - } - $data['channel_id'] = $currentChannelId; - } - $passwd = $data['password'] ?? ''; $data = $this->excludeFields($data); $result = false; @@ -115,7 +100,12 @@ class Admin extends Backend $result = $this->model->save($data); if ($result !== false) { $agentId = strtolower(md5($this->model->username . $this->model->id)); - $this->model->where('id', $this->model->id)->update(['agent_id' => $agentId]); + $agentSecret = strtoupper(md5($this->model->username . $this->model->id)); + // 使用原生 SQL,避免 ThinkORM 按当前表结构校验字段时因未迁移缺少 agent_api_secret 列而报错 + Db::execute( + 'UPDATE `admin` SET `agent_id` = ?, `agent_api_secret` = ? WHERE `id` = ?', + [$agentId, $agentSecret, $this->model->id] + ); } if (!empty($data['group_arr'])) { $groupAccess = []; @@ -306,6 +296,39 @@ class Admin extends Backend ]); } + /** + * 去掉已废弃的渠道字段,避免组合搜索生成对不存在列的条件 + */ + protected function filterSearchArray(array $search): array + { + return array_values(array_filter($search, static function ($item) { + if (!is_array($item) || !isset($item['field'])) { + return true; + } + $f = (string) $item['field']; + if ($f === 'channel_id' || str_ends_with($f, '.channel_id')) { + return false; + } + if ($f === 'channel.name' || str_starts_with($f, 'channel.')) { + return false; + } + + return true; + })); + } + + public function queryOrderBuilder(): array + { + $order = parent::queryOrderBuilder(); + foreach (array_keys($order) as $key) { + if ($key === 'channel_id' || (is_string($key) && str_contains($key, 'channel.'))) { + unset($order[$key]); + } + } + + return $order; + } + private function checkGroupAuth(array $groups): ?Response { if ($this->auth->isSuperAdmin()) { diff --git a/app/admin/controller/channel/Manage.php b/app/admin/controller/channel/Manage.php deleted file mode 100644 index 54ab16d..0000000 --- a/app/admin/controller/channel/Manage.php +++ /dev/null @@ -1,110 +0,0 @@ -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')) { - return $this->select($request); - } - - /** - * 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(); - } - - /** - * 渠道下拉选择(供 remoteSelect 使用) - */ - public function select(\Webman\Http\Request $request): \support\Response - { - $response = $this->initializeBackend($request); - if ($response !== null) { - return $response; - } - list($where, $alias, $limit, $order) = $this->queryBuilder(); - $res = $this->model - ->field('id,name,title') - ->alias($alias) - ->where($where) - ->order($order) - ->paginate($limit); - return $this->success('', [ - 'list' => $res->items(), - 'total' => $res->total(), - ]); - } - - /** - * add、edit、del、sortable 已由父类 Backend 实现,无需重写即可直接使用 - * 若需重写,请确保调用 initializeBackend($request) 并传入 Request 参数 - * 若模型有 admin_id 字段需自动填充,可设置 protected bool $autoFillAdminId = true - */ -} \ No newline at end of file diff --git a/app/admin/controller/routine/AdminInfo.php b/app/admin/controller/routine/AdminInfo.php index 8c37c87..c00d8dc 100644 --- a/app/admin/controller/routine/AdminInfo.php +++ b/app/admin/controller/routine/AdminInfo.php @@ -13,7 +13,7 @@ class AdminInfo extends Backend { protected ?object $model = null; - protected array|string $preExcludeFields = ['username', 'last_login_time', 'password', 'salt', 'status']; + protected array|string $preExcludeFields = ['username', 'last_login_time', 'password', 'salt', 'status', 'channel_id', 'agent_id', 'agent_api_secret']; protected array $authAllowFields = ['id', 'username', 'nickname', 'avatar', 'email', 'mobile', 'motto', 'last_login_time']; protected function initController(Request $request): ?Response diff --git a/app/admin/lang/en/auth/admin.php b/app/admin/lang/en/auth/admin.php index 0044be3..b1a3073 100644 --- a/app/admin/lang/en/auth/admin.php +++ b/app/admin/lang/en/auth/admin.php @@ -2,6 +2,4 @@ return [ 'Group Name Arr' => 'Administrator Grouping ', 'Please use another administrator account to disable the current account!' => 'Disable the current account, please use another administrator account!', - 'Please select channel' => 'Please select channel', - 'Current admin has no channel bound' => 'Current admin has no channel bound', ]; \ No newline at end of file diff --git a/app/admin/lang/zh-cn/auth/admin.php b/app/admin/lang/zh-cn/auth/admin.php index e5501f4..efa0622 100644 --- a/app/admin/lang/zh-cn/auth/admin.php +++ b/app/admin/lang/zh-cn/auth/admin.php @@ -3,6 +3,4 @@ return [ 'Group Name Arr' => '管理员分组', 'Please use another administrator account to disable the current account!' => '请使用另外的管理员账户禁用当前账户!', 'You have no permission to add an administrator to this group!' => '您没有权限向此分组添加管理员!', - 'Please select channel' => '请选择渠道', - 'Current admin has no channel bound' => '当前管理员未绑定渠道', ]; \ No newline at end of file diff --git a/app/admin/library/Auth.php b/app/admin/library/Auth.php index 54a0128..97c8e07 100644 --- a/app/admin/library/Auth.php +++ b/app/admin/library/Auth.php @@ -33,7 +33,7 @@ class Auth extends \ba\Auth protected string $refreshToken = ''; protected int $keepTime = 86400; protected int $refreshTokenKeepTime = 2592000; - protected array $allowFields = ['id', 'username', 'nickname', 'avatar', 'last_login_time', 'channel_id']; + protected array $allowFields = ['id', 'username', 'nickname', 'avatar', 'last_login_time']; public function __construct(array $config = []) { diff --git a/app/admin/model/Admin.php b/app/admin/model/Admin.php index 11db421..c8bc00c 100644 --- a/app/admin/model/Admin.php +++ b/app/admin/model/Admin.php @@ -21,13 +21,23 @@ use support\think\Db; * @property string $password 密码密文 * @property string $salt 密码盐 * @property string $status 状态:enable=启用,disable=禁用 - * @property string $agent_id 代理ID(关联渠道) - * @property int $channel_id 渠道ID + * @property string $agent_id 代理 ID(API 鉴权) + * @property string $agent_api_secret Agent API 密钥 */ class Admin extends Model { use TimestampInteger; + /** + * 已移除的 channel_id 等若仍被旧请求/缓存传入,禁止参与读写 + */ + protected function getOptions(): array + { + return [ + 'disuse' => ['channel_id'], + ]; + } + protected string $table = 'admin'; protected string $pk = 'id'; protected bool $autoWriteTimestamp = true; @@ -66,12 +76,4 @@ class Admin extends Model { return $this->where(['id' => $uid])->update(['password' => hash_password($newPassword), 'salt' => '']); } - - /** - * 关联渠道 - */ - public function channel(): \think\model\relation\BelongsTo - { - return $this->belongsTo(\app\common\model\ChannelManage::class, 'channel_id', 'id'); - } } diff --git a/app/api/controller/v1/Auth.php b/app/api/controller/v1/Auth.php index bf7195e..0f64776 100644 --- a/app/api/controller/v1/Auth.php +++ b/app/api/controller/v1/Auth.php @@ -10,7 +10,6 @@ use app\common\controller\Api; use app\common\facade\Token; use app\common\library\Auth as UserAuth; use app\common\library\AgentJwt; -use app\common\model\ChannelManage; use app\common\model\MallPlayxUserAsset; use app\admin\model\Admin; use Webman\Http\Request; @@ -72,17 +71,12 @@ class Auth extends Api return $this->error(__('Agent not found')); } - $channelId = intval($admin->channel_id ?? 0); - if ($channelId <= 0) { + $apiSecret = strval($admin->agent_api_secret ?? ''); + if ($apiSecret === '') { return $this->error(__('Agent not found')); } - $channel = ChannelManage::where('id', $channelId)->find(); - if (!$channel || $channel->secret === '') { - return $this->error(__('Agent not found')); - } - - if ($channel->secret !== $secret) { + if ($apiSecret !== $secret) { return $this->error(__('Invalid agent or secret')); } @@ -93,9 +87,8 @@ class Auth extends Api $expire = intval(config('buildadmin.agent_auth.token_expire', 86400)); $payload = [ - 'agent_id' => $agentId, - 'channel_id' => $channel->id, - 'admin_id' => $admin->id, + 'agent_id' => $agentId, + 'admin_id' => $admin->id, ]; $authtoken = AgentJwt::encode($payload, $expire); diff --git a/app/common/controller/Backend.php b/app/common/controller/Backend.php index 855e9d0..d57e471 100644 --- a/app/common/controller/Backend.php +++ b/app/common/controller/Backend.php @@ -238,6 +238,7 @@ class Backend extends Api $limit = is_numeric($limit) ? intval($limit) : 10; $search = $this->request->get('search', []); $search = is_array($search) ? $search : []; + $search = $this->filterSearchArray($search); $initKey = $this->request->get('initKey', $pk); $initValue = $this->request->get('initValue', ''); $initOperator = $this->request->get('initOperator', 'in'); @@ -352,6 +353,14 @@ class Backend extends Api return [$where, $alias, $limit, $this->queryOrderBuilder()]; } + /** + * 组合搜索条件过滤(子类可覆盖,例如去掉已删除的数据库字段) + */ + protected function filterSearchArray(array $search): array + { + return $search; + } + /** * 查询的排序参数构建器 */ diff --git a/app/common/library/AgentJwt.php b/app/common/library/AgentJwt.php index 8cb223f..3e0bf7f 100644 --- a/app/common/library/AgentJwt.php +++ b/app/common/library/AgentJwt.php @@ -18,7 +18,7 @@ class AgentJwt /** * 生成 JWT authtoken - * @param array $payload agent_id, channel_id, admin_id 等 + * @param array $payload agent_id、admin_id 等 * @param int $expire 有效期(秒) */ public static function encode(array $payload, int $expire = 86400): string diff --git a/app/common/model/ChannelManage.php b/app/common/model/ChannelManage.php deleted file mode 100644 index cd1621e..0000000 --- a/app/common/model/ChannelManage.php +++ /dev/null @@ -1,84 +0,0 @@ - '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 deleted file mode 100644 index 5e0b3b3..0000000 --- a/app/common/validate/ChannelManage.php +++ /dev/null @@ -1,31 +0,0 @@ - [], - 'edit' => [], - ]; - -} diff --git a/app/functions.php b/app/functions.php index b89e844..2540183 100644 --- a/app/functions.php +++ b/app/functions.php @@ -167,7 +167,7 @@ if (!function_exists('get_auth_token')) { if (!function_exists('get_agent_jwt_payload')) { /** - * 解析 Agent JWT authtoken,返回 payload(agent_id、channel_id、admin_id 等) + * 解析 Agent JWT authtoken,返回 payload(agent_id、admin_id 等) * @param string $token authtoken * @return array 成功返回 payload,失败返回空数组 */ diff --git a/web/src/lang/backend/en/auth/admin.ts b/web/src/lang/backend/en/auth/admin.ts index d0ccaf3..c653912 100644 --- a/web/src/lang/backend/en/auth/admin.ts +++ b/web/src/lang/backend/en/auth/admin.ts @@ -1,9 +1,6 @@ export default { username: 'Username', nickname: 'Nickname', - channel_id: 'Channel', - channel_name: 'Channel name', - 'Please select channel': 'Please select channel', group: 'Group', avatar: 'Avatar', email: 'Email', diff --git a/web/src/lang/backend/en/channel/manage.ts b/web/src/lang/backend/en/channel/manage.ts deleted file mode 100644 index ff9514b..0000000 --- a/web/src/lang/backend/en/channel/manage.ts +++ /dev/null @@ -1,15 +0,0 @@ -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/auth/admin.ts b/web/src/lang/backend/zh-cn/auth/admin.ts index b26c15e..4ce94ae 100644 --- a/web/src/lang/backend/zh-cn/auth/admin.ts +++ b/web/src/lang/backend/zh-cn/auth/admin.ts @@ -1,9 +1,6 @@ export default { username: '用户名', nickname: '昵称', - channel_id: '渠道', - channel_name: '渠道名称', - 'Please select channel': '请选择渠道', group: '角色组', avatar: '头像', email: '电子邮箱', diff --git a/web/src/lang/backend/zh-cn/channel/manage.ts b/web/src/lang/backend/zh-cn/channel/manage.ts deleted file mode 100644 index d508bef..0000000 --- a/web/src/lang/backend/zh-cn/channel/manage.ts +++ /dev/null @@ -1,15 +0,0 @@ -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/stores/adminInfo.ts b/web/src/stores/adminInfo.ts index 2bea1b7..65ffd10 100644 --- a/web/src/stores/adminInfo.ts +++ b/web/src/stores/adminInfo.ts @@ -13,7 +13,6 @@ export const useAdminInfo = defineStore('adminInfo', { token: '', refresh_token: '', super: false, - channel_id: 0, } }, actions: { diff --git a/web/src/stores/interface/index.ts b/web/src/stores/interface/index.ts index 7770cdf..5307183 100644 --- a/web/src/stores/interface/index.ts +++ b/web/src/stores/interface/index.ts @@ -113,8 +113,6 @@ export interface AdminInfo { refresh_token: string // 是否是 superAdmin,用于判定是否显示终端按钮等,不做任何权限判断 super: boolean - // 渠道ID(创建子管理员时默认绑定) - channel_id?: number } export interface UserInfo { diff --git a/web/src/views/backend/auth/admin/index.vue b/web/src/views/backend/auth/admin/index.vue index 63679f9..9c33c7e 100644 --- a/web/src/views/backend/auth/admin/index.vue +++ b/web/src/views/backend/auth/admin/index.vue @@ -61,13 +61,6 @@ const baTable = new baTableClass( operator: 'RANGE', width: 160, }, - { - label: t('auth.admin.channel_name'), - prop: 'channel.name', - align: 'center', - minWidth: 120, - operator: false, - }, { label: t('auth.admin.agent_id'), prop: 'agent_id', diff --git a/web/src/views/backend/auth/admin/popupForm.vue b/web/src/views/backend/auth/admin/popupForm.vue index fa93f02..cf3e43c 100644 --- a/web/src/views/backend/auth/admin/popupForm.vue +++ b/web/src/views/backend/auth/admin/popupForm.vue @@ -41,19 +41,6 @@ prop="nickname" :placeholder="t('Please input field', { field: t('auth.admin.nickname') })" /> - > = reactive({ username: [buildValidatorData({ name: 'required', title: t('auth.admin.username') }), buildValidatorData({ name: 'account' })], nickname: [buildValidatorData({ name: 'required', title: t('auth.admin.nickname') })], - channel_id: [ - { - validator: (_rule: any, val: any, callback: Function) => { - if (baTable.form.operate === 'Add' && adminInfo.super && !val) { - return callback(new Error(t('auth.admin.Please select channel'))) - } - return callback() - }, - trigger: 'change', - }, - ], group_arr: [buildValidatorData({ name: 'required', message: t('Please select field', { field: t('auth.admin.group') }) })], email: [buildValidatorData({ name: 'email', message: t('Please enter the correct field', { field: t('auth.admin.email') }) })], mobile: [buildValidatorData({ name: 'mobile', message: t('Please enter the correct field', { field: t('auth.admin.mobile') }) })], diff --git a/web/src/views/backend/channel/manage/index.vue b/web/src/views/backend/channel/manage/index.vue deleted file mode 100644 index d00f750..0000000 --- a/web/src/views/backend/channel/manage/index.vue +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/web/src/views/backend/channel/manage/popupForm.vue b/web/src/views/backend/channel/manage/popupForm.vue deleted file mode 100644 index c778936..0000000 --- a/web/src/views/backend/channel/manage/popupForm.vue +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - {{ baTable.form.operate ? t(baTable.form.operate) : '' }} - - - - - - - - - - - - - {{ t('Add') }} - - - - - - - - - - - {{ t('Cancel') }} - - {{ baTable.form.operateIds && baTable.form.operateIds.length > 1 ? t('Save and edit next item') : t('Save') }} - - - - - - - - - diff --git a/web/src/views/backend/channel/manage/whitelistPopup.vue b/web/src/views/backend/channel/manage/whitelistPopup.vue deleted file mode 100644 index 2eb9ca1..0000000 --- a/web/src/views/backend/channel/manage/whitelistPopup.vue +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - {{ t('Add') }} - - - - - {{ t('Cancel') }} - {{ t('Save') }} - - - - - - -