😎优化系统配置与登录验证相关代码

This commit is contained in:
zuohuaijun 2024-08-03 10:58:44 +08:00
parent f84a6fc50a
commit f77ee3c15e
10 changed files with 113 additions and 146 deletions

View File

@ -25,8 +25,8 @@ public class SysConfigSeedData : ISqlSugarEntitySeedData<SysConfig>
new SysConfig{ Id=1300000000131, Name="日志保留天数", Code=ConfigConst.SysLogRetentionDays, Value="180", SysFlag=YesNoEnum.Y, Remark="日志保留天数(天)", OrderNo=40, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
new SysConfig{ Id=1300000000141, Name="记录操作日志", Code=ConfigConst.SysOpLog, Value="True", SysFlag=YesNoEnum.Y, Remark="是否记录操作日志", OrderNo=50, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
new SysConfig{ Id=1300000000151, Name="单设备登录", Code=ConfigConst.SysSingleLogin, Value="False", SysFlag=YesNoEnum.Y, Remark="是否开启单设备登录", OrderNo=60, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
new SysConfig{ Id=1300000000161, Name="登录二次验证", Code=ConfigConst.SysSecondVer, Value="False", SysFlag=YesNoEnum.Y, Remark="是否开启登录二次验证", OrderNo=70, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
new SysConfig{ Id=1300000000171, Name="图形验证码", Code=ConfigConst.SysCaptcha, Value="True", SysFlag=YesNoEnum.Y, Remark="是否开启图形验证码", OrderNo=80, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
new SysConfig{ Id=1300000000161, Name="登录二次验证", Code=ConfigConst.SysSecondVer, Value="False", SysFlag=YesNoEnum.Y, Remark="是否开启登录二次验证", OrderNo=70, GroupCode="WebConfig", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
new SysConfig{ Id=1300000000171, Name="图形验证码", Code=ConfigConst.SysCaptcha, Value="True", SysFlag=YesNoEnum.Y, Remark="是否开启图形验证码", OrderNo=80, GroupCode="WebConfig", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
new SysConfig{ Id=1300000000181, Name="Token过期时间", Code=ConfigConst.SysTokenExpire, Value="10080", SysFlag=YesNoEnum.Y, Remark="Token过期时间分钟", OrderNo=90, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
new SysConfig{ Id=1300000000191, Name="RefreshToken过期时间", Code=ConfigConst.SysRefreshTokenExpire, Value="20160", SysFlag=YesNoEnum.Y, Remark="刷新Token过期时间分钟一般 refresh_token 的有效时间 > 2 * access_token 的有效时间)", OrderNo=100, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
new SysConfig{ Id=1300000000201, Name="发送异常日志邮件", Code=ConfigConst.SysErrorMail, Value="True", SysFlag=YesNoEnum.Y, Remark="是否发送异常日志邮件", OrderNo=110, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },

View File

@ -324,20 +324,6 @@ public class SysAuthService : IDynamicApiController, ITransient
_httpContextAccessor.HttpContext.SignoutToSwagger();
}
/// <summary>
/// 获取登录配置 🔖
/// </summary>
/// <returns></returns>
[AllowAnonymous]
[SuppressMonitor]
[DisplayName("获取登录配置")]
public async Task<dynamic> GetLoginConfig()
{
var secondVerEnabled = await _sysConfigService.GetConfigValue<bool>(ConfigConst.SysSecondVer);
var captchaEnabled = await _sysConfigService.GetConfigValue<bool>(ConfigConst.SysCaptcha);
return new { SecondVerEnabled = secondVerEnabled, CaptchaEnabled = captchaEnabled };
}
/// <summary>
/// 获取验证码 🔖
/// </summary>

View File

@ -55,4 +55,14 @@ public class InfoSaveInput
/// ICP地址
/// </summary>
public string SysIcpUrl { get; set; }
/// <summary>
/// 登录二次验证
/// </summary>
public bool? SysSecondVer { get; set; }
/// <summary>
/// 图形验证码
/// </summary>
public bool? SysCaptcha { get; set; }
}

View File

@ -245,6 +245,8 @@ public class SysConfigService : IDynamicApiController, ITransient
var sysCopyright = await GetConfigValue<string>(ConfigConst.SysWebCopyright);
var sysIcp = await GetConfigValue<string>(ConfigConst.SysWebIcp);
var sysIcpUrl = await GetConfigValue<string>(ConfigConst.SysWebIcpUrl);
var sysSecondVer = await GetConfigValue<bool>(ConfigConst.SysSecondVer);
var sysCaptcha = await GetConfigValue<bool>(ConfigConst.SysCaptcha);
return new
{
@ -255,7 +257,9 @@ public class SysConfigService : IDynamicApiController, ITransient
SysWatermark = sysWatermark,
SysCopyright = sysCopyright,
SysIcp = sysIcp,
SysIcpUrl = sysIcpUrl
SysIcpUrl = sysIcpUrl,
SysSecondVer = sysSecondVer,
SysCaptcha = sysCaptcha
};
}
@ -308,5 +312,7 @@ public class SysConfigService : IDynamicApiController, ITransient
await UpdateConfigValue(ConfigConst.SysWebCopyright, input.SysCopyright);
await UpdateConfigValue(ConfigConst.SysWebIcp, input.SysIcp);
await UpdateConfigValue(ConfigConst.SysWebIcpUrl, input.SysIcpUrl);
await UpdateConfigValue(ConfigConst.SysSecondVer, (input.SysSecondVer ?? false).ToString());
await UpdateConfigValue(ConfigConst.SysCaptcha, (input.SysCaptcha ?? true).ToString());
}
}

View File

@ -133,6 +133,9 @@ const loadSysInfo = () => {
themeConfig.value.watermarkText = data.sysWatermark;
//
themeConfig.value.copyright = data.sysCopyright;
//
themeConfig.value.secondVer = data.sysSecondVer;
themeConfig.value.captcha = data.sysCaptcha;
// favicon
updateFavicon(data.sysLogo);

View File

@ -173,49 +173,6 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
options: localVarRequestOptions,
};
},
/**
*
* @summary 🔖
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
apiSysAuthLoginConfigGet: async (options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/api/sysAuth/loginConfig`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, 'https://example.com');
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions :AxiosRequestConfig = { method: 'GET', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
// authentication Bearer required
// http bearer authentication required
if (configuration && configuration.accessToken) {
const accessToken = typeof configuration.accessToken === 'function'
? await configuration.accessToken()
: await configuration.accessToken;
localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
}
const query = new URLSearchParams(localVarUrlObj.search);
for (const key in localVarQueryParameter) {
query.set(key, localVarQueryParameter[key]);
}
for (const key in options.params) {
query.set(key, options.params[key]);
}
localVarUrlObj.search = (new URLSearchParams(query)).toString();
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
return {
url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
options: localVarRequestOptions,
};
},
/**
*
* @summary 🔖
@ -556,19 +513,6 @@ export const SysAuthApiFp = function(configuration?: Configuration) {
return axios.request(axiosRequestArgs);
};
},
/**
*
* @summary 🔖
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async apiSysAuthLoginConfigGet(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultObject>>> {
const localVarAxiosArgs = await SysAuthApiAxiosParamCreator(configuration).apiSysAuthLoginConfigGet(options);
return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
return axios.request(axiosRequestArgs);
};
},
/**
*
* @summary 🔖
@ -689,15 +633,6 @@ export const SysAuthApiFactory = function (configuration?: Configuration, basePa
async apiSysAuthCaptchaGet(options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultObject>> {
return SysAuthApiFp(configuration).apiSysAuthCaptchaGet(options).then((request) => request(axios, basePath));
},
/**
*
* @summary 🔖
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async apiSysAuthLoginConfigGet(options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultObject>> {
return SysAuthApiFp(configuration).apiSysAuthLoginConfigGet(options).then((request) => request(axios, basePath));
},
/**
*
* @summary 🔖
@ -798,16 +733,6 @@ export class SysAuthApi extends BaseAPI {
public async apiSysAuthCaptchaGet(options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultObject>> {
return SysAuthApiFp(this.configuration).apiSysAuthCaptchaGet(options).then((request) => request(this.axios, this.basePath));
}
/**
*
* @summary 🔖
* @param {*} [options] Override http request option.
* @throws {RequiredError}
* @memberof SysAuthApi
*/
public async apiSysAuthLoginConfigGet(options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultObject>> {
return SysAuthApiFp(this.configuration).apiSysAuthLoginConfigGet(options).then((request) => request(this.axios, this.basePath));
}
/**
*
* @summary 🔖

View File

@ -91,4 +91,20 @@ export interface InfoSaveInput {
* @memberof InfoSaveInput
*/
sysIcpUrl?: string | null;
/**
*
*
* @type {boolean}
* @memberof InfoSaveInput
*/
sysSecondVer?: boolean | null;
/**
*
*
* @type {boolean}
* @memberof InfoSaveInput
*/
sysCaptcha?: boolean | null;
}

View File

@ -45,58 +45,60 @@ declare interface RoutesListState<T = any> {
// 布局配置
declare interface ThemeConfigState {
themeConfig: {
isDrawer: boolean;
primary: string;
topBar: string;
topBarColor: string;
isTopBarColorGradual: boolean;
menuBar: string;
menuBarColor: string;
menuBarActiveColor: string;
isMenuBarColorGradual: boolean;
columnsMenuBar: string;
columnsMenuBarColor: string;
isColumnsMenuBarColorGradual: boolean;
isColumnsMenuHoverPreload: boolean;
columnsLogoHeight: number;
columnsMenuWidth: number;
columnsMenuHeight: number;
isCollapse: boolean;
isUniqueOpened: boolean;
isFixedHeader: boolean;
isFixedHeaderChange: boolean;
isClassicSplitMenu: boolean;
isLockScreen: boolean;
lockScreenTime: number;
isShowLogo: boolean;
isShowLogoChange: boolean;
isBreadcrumb: boolean;
isTagsview: boolean;
isBreadcrumbIcon: boolean;
isTagsviewIcon: boolean;
isCacheTagsView: boolean;
isSortableTagsView: boolean;
isShareTagsView: boolean;
isFooter: boolean;
isGrayscale: boolean;
isInvert: boolean;
isIsDark: boolean;
isWatermark: boolean;
watermarkText: string;
tagsStyle: string;
animation: string;
columnsAsideStyle: string;
columnsAsideLayout: string;
layout: string;
isRequestRoutes: boolean;
globalTitle: string;
globalViceTitle: string;
globalViceTitleMsg: string;
copyright: string;
globalI18n: string;
globalComponentSize: string;
isDrawer: boolean; // 是否开启抽屉配置
primary: string; // 主题颜色
topBar: string; // 顶部栏背景
topBarColor: string; // 顶部栏背景色
isTopBarColorGradual: boolean; // 是否顶部栏背景渐变
menuBar: string; // 侧边栏菜单栏背景
menuBarColor: string; // 侧边栏菜单栏背景色
menuBarActiveColor: string; // 侧边栏激活项背景色
isMenuBarColorGradual: boolean; // 是否侧边栏菜单栏背景渐变
columnsMenuBar: string; // 侧边栏菜单栏背景
columnsMenuBarColor: string; // 侧边栏菜单栏背景
isColumnsMenuBarColorGradual: boolean; // 是否侧边栏菜单栏背景渐变
isColumnsMenuHoverPreload: boolean; // 是否鼠标悬停预加载路由
columnsLogoHeight: number; // 侧边栏logo高度
columnsMenuWidth: number; // 侧边栏宽度
columnsMenuHeight: number; // 侧边栏高度
isCollapse: boolean; // 是否水平折叠收起菜单(支持手机端)
isUniqueOpened: boolean; // 是否只保持一个菜单的展开
isFixedHeader: boolean; // 是否固定头部
isFixedHeaderChange: boolean; // 是否固定头部
isClassicSplitMenu: boolean; // 是否分割菜单
isLockScreen: boolean; // 是否开启锁屏
lockScreenTime: number; // 锁屏时间
isShowLogo: boolean; // 是否显示logo
isShowLogoChange: boolean; // 是否显示logo动画
isBreadcrumb: boolean; // 是否显示面包屑
isTagsview: boolean; // 是否显示多标签页
isBreadcrumbIcon: boolean; // 是否显示面包屑图标
isTagsviewIcon: boolean; // 是否显示多标签页图标
isCacheTagsView: boolean; // 是否缓存 TagsView
isSortableTagsView: boolean; // 是否开启拖拽排序
isShareTagsView: boolean; // 是否开启多标签页缓存
isFooter: boolean; // 是否显示页脚
isGrayscale: boolean; // 是否灰度模式
isInvert: boolean; // 是否色弱模式
isIsDark: boolean; // 是否暗黑模式
isWatermark: boolean; // 是否开启水印
watermarkText: string; // 水印内容
tagsStyle: string; // 标签页主题
animation: string; // 动画
columnsAsideStyle: string; // 侧边栏主题
columnsAsideLayout: string; // 侧边栏布局
layout: string; // 布局模式
isRequestRoutes: boolean; // 是否开启路由懒加载
globalI18n: string; // 是否开启国际化
globalComponentSize: string; // 全局组件大小
globalTitle: string; // 全局标题
globalViceTitle: string; // 全局副标题
globalViceTitleMsg: string; // 全局副标题消息
copyright: string; // 版权信息
logoUrl: string; // 系统 logo 地址
icp: string; // Icp备案号
icpUrl: string; // Icp地址
secondVer: boolean; // 是否开启二级验证
captcha: boolean; // 是否开启验证码
};
}

View File

@ -133,6 +133,7 @@ const state = reactive({
capsLockVisible: false,
});
//
onMounted(async () => {
// URLToken
var accessToken = route.query.token;
@ -141,9 +142,8 @@ onMounted(async () => {
}
//
var res1 = await getAPI(SysAuthApi).apiSysAuthLoginConfigGet();
state.secondVerEnabled = res1.data.result.secondVerEnabled ?? true;
state.captchaEnabled = res1.data.result.captchaEnabled ?? true;
state.secondVerEnabled = themeConfig.value.secondVer ?? true;
state.captchaEnabled = themeConfig.value.captcha ?? true;
//
getCaptcha();
@ -152,7 +152,7 @@ onMounted(async () => {
document.addEventListener('keyup', handleKeyPress);
});
//
//
onUnmounted(() => {
document.removeEventListener('keyup', handleKeyPress);
});

View File

@ -37,6 +37,19 @@
<el-descriptions-item label="ICP地址">
<el-input v-model="state.formData.sysIcpUrl" />
</el-descriptions-item>
<el-descriptions-item label="登录二次验证">
<el-radio-group v-model="state.formData.sysSecondVer">
<el-radio :value="true">启用</el-radio>
<el-radio :value="false">禁用</el-radio>
</el-radio-group>
</el-descriptions-item>
<el-descriptions-item label="图形验证码">
<el-radio-group v-model="state.formData.sysCaptcha">
<el-radio :value="true">启用</el-radio>
<el-radio :value="false">禁用</el-radio>
</el-radio-group>
</el-descriptions-item>
<template #extra>
<el-button type="primary" icon="ele-SuccessFilled" @click="onSave">保存</el-button>
</template>
@ -68,6 +81,8 @@ const state = reactive({
sysCopyright: '',
sysIcp: '',
sysIcpUrl: '',
sysSecondVer: undefined,
sysCaptcha: undefined,
},
});
@ -101,6 +116,8 @@ const onSave = async () => {
sysCopyright: state.formData.sysCopyright,
sysIcp: state.formData.sysIcp,
sysIcpUrl: state.formData.sysIcpUrl,
sysSecondVer: state.formData.sysSecondVer,
sysCaptcha: state.formData.sysCaptcha,
});
if (res.data!.type !== 'success') return;
@ -134,6 +151,8 @@ const loadData = async () => {
sysCopyright: result.sysCopyright,
sysIcp: result.sysIcp,
sysIcpUrl: result.sysIcpUrl,
sysSecondVer: result.sysSecondVer,
sysCaptcha: result.sysCaptcha,
};
} finally {
nextTick(() => {