diff --git a/.workbuddy/memory/2026-07-20.md b/.workbuddy/memory/2026-07-20.md new file mode 100644 index 0000000..4e7303c --- /dev/null +++ b/.workbuddy/memory/2026-07-20.md @@ -0,0 +1,24 @@ +# 2026-07-20 工作记录 + +## 复制 site-vue 登录页到 mp-vue + +将 `/Users/gxwebsoft/VUE/site-vue/src/views/passport/login` 的登录页复制到当前项目 `mp-vue/src/views/passport/login`。 + +### 关键发现 +- 两边 `components/` 子目录完全一致,无需复制;仅 `index.vue` 有差异(源为重构后的新版本,22387 字节)。 +- 源登录页重构后依赖 site-vue 专属 API,mp-vue 原本缺失: + - `loginByUserId` / `loginByEmail`:写死了外部地址 `https://server.websoft.top/api/...`(非 mp-vue 后端) + - `loginBySuperAdminSms`:走 `SERVER_API_URL + '/loginBySuperAdminSms'` + - `listAdminsByEmailAll`(来自 `@/api/system/user`):同样指向 `server.websoft.top` +- 用户确认采用「完整移植含 API」方案,保留上述 websoft.top 硬编码地址(已知风险:登录会打到 site-vue 后端,需确认 mp-vue 后端是否支持这些接口)。 + +### 已改动文件 +1. `src/views/passport/login/index.vue` —— 直接覆盖为源版本。 +2. `src/api/passport/login/index.ts` —— 新增 `loginByUserId`、`loginBySuperAdminSms`、`loginByEmail` 三个函数。 +3. `src/api/system/user/index.ts` —— 新增 `listAdminsByEmailAll` 函数。 +4. `src/api/passport/login/model/index.ts` —— LoginParam 增加 `userId`、`email` 字段。 + +### 验证 +- 所有 import 符号在 mp-vue 中均存在(`@/router`、`QrCodeStatusResponse`、`QrLogin` 组件、`configWebsiteField` 等)。 +- 两边 `User` 模型字段一致(含 `isSuperAdmin`、`templateId`),表单初值与 `LoginForm` 类型匹配。 +- 已触发 `vue-tsc --noEmit` 全量类型检查(后台任务)确认无编译错误。 diff --git a/src/api/passport/login/index.ts b/src/api/passport/login/index.ts index 6e4a498..1a395bd 100644 --- a/src/api/passport/login/index.ts +++ b/src/api/passport/login/index.ts @@ -62,6 +62,66 @@ export async function loginBySms(data: LoginParam) { return Promise.reject(new Error(res.data.message)); } +/** + * 用户ID登录 + */ +export async function loginByUserId(data: LoginParam) { + const res = await request.post>( + 'https://server.websoft.top/api/loginByUserId', + data + ); + if (res.data.code === 0) { + setToken(res.data.data?.access_token, data.remember); + if (res.data.data?.user) { + const user = res.data.data?.user; + localStorage.setItem('TenantId', String(user.tenantId)); + localStorage.setItem('UserId', String(user.userId)); + } + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 超级管理员短信验证码登录 + */ +export async function loginBySuperAdminSms(data: LoginParam) { + const res = await request.post>( + SERVER_API_URL + '/loginBySuperAdminSms', + data + ); + if (res.data.code === 0) { + setToken(res.data.data?.access_token, data.remember); + if (res.data.data?.user) { + const user = res.data.data?.user; + localStorage.setItem('TenantId', String(user.tenantId)); + localStorage.setItem('UserId', String(user.userId)); + } + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 邮箱登录(跨租户) + */ +export async function loginByEmail(data: LoginParam) { + const res = await request.post>( + 'https://server.websoft.top/api/loginByEmail', + data + ); + if (res.data.code === 0) { + setToken(res.data.data?.access_token, data.remember); + if (res.data.data?.user) { + const user = res.data.data?.user; + localStorage.setItem('TenantId', String(user.tenantId)); + localStorage.setItem('UserId', String(user.userId)); + } + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + /** * 发送短信验证码 */ diff --git a/src/api/passport/login/model/index.ts b/src/api/passport/login/model/index.ts index 1f1c822..cd2556a 100644 --- a/src/api/passport/login/model/index.ts +++ b/src/api/passport/login/model/index.ts @@ -5,6 +5,8 @@ import type { User } from '@/api/system/user/model'; export interface LoginParam { // 账号 username?: string; + // 用户ID(loginByUserId 登录使用) + userId?: number; // 密码 password?: string; // 租户id @@ -13,6 +15,8 @@ export interface LoginParam { remember?: boolean; // 手机号码 phone?: string; + // 邮箱 + email?: string; // 短信验证码 code?: string; } diff --git a/src/api/system/user/index.ts b/src/api/system/user/index.ts index 9f49596..c284bf1 100644 --- a/src/api/system/user/index.ts +++ b/src/api/system/user/index.ts @@ -283,6 +283,23 @@ export async function listAdminsByPhoneAll(params?: UserParam) { return Promise.reject(new Error(res.data.message)); } +/** + * 选择邮箱下管理员账号登录(跨租户) + * @param params + */ +export async function listAdminsByEmailAll(params?: UserParam) { + const res = await request.get>( + 'https://server.websoft.top/api/listAdminsByEmailAll', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + /** * 导出用户列表 */ diff --git a/src/views/passport/login/index.vue b/src/views/passport/login/index.vue index 1f9c514..31ae307 100644 --- a/src/views/passport/login/index.vue +++ b/src/views/passport/login/index.vue @@ -27,24 +27,26 @@ :rules="rules" class="login-form ele-bg-white" > - @@ -189,8 +154,8 @@ > {{ loading ? t('login.loading') : t('login.login') }} - 还没有账号?联系管理员开通 @@ -204,7 +169,7 @@ @@ -272,7 +237,7 @@