🔨 修改系统设置逻辑.

This commit is contained in:
lijiahang
2025-01-20 10:24:40 +08:00
parent 27e3e65ea1
commit dc42a31711
10 changed files with 721 additions and 66 deletions

View File

@@ -1,35 +1,15 @@
import axios from 'axios';
import { dateFormat } from '@/utils';
/**
* 系统设置类型
*/
export type SystemSettingType = 'SFTP' | 'ENCRYPT';
/**
* 系统设置更新请求
*/
export interface SystemSettingUpdateRequest {
type?: SystemSettingType;
item?: string;
value?: any;
type?: string;
value?: string;
settings?: Record<string, any>;
}
/**
* 应用信息查询响应
*/
export interface SystemLicenseResponse {
userCount: number;
hostCount: number;
release: string;
releaseName: string;
issueDate: number;
expireDate: number;
expireDay: number;
uuid: string;
}
/**
* 应用信息查询响应
*/
@@ -47,28 +27,72 @@ export interface AppReleaseResponse {
}
/**
* 系统聚合设置响应
* RSA 密钥对响应
*/
export interface SystemSettingAggregateResponse {
sftp: SftpSetting;
encrypt: EncryptSetting;
}
/**
* SFTP 配置
*/
export interface SftpSetting {
previewSize: number;
}
/**
* 加密配置
*/
export interface EncryptSetting {
export interface RsaKeyPairResponse {
publicKey: string;
privateKey: string;
}
/**
* 系统设置
*/
export type SystemSetting = SftpSetting
& LoginSetting & EncryptSetting
& LogSetting & AutoClearSetting;
/**
* SFTP 设置
*/
export interface SftpSetting {
sftp_previewSize: number;
sftp_uploadPresentBackup: string;
sftp_uploadBackupFileName: string;
}
/**
* 登录设置
*/
export interface LoginSetting {
login_allowMultiDevice: string;
login_allowRefresh: string;
login_maxRefreshCount: number;
login_refreshInterval: number;
login_loginFailedLock: string;
login_loginFailedLockThreshold: number;
login_loginFailedLockTime: number;
login_loginFailedSend: string;
login_loginFailedSendThreshold: number;
login_loginSessionTime: number;
}
/**
* 加密设置
*/
export interface EncryptSetting {
encrypt_publicKey: string;
encrypt_privateKey: string;
}
/**
* 日志设置
*/
export interface LogSetting {
log_trackerOffset: number;
log_trackerDelay: number;
log_execAppendAnsi: string;
}
/**
* 自动清理设置
*/
export interface AutoClearSetting {
autoClear_execLogEnabled: string;
autoClear_execLogKeepDays: number;
autoClear_terminalLogEnabled: string;
autoClear_terminalLogKeepDays: number;
}
/**
* 查询应用信息
*/
@@ -80,7 +104,7 @@ export function getSystemAppInfo() {
* 获取系统聚合设置
*/
export function getSystemAggregateSetting() {
return axios.get<SystemSettingAggregateResponse>('/infra/system-setting/setting');
return axios.get<Record<keyof SystemSetting, string>>('/infra/system-setting/setting');
}
/**
@@ -101,26 +125,26 @@ export function getAppLatestRelease() {
* 生成密钥对
*/
export function generatorKeypair() {
return axios.get<EncryptSetting>('/infra/system-setting/generator-keypair');
return axios.get<RsaKeyPairResponse>('/infra/system-setting/generator-keypair');
}
/**
* 更新系统设置-单个
*/
export function updateSystemSetting(request: SystemSettingUpdateRequest) {
return axios.put<number>('/infra/system-setting/update', request);
return axios.put<string>('/infra/system-setting/update', request);
}
/**
* 更新系统设置-多个
*/
export function updateSystemSettingBatch(request: SystemSettingUpdateRequest) {
return axios.put<number>('/infra/system-setting/update-batch', request);
return axios.put<string>('/infra/system-setting/update-batch', request);
}
/**
* 查询系统设置
*/
export function getSystemSetting<T>(type: SystemSettingType) {
return axios.get<T>('/infra/system-setting/get', { params: { type } });
export function getSystemSetting(type: string) {
return axios.get<Record<keyof SystemSetting, string>>('/infra/system-setting/get', { params: { type } });
}

View File

@@ -129,6 +129,21 @@ export function formatDuration(start: number, end?: number): string {
return result;
}
/**
* 转为匿名数字 number | undefined
*/
export function toAnonymousNumber(value: string | undefined): number {
if (value === undefined || value === null) {
return value as unknown as number;
}
const num = Number.parseInt(value);
if (Number.isNaN(num)) {
return undefined as unknown as number;
} else {
return num;
}
}
/**
* 格式化数字为 ,分割
*/

View File

@@ -9,9 +9,9 @@ export const encrypt = async (data: string | undefined): Promise<string | undefi
return data;
}
// 获取公钥
const { encrypt } = await useCacheStore().loadSystemSetting();
const publicKey = (await useCacheStore().loadSystemSetting()).encrypt_publicKey;
const encryptor = new JSEncrypt();
encryptor.setPublicKey(encrypt?.publicKey);
encryptor.setPublicKey(publicKey);
// 加密
const value = encryptor.encrypt(data);
if (value === false) {

View File

@@ -0,0 +1,156 @@
<template>
<a-spin class="main-container" :loading="loading">
<!-- 标题 -->
<h3 class="setting-header">自动清理设置</h3>
<!-- 表单 -->
<a-form :model="setting"
ref="formRef"
class="setting-form"
label-align="right"
:auto-label-width="true">
<!-- 自动清理执行记录 -->
<a-form-item field="autoClear_execLogEnabled"
label="自动清理执行记录"
:rules="[{required: true, message: '请选择此项'}]"
hide-asterisk>
<a-switch v-model="setting.autoClear_execLogEnabled"
type="round"
checked-value="true"
unchecked-value="false"
checked-text="开启"
unchecked-text="关闭" />
<template #extra>
开启后将会在每天凌晨自动清理命令执行记录
</template>
</a-form-item>
<!-- 执行记录保留天数 -->
<a-form-item field="autoClear_execLogKeepDays"
label="执行记录保留天数"
:rules="[{required: true, message: '请输入执行记录保留天数'}]"
hide-asterisk>
<a-input-number v-model="setting.autoClear_execLogKeepDays"
class="input-wrapper"
:min="0"
:max="99999"
placeholder="请输入执行记录保留天数"
allow-clear
hide-button>
<template #suffix>
</template>
</a-input-number>
<template #extra>
自动清理命令执行记录时保留的天数
</template>
</a-form-item>
<!-- 自动清理终端记录 -->
<a-form-item field="autoClear_terminalLogEnabled"
label="自动清理终端记录"
:rules="[{required: true, message: '请选择此项'}]"
hide-asterisk>
<a-switch v-model="setting.autoClear_terminalLogEnabled"
type="round"
checked-value="true"
unchecked-value="false"
checked-text="开启"
unchecked-text="关闭" />
<template #extra>
开启后将会在每天凌晨自动清理终端连接记录
</template>
</a-form-item>
<!-- 终端记录保留天数 -->
<a-form-item field="autoClear_terminalLogKeepDays"
label="终端记录保留天数"
:rules="[{required: true, message: '请输入终端记录保留天数'}]"
hide-asterisk>
<a-input-number v-model="setting.autoClear_terminalLogKeepDays"
class="input-wrapper"
:min="0"
:max="99999"
placeholder="请输入终端记录保留天数"
allow-clear
hide-button>
<template #suffix>
</template>
</a-input-number>
<template #extra>
自动清理终端连接记录时保留的天数
</template>
</a-form-item>
<!-- 按钮 -->
<a-form-item v-permission="['infra:system-setting:update']">
<!-- 保存 -->
<a-button type="primary"
size="small"
@click="save">
保存
</a-button>
</a-form-item>
</a-form>
</a-spin>
</template>
<script lang="ts">
export default {
name: 'autoClearSetting',
};
</script>
<script lang="ts" setup>
import type { AutoClearSetting } from '@/api/system/setting';
import { onMounted, ref } from 'vue';
import { getSystemSetting, updateSystemSettingBatch } from '@/api/system/setting';
import useLoading from '@/hooks/loading';
import { Message } from '@arco-design/web-vue';
import { toAnonymousNumber } from '@/utils';
import { SystemSettingTypes } from '../types/const';
const { loading, setLoading } = useLoading();
const formRef = ref();
const setting = ref<AutoClearSetting>({} as AutoClearSetting);
// 保存
const save = async () => {
// 验证参数
const error = await formRef.value.validate();
if (error) {
return false;
}
setLoading(true);
try {
await updateSystemSettingBatch({
type: SystemSettingTypes.AUTO_CLEAR,
settings: setting.value
});
Message.success('修改成功');
} catch (e) {
} finally {
setLoading(false);
}
};
// 加载配置
onMounted(async () => {
setLoading(true);
try {
const { data } = await getSystemSetting(SystemSettingTypes.AUTO_CLEAR);
setting.value = {
...data,
autoClear_execLogKeepDays: toAnonymousNumber(data.autoClear_execLogKeepDays),
autoClear_terminalLogKeepDays: toAnonymousNumber(data.autoClear_terminalLogKeepDays),
};
} catch (e) {
} finally {
setLoading(false);
}
});
</script>
<style lang="less" scoped>
.input-wrapper {
width: 368px;
}
</style>

View File

@@ -13,22 +13,22 @@
<a-alert>请输入 PKCS8 格式的 RSA Base64 密钥, 用于前后端传输时的数据加密</a-alert>
</a-form-item>
<!-- 加密公钥 -->
<a-form-item field="publicKey"
<a-form-item field="encrypt_publicKey"
label="加密公钥"
:rules="[{required: true, message: '请输入加密公钥'}]"
hide-asterisk>
<a-textarea v-model="setting.publicKey"
<a-textarea v-model="setting.encrypt_publicKey"
class="input-wrapper"
placeholder="RSA 公钥 Base64"
:auto-size="{ minRows: 5, maxRows: 5 }"
allow-clear />
</a-form-item>
<!-- 加密私钥 -->
<a-form-item field="privateKey"
<a-form-item field="encrypt_privateKey"
label="加密私钥"
:rules="[{required: true, message: '请输入加密私钥'}]"
hide-asterisk>
<a-textarea v-model="setting.privateKey"
<a-textarea v-model="setting.encrypt_privateKey"
class="input-wrapper"
placeholder="RSA 私钥 Base64"
:auto-size="{ minRows: 14, maxRows: 14 }"
@@ -97,8 +97,8 @@
setLoading(true);
try {
const { data } = await generatorKeypair();
setting.value.publicKey = data.publicKey;
setting.value.privateKey = data.privateKey;
setting.value.encrypt_publicKey = data.publicKey;
setting.value.encrypt_privateKey = data.privateKey;
} catch (e) {
} finally {
setLoading(false);
@@ -109,8 +109,10 @@
onMounted(async () => {
setLoading(true);
try {
const { data } = await getSystemSetting<EncryptSetting>(SystemSettingTypes.ENCRYPT);
setting.value = data;
const { data } = await getSystemSetting(SystemSettingTypes.ENCRYPT);
setting.value = {
...data
};
} catch (e) {
} finally {
setLoading(false);

View File

@@ -0,0 +1,141 @@
<template>
<a-spin class="main-container" :loading="loading">
<!-- 标题 -->
<h3 class="setting-header">日志设置</h3>
<!-- 表单 -->
<a-form :model="setting"
ref="formRef"
class="setting-form"
label-align="right"
:auto-label-width="true">
<!-- 执行详细日志 -->
<a-form-item field="log_execAppendAnsi"
label="执行详细日志"
:rules="[{required: true, message: '请选择此项'}]"
hide-asterisk>
<a-switch v-model="setting.log_execAppendAnsi"
type="round"
checked-value="true"
unchecked-value="false"
checked-text="详细输出"
unchecked-text="原始输出" />
<template #extra>
开启后在命令执行时会拼接详细的日志信息, 关闭后则只显示命令的标准输出
</template>
</a-form-item>
<!-- 日志加载行数 -->
<a-form-item field="log_trackerOffset"
label="日志加载行数"
:rules="[{required: true, message: '请输入日志加载行数'}]"
hide-asterisk>
<a-input-number v-model="setting.log_trackerOffset"
class="input-wrapper"
:min="0"
:max="99999"
placeholder="请输入日志加载行数"
allow-clear
hide-button>
<template #suffix>
</template>
</a-input-number>
<template #extra>
当查看日志时, 默认读取的行数
</template>
</a-form-item>
<!-- 日志监听间隔 -->
<a-form-item field="log_trackerDelay"
label="日志监听间隔"
:rules="[{required: true, message: '请输入日志监听间隔'}]"
hide-asterisk>
<a-input-number v-model="setting.log_trackerDelay"
class="input-wrapper"
:min="0"
:max="99999"
placeholder="请输入日志监听间隔"
allow-clear
hide-button>
<template #suffix>
ms
</template>
</a-input-number>
<template #extra>
日志增量刷新的间隔 (毫秒)
</template>
</a-form-item>
<!-- 按钮 -->
<a-form-item v-permission="['infra:system-setting:update']">
<!-- 保存 -->
<a-button type="primary"
size="small"
@click="save">
保存
</a-button>
</a-form-item>
</a-form>
</a-spin>
</template>
<script lang="ts">
export default {
name: 'logSetting',
};
</script>
<script lang="ts" setup>
import type { LogSetting } from '@/api/system/setting';
import { onMounted, ref } from 'vue';
import { getSystemSetting, updateSystemSettingBatch } from '@/api/system/setting';
import useLoading from '@/hooks/loading';
import { Message } from '@arco-design/web-vue';
import { toAnonymousNumber } from '@/utils';
import { SystemSettingTypes } from '../types/const';
const { loading, setLoading } = useLoading();
const formRef = ref();
const setting = ref<LogSetting>({} as LogSetting);
// 保存
const save = async () => {
// 验证参数
const error = await formRef.value.validate();
if (error) {
return false;
}
setLoading(true);
try {
await updateSystemSettingBatch({
type: SystemSettingTypes.LOG,
settings: setting.value
});
Message.success('修改成功');
} catch (e) {
} finally {
setLoading(false);
}
};
// 加载配置
onMounted(async () => {
setLoading(true);
try {
const { data } = await getSystemSetting(SystemSettingTypes.LOG);
setting.value = {
...data,
log_trackerDelay: toAnonymousNumber(data.log_trackerDelay),
log_trackerOffset: toAnonymousNumber(data.log_trackerOffset),
};
} catch (e) {
} finally {
setLoading(false);
}
});
</script>
<style lang="less" scoped>
.input-wrapper {
width: 368px;
}
</style>

View File

@@ -0,0 +1,258 @@
<template>
<a-spin class="main-container" :loading="loading">
<!-- 标题 -->
<h3 class="setting-header">登录设置</h3>
<!-- 表单 -->
<a-form :model="setting"
ref="formRef"
class="setting-form"
label-align="right"
:auto-label-width="true">
<!-- 允许多端登录 -->
<a-form-item field="login_allowMultiDevice"
label="允许多端登录"
:rules="[{required: true, message: '请选择此项'}]"
hide-asterisk>
<a-switch v-model="setting.login_allowMultiDevice"
type="round"
checked-value="true"
unchecked-value="false"
checked-text="开启"
unchecked-text="关闭" />
<template #extra>
开启后一个账号可以多个设备同时登录
</template>
</a-form-item>
<!-- 允许凭证续签 -->
<a-form-item field="login_allowRefresh"
label="允许凭证续签"
:rules="[{required: true, message: '请选择此项'}]"
hide-asterisk>
<a-switch v-model="setting.login_allowRefresh"
type="round"
checked-value="true"
unchecked-value="false"
checked-text="开启"
unchecked-text="关闭" />
<template #extra>
开启后当凭证即将过期时系统会自动续签
</template>
</a-form-item>
<!-- 登录失败锁定 -->
<a-form-item field="login_loginFailedLock"
label="登录失败锁定"
:rules="[{required: true, message: '请选择此项'}]"
hide-asterisk>
<a-switch v-model="setting.login_loginFailedLock"
type="round"
checked-value="true"
unchecked-value="false"
checked-text="开启"
unchecked-text="关闭" />
<template #extra>
开启后当登录失败次数达到阈值时账号会自动锁定
</template>
</a-form-item>
<!-- 登录失败发信 -->
<a-form-item field="login_loginFailedSend"
label="登录失败发信"
:rules="[{required: true, message: '请选择此项'}]"
hide-asterisk>
<a-switch v-model="setting.login_loginFailedSend"
type="round"
checked-value="true"
unchecked-value="false"
checked-text="开启"
unchecked-text="关闭" />
<template #extra>
开启后当登录失败次数达到阈值时将发送站内信
</template>
</a-form-item>
<!-- 凭证有效期 -->
<a-form-item field="login_loginSessionTime"
label="凭证有效期"
:rules="[{required: true, message: '请输入凭证有效期'}]"
hide-asterisk>
<a-input-number v-model="setting.login_loginSessionTime"
class="input-wrapper"
:min="1"
:max="99999"
placeholder="请输入凭证有效期"
allow-clear
hide-button>
<template #suffix>
</template>
</a-input-number>
<template #extra>
设置登录凭证有效期时长()
</template>
</a-form-item>
<!-- 凭证续签间隔 -->
<a-form-item field="login_refreshInterval"
label="凭证续签间隔"
:rules="[{required: true, message: '请输入凭证续签间隔时间'}]"
hide-asterisk>
<a-input-number v-model="setting.login_refreshInterval"
class="input-wrapper"
:min="1"
:max="99999"
placeholder="请输入凭证续签间隔时间"
allow-clear
hide-button>
<template #suffix>
</template>
</a-input-number>
<template #extra>
当登录凭证过期但未超过续签间隔时系统会自动续签
</template>
</a-form-item>
<!-- 凭证续签最大次数 -->
<a-form-item field="login_maxRefreshCount"
label="凭证续签最大次数"
:rules="[{required: true, message: '请输入凭证续签最大次数'}]"
hide-asterisk>
<a-input-number v-model="setting.login_maxRefreshCount"
class="input-wrapper"
:min="0"
:max="99999"
placeholder="请输入凭证续签最大次数"
allow-clear
hide-button />
<template #extra>
凭证续签的最大次数
</template>
</a-form-item>
<!-- 登录失败锁定阈值 -->
<a-form-item field="login_loginFailedLockThreshold"
label="登录失败锁定阈值"
:rules="[{required: true, message: '请输入登录失败锁定阈值'}]"
hide-asterisk>
<a-input-number v-model="setting.login_loginFailedLockThreshold"
class="input-wrapper"
:min="0"
:max="99999"
placeholder="请输入登录失败锁定阈值"
allow-clear
hide-button />
<template #extra>
登录失败次数到达该值时账号会自动锁定
</template>
</a-form-item>
<!-- 登录失败锁定时间 -->
<a-form-item field="login_loginFailedLockTime"
label="登录失败锁定时间"
:rules="[{required: true, message: '请输入登录失败锁定时间'}]"
hide-asterisk>
<a-input-number v-model="setting.login_loginFailedLockTime"
class="input-wrapper"
:min="0"
:max="999999"
placeholder="请输入登录失败锁定时间"
allow-clear
hide-button>
<template #suffix>
</template>
</a-input-number>
<template #extra>
登录失败多次后账号锁定的时间()
</template>
</a-form-item>
<!-- 登录失败发信阈值 -->
<a-form-item field="login_loginFailedSendThreshold"
label="登录失败发信阈值"
:rules="[{required: true, message: '请输入登录失败发信阈值'}]"
hide-asterisk>
<a-input-number v-model="setting.login_loginFailedSendThreshold"
class="input-wrapper"
:min="0"
:max="99999"
placeholder="请输入登录失败发信阈值"
allow-clear
hide-button />
<template #extra>
登录失败次数到达该值时系统将发送站内信
</template>
</a-form-item>
<!-- 按钮 -->
<a-form-item v-permission="['infra:system-setting:update']">
<!-- 保存 -->
<a-button type="primary"
size="small"
@click="save">
保存
</a-button>
</a-form-item>
</a-form>
</a-spin>
</template>
<script lang="ts">
export default {
name: 'loginSetting',
};
</script>
<script lang="ts" setup>
import type { LoginSetting } from '@/api/system/setting';
import { onMounted, ref } from 'vue';
import { getSystemSetting, updateSystemSettingBatch } from '@/api/system/setting';
import useLoading from '@/hooks/loading';
import { Message } from '@arco-design/web-vue';
import { toAnonymousNumber } from '@/utils';
import { SystemSettingTypes } from '../types/const';
const { loading, setLoading } = useLoading();
const formRef = ref();
const setting = ref<LoginSetting>({} as LoginSetting);
// 保存
const save = async () => {
// 验证参数
const error = await formRef.value.validate();
if (error) {
return false;
}
setLoading(true);
try {
await updateSystemSettingBatch({
type: SystemSettingTypes.LOGIN,
settings: setting.value
});
Message.success('修改成功');
} catch (e) {
} finally {
setLoading(false);
}
};
// 加载配置
onMounted(async () => {
setLoading(true);
try {
const { data } = await getSystemSetting(SystemSettingTypes.LOGIN);
setting.value = {
...data,
login_loginSessionTime: toAnonymousNumber(data.login_loginSessionTime),
login_maxRefreshCount: toAnonymousNumber(data.login_maxRefreshCount),
login_refreshInterval: toAnonymousNumber(data.login_refreshInterval),
login_loginFailedLockThreshold: toAnonymousNumber(data.login_loginFailedLockThreshold),
login_loginFailedLockTime: toAnonymousNumber(data.login_loginFailedLockTime),
login_loginFailedSendThreshold: toAnonymousNumber(data.login_loginFailedSendThreshold),
};
} catch (e) {
} finally {
setLoading(false);
}
});
</script>
<style lang="less" scoped>
.input-wrapper {
width: 368px;
}
</style>

View File

@@ -8,12 +8,40 @@
class="setting-form"
label-align="right"
:auto-label-width="true">
<!-- 重复文件备份 -->
<a-form-item field="sftp_uploadPresentBackup"
label="重复文件备份"
:rules="[{required: true, message: '请选择此项'}]"
hide-asterisk>
<a-switch v-model="setting.sftp_uploadPresentBackup"
type="round"
checked-value="true"
unchecked-value="false"
checked-text="备份"
unchecked-text="覆盖" />
<template #extra>
文件上传时, 若文件存在是否备份原始文件
</template>
</a-form-item>
<!-- 备份文件名称 -->
<a-form-item field="sftp_uploadBackupFileName"
label="备份文件名称"
:rules="[{required: true, message: '请输入备份文件名称'}]"
hide-asterisk>
<a-input v-model="setting.sftp_uploadBackupFileName"
class="input-wrapper"
placeholder="请输入备份文件名称模板"
allow-clear />
<template #extra>
${fileName} 文件名称, ${timestamp} 时间戳, ${time} 时间
</template>
</a-form-item>
<!-- 文件预览大小 -->
<a-form-item field="previewSize"
<a-form-item field="sftp_previewSize"
label="文件预览大小"
:rules="[{required: true, message: '请输入文件预览大小'}]"
hide-asterisk>
<a-input-number v-model="setting.previewSize"
<a-input-number v-model="setting.sftp_previewSize"
class="input-wrapper"
:min="0"
:max="200"
@@ -24,6 +52,9 @@
MB
</template>
</a-input-number>
<template #extra>
可以直接查看或编辑小于等于该大小的普通文件
</template>
</a-form-item>
<!-- 按钮 -->
<a-form-item v-permission="['infra:system-setting:update']">
@@ -50,6 +81,7 @@
import { getSystemSetting, updateSystemSettingBatch } from '@/api/system/setting';
import useLoading from '@/hooks/loading';
import { Message } from '@arco-design/web-vue';
import { toAnonymousNumber } from '@/utils';
import { SystemSettingTypes } from '../types/const';
const { loading, setLoading } = useLoading();
@@ -68,7 +100,7 @@
try {
await updateSystemSettingBatch({
type: SystemSettingTypes.SFTP,
settings: setting.value
settings: setting.value,
});
Message.success('修改成功');
} catch (e) {
@@ -81,8 +113,11 @@
onMounted(async () => {
setLoading(true);
try {
const { data } = await getSystemSetting<SftpSetting>(SystemSettingTypes.SFTP);
setting.value = data;
const { data } = await getSystemSetting(SystemSettingTypes.SFTP);
setting.value = {
...data,
sftp_previewSize: toAnonymousNumber(data.sftp_previewSize),
};
} catch (e) {
} finally {
setLoading(false);
@@ -93,6 +128,6 @@
<style lang="less" scoped>
.input-wrapper {
width: 328px;
width: 368px;
}
</style>

View File

@@ -11,12 +11,30 @@
title="SFTP">
<sftp-setting />
</a-tab-pane>
<!-- 登录设置 -->
<a-tab-pane v-permission="['infra:system-setting:update']"
key="login"
title="登录设置">
<login-setting />
</a-tab-pane>
<!-- 加密设置 -->
<a-tab-pane v-permission="['infra:system-setting:update']"
key="encrypt"
title="加密设置">
<encrypt-setting />
</a-tab-pane>
<!-- 日志设置 -->
<a-tab-pane v-permission="['infra:system-setting:update']"
key="log"
title="日志设置">
<log-setting />
</a-tab-pane>
<!-- 自动清理 -->
<a-tab-pane v-permission="['infra:system-setting:update']"
key="auto-clear"
title="自动清理">
<auto-clear-setting />
</a-tab-pane>
<!-- 关于 -->
<a-tab-pane key="about" title="关于">
<about-setting />
@@ -36,7 +54,10 @@
import { useRoute } from 'vue-router';
import usePermission from '@/hooks/permission';
import SftpSetting from './components/sftp-setting.vue';
import LoginSetting from './components/login-setting.vue';
import EncryptSetting from './components/encrypt-setting.vue';
import LogSetting from './components/log-setting.vue';
import AutoClearSetting from './components/auto-clear-setting.vue';
import AboutSetting from './components/about-setting.vue';
const route = useRoute();
@@ -96,6 +117,7 @@
margin-top: 0;
margin-bottom: 20px;
font-weight: 600;
user-select: none;
}
.setting-form {
@@ -104,6 +126,7 @@
.arco-descriptions-title {
font-weight: 600;
user-select: none;
}
.alert-href {

View File

@@ -1,7 +1,8 @@
import type { SystemSettingType } from '@/api/system/setting';
// 系统设置类型
export const SystemSettingTypes: Record<SystemSettingType, SystemSettingType> = {
SFTP: 'SFTP',
ENCRYPT: 'ENCRYPT',
export const SystemSettingTypes = {
SFTP: 'sftp',
ENCRYPT: 'encrypt',
LOGIN: 'login',
LOG: 'log',
AUTO_CLEAR: 'autoClear',
};