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 @@
+
+ 选择要进入的企业 {{ chooseErr }} 微信登录失败 {{ error }} 正在通过微信登录,请稍候…
+ 支持 .xlsx / .xls / .csv。列顺序:平台名称、网址、账号、密码、注册信息、账号备注、备注。
+ 多行「平台名称 + 网址」相同会合并为一条记录的多个账号;重复检测:文件内「同平台同账号」、
+ 以及库内已存在的同名登录账号都会自动跳过(不计入新增/更新)。
+
+
+
+
+