From 066686f024e36ed8e898d4b70bf441fbf767e003 Mon Sep 17 00:00:00 2001 From: Zyronon Date: Fri, 14 Nov 2025 02:00:21 +0800 Subject: [PATCH] save --- components.d.ts | 15 + src/App.vue | 6 +- src/apis/user.ts | 32 +- src/components/BackIcon.vue | 5 +- src/components/Header.vue | 21 ++ src/pages/article/BookDetail.vue | 2 +- .../article/components/TypingArticle.vue | 2 +- src/pages/setting/Setting.vue | 20 +- src/pages/user/User.vue | 351 +++++++++--------- src/pages/user/VipIntro.vue | 169 +++++++++ src/pages/user/login.vue | 301 +++++++-------- src/router.ts | 8 +- src/stores/auth.ts | 18 +- src/utils/index.ts | 20 +- 14 files changed, 581 insertions(+), 389 deletions(-) create mode 100644 src/components/Header.vue create mode 100644 src/pages/user/VipIntro.vue diff --git a/components.d.ts b/components.d.ts index 7834607a..c8c320ca 100644 --- a/components.d.ts +++ b/components.d.ts @@ -29,11 +29,13 @@ declare module 'vue' { Empty: typeof import('./src/components/Empty.vue')['default'] Form: typeof import('./src/components/base/form/Form.vue')['default'] FormItem: typeof import('./src/components/base/form/FormItem.vue')['default'] + Header: typeof import('./src/components/Header.vue')['default'] IconBxVolume: typeof import('~icons/bx/volume')['default'] IconBxVolumeFull: typeof import('~icons/bx/volume-full')['default'] IconBxVolumeLow: typeof import('~icons/bx/volume-low')['default'] IconBxVolumeMute: typeof import('~icons/bx/volume-mute')['default'] IconEosIconsLoading: typeof import('~icons/eos-icons/loading')['default'] + IconFluentAccessibilityQuestionMark20Regular: typeof import('~icons/fluent/accessibility-question-mark20-regular')['default'] IconFluentAdd16Regular: typeof import('~icons/fluent/add16-regular')['default'] IconFluentAdd20Regular: typeof import('~icons/fluent/add20-regular')['default'] IconFluentAddSquare20Regular: typeof import('~icons/fluent/add-square20-regular')['default'] @@ -41,6 +43,8 @@ declare module 'vue' { IconFluentArrowCircleRight16Regular: typeof import('~icons/fluent/arrow-circle-right16-regular')['default'] IconFluentArrowClockwise20Regular: typeof import('~icons/fluent/arrow-clockwise20-regular')['default'] IconFluentArrowLeft16Regular: typeof import('~icons/fluent/arrow-left16-regular')['default'] + IconFluentArrowMove20Regular: typeof import('~icons/fluent/arrow-move20-regular')['default'] + IconFluentArrowRepeatAll20Regular: typeof import('~icons/fluent/arrow-repeat-all20-regular')['default'] IconFluentArrowRight16Regular: typeof import('~icons/fluent/arrow-right16-regular')['default'] IconFluentArrowShuffle16Regular: typeof import('~icons/fluent/arrow-shuffle16-regular')['default'] IconFluentArrowShuffle20Filled: typeof import('~icons/fluent/arrow-shuffle20-filled')['default'] @@ -48,27 +52,38 @@ declare module 'vue' { IconFluentArrowSwap20Regular: typeof import('~icons/fluent/arrow-swap20-regular')['default'] IconFluentBookLetter20Regular: typeof import('~icons/fluent/book-letter20-regular')['default'] IconFluentBookNumber20Filled: typeof import('~icons/fluent/book-number20-filled')['default'] + IconFluentCalendarDate20Regular: typeof import('~icons/fluent/calendar-date20-regular')['default'] + IconFluentCalendarEmpty20Regular: typeof import('~icons/fluent/calendar-empty20-regular')['default'] + IconFluentCardUi20Regular: typeof import('~icons/fluent/card-ui20-regular')['default'] IconFluentCheckmark20Regular: typeof import('~icons/fluent/checkmark20-regular')['default'] IconFluentCheckmarkCircle16Filled: typeof import('~icons/fluent/checkmark-circle16-filled')['default'] IconFluentCheckmarkCircle16Regular: typeof import('~icons/fluent/checkmark-circle16-regular')['default'] IconFluentCheckmarkCircle20Filled: typeof import('~icons/fluent/checkmark-circle20-filled')['default'] + IconFluentCheckmarkCircle20Regular: typeof import('~icons/fluent/checkmark-circle20-regular')['default'] IconFluentChevronLeft20Filled: typeof import('~icons/fluent/chevron-left20-filled')['default'] IconFluentChevronLeft28Filled: typeof import('~icons/fluent/chevron-left28-filled')['default'] + IconFluentCrown20Regular: typeof import('~icons/fluent/crown20-regular')['default'] IconFluentDatabasePerson20Regular: typeof import('~icons/fluent/database-person20-regular')['default'] IconFluentDelete20Regular: typeof import('~icons/fluent/delete20-regular')['default'] IconFluentDismiss20Regular: typeof import('~icons/fluent/dismiss20-regular')['default'] IconFluentDismissCircle16Regular: typeof import('~icons/fluent/dismiss-circle16-regular')['default'] IconFluentDismissCircle20Filled: typeof import('~icons/fluent/dismiss-circle20-filled')['default'] + IconFluentDocumentSparkle20Regular: typeof import('~icons/fluent/document-sparkle20-regular')['default'] IconFluentErrorCircle20Filled: typeof import('~icons/fluent/error-circle20-filled')['default'] IconFluentErrorCircle20Regular: typeof import('~icons/fluent/error-circle20-regular')['default'] IconFluentEye16Regular: typeof import('~icons/fluent/eye16-regular')['default'] IconFluentEyeOff16Regular: typeof import('~icons/fluent/eye-off16-regular')['default'] + IconFluentHandWave20Regular: typeof import('~icons/fluent/hand-wave20-regular')['default'] IconFluentHome20Regular: typeof import('~icons/fluent/home20-regular')['default'] IconFluentKeyboardLayoutFloat20Regular: typeof import('~icons/fluent/keyboard-layout-float20-regular')['default'] + IconFluentLockClosed20Regular: typeof import('~icons/fluent/lock-closed20-regular')['default'] IconFluentMail20Regular: typeof import('~icons/fluent/mail20-regular')['default'] IconFluentMyLocation20Regular: typeof import('~icons/fluent/my-location20-regular')['default'] + IconFluentNumberSymbol20Regular: typeof import('~icons/fluent/number-symbol20-regular')['default'] IconFluentPaddingLeft20Regular: typeof import('~icons/fluent/padding-left20-regular')['default'] + IconFluentPayment20Regular: typeof import('~icons/fluent/payment20-regular')['default'] IconFluentPerson20Regular: typeof import('~icons/fluent/person20-regular')['default'] + IconFluentPhone20Regular: typeof import('~icons/fluent/phone20-regular')['default'] IconFluentPlay20Regular: typeof import('~icons/fluent/play20-regular')['default'] IconFluentQuestionCircle20Regular: typeof import('~icons/fluent/question-circle20-regular')['default'] IconFluentReplay20Regular: typeof import('~icons/fluent/replay20-regular')['default'] diff --git a/src/App.vue b/src/App.vue index a0699b92..877aca5c 100644 --- a/src/App.vue +++ b/src/App.vue @@ -12,12 +12,12 @@ import { useRoute } from "vue-router"; import { DictId } from "@/types/types.ts"; import { APP_VERSION, CAN_REQUEST, LOCAL_FILE_KEY, SAVE_DICT_KEY, SAVE_SETTING_KEY } from "@/config/env.ts"; import { syncSetting } from "@/apis"; -import {useAuthStore} from "@/stores/auth.ts"; +import {useUserStore} from "@/stores/auth.ts"; const store = useBaseStore() const runtimeStore = useRuntimeStore() const settingStore = useSettingStore() -const authStore = useAuthStore() +const userStore = useUserStore() const {setTheme} = useTheme() let lastAudioFileIdList = [] @@ -59,10 +59,10 @@ watch(settingStore.$state, (n) => { }) async function init() { + await userStore.init() await store.init() await settingStore.init() store.load = true - await authStore.init() setTheme(settingStore.theme) diff --git a/src/apis/user.ts b/src/apis/user.ts index 04349fc2..a0b3fdbe 100644 --- a/src/apis/user.ts +++ b/src/apis/user.ts @@ -1,5 +1,5 @@ import http from '@/utils/http.ts' -import {CodeType} from "@/types/types.ts"; +import { CodeType } from "@/types/types.ts"; // 用户登录接口 export interface LoginParams { @@ -10,17 +10,25 @@ export interface LoginParams { type: 'code' | 'pwd' } -export interface LoginResponse { - token: string - user: { - id: string - email?: string - phone?: string - nickname?: string - avatar?: string +export interface User { + id: string + email?: string + phone?: string + username?: string + avatar?: string, + hasPwd?: boolean, + member: { + level: number, + levelDesc: string, + active: boolean, + endTime: number, + autoRenew: boolean, + payMethod: number, + payMethodDesc: string, } } + // 用户注册接口 export interface RegisterParams { account: string @@ -59,7 +67,7 @@ export interface WechatLoginParams { } export function loginApi(params: LoginParams) { - return http('user/login', params, null, 'post') + return http('user/login', params, null, 'post') } export function registerApi(params: RegisterParams) { @@ -75,7 +83,7 @@ export function resetPasswordApi(params: ResetPasswordParams) { } export function wechatLogin(params: WechatLoginParams) { - return http('user/wechatLogin', params, null, 'post') + return http('user/wechatLogin', params, null, 'post') } export function refreshToken() { @@ -84,7 +92,7 @@ export function refreshToken() { // 获取用户信息 export function getUserInfo() { - return http('user/userInfo', null, null, 'get') + return http('user/userInfo', null, null, 'get') } // 设置密码 diff --git a/src/components/BackIcon.vue b/src/components/BackIcon.vue index 494d7cc1..376eb9e2 100644 --- a/src/components/BackIcon.vue +++ b/src/components/BackIcon.vue @@ -1,10 +1,11 @@ + + + + \ No newline at end of file diff --git a/src/pages/article/BookDetail.vue b/src/pages/article/BookDetail.vue index 92e646d2..e6fd7e1b 100644 --- a/src/pages/article/BookDetail.vue +++ b/src/pages/article/BookDetail.vue @@ -225,7 +225,7 @@ function next() {
- {{ _dateFormat(i.startDate, 'YYYY/MM/DD HH:mm') }} + {{ _dateFormat(i.startDate) }} {{ msToHourMinute(i.spend) }}
diff --git a/src/pages/article/components/TypingArticle.vue b/src/pages/article/components/TypingArticle.vue index ad6932b2..456587a6 100644 --- a/src/pages/article/components/TypingArticle.vue +++ b/src/pages/article/components/TypingArticle.vue @@ -636,7 +636,7 @@ const currentPractice = inject('currentPractice', []) {{ i === currentPractice.length - 1 ? '当前' : i + 1 - }}.  {{ _dateFormat(item.startDate, 'YYYY/MM/DD HH:mm') }} + }}.  {{ _dateFormat(item.startDate) }} {{ msToHourMinute(item.spend) }} diff --git a/src/pages/setting/Setting.vue b/src/pages/setting/Setting.vue index d6124324..a38b62b3 100644 --- a/src/pages/setting/Setting.vue +++ b/src/pages/setting/Setting.vue @@ -31,7 +31,7 @@ import Textarea from "@/components/base/Textarea.vue"; import SettingItem from "@/pages/setting/SettingItem.vue"; import {get, set} from "idb-keyval"; import {useRuntimeStore} from "@/stores/runtime.ts"; -import {useAuthStore} from "@/stores/auth.ts"; +import {useUserStore} from "@/stores/auth.ts"; const emit = defineEmits<{ toggleDisabledDialogEscKey: [val: boolean] @@ -41,7 +41,7 @@ const tabIndex = $ref(0) const settingStore = useSettingStore() const runtimeStore = useRuntimeStore() const store = useBaseStore() -const authStore = useAuthStore() +const userStore = useUserStore() //@ts-ignore const gitLastCommitHash = ref(LATEST_COMMIT_HASH); @@ -793,22 +793,22 @@ function importOldData() {

Type Words

-