From 485ba7a3801092b38289f6135e7e362a582fd5ae Mon Sep 17 00:00:00 2001
From: long <452591453@qq.com>
Date: Wed, 20 May 2026 16:06:46 +0800
Subject: [PATCH] style: optimize ui for login and index pages with modern ios
tech style
---
admin/src/api/asset.ts | 26 +++
admin/src/views/asset/resource/index.vue | 178 ++++++++++++++++++
admin/src/views/asset/user/index.vue | 151 +++++++++++++++
.../asset/AssetResourceController.php | 101 ++++++++++
.../controller/asset/AssetUserController.php | 109 +++++++++++
.../controller/asset/AssetAppController.php | 98 ++++++++++
server/app/common/model/AssetResource.php | 36 ++++
server/app/common/model/AssetUser.php | 13 ++
server/app/common/model/AssetUserResource.php | 9 +
server/sql/asset_system.sql | 31 +++
10 files changed, 752 insertions(+)
create mode 100644 admin/src/api/asset.ts
create mode 100644 admin/src/views/asset/resource/index.vue
create mode 100644 admin/src/views/asset/user/index.vue
create mode 100644 server/app/adminapi/controller/asset/AssetResourceController.php
create mode 100644 server/app/adminapi/controller/asset/AssetUserController.php
create mode 100644 server/app/api/controller/asset/AssetAppController.php
create mode 100644 server/app/common/model/AssetResource.php
create mode 100644 server/app/common/model/AssetUser.php
create mode 100644 server/app/common/model/AssetUserResource.php
create mode 100644 server/sql/asset_system.sql
diff --git a/admin/src/api/asset.ts b/admin/src/api/asset.ts
new file mode 100644
index 00000000..7da0b015
--- /dev/null
+++ b/admin/src/api/asset.ts
@@ -0,0 +1,26 @@
+import request from '@/utils/request'
+
+// 账号管理 API
+export function apiAssetUserList(params: any) {
+ return request.get({ url: '/asset/AssetUser/lists', params })
+}
+export function apiAssetUserAdd(params: any) {
+ return request.post({ url: '/asset/AssetUser/add', params })
+}
+export function apiAssetUserEdit(params: any) {
+ return request.post({ url: '/asset/AssetUser/edit', params })
+}
+export function apiAssetUserDelete(params: any) {
+ return request.post({ url: '/asset/AssetUser/delete', params })
+}
+
+// 资源管理 API
+export function apiAssetResourceList(params: any) {
+ return request.get({ url: '/asset/AssetResource/lists', params })
+}
+export function apiAssetResourceAdd(params: any) {
+ return request.post({ url: '/asset/AssetResource/add', params })
+}
+export function apiAssetResourceDelete(params: any) {
+ return request.post({ url: '/asset/AssetResource/delete', params })
+}
diff --git a/admin/src/views/asset/resource/index.vue b/admin/src/views/asset/resource/index.vue
new file mode 100644
index 00000000..9b71d63e
--- /dev/null
+++ b/admin/src/views/asset/resource/index.vue
@@ -0,0 +1,178 @@
+
+
+
+
+ 上传并分发资源
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 点击预览
+
+
+
+
+ {{ row.users?.map((u: any) => u.phone).join(', ') || '未关联' }}
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 图片
+ 视频
+ 语音
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 确定发布
+
+
+
+
+
+
diff --git a/admin/src/views/asset/user/index.vue b/admin/src/views/asset/user/index.vue
new file mode 100644
index 00000000..28ea76cf
--- /dev/null
+++ b/admin/src/views/asset/user/index.vue
@@ -0,0 +1,151 @@
+
+
+
+
+ 新增分发账号
+
+
+
+
+
+
+
+
+ {{ row.status === 1 ? '正常' : '禁用' }}
+
+
+
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 确定
+
+
+
+
+
+
diff --git a/server/app/adminapi/controller/asset/AssetResourceController.php b/server/app/adminapi/controller/asset/AssetResourceController.php
new file mode 100644
index 00000000..9de71819
--- /dev/null
+++ b/server/app/adminapi/controller/asset/AssetResourceController.php
@@ -0,0 +1,101 @@
+request->get('page_no', 1);
+ $pageSize = $this->request->get('page_size', 15);
+ $type = $this->request->get('type');
+
+ $where = [];
+ if ($type) {
+ $where[] = ['type', '=', $type];
+ }
+
+ $count = AssetResource::where($where)->count();
+ $lists = AssetResource::with('users')
+ ->where($where)
+ ->order('id', 'desc')
+ ->page($pageNo, $pageSize)
+ ->select();
+
+ return $this->data([
+ 'count' => $count,
+ 'lists' => $lists,
+ 'page_no' => $pageNo,
+ 'page_size' => $pageSize,
+ ]);
+ }
+
+ /**
+ * @notes 添加资源及分配账号
+ */
+ public function add()
+ {
+ $params = $this->request->post();
+ if (empty($params['type']) || empty($params['title']) || empty($params['file_url'])) {
+ return $this->fail('请填写完整的资源信息');
+ }
+
+ Db::startTrans();
+ try {
+ $resource = AssetResource::create([
+ 'type' => $params['type'],
+ 'title' => $params['title'],
+ 'file_url' => $params['file_url'],
+ 'cover_url' => $params['cover_url'] ?? '',
+ ]);
+
+ // 绑定用户
+ if (!empty($params['user_ids']) && is_array($params['user_ids'])) {
+ $userResources = [];
+ foreach ($params['user_ids'] as $userId) {
+ $userResources[] = [
+ 'user_id' => $userId,
+ 'resource_id' => $resource->id,
+ 'create_time' => time(),
+ ];
+ }
+ (new AssetUserResource())->saveAll($userResources);
+ }
+
+ Db::commit();
+ return $this->success('添加并分配成功', ['id' => $resource->id]);
+ } catch (\Exception $e) {
+ Db::rollback();
+ return $this->fail('操作失败: ' . $e->getMessage());
+ }
+ }
+
+ /**
+ * @notes 删除资源
+ */
+ public function delete()
+ {
+ $id = $this->request->post('id');
+ if (empty($id)) {
+ return $this->fail('缺少参数');
+ }
+
+ Db::startTrans();
+ try {
+ AssetResource::destroy($id);
+ AssetUserResource::where('resource_id', $id)->delete();
+ Db::commit();
+ return $this->success('删除成功');
+ } catch (\Exception $e) {
+ Db::rollback();
+ return $this->fail('删除失败');
+ }
+ }
+}
diff --git a/server/app/adminapi/controller/asset/AssetUserController.php b/server/app/adminapi/controller/asset/AssetUserController.php
new file mode 100644
index 00000000..8d25dc1e
--- /dev/null
+++ b/server/app/adminapi/controller/asset/AssetUserController.php
@@ -0,0 +1,109 @@
+request->get('page_no', 1);
+ $pageSize = $this->request->get('page_size', 15);
+
+ $count = AssetUser::count();
+ $lists = AssetUser::order('id', 'desc')
+ ->page($pageNo, $pageSize)
+ ->select();
+
+ return $this->data([
+ 'count' => $count,
+ 'lists' => $lists,
+ 'page_no' => $pageNo,
+ 'page_size' => $pageSize,
+ ]);
+ }
+
+ /**
+ * @notes 添加账号
+ */
+ public function add()
+ {
+ $params = $this->request->post();
+ if (empty($params['phone'])) {
+ return $this->fail('手机号不能为空');
+ }
+
+ $exist = AssetUser::where('phone', $params['phone'])->find();
+ if ($exist) {
+ return $this->fail('手机号已存在');
+ }
+
+ // Default password 123456
+ $password = empty($params['password']) ? '123456' : $params['password'];
+ $passwordHash = password_hash($password, PASSWORD_DEFAULT);
+
+ $user = AssetUser::create([
+ 'phone' => $params['phone'],
+ 'password' => $passwordHash,
+ 'status' => $params['status'] ?? 1,
+ ]);
+
+ return $this->success('添加成功', ['id' => $user->id]);
+ }
+
+ /**
+ * @notes 编辑账号
+ */
+ public function edit()
+ {
+ $params = $this->request->post();
+ if (empty($params['id'])) {
+ return $this->fail('缺少参数');
+ }
+
+ $user = AssetUser::find($params['id']);
+ if (!$user) {
+ return $this->fail('账号不存在');
+ }
+
+ if (!empty($params['phone']) && $params['phone'] != $user->phone) {
+ $exist = AssetUser::where('phone', $params['phone'])->find();
+ if ($exist) {
+ return $this->fail('手机号已存在');
+ }
+ $user->phone = $params['phone'];
+ }
+
+ if (!empty($params['password'])) {
+ $user->password = password_hash($params['password'], PASSWORD_DEFAULT);
+ }
+
+ if (isset($params['status'])) {
+ $user->status = $params['status'];
+ }
+
+ $user->save();
+ return $this->success('修改成功');
+ }
+
+ /**
+ * @notes 删除账号
+ */
+ public function delete()
+ {
+ $id = $this->request->post('id');
+ if (empty($id)) {
+ return $this->fail('缺少参数');
+ }
+
+ AssetUser::destroy($id);
+ // 也需要删除关联的资源记录
+ \app\common\model\AssetUserResource::where('user_id', $id)->delete();
+
+ return $this->success('删除成功');
+ }
+}
diff --git a/server/app/api/controller/asset/AssetAppController.php b/server/app/api/controller/asset/AssetAppController.php
new file mode 100644
index 00000000..78f2ce42
--- /dev/null
+++ b/server/app/api/controller/asset/AssetAppController.php
@@ -0,0 +1,98 @@
+request->post('phone');
+ $password = $this->request->post('password');
+
+ if (empty($phone) || empty($password)) {
+ return $this->fail('手机号或密码不能为空');
+ }
+
+ $user = AssetUser::where('phone', $phone)->find();
+ if (!$user) {
+ return $this->fail('账号不存在');
+ }
+
+ if ($user->status != 1) {
+ return $this->fail('账号已被禁用');
+ }
+
+ if (!password_verify($password, $user->password)) {
+ return $this->fail('密码错误');
+ }
+
+ // 简单生成 token (实际项目中建议用 JWT 或 Redis 存储 token)
+ $token = md5($user->id . time() . 'secret');
+ cache('asset_token_' . $token, $user->id, 86400 * 7);
+
+ return $this->success('登录成功', [
+ 'token' => $token,
+ 'user' => [
+ 'id' => $user->id,
+ 'phone' => $user->phone
+ ]
+ ]);
+ }
+
+ /**
+ * @notes 获取用户关联的资源列表
+ */
+ public function getResourceList()
+ {
+ $token = $this->request->header('token');
+ if (empty($token)) {
+ return $this->fail('请先登录', [], 401);
+ }
+
+ $userId = cache('asset_token_' . $token);
+ if (!$userId) {
+ return $this->fail('登录已过期', [], 401);
+ }
+
+ $type = $this->request->get('type', 1); // 1:图片 2:视频 3:语音
+ $pageNo = $this->request->get('page_no', 1);
+ $pageSize = $this->request->get('page_size', 20);
+
+ // 获取用户关联的资源 ID 列表
+ $resourceIds = AssetUserResource::where('user_id', $userId)->column('resource_id');
+
+ if (empty($resourceIds)) {
+ return $this->data([
+ 'lists' => [],
+ 'count' => 0,
+ 'page_no' => $pageNo,
+ 'page_size' => $pageSize,
+ ]);
+ }
+
+ $count = AssetResource::whereIn('id', $resourceIds)->where('type', $type)->count();
+ $lists = AssetResource::whereIn('id', $resourceIds)
+ ->where('type', $type)
+ ->order('id', 'desc')
+ ->page($pageNo, $pageSize)
+ ->select();
+
+ return $this->data([
+ 'lists' => $lists,
+ 'count' => $count,
+ 'page_no' => $pageNo,
+ 'page_size' => $pageSize,
+ ]);
+ }
+}
diff --git a/server/app/common/model/AssetResource.php b/server/app/common/model/AssetResource.php
new file mode 100644
index 00000000..302f5642
--- /dev/null
+++ b/server/app/common/model/AssetResource.php
@@ -0,0 +1,36 @@
+belongsToMany(AssetUser::class, AssetUserResource::class, 'user_id', 'resource_id');
+ }
+}
diff --git a/server/app/common/model/AssetUser.php b/server/app/common/model/AssetUser.php
new file mode 100644
index 00000000..10cd222c
--- /dev/null
+++ b/server/app/common/model/AssetUser.php
@@ -0,0 +1,13 @@
+