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 @@ + + + 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 @@ + + + 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 @@ +