From e3db229f41d261ef803b427ad89f77ba21ff3912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=AB=E5=9C=B0=E5=83=A7?= <357099073@qq.com> Date: Wed, 30 Sep 2026 00:57:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=B9=E9=87=8F=E4=BC=98=E5=8C=96=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/api/passwordStore.js | 4 + backend/src/api/wechatMp.js | 2 +- backend/src/router/index.js | 11 +- backend/src/views/auth/mpLogin.vue | 216 ++++++++ .../components/PasswordImportDialog.vue | 177 +++++++ .../src/views/tools/passwordStore/index.vue | 131 +++-- .../tools/passwordStore/passwordExcel.js | 126 +++++ .../views/user/components/WechatBindCard.vue | 144 +++--- go/conf/app.conf | 3 + go/controllers/api_wechat_mp.go | 149 ++++++ go/controllers/auth/login.go | 18 +- go/controllers/auth/wechat_scan.go | 143 ++++++ go/controllers/backend_wechat_mp.go | 18 +- go/controllers/password_store.go | 471 +++++++++++++++++- go/controllers/platform_admin_user.go | 25 +- go/controllers/platform_auth.go | 2 +- go/controllers/platform_wechat_mp.go | 143 +++++- .../sql/alter_platform_admin_user_birth.sql | 4 + ...latform_wechat_mp_config_follow_qrcode.sql | 5 + .../create_platform_wechat_mp_login_token.sql | 16 + .../create_platform_wechat_mp_scan_login.sql | 20 + go/models/admin_user.go | 1 + go/models/init.go | 2 + go/models/wechat_mp.go | 44 ++ go/routers/auth/auth.go | 4 + go/routers/backend/backend.go | 2 + go/routers/platform/platform.go | 2 + go/routers/platform/wechat_mp.go | 7 + go/services/admin_user.go | 3 +- go/services/platform_auth.go | 10 +- go/services/wechatmp/bind.go | 38 +- go/services/wechatmp/config.go | 39 +- go/services/wechatmp/login.go | 142 ++++++ go/services/wechatmp/menu.go | 103 ++++ go/services/wechatmp/scanlogin.go | 232 +++++++++ go/views/auth/login.tpl | 134 ++++- platform/components.d.ts | 1 - platform/src/api/passwordStore.js | 4 + platform/src/api/wechatMp.js | 26 + .../components/notificationSettings.vue | 110 +++- .../components/PasswordImportDialog.vue | 177 +++++++ .../src/views/tools/passwordStore/index.vue | 131 +++-- .../tools/passwordStore/passwordExcel.js | 126 +++++ 43 files changed, 2959 insertions(+), 207 deletions(-) create mode 100644 backend/src/views/auth/mpLogin.vue create mode 100644 backend/src/views/tools/passwordStore/components/PasswordImportDialog.vue create mode 100644 backend/src/views/tools/passwordStore/passwordExcel.js create mode 100644 go/controllers/auth/wechat_scan.go create mode 100644 go/docs/sql/alter_platform_admin_user_birth.sql create mode 100644 go/docs/sql/alter_platform_wechat_mp_config_follow_qrcode.sql create mode 100644 go/docs/sql/create_platform_wechat_mp_login_token.sql create mode 100644 go/docs/sql/create_platform_wechat_mp_scan_login.sql create mode 100644 go/services/wechatmp/login.go create mode 100644 go/services/wechatmp/menu.go create mode 100644 go/services/wechatmp/scanlogin.go create mode 100644 platform/src/views/tools/passwordStore/components/PasswordImportDialog.vue create mode 100644 platform/src/views/tools/passwordStore/passwordExcel.js diff --git a/backend/src/api/passwordStore.js b/backend/src/api/passwordStore.js index 4933d03..a1c8afc 100644 --- a/backend/src/api/passwordStore.js +++ b/backend/src/api/passwordStore.js @@ -6,3 +6,7 @@ export const getPasswordStoreDetail = (id) => request({ url: `${resource}/detail export const createPasswordStore = (data) => request({ url: `${resource}/create`, method: 'post', data }) export const updatePasswordStore = (id, data) => request({ url: `${resource}/update/${id}`, method: 'post', data }) export const deletePasswordStore = (id) => request({ url: `${resource}/delete/${id}`, method: 'delete' }) +/** 导出全部记录(不受列表 200 条限制),返回 data.list */ +export const exportPasswordStore = () => request({ url: `${resource}/export`, method: 'get' }) +/** 批量导入:rows 为 Excel/CSV 解析后的行数据,返回 created/updated/failed/failures */ +export const importPasswordStore = (rows) => request({ url: `${resource}/import`, method: 'post', data: { rows } }) diff --git a/backend/src/api/wechatMp.js b/backend/src/api/wechatMp.js index 32e91b6..d253d76 100644 --- a/backend/src/api/wechatMp.js +++ b/backend/src/api/wechatMp.js @@ -5,7 +5,7 @@ import request from "@/utils/request"; * 流程:生成二维码 → 微信扫码关注 → 公众号回复验证码 → 输入验证码完成绑定 *************************************************/ -/** 发起绑定:生成带参数二维码 */ +/** 发起绑定:返回绑定指引(未认证公众号无带参二维码,公众号内发送「验证码」取码) */ export function startWechatMpBind() { return request({ url: "/backend/wechatMp/bind/start", diff --git a/backend/src/router/index.js b/backend/src/router/index.js index 67d6d8a..16c50b9 100644 --- a/backend/src/router/index.js +++ b/backend/src/router/index.js @@ -141,6 +141,13 @@ const staticRoutes = [ component: () => import("@/views/auth/callback.vue"), meta: { requiresAuth: false } }, + // 微信公众号一次性链接登录页(公众号发「登录」/扫码确认 → 链接跳到这里兑换令牌) + { + path: "/mp-login", + name: "MpLogin", + component: () => import("@/views/auth/mpLogin.vue"), + meta: { requiresAuth: false } + }, { path: "/home", name: "Home", @@ -310,8 +317,8 @@ async function gotoAuthorize() { router.beforeEach(async (to, from, next) => { const token = localStorage.getItem("token"); - // 认证中心回跳页:始终放行,由页面自身完成 code 换令牌 - if (to.path === "/auth/callback") { + // 认证中心回跳页 / 微信登录兑换页:始终放行,由页面自身完成令牌兑换 + if (to.path === "/auth/callback" || to.path === "/mp-login") { next(); return; } diff --git a/backend/src/views/auth/mpLogin.vue b/backend/src/views/auth/mpLogin.vue new file mode 100644 index 0000000..0055edc --- /dev/null +++ b/backend/src/views/auth/mpLogin.vue @@ -0,0 +1,216 @@ + + + + + diff --git a/backend/src/views/tools/passwordStore/components/PasswordImportDialog.vue b/backend/src/views/tools/passwordStore/components/PasswordImportDialog.vue new file mode 100644 index 0000000..55b9b3b --- /dev/null +++ b/backend/src/views/tools/passwordStore/components/PasswordImportDialog.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/backend/src/views/tools/passwordStore/index.vue b/backend/src/views/tools/passwordStore/index.vue index 8b0bcc5..88fef2f 100644 --- a/backend/src/views/tools/passwordStore/index.vue +++ b/backend/src/views/tools/passwordStore/index.vue @@ -14,11 +14,13 @@ clearable style="width: 300px" :prefix-icon="Search" - @keyup.enter="load" - @clear="load" + @keyup.enter="refresh" + @clear="refresh" /> 新增平台密码 - 刷新 + 导出 Excel + 批量导入 + 刷新 @@ -94,18 +96,7 @@
登录密码: - - {{ showPasswords[`${row.id}_${accIdx}`] ? acc.password : '••••••••' }} - - + {{ acc.password || '-' }} + + +
+ +
@@ -476,17 +483,7 @@
登录密码: - - {{ showDetailPasswords[accIdx] ? acc.password : '••••••••' }} - - + {{ acc.password || '-' }} 关闭 + + +
diff --git a/platform/src/views/tools/passwordStore/index.vue b/platform/src/views/tools/passwordStore/index.vue index 7c4ebe8..0fef209 100644 --- a/platform/src/views/tools/passwordStore/index.vue +++ b/platform/src/views/tools/passwordStore/index.vue @@ -14,11 +14,13 @@ clearable style="width: 300px" :prefix-icon="Search" - @keyup.enter="load" - @clear="load" + @keyup.enter="refresh" + @clear="refresh" /> 新增平台密码 - 刷新 + 导出 Excel + 批量导入 + 刷新
@@ -94,18 +96,7 @@
登录密码: - - {{ showPasswords[`${row.id}_${accIdx}`] ? acc.password : '••••••••' }} - - + {{ acc.password || '-' }} + + +
+ +
@@ -476,17 +483,7 @@
登录密码: - - {{ showDetailPasswords[accIdx] ? acc.password : '••••••••' }} - - + {{ acc.password || '-' }} 关闭 + + +