系统完善

This commit is contained in:
zhonghua 2026-03-03 11:17:29 +08:00
parent 98ba531305
commit 628e0d9461
6 changed files with 1063 additions and 47 deletions

2
.gitignore vendored
View File

@ -36,7 +36,7 @@ reading-platform-backend/prisma/migrations
*.iml *.iml
*.ipr *.ipr
*.iws *.iws
*/package-lock.json
# 日志 # 日志
logs/ logs/
*.log *.log

File diff suppressed because it is too large Load Diff

View File

@ -11,8 +11,10 @@ declare module 'vue' {
AAvatar: typeof import('ant-design-vue/es')['Avatar'] AAvatar: typeof import('ant-design-vue/es')['Avatar']
ABadge: typeof import('ant-design-vue/es')['Badge'] ABadge: typeof import('ant-design-vue/es')['Badge']
AButton: typeof import('ant-design-vue/es')['Button'] AButton: typeof import('ant-design-vue/es')['Button']
AButtonGroup: typeof import('ant-design-vue/es')['ButtonGroup']
ACard: typeof import('ant-design-vue/es')['Card'] ACard: typeof import('ant-design-vue/es')['Card']
ACheckbox: typeof import('ant-design-vue/es')['Checkbox'] ACheckbox: typeof import('ant-design-vue/es')['Checkbox']
ACheckboxGroup: typeof import('ant-design-vue/es')['CheckboxGroup']
ACol: typeof import('ant-design-vue/es')['Col'] ACol: typeof import('ant-design-vue/es')['Col']
ACollapse: typeof import('ant-design-vue/es')['Collapse'] ACollapse: typeof import('ant-design-vue/es')['Collapse']
ACollapsePanel: typeof import('ant-design-vue/es')['CollapsePanel'] ACollapsePanel: typeof import('ant-design-vue/es')['CollapsePanel']
@ -47,16 +49,21 @@ declare module 'vue' {
APopconfirm: typeof import('ant-design-vue/es')['Popconfirm'] APopconfirm: typeof import('ant-design-vue/es')['Popconfirm']
AProgress: typeof import('ant-design-vue/es')['Progress'] AProgress: typeof import('ant-design-vue/es')['Progress']
ARadio: typeof import('ant-design-vue/es')['Radio'] ARadio: typeof import('ant-design-vue/es')['Radio']
ARadioButton: typeof import('ant-design-vue/es')['RadioButton']
ARadioGroup: typeof import('ant-design-vue/es')['RadioGroup'] ARadioGroup: typeof import('ant-design-vue/es')['RadioGroup']
ARangePicker: typeof import('ant-design-vue/es')['RangePicker'] ARangePicker: typeof import('ant-design-vue/es')['RangePicker']
ARate: typeof import('ant-design-vue/es')['Rate'] ARate: typeof import('ant-design-vue/es')['Rate']
AResult: typeof import('ant-design-vue/es')['Result']
ARow: typeof import('ant-design-vue/es')['Row'] ARow: typeof import('ant-design-vue/es')['Row']
ASelect: typeof import('ant-design-vue/es')['Select'] ASelect: typeof import('ant-design-vue/es')['Select']
ASelectOptGroup: typeof import('ant-design-vue/es')['SelectOptGroup']
ASelectOption: typeof import('ant-design-vue/es')['SelectOption'] ASelectOption: typeof import('ant-design-vue/es')['SelectOption']
ASkeleton: typeof import('ant-design-vue/es')['Skeleton'] ASkeleton: typeof import('ant-design-vue/es')['Skeleton']
ASpace: typeof import('ant-design-vue/es')['Space'] ASpace: typeof import('ant-design-vue/es')['Space']
ASpin: typeof import('ant-design-vue/es')['Spin'] ASpin: typeof import('ant-design-vue/es')['Spin']
AStatistic: typeof import('ant-design-vue/es')['Statistic'] AStatistic: typeof import('ant-design-vue/es')['Statistic']
AStep: typeof import('ant-design-vue/es')['Step']
ASteps: typeof import('ant-design-vue/es')['Steps']
ASubMenu: typeof import('ant-design-vue/es')['SubMenu'] ASubMenu: typeof import('ant-design-vue/es')['SubMenu']
ASwitch: typeof import('ant-design-vue/es')['Switch'] ASwitch: typeof import('ant-design-vue/es')['Switch']
ATable: typeof import('ant-design-vue/es')['Table'] ATable: typeof import('ant-design-vue/es')['Table']

View File

@ -20,54 +20,33 @@
<!-- 角色选择 --> <!-- 角色选择 -->
<div class="role-section"> <div class="role-section">
<div <div v-for="role in roles" :key="role.value" :class="['role-btn', { active: formState.role === role.value }]"
v-for="role in roles" @click="selectRole(role.value)">
:key="role.value"
:class="['role-btn', { active: formState.role === role.value }]"
@click="selectRole(role.value)"
>
<component :is="role.icon" /> <component :is="role.icon" />
<span>{{ role.label }}</span> <span>{{ role.label }}</span>
</div> </div>
</div> </div>
<!-- 登录表单 --> <!-- 登录表单 -->
<a-form <a-form :model="formState" @finish="handleLogin" layout="vertical" class="login-form">
:model="formState"
@finish="handleLogin"
layout="vertical"
class="login-form"
>
<a-form-item name="account" :rules="[{ required: true, message: '请输入账号' }]"> <a-form-item name="account" :rules="[{ required: true, message: '请输入账号' }]">
<a-input <a-input v-model:value="formState.account" placeholder="请输入账号" size="large" allow-clear>
v-model:value="formState.account" <template #prefix>
placeholder="请输入账号" <UserOutlined />
size="large" </template>
allow-clear
>
<template #prefix><UserOutlined /></template>
</a-input> </a-input>
</a-form-item> </a-form-item>
<a-form-item name="password" :rules="[{ required: true, message: '请输入密码' }]"> <a-form-item name="password" :rules="[{ required: true, message: '请输入密码' }]">
<a-input-password <a-input-password v-model:value="formState.password" placeholder="请输入密码" size="large">
v-model:value="formState.password" <template #prefix>
placeholder="请输入密码" <LockOutlined />
size="large" </template>
>
<template #prefix><LockOutlined /></template>
</a-input-password> </a-input-password>
</a-form-item> </a-form-item>
<a-form-item> <a-form-item>
<a-button <a-button type="primary" html-type="submit" size="large" block :loading="loading" class="login-btn">
type="primary"
html-type="submit"
size="large"
block
:loading="loading"
class="login-btn"
>
登录 登录
</a-button> </a-button>
</a-form-item> </a-form-item>
@ -77,12 +56,7 @@
<div class="test-section"> <div class="test-section">
<div class="test-title">快速体验</div> <div class="test-title">快速体验</div>
<div class="test-list"> <div class="test-list">
<span <span v-for="acc in testAccounts" :key="acc.role" class="test-item" @click="fillAccount(acc)">
v-for="acc in testAccounts"
:key="acc.role"
class="test-item"
@click="fillAccount(acc)"
>
{{ acc.label }}: {{ acc.account }} {{ acc.label }}: {{ acc.account }}
</span> </span>
</div> </div>
@ -382,9 +356,8 @@ $bg-cream: #FEFEFE;
} }
} }
// - //
.test-section { .test-section {
display: none;
margin-top: 24px; margin-top: 24px;
padding-top: 20px; padding-top: 20px;
border-top: 1px solid #F5F5F5; border-top: 1px solid #F5F5F5;

View File

@ -1,5 +1,7 @@
/// <reference types="vite/client" /> /// <reference types="vite/client" />
declare module 'virtual:uno.css' {}
interface ImportMetaEnv { interface ImportMetaEnv {
readonly VITE_API_URL: string readonly VITE_API_URL: string
readonly VITE_SERVER_BASE_URL: string readonly VITE_SERVER_BASE_URL: string