Explorar el Código

feat: 增加登录密码的加密操作,增加安全配置页面

yanglzh hace 1 año
padre
commit
dc75720b0e
Se han modificado 4 ficheros con 199 adiciones y 3 borrados
  1. 1 1
      .env.development
  2. 2 1
      .env.open
  3. 5 1
      src/api/system/index.ts
  4. 191 0
      src/views/system/safeConfig/index.vue

+ 1 - 1
.env.development

@@ -14,4 +14,4 @@ VITE_SERVER_HOSTNAME = 'zhgy.sagoo.cn'
 # VITE_SERVER_HOSTNAME = 'pg.server.mydig.net'
 
 # 加密公钥, 用双引号,换行符用 \n
-VITE_PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\nMIIBCgKCAQEAvp4tyTMi9aWjzm75Mbv00ztx7vIMgOE/8UyMCRPR7uYFCccklXk2\nt0bDwm21OtPF6L+xb9p1vEPVM8NmCUYoGMMb/alwFy0rF0mjH6+vw2Ui1nd+O7P1\nYDcYyj/k+bZFBaPIgfX14gel1apTd39L4DaiLR6mn3uQJd7n2X0GfD1PctmI/Ecx\ndPOzf7119fEk13f7g1w2wllIppb8ewsI2tiewORBqxwJLtDQE+TmYJLHFRSCbUls\nGYlXTpNNVHC0l/C63EwEk7EyGXom/O9Izsqjtbz7DMCkSz8we2aaLzywP3goEhfT\n8THh/M4CptdHMJINUh8HvMbLaE7flnaUZQIDAQAB\n-----END PUBLIC KEY-----"
+VITE_PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\nMIIBCgKCAQEA2GHtfmjFVCi5pcjsv6ppyeEmESN4FpID8WHLtvXXRm3wexonVmhO\n2GUEl/T8PonnYYuUHARFVBmTEF0SvFUwfTab88HznL8KDW8yPDEz8E8daV59BzAx\nVWP389PUxv0AAwLWNa5dy5cIG4eKvrgRjHtMn/c12Ba5R6OfvWX/lX9YkOIDfeca\n2X1eOhgtfqVr4iG6R4UHAf0NzKleNvPbwQjXUN/wMFIF7bNmYebn5kSBDkFb2DLP\npEb8iQ6CQzQM/Z6HVGM2XokJ2oPhvUFpI7BVQce0gIg7rq00Dexz7IJxCU/khkFY\nR6fjPEkL0hoaae2MXtv22gJPwOhlh7kFhQIDAQAB\n-----END PUBLIC KEY-----"

+ 2 - 1
.env.open

@@ -4,4 +4,5 @@ VITE_SERVER_HOSTNAME = ''
 VITE_ISOPEN = true
 
 # 加密公钥, 用双引号,换行符用 \n
-VITE_PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\nMIIBCgKCAQEAvp4tyTMi9aWjzm75Mbv00ztx7vIMgOE/8UyMCRPR7uYFCccklXk2\nt0bDwm21OtPF6L+xb9p1vEPVM8NmCUYoGMMb/alwFy0rF0mjH6+vw2Ui1nd+O7P1\nYDcYyj/k+bZFBaPIgfX14gel1apTd39L4DaiLR6mn3uQJd7n2X0GfD1PctmI/Ecx\ndPOzf7119fEk13f7g1w2wllIppb8ewsI2tiewORBqxwJLtDQE+TmYJLHFRSCbUls\nGYlXTpNNVHC0l/C63EwEk7EyGXom/O9Izsqjtbz7DMCkSz8we2aaLzywP3goEhfT\n8THh/M4CptdHMJINUh8HvMbLaE7flnaUZQIDAQAB\n-----END PUBLIC KEY-----"
+
+VITE_PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\nMIIBCgKCAQEA2GHtfmjFVCi5pcjsv6ppyeEmESN4FpID8WHLtvXXRm3wexonVmhO\n2GUEl/T8PonnYYuUHARFVBmTEF0SvFUwfTab88HznL8KDW8yPDEz8E8daV59BzAx\nVWP389PUxv0AAwLWNa5dy5cIG4eKvrgRjHtMn/c12Ba5R6OfvWX/lX9YkOIDfeca\n2X1eOhgtfqVr4iG6R4UHAf0NzKleNvPbwQjXUN/wMFIF7bNmYebn5kSBDkFb2DLP\npEb8iQ6CQzQM/Z6HVGM2XokJ2oPhvUFpI7BVQce0gIg7rq00Dexz7IJxCU/khkFY\nR6fjPEkL0hoaae2MXtv22gJPwOhlh7kFhQIDAQAB\n-----END PUBLIC KEY-----"

+ 5 - 1
src/api/system/index.ts

