diff --git a/package.json b/package.json index fceb3d2d..67aca91b 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "@iconify-json/simple-icons": "^1.2.48", "@iconify-json/streamline": "^1.2.5", "@iconify-json/system-uicons": "^1.2.4", + "@iconify-json/uiw": "^1.2.3", "@types/file-saver": "^2.0.7", "@types/lodash-es": "^4.17.12", "@types/md5": "^2.1.33", diff --git a/public/static-home.html b/public/static-home.html index f8aee9f1..ffc7a452 100644 --- a/public/static-home.html +++ b/public/static-home.html @@ -285,6 +285,10 @@ border-radius: 1rem; margin-top: 1.2rem; } + + .cursor-pointer{ + cursor: pointer; + } - - - - - - - 安全支付 - 选择支付方式完成订单 - - - - - - - - Choose a way to pay - - - - - {{ method.icon }} - - {{ method.name }} - {{ method.description }} - - - - - - - - - - - - - 订单概要 - - 更改 - - - - - - 付费方案(月费)订阅 - - 从 {{ orderData.startDate }} 开始: - - - - - - {{ orderData.currency }}{{ orderData.price }} - / {{ orderData.unit }} - - {{ orderData.vatText }} - - - - - 你将于 {{ orderData.startDate }} 付费。 - - - 在试订期间和订阅开始前的24小时内,你可随时通过 "账户" > "订阅" 页面取消或改订。 - - - - - - - - 我同意 Lingvist 的 - 服务条款 - - - - - - 选择 - - - - - - - - - \ No newline at end of file diff --git a/src/pages/user/User.vue b/src/pages/user/User.vue index 29b5da90..7fbac5e9 100644 --- a/src/pages/user/User.vue +++ b/src/pages/user/User.vue @@ -246,13 +246,17 @@ function subscribe() { } +function onFileChange(e) { + console.log('e', e) + +} - + @@ -279,8 +283,7 @@ function subscribe() { - - + 帐户 @@ -458,14 +461,14 @@ function subscribe() { - + 设置密码 在此输入密码 - + + + + + + + 同步进度 + + + + + + + + @@ -551,8 +568,7 @@ function subscribe() { - - + 订阅信息 @@ -563,13 +579,13 @@ function subscribe() { 当前计划 - {{ member?.levelDesc }} + {{ member?.planDesc }} 状态 - + {{ member?.status }} @@ -609,6 +625,7 @@ function subscribe() { + - diff --git a/src/pages/user/login.vue b/src/pages/user/login.vue index 27c1d3be..921e4028 100644 --- a/src/pages/user/login.vue +++ b/src/pages/user/login.vue @@ -5,7 +5,7 @@ import BaseInput from "@/components/base/BaseInput.vue"; import BaseButton from "@/components/BaseButton.vue"; import {APP_NAME} from "@/config/env.ts"; import {useUserStore} from "@/stores/auth.ts"; -import {loginApi, LoginParams, registerApi, resetPasswordApi, sendCode} from "@/apis/user.ts"; +import {loginApi, LoginParams, registerApi, resetPasswordApi} from "@/apis/user.ts"; import {accountRules, codeRules, passwordRules, phoneRules} from "@/utils/validation.ts"; import Toast from "@/components/base/toast/Toast.ts"; import FormItem from "@/components/base/form/FormItem.vue"; @@ -15,9 +15,9 @@ import {FormInstance} from "@/components/base/form/types.ts"; import {PASSWORD_CONFIG, PHONE_CONFIG} from "@/config/auth.ts"; import {CodeType} from "@/types/types.ts"; import Code from "@/pages/user/Code.vue"; -import BackIcon from "@/components/BackIcon.vue"; -import {useNav} from "@/utils"; +import {isNewUser, useNav} from "@/utils"; import Header from "@/components/Header.vue"; +import PopConfirm from "@/components/PopConfirm.vue"; // 状态管理 const userStore = useUserStore() @@ -28,13 +28,14 @@ const router = useNav() let currentMode = $ref<'login' | 'register' | 'forgot'>('login') let loginType = $ref<'code' | 'password'>('code') // 默认验证码登录 let loading = $ref(false) -let codeCountdown = $ref(0) let showWechatQR = $ref(true) let wechatQRUrl = $ref('https://open.weixin.qq.com/connect/qrcode/041GmMJM2wfM0w3D') // 微信二维码状态:idle-正常/等待扫码,scanned-已扫码待确认,expired-已过期,cancelled-已取消 let qrStatus = $ref<'idle' | 'scanned' | 'expired' | 'cancelled'>('idle') let qrExpireTimer: ReturnType | null = null let qrCheckInterval: ReturnType | null = null +let waitForImportConfirmation = $ref(true) +let isImporting = $ref(true) const QR_EXPIRE_TIME = 5 * 60 * 1000 // 5分钟过期 @@ -153,7 +154,7 @@ async function handleRegister() { let res = await registerApi(registerForm) if (res.success) { userStore.setToken(res.data.token) - userStore.setUser(res.data.user) + userStore.setUser(res.data.user as any) Toast.success('注册成功') // 跳转到首页或用户中心 router.push('/') @@ -284,7 +285,7 @@ onBeforeUnmount(() => { - + @@ -581,6 +582,44 @@ onBeforeUnmount(() => { + + + 同步数据确认 + + + 检测到您本地存在使用记录 + 是否需要同步到账户中? + + + 正在导入中 + + + 您的用户数据已自动下载到您的电脑中 + + + 随后将开始数据同步 + + + 如果您的数据量很大,这将是一个耗时操作 + + + 请耐心等待,请勿关闭此页面 + + + + + + 放弃数据 + + + 确认同步 + + + diff --git a/src/router.ts b/src/router.ts index e2e7f98d..aa6004a4 100644 --- a/src/router.ts +++ b/src/router.ts @@ -1,5 +1,5 @@ import * as VueRouter from 'vue-router' -import { RouteRecordRaw } from 'vue-router' +import {RouteRecordRaw} from 'vue-router' import WordsPage from "@/pages/word/WordsPage.vue"; import Layout from "@/pages/layout.vue"; import ArticlesPage from "@/pages/article/ArticlesPage.vue"; @@ -13,7 +13,6 @@ import Setting from "@/pages/setting/Setting.vue"; import Login from "@/pages/user/login.vue"; import User from "@/pages/user/User.vue"; import VipIntro from "@/pages/user/VipIntro.vue"; -import Pay from "@/pages/user/Pay.vue"; // import { useAuthStore } from "@/stores/auth.ts"; export const routes: RouteRecordRaw[] = [ @@ -39,7 +38,6 @@ export const routes: RouteRecordRaw[] = [ {path: 'login', component: Login}, {path: 'user', component: User}, {path: 'vip', component: VipIntro}, - {path: 'pay', component: Pay}, ] }, {path: '/batch-edit-article', component: () => import("@/pages/article/BatchEditArticlePage.vue")}, diff --git a/src/stores/auth.ts b/src/stores/auth.ts index 4a02f29e..7deef001 100644 --- a/src/stores/auth.ts +++ b/src/stores/auth.ts @@ -1,7 +1,7 @@ -import { defineStore } from 'pinia' -import { ref } from 'vue' -import { getUserInfo, User } from '@/apis/user.ts' -import { AppEnv } from "@/config/env.ts"; +import {defineStore} from 'pinia' +import {ref} from 'vue' +import {getUserInfo, User} from '@/apis/user.ts' +import {AppEnv} from "@/config/env.ts"; import Toast from "@/components/base/toast/Toast.ts"; export const useUserStore = defineStore('user', () => { @@ -42,6 +42,7 @@ export const useUserStore = defineStore('user', () => { // 获取用户信息 async function fetchUserInfo() { + if (!AppEnv.CAN_REQUEST) return false try { const res = await getUserInfo() if (res.success) { @@ -58,11 +59,9 @@ export const useUserStore = defineStore('user', () => { // 初始化用户状态 async function init() { - if (AppEnv.CAN_REQUEST) { - const success = await fetchUserInfo() - if (!success) { - clearToken() - } + const success = await fetchUserInfo() + if (!success) { + clearToken() } } diff --git a/src/stores/base.ts b/src/stores/base.ts index e542bef5..8910a258 100644 --- a/src/stores/base.ts +++ b/src/stores/base.ts @@ -22,7 +22,7 @@ export interface BaseState { dictListVersion: number } -export const DefaultBaseState = (): BaseState => ({ +export const getDefaultBaseState = (): BaseState => ({ simpleWords: [ 'a', 'an', 'i', 'my', 'me', 'you', 'your', 'he', 'his', 'she', 'her', 'it', @@ -51,7 +51,7 @@ export const DefaultBaseState = (): BaseState => ({ export const useBaseStore = defineStore('base', { state: (): BaseState => { - return DefaultBaseState() + return getDefaultBaseState() }, getters: { collectWord(): Dict { diff --git a/src/utils/index.ts b/src/utils/index.ts index c5a35bb3..3c5901d9 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,4 +1,4 @@ -import {BaseState, DefaultBaseState, useBaseStore} from "@/stores/base.ts"; +import {BaseState, getDefaultBaseState, useBaseStore} from "@/stores/base.ts"; import {getDefaultSettingState, SettingState} from "@/stores/setting.ts"; import {Dict, DictId, DictResource, DictType} from "@/types/types.ts"; import {useRouter} from "vue-router"; @@ -28,7 +28,7 @@ export function checkAndUpgradeSaveDict(val: any) { // console.log(configStr) // console.log('s', new Blob([val]).size) // val = '' - let defaultState = DefaultBaseState() + let defaultState = getDefaultBaseState() if (val) { try { let data: any @@ -450,3 +450,12 @@ export function resourceWrap(resource: string, version?: number) { } return resource; } + +// check if it is a new user +export async function isNewUser() { + let isNew = false + let base = useBaseStore() + console.log(JSON.stringify(base.$state)) + console.log(JSON.stringify(getDefaultBaseState())) + return JSON.stringify(base.$state) === JSON.stringify({...getDefaultBaseState(), ...{load: true}}) +} \ No newline at end of file diff --git a/uno.config.ts b/uno.config.ts index 1ad49620..2c9a07c6 100644 --- a/uno.config.ts +++ b/uno.config.ts @@ -6,6 +6,7 @@ export default defineConfig({ 'bg-primary': 'bg-[var(--color-primary)]', 'bg-second': 'bg-[var(--color-second)]', 'bg-third': 'bg-[var(--color-third)]', + 'bg-fourth': 'bg-[var(--color-fourth)]', 'bg-card-active': 'bg-[var(--color-card-active)]', 'bg-item': 'bg-[var(--color-item-bg)]', 'bg-reverse-white': 'bg-[var(--color-reverse-white)]',
选择支付方式完成订单
- 你将于 {{ orderData.startDate }} 付费。 -
- 在试订期间和订阅开始前的24小时内,你可随时通过 "账户" > "订阅" 页面取消或改订。 -