新增登录页图形验证码功能,支持通过Redis全局配置控制验证码的启用状态,优化登录流程以提升用户体验。新增相关API接口和前端配置项,确保验证码逻辑与后端同步。

This commit is contained in:
geht
2026-04-20 14:21:36 +08:00
parent 7a648b20be
commit 73426a7af3
23 changed files with 450 additions and 103 deletions

View File

@@ -21,12 +21,28 @@ import { primaryColor } from '../../build/config/themeConfig';
import { Persistent } from '/@/utils/cache/persistent';
import { deepMerge } from '/@/utils';
import { ThemeEnum } from '/@/enums/appEnum';
import { getLoginCaptchaServerConfig } from '/@/api/sys/user';
/** 解析 GET /sys/loginCaptchaConfig 的 result兼容 boolean / 字符串) */
function parseLoginCaptchaEnabledFromServer(raw: unknown): boolean {
if (raw === true || raw === 'true' || raw === 1 || raw === '1') {
return true;
}
if (raw === false || raw === 'false' || raw === 0 || raw === '0') {
return false;
}
return false;
}
// Initial project configuration
export function initAppConfigStore() {
const localeStore = useLocaleStore();
const appStore = useAppStore();
let projCfg: ProjectConfig = Persistent.getLocal(PROJ_CFG_KEY) as ProjectConfig;
// 合并前判断是否已在本地持久化过「验证码登录」键;有则不再用接口覆盖,避免侧边栏已选「开」却被同步成「关」
const persistedHadLoginCaptchaKey = !!(
projCfg && Object.prototype.hasOwnProperty.call(projCfg, 'loginCaptchaEnabled')
);
projCfg = deepMerge(projectSetting, projCfg || {});
const darkMode = appStore.getDarkMode;
const {
@@ -48,6 +64,15 @@ export function initAppConfigStore() {
console.log(error);
}
appStore.setProjectConfig(projCfg);
// 仅当本地从未保存过该开关时,用后端 Redis/防火墙 初始化一次;用户一旦在侧边栏保存过,完全信任本地持久化
getLoginCaptchaServerConfig()
.then((enabled) => {
if (persistedHadLoginCaptchaKey) {
return;
}
appStore.setProjectConfig({ loginCaptchaEnabled: parseLoginCaptchaEnabledFromServer(enabled) });
})
.catch(() => {});
// init dark mode
updateDarkTheme(darkMode);