🔨 修改系统设置逻辑.
This commit is contained in:
@@ -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 } });
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 格式化数字为 ,分割
|
||||
*/
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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>
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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',
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user