@@ -167,6 +167,10 @@ export default {
   basicConfig: {
     getDetails: (params: object) => get('/common/getSysConfigSetting', params),
     setDetails: (data: object) => put('/common/editSysConfigSetting', data),
+    getEmailSetting: () => get('/common/getEmailSetting'),
+    editEmailSetting: (data: object) => put('/common/editEmailSetting', data),
+    getSecuritySetting: () => get('/common/getSecuritySetting'),
+    editSecuritySetting: (data: object) => put('/common/editSecuritySetting', data),
   },
   certificate: {
     getList: () => get('/system/certificate/getAll')
@@ -180,6 +184,6 @@ export default {
   lastLinesLog: {
     getList: (params: object) => get('/system/monitor/listLogs', params),
     detail: (params: object) => get('/system/monitor/lastLinesLog', params),
-    down:(params:object)=>file('system/monitor/downloadLog',params),
+    down: (params: object) => file('system/monitor/downloadLog', params),
   },
 }

+ 191 - 0
src/views/system/safeConfig/index.vue

@@ -0,0 +1,191 @@
+<template>
+	<div class="system-dic-container page-full">
+		<el-card class="page-full-part" shadow="never">
+			<el-form :model="form" ref="queryRef" label-width="140px">
+				<div :style="{ width: '450px' }">
+					<el-descriptions title="安全控制"></el-descriptions>
+					<el-form-item label="是否启用安全控制" prop="security">
+						<el-radio-group v-model="form.security">
+							<el-radio label="0">否</el-radio>
+							<el-radio label="1">是</el-radio>
+						</el-radio-group>
+					</el-form-item>
+					<el-descriptions title="登录设置"></el-descriptions>
+					<el-form-item label="是否单一登录" prop="singleLogin">
+						<el-radio-group v-model="form.singleLogin">
+							<el-radio label="0">否</el-radio>
+							<el-radio label="1">是</el-radio>
+						</el-radio-group>
+					</el-form-item>
+					<el-form-item label="TOKEN过期时间" prop="expiryDate">
+						<el-input type="number" v-model="form.expiryDate" placeholder="请输入">
+							<template #append>分钟</template>
+						</el-input>
+					</el-form-item>
+					<el-form-item label="密码输入错误次数" prop="errorNum">
+						<el-input type="number" v-model="form.errorNum" placeholder="请输入"></el-input>
+					</el-form-item>
+					<el-form-item label="允许再次登录时间" prop="againLoginDate">
+						<el-input type="number" v-model="form.againLoginDate" placeholder="请输入">
+							<template #append>分钟</template>
+						</el-input>
+					</el-form-item>
+					<el-form-item label="密码更换周期" prop="changePeriod">
+						<el-input type="number" v-model="form.changePeriod" placeholder="请输入">
+							<template #append>天</template>
+						</el-input>
+					</el-form-item>
+					<el-descriptions title="密码策略设置"></el-descriptions>
+					<el-form-item label="是否包含大写字母" prop="uppercase">
+						<el-radio-group v-model="form.uppercase">
+							<el-radio label="0">否</el-radio>
+							<el-radio label="1">是</el-radio>
+						</el-radio-group>
+					</el-form-item>
+					<el-form-item label="是否包含小写字母" prop="lowercase">
+						<el-radio-group v-model="form.lowercase">
+							<el-radio label="0">否</el-radio>
+							<el-radio label="1">是</el-radio>
+						</el-radio-group>
+					</el-form-item>
+					<el-form-item label="是否包含数字" prop="digit">
+						<el-radio-group v-model="form.digit">
+							<el-radio label="0">否</el-radio>
+							<el-radio label="1">是</el-radio>
+						</el-radio-group>
+					</el-form-item>
+					<el-form-item label="是否包含复杂字符" prop="complexity">
+						<el-radio-group v-model="form.complexity">
+							<el-radio label="0">否</el-radio>
+							<el-radio label="1">是</el-radio>
+						</el-radio-group>
+					</el-form-item>
+					<el-form-item label="密码长度" prop="minimum">
+						<el-input type="number" v-model="form.minimum" placeholder="请输入密码长度"></el-input>
+					</el-form-item>
+					<el-descriptions title="权限设置"></el-descriptions>
+					<el-form-item label="按钮开关" prop="button">
+						<el-radio-group v-model="form.button">
+							<el-radio label="0">否</el-radio>
+							<el-radio label="1">是</el-radio>
+						</el-radio-group>
+					</el-form-item>
+					<el-form-item label="列表开关" prop="column">
+						<el-radio-group v-model="form.column">
+							<el-radio label="0">否</el-radio>
+							<el-radio label="1">是</el-radio>
+						</el-radio-group>
+					</el-form-item>
+					<el-form-item label="API开关" prop="api">
+						<el-radio-group v-model="form.api">
+							<el-radio label="0">否</el-radio>
+							<el-radio label="1">是</el-radio>
+						</el-radio-group>
+					</el-form-item>
+					<el-form-item>
+						<el-button type="primary" class="ml10" @click="saveEmailConfig">确认</el-button>
+					</el-form-item>
+				</div>
+			</el-form>
+		</el-card>
+
+	</div>
+</template>
+
+<script lang="ts" setup>
+import { reactive } from 'vue';
+import { ElMessage } from 'element-plus';
+import api from '/@/api/system';
+
+const emailConfigMap: any = {}
+
+const form = reactive({
+	singleLogin: '',
+	expiryDate: '',
+	uppercase: '',
+	lowercase: '',
+	digit: '',
+	complexity: '',
+	minimum: '',
+	errorNum: '',
+	againLoginDate: '',
+	changePeriod: '',
+	button: '',
+	column: '',
+	api: '',
+	security: '',
+})
+
+// 是否包含大写字母
+// 是否包含小写字母
+// 是否包含数字
+// 是否包含复杂字符
+// 密码长度
+// 密码输入错误次数
+// 允许再次登录时间
+// 密码更换周期
+api.basicConfig.getDetails({ types: 1 }).then((res: any) => {
+	res.data.forEach((item: any) => {
+		emailConfigMap[item.configKey] = item
+	})
+
+	form.singleLogin = emailConfigMap['sys.is.single.login']?.configValue
+	form.expiryDate = emailConfigMap['sys.token.expiry.date']?.configValue
+	form.uppercase = emailConfigMap['sys.require.uppercase.letter']?.configValue
+	form.lowercase = emailConfigMap['sys.require.lowercase.letter']?.configValue
+	form.digit = emailConfigMap['sys.require.digit']?.configValue
+	form.complexity = emailConfigMap['sys.require.complexity']?.configValue
+	form.minimum = emailConfigMap['sys.password.minimum.length']?.configValue
+	form.errorNum = emailConfigMap['sys.password.error.num']?.configValue
+	form.againLoginDate = emailConfigMap['sys.again.login.date']?.configValue
+	form.changePeriod = emailConfigMap['sys.password.change.period']?.configValue
+	form.changePeriod = emailConfigMap['sys.password.change.period']?.configValue
+	form.changePeriod = emailConfigMap['sys.password.change.period']?.configValue
+	form.button = emailConfigMap['sys.button.switch']?.configValue
+	form.column = emailConfigMap['sys.column.switch']?.configValue
+	form.api = emailConfigMap['sys.api.switch']?.configValue
+	form.security = emailConfigMap['sys.is.security.control.enabled']?.configValue
+});
+
+function saveEmailConfig() {
+	emailConfigMap['sys.is.single.login'] && (emailConfigMap['sys.is.single.login'].configValue = form.singleLogin)
+	emailConfigMap['sys.token.expiry.date'] && (emailConfigMap['sys.token.expiry.date'].configValue = form.expiryDate)
+	emailConfigMap['sys.require.uppercase.letter'] && (emailConfigMap['sys.require.uppercase.letter'].configValue = form.uppercase)
+	emailConfigMap['sys.require.lowercase.letter'] && (emailConfigMap['sys.require.lowercase.letter'].configValue = form.lowercase)
+	emailConfigMap['sys.require.digit'] && (emailConfigMap['sys.require.digit'].configValue = form.digit)
+	emailConfigMap['sys.require.complexity'] && (emailConfigMap['sys.require.complexity'].configValue = form.complexity)
+	emailConfigMap['sys.password.minimum.length'] && (emailConfigMap['sys.password.minimum.length'].configValue = form.minimum)
+	emailConfigMap['sys.password.error.num'] && (emailConfigMap['sys.password.error.num'].configValue = form.errorNum)
+	emailConfigMap['sys.again.login.date'] && (emailConfigMap['sys.again.login.date'].configValue = form.againLoginDate)
+	emailConfigMap['sys.password.change.period'] && (emailConfigMap['sys.password.change.period'].configValue = form.changePeriod)
+	emailConfigMap['sys.button.switch'] && (emailConfigMap['sys.button.switch'].configValue = form.button)
+	emailConfigMap['sys.column.switch'] && (emailConfigMap['sys.column.switch'].configValue = form.column)
+	emailConfigMap['sys.api.switch'] && (emailConfigMap['sys.api.switch'].configValue = form.api)
+	emailConfigMap['sys.is.security.control.enabled'] && (emailConfigMap['sys.is.security.control.enabled'].configValue = form.security)
+	api.basicConfig.setDetails({ ConfigInfo: Object.values(emailConfigMap) }).then(() => {
+		ElMessage.success('操作成功');
+	});
+}
+
+</script>
+
+<style scoped lang="scss">
+:deep(.el-form) {
+	width: 100%;
+}
+
+.el-form-item {
+	margin-bottom: 10px;
+}
+
+:deep(.form-inner-wrap) {
+	width: 100%;
+	display: flex;
+	justify-content: space-between;
+
+	.left-wrap,
+	.right-wrap {
+		width: 100%;
+	}
+}
+</style>