From be1cd9e5b30097ca427a9c2b7b054b28854e410a Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期三, 11 三月 2026 13:21:36 +0800
Subject: [PATCH] #
---
src/main/webapp/static/js/detail/detail.js | 207 +++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 182 insertions(+), 25 deletions(-)
diff --git a/src/main/webapp/static/js/detail/detail.js b/src/main/webapp/static/js/detail/detail.js
index 2c4c7d5..0e041d7 100644
--- a/src/main/webapp/static/js/detail/detail.js
+++ b/src/main/webapp/static/js/detail/detail.js
@@ -15,18 +15,36 @@
saving: false,
passwordDialogVisible: false,
passwordSaving: false,
+ mfaDialogVisible: false,
+ mfaDialogMode: "enable",
+ mfaSetupLoading: false,
+ mfaSubmitting: false,
form: {
id: "",
roleName: "",
username: "",
mobile: "",
- password: "",
- createTime$: ""
+ createTime$: "",
+ mfaAllow: 0,
+ mfaAllow$: "鍚�",
+ mfaEnabled: 0,
+ mfaEnabled$: "鍚�",
+ mfaBoundTime$: "",
+ mfaMaskedSecret: ""
},
passwordForm: {
oldPassword: "",
password: "",
rePassword: ""
+ },
+ mfaForm: {
+ currentPassword: "",
+ code: ""
+ },
+ mfaSetup: {
+ secret: "",
+ qrCode: "",
+ otpAuth: ""
},
rules: {
username: [
@@ -38,25 +56,7 @@
},
passwordRules: {
oldPassword: [
- { required: true, message: "璇疯緭鍏ュ綋鍓嶅瘑鐮�", trigger: "blur" },
- {
- validator: function (rule, value, callback) {
- if (!value) {
- callback(new Error("璇疯緭鍏ュ綋鍓嶅瘑鐮�"));
- return;
- }
- if (!this.form.password) {
- callback(new Error("鏈鍙栧埌褰撳墠鐢ㄦ埛瀵嗙爜"));
- return;
- }
- if (hex_md5(value) !== this.form.password) {
- callback(new Error("瀵嗙爜涓嶅尮閰�"));
- return;
- }
- callback();
- }.bind(this),
- trigger: "blur"
- }
+ { required: true, message: "璇疯緭鍏ュ綋鍓嶅瘑鐮�", trigger: "blur" }
],
password: [
{ required: true, message: "璇疯緭鍏ユ柊瀵嗙爜", trigger: "blur" },
@@ -70,7 +70,7 @@
callback(new Error("涓嶈兘灏戜簬4涓瓧绗�"));
return;
}
- if (this.form.password && hex_md5(value) === this.form.password) {
+ if (value === this.passwordForm.oldPassword) {
callback(new Error("涓庢棫瀵嗙爜涓嶈兘鐩稿悓"));
return;
}
@@ -89,6 +89,24 @@
}
callback();
}.bind(this),
+ trigger: "blur"
+ }
+ ]
+ },
+ mfaRules: {
+ currentPassword: [
+ { required: true, message: "璇疯緭鍏ュ綋鍓嶅瘑鐮�", trigger: "blur" }
+ ],
+ code: [
+ { required: true, message: "璇疯緭鍏�6浣嶉獙璇佺爜", trigger: "blur" },
+ {
+ validator: function (rule, value, callback) {
+ if (!/^\d{6}$/.test(String(value || "").trim())) {
+ callback(new Error("璇疯緭鍏�6浣嶆暟瀛楅獙璇佺爜"));
+ return;
+ }
+ callback();
+ },
trigger: "blur"
}
]
@@ -155,10 +173,10 @@
var vm = this;
vm.passwordSaving = true;
$.ajax({
- url: baseUrl + "/user/update/auth",
+ url: baseUrl + "/user/password/update/auth",
headers: { token: localStorage.getItem("token") },
data: {
- id: vm.form.id,
+ oldPassword: hex_md5(vm.passwordForm.oldPassword),
password: hex_md5(vm.passwordForm.password)
},
method: "POST",
@@ -170,7 +188,6 @@
vm.$message.error(res.msg || "瀵嗙爜淇敼澶辫触");
return;
}
- vm.form.password = hex_md5(vm.passwordForm.password);
vm.passwordDialogVisible = false;
vm.$alert("瀵嗙爜淇敼鎴愬姛锛岃閲嶆柊鐧诲綍", "鎻愮ず", {
confirmButtonText: "纭畾",
@@ -188,6 +205,146 @@
}
});
},
+ openMfaEnableDialog: function () {
+ if (Number(this.form.mfaAllow) !== 1) {
+ this.$message.warning("褰撳墠璐﹀彿鏈紑閫歁FA浣跨敤鏉冮檺");
+ return;
+ }
+ this.mfaDialogMode = "enable";
+ this.resetMfaDialogState();
+ this.mfaDialogVisible = true;
+ this.loadMfaSetup();
+ },
+ openMfaDisableDialog: function () {
+ this.mfaDialogMode = "disable";
+ this.resetMfaDialogState();
+ this.mfaDialogVisible = true;
+ },
+ closeMfaDialog: function () {
+ this.mfaDialogVisible = false;
+ this.resetMfaDialogState();
+ },
+ resetMfaDialogState: function () {
+ this.mfaSubmitting = false;
+ this.mfaSetupLoading = false;
+ this.mfaForm = {
+ currentPassword: "",
+ code: ""
+ };
+ this.mfaSetup = {
+ secret: "",
+ qrCode: "",
+ otpAuth: ""
+ };
+ if (this.$refs.mfaForm) {
+ this.$refs.mfaForm.clearValidate();
+ }
+ },
+ loadMfaSetup: function () {
+ var vm = this;
+ vm.mfaSetupLoading = true;
+ $.ajax({
+ url: baseUrl + "/user/mfa/setup/auth",
+ headers: { token: localStorage.getItem("token") },
+ method: "POST",
+ success: function (res) {
+ if (handleForbidden(res)) {
+ return;
+ }
+ if (Number(res.code) !== 200) {
+ vm.$message.error(res.msg || "MFA閰嶇疆鍔犺浇澶辫触");
+ return;
+ }
+ vm.mfaSetup = Object.assign({}, vm.mfaSetup, res.data || {});
+ },
+ error: function () {
+ vm.$message.error("MFA閰嶇疆鍔犺浇澶辫触");
+ },
+ complete: function () {
+ vm.mfaSetupLoading = false;
+ }
+ });
+ },
+ handleMfaSubmit: function () {
+ var vm = this;
+ if (!vm.$refs.mfaForm) {
+ return;
+ }
+ vm.$refs.mfaForm.validate(function (valid) {
+ if (!valid) {
+ return false;
+ }
+ if (vm.mfaDialogMode === "enable" && !vm.mfaSetup.secret) {
+ vm.$message.error("MFA瀵嗛挜灏氭湭鐢熸垚锛岃绋嶅悗閲嶈瘯");
+ return false;
+ }
+ vm.submitMfaAction();
+ return true;
+ });
+ },
+ submitMfaAction: function () {
+ var vm = this;
+ vm.mfaSubmitting = true;
+ $.ajax({
+ url: baseUrl + (vm.mfaDialogMode === "enable" ? "/user/mfa/enable/auth" : "/user/mfa/disable/auth"),
+ headers: { token: localStorage.getItem("token") },
+ data: {
+ currentPassword: hex_md5(vm.mfaForm.currentPassword),
+ code: vm.mfaForm.code,
+ secret: vm.mfaSetup.secret
+ },
+ method: "POST",
+ success: function (res) {
+ if (handleForbidden(res)) {
+ return;
+ }
+ if (Number(res.code) !== 200) {
+ vm.$message.error(res.msg || "MFA鎿嶄綔澶辫触");
+ return;
+ }
+ vm.$message.success(vm.mfaDialogMode === "enable" ? "MFA宸插惎鐢�" : "MFA宸插仠鐢�");
+ vm.closeMfaDialog();
+ vm.loadDetail();
+ },
+ error: function () {
+ vm.$message.error("MFA鎿嶄綔澶辫触");
+ },
+ complete: function () {
+ vm.mfaSubmitting = false;
+ }
+ });
+ },
+ copySecret: function () {
+ var vm = this;
+ var text = vm.mfaSetup.secret || "";
+ if (!text) {
+ return;
+ }
+ if (navigator.clipboard && navigator.clipboard.writeText) {
+ navigator.clipboard.writeText(text).then(function () {
+ vm.$message.success("瀵嗛挜宸插鍒�");
+ }).catch(function () {
+ vm.fallbackCopy(text);
+ });
+ return;
+ }
+ vm.fallbackCopy(text);
+ },
+ fallbackCopy: function (text) {
+ try {
+ var textarea = document.createElement("textarea");
+ textarea.value = text;
+ textarea.style.position = "fixed";
+ textarea.style.opacity = "0";
+ document.body.appendChild(textarea);
+ textarea.select();
+ document.execCommand("copy");
+ document.body.removeChild(textarea);
+ this.$message.success("瀵嗛挜宸插鍒�");
+ } catch (err) {
+ this.$message.error("澶嶅埗澶辫触");
+ }
+ },
handleSave: function () {
var vm = this;
vm.$refs.profileForm.validate(function (valid) {
--
Gitblit v1.9.1