From 5f48917d3fe8d1838e26037f65f15fde0b5a5ca1 Mon Sep 17 00:00:00 2001 From: fanbook-wangdage <124357765+fanbook-wangdage@users.noreply.github.com> Date: Sun, 21 Dec 2025 17:10:02 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=83=A8=E5=88=86?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD=E5=92=8C?= =?UTF-8?q?=E5=85=AC=E5=91=8A=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 1 + src/api/announcement.ts | 87 +++++ src/api/auth.ts | 25 ++ src/api/user.ts | 60 ++++ src/components/SidebarItem.vue | 22 +- src/layouts/DefaultLayout.vue | 48 ++- src/main.ts | 3 + src/router/index.ts | 7 +- src/router/permission.ts | 37 ++ src/stores/user.ts | 31 ++ src/utils/request.ts | 56 ++- src/views/announcement/index.vue | 577 +++++++++++++++++++++++++++++++ src/views/login/index.vue | 129 ++++++- src/views/user/index.vue | 188 ++++++++++ 14 files changed, 1257 insertions(+), 14 deletions(-) create mode 100644 .env.development create mode 100644 src/api/announcement.ts create mode 100644 src/api/auth.ts create mode 100644 src/api/user.ts create mode 100644 src/router/permission.ts create mode 100644 src/stores/user.ts create mode 100644 src/views/announcement/index.vue create mode 100644 src/views/user/index.vue diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..6996edc --- /dev/null +++ b/.env.development @@ -0,0 +1 @@ +VITE_API_BASE_URL = http://localhost:5222/ diff --git a/src/api/announcement.ts b/src/api/announcement.ts new file mode 100644 index 0000000..54d64f9 --- /dev/null +++ b/src/api/announcement.ts @@ -0,0 +1,87 @@ +import request from '@/utils/request' + +/** 公告数据类型 */ +export interface Announcement { + Content: string + Id: number + LastUpdateTime: number + Link: string | null + Locale: string | null + MaxPresentVersion: string | null + Severity: number + Title: string +} + +/** 公告列表响应数据类型 */ +export interface AnnouncementListResponse { + code: number + data: Announcement[] + message: string +} + +/** + * 获取公告列表 API + * POST /Announcement/List + */ +export function getAnnouncementListApi(): Promise { + return request({ + url: '/Announcement/List', + method: 'post', + }) +} + +/** 创建公告请求参数类型 */ +export interface CreateAnnouncementRequest { + Content: string + Title: string + Link?: string | null + Locale?: string | null + MaxPresentVersion?: string | null + Severity?: number | null +} + +/** 创建公告响应数据类型 */ +export interface CreateAnnouncementResponse { + code: number + data: { + Id: number + } + message: string +} + +/** + * 创建公告 API + * POST /web-api/announcement + * 注意:由于request.ts拦截器处理,实际返回的是data部分,即 { Id: number } + */ +export function createAnnouncementApi(params: CreateAnnouncementRequest): Promise<{ Id: number }> { + return request({ + url: '/web-api/announcement', + method: 'post', + data: params, + }) +} + +/** + * 编辑公告 API + * PUT /web-api/announcement/{announcement_id} + */ +export function updateAnnouncementApi(id: number, params: CreateAnnouncementRequest): Promise { + return request({ + url: `/web-api/announcement/${id}`, + method: 'put', + data: params, + }) +} + +/** + * 删除公告 API + * DELETE /web-api/announcement/{announcement_id} + */ +export function deleteAnnouncementApi(id: number): Promise { + return request({ + url: `/web-api/announcement/${id}`, + method: 'delete', + }) +} + diff --git a/src/api/auth.ts b/src/api/auth.ts new file mode 100644 index 0000000..9cefb77 --- /dev/null +++ b/src/api/auth.ts @@ -0,0 +1,25 @@ +import request from '@/utils/request' + +/** 登录请求参数 */ +export interface WebLoginParams { + email: string + password: string +} + +/** 登录返回数据 */ +export interface WebLoginResult { + access_token: string + expires_in: number +} + +/** + * WEB 登录 API + * POST /web-api/login + */ +export function webLoginApi(data: WebLoginParams) { + return request({ + url: '/web-api/login', + method: 'post', + data, + }) +} diff --git a/src/api/user.ts b/src/api/user.ts new file mode 100644 index 0000000..e862734 --- /dev/null +++ b/src/api/user.ts @@ -0,0 +1,60 @@ +import request from '@/utils/request' + +/** 用户信息数据结构 */ +export interface UserInfo { + CdnExpireAt: string + GachaLogExpireAt: string + IsLicensedDeveloper: boolean + IsMaintainer: boolean + NormalizedUserName: string + UserName: string +} + +/** 用户列表中的用户数据结构 */ +export interface UserListItem { + CdnExpireAt: string + CreatedAt: string + GachaLogExpireAt: string + IsLicensedDeveloper: boolean + IsMaintainer: boolean + NormalizedUserName: string + UserName: string + _id: string + email: string +} + +/** API响应数据结构 */ +export interface ApiResponse { + code: number + data: T + message: string +} + +/** + * 获取用户信息 + * GET /Passport/v2/UserInfo + */ +export function getUserInfoApi(): Promise { + return request({ + url: '/Passport/v2/UserInfo', + method: 'get', + }) +} + +/** + * 获取用户列表 + * GET /web-api/users + * @param q 搜索参数,可搜索用户名、邮箱、_id + */ +export function getUserListApi(q?: string): Promise { + const params: Record = {} + if (q) { + params.q = q + } + + return request({ + url: '/web-api/users', + method: 'get', + params, + }) +} diff --git a/src/components/SidebarItem.vue b/src/components/SidebarItem.vue index 28b5b51..0f623a2 100644 --- a/src/components/SidebarItem.vue +++ b/src/components/SidebarItem.vue @@ -12,13 +12,13 @@ {{ item.meta?.title }} - + @@ -32,10 +32,24 @@ import type { RouteRecordRaw } from 'vue-router' import * as icons from '@element-plus/icons-vue' -defineProps<{ +interface Props { routes: RouteRecordRaw[] -}>() + parentPath?: string +} + +const props = withDefaults(defineProps(), { + parentPath: '' +}) const hasChildren = (route: RouteRecordRaw) => route.children && route.children.length > 0 + +const getFullPath = (route: RouteRecordRaw) => { + // 如果是绝对路径,直接返回 + if (route.path.startsWith('/')) { + return route.path + } + // 否则拼接父级路径 + return props.parentPath ? `/${props.parentPath}/${route.path}` : `/${route.path}` +} diff --git a/src/layouts/DefaultLayout.vue b/src/layouts/DefaultLayout.vue index 2bce8cb..422959a 100644 --- a/src/layouts/DefaultLayout.vue +++ b/src/layouts/DefaultLayout.vue @@ -34,6 +34,20 @@ @change="themeStore.toggleTheme" /> + + + + + @@ -47,14 +61,31 @@ + + \ No newline at end of file diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 05253b5..1824c22 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -1,7 +1,128 @@ - \ No newline at end of file + + + + + diff --git a/src/views/user/index.vue b/src/views/user/index.vue new file mode 100644 index 0000000..cbf1b0d --- /dev/null +++ b/src/views/user/index.vue @@ -0,0 +1,188 @@ + + + + + \ No newline at end of file From 29b8e6e8bf64ffee6b8cac672e466cd783ec4a61 Mon Sep 17 00:00:00 2001 From: fanbook-wangdage <124357765+fanbook-wangdage@users.noreply.github.com> Date: Sun, 21 Dec 2025 20:13:58 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/router/permission.ts | 2 +- src/views/user/index.vue | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/router/permission.ts b/src/router/permission.ts index 421ac01..99c2b1b 100644 --- a/src/router/permission.ts +++ b/src/router/permission.ts @@ -1,7 +1,7 @@ import router from './index' import { useUserStore } from '@/stores/user' -router.beforeEach(async (to, from, next) => { +router.beforeEach(async (to, _ , next) => { const userStore = useUserStore() // 未登录 diff --git a/src/views/user/index.vue b/src/views/user/index.vue index cbf1b0d..a6c2cd7 100644 --- a/src/views/user/index.vue +++ b/src/views/user/index.vue @@ -142,17 +142,17 @@ function handleRefresh() { } } -function handleAdd() { - ElMessage.info('新增用户功能待实现') -} +// function handleAdd() { +// ElMessage.info('新增用户功能待实现') +// } -function handleEdit(row: UserListItem) { - ElMessage.info(`编辑用户 ${row.UserName} 功能待实现`) -} +// function handleEdit(row: UserListItem) { +// ElMessage.info(`编辑用户 ${row.UserName} 功能待实现`) +// } -function handleDelete(row: UserListItem) { - ElMessage.info(`删除用户 ${row.UserName} 功能待实现`) -} +// function handleDelete(row: UserListItem) { +// ElMessage.info(`删除用户 ${row.UserName} 功能待实现`) +// } // 页面加载时获取用户列表 onMounted(() => { From d4de66cd8aca6a8d212fc496910709a7c9ebeb07 Mon Sep 17 00:00:00 2001 From: fanbook-wangdage <124357765+fanbook-wangdage@users.noreply.github.com> Date: Fri, 16 Jan 2026 11:38:18 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=85=AC=E5=91=8A?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E5=8F=91=E8=A1=8C=E7=89=88=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.production | 1 + src/api/announcement.ts | 2 ++ src/views/announcement/index.vue | 26 ++++++++++++++++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 .env.production diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..0eb9e82 --- /dev/null +++ b/.env.production @@ -0,0 +1 @@ +VITE_API_BASE_URL = https://htserver.wdg.cloudns.ch/api/ diff --git a/src/api/announcement.ts b/src/api/announcement.ts index 54d64f9..88326ce 100644 --- a/src/api/announcement.ts +++ b/src/api/announcement.ts @@ -10,6 +10,7 @@ export interface Announcement { MaxPresentVersion: string | null Severity: number Title: string + Distribution: string | null } /** 公告列表响应数据类型 */ @@ -38,6 +39,7 @@ export interface CreateAnnouncementRequest { Locale?: string | null MaxPresentVersion?: string | null Severity?: number | null + Distribution?: string | null } /** 创建公告响应数据类型 */ diff --git a/src/views/announcement/index.vue b/src/views/announcement/index.vue index 42ef60f..17041d1 100644 --- a/src/views/announcement/index.vue +++ b/src/views/announcement/index.vue @@ -28,6 +28,14 @@ + + +