bjang03
3 months ago
2 changed files with 178 additions and 0 deletions
@ -0,0 +1,25 @@ |
|||||
|
import request from '@/config/axios' |
||||
|
|
||||
|
export interface PassWordConfigVO { |
||||
|
id: number |
||||
|
status: boolean |
||||
|
ruleLevel: string |
||||
|
ruleDesc: string |
||||
|
tryCount: number |
||||
|
lockMinutes: number |
||||
|
updatePeriod: number |
||||
|
} |
||||
|
// 获取密码策略
|
||||
|
export const getConfig = () => { |
||||
|
return request.get({ url: '/system/password/getConfig' }) |
||||
|
} |
||||
|
|
||||
|
// 设置密码策略
|
||||
|
export const setConfig = (data: PassWordConfigVO) => { |
||||
|
return request.post({ url: '/system/password/setConfig', data }) |
||||
|
} |
||||
|
|
||||
|
// 获取密码复杂度
|
||||
|
export const getRuleList = () => { |
||||
|
return request.get({ url: '/system/password/getRuleList'}) |
||||
|
} |
@ -0,0 +1,153 @@ |
|||||
|
<template> |
||||
|
<!-- 搜索 --> |
||||
|
<div v-loading="loading" class="box"> |
||||
|
<el-form ref="formSmsLogin" :model="data" :rules="rules" label-width="70px" size="large"> |
||||
|
<div |
||||
|
class="title" |
||||
|
style="font-size: 20px; text-align: center; margin-bottom: 20px; font-weight: bold" |
||||
|
>密码策略</div |
||||
|
> |
||||
|
<el-row type="flex" justify="center" align="middle"> |
||||
|
<el-col> |
||||
|
<el-form-item label="密码难度" prop="ruleLevel" align="center"> |
||||
|
<el-select v-model="passwordConfig.ruleLevel" placeholder="请选择密码难度"> |
||||
|
<el-option |
||||
|
v-for="item in ruleList" |
||||
|
:key="item.value" |
||||
|
:label="item.ruleLevel" |
||||
|
:value="item.ruleLevel" |
||||
|
/> |
||||
|
</el-select> |
||||
|
</el-form-item> |
||||
|
</el-col> |
||||
|
<el-col> |
||||
|
<el-form-item label="试错次数" prop="tryCount"> |
||||
|
<el-input-number |
||||
|
v-model="passwordConfig.tryCount" |
||||
|
:min="0" |
||||
|
:precision="0" |
||||
|
style="margin-right: 10px" |
||||
|
/>次 |
||||
|
</el-form-item> |
||||
|
</el-col> |
||||
|
<el-col> |
||||
|
<el-form-item label="锁定时长" prop="lockMinutes"> |
||||
|
<el-input-number |
||||
|
v-model="passwordConfig.lockMinutes" |
||||
|
:min="0" |
||||
|
:precision="0" |
||||
|
style="margin-right: 10px" |
||||
|
/>分钟 |
||||
|
</el-form-item> |
||||
|
</el-col> |
||||
|
<el-col> |
||||
|
<el-form-item label="更新周期" prop="updatePeriod"> |
||||
|
<el-input-number |
||||
|
v-model="passwordConfig.updatePeriod" |
||||
|
:min="0" |
||||
|
:precision="0" |
||||
|
style="margin-right: 10px" |
||||
|
/>天 |
||||
|
</el-form-item> |
||||
|
</el-col> |
||||
|
<el-col> |
||||
|
<el-form-item label="是否开启" prop="status"> |
||||
|
<el-switch v-model="passwordConfig.status" /> |
||||
|
</el-form-item> |
||||
|
</el-col> |
||||
|
</el-row> |
||||
|
</el-form> |
||||
|
<div class="dialog-footer"> |
||||
|
<el-button |
||||
|
type="primary" |
||||
|
@click="handleUpdate" |
||||
|
style="width: 100%; height: 40px; line-height: 40px" |
||||
|
>保 存</el-button |
||||
|
> |
||||
|
<el-button type="danger" @click="reset" style="width: 100%; height: 40px; line-height: 40px" |
||||
|
>重 置</el-button |
||||
|
> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
<script lang="ts" setup> |
||||
|
import * as api from '@/api/system/password' |
||||
|
|
||||
|
defineOptions({ name: 'PasswordRule' }) |
||||
|
|
||||
|
const message = useMessage() // 消息弹窗 |
||||
|
const { t } = useI18n() // 国际化 |
||||
|
const loading = ref(false) |
||||
|
const rules = { |
||||
|
password: [required], |
||||
|
againPassword: [required] |
||||
|
} |
||||
|
const reset = () => { |
||||
|
passwordConfig.value = { |
||||
|
status: true, |
||||
|
ruleLevel: "简单", |
||||
|
ruleDesc: "", |
||||
|
tryCount: 3, |
||||
|
lockMinutes: 1, |
||||
|
updatePeriod: 1, |
||||
|
} |
||||
|
} |
||||
|
const passwordConfig = ref({ |
||||
|
status: true, |
||||
|
ruleLevel: "简单", |
||||
|
ruleDesc: "", |
||||
|
tryCount: 3, |
||||
|
lockMinutes: 1, |
||||
|
updatePeriod: 1, |
||||
|
}) |
||||
|
/** 查询配置 */ |
||||
|
const getConfig = async () => { |
||||
|
loading.value = true |
||||
|
try { |
||||
|
passwordConfig.value = await api.getConfig() |
||||
|
} finally { |
||||
|
loading.value = false |
||||
|
} |
||||
|
} |
||||
|
const ruleList = ref([]) |
||||
|
/** 获取规则等级 */ |
||||
|
const getRuleList = async () => { |
||||
|
loading.value = true |
||||
|
try { |
||||
|
ruleList.value = await api.getRuleList() |
||||
|
} finally { |
||||
|
loading.value = false |
||||
|
} |
||||
|
} |
||||
|
/** 保存 */ |
||||
|
const handleUpdate = async () => { |
||||
|
try { |
||||
|
loading.value = true |
||||
|
await api.setConfig(passwordConfig.value) |
||||
|
message.success(t('common.save')) |
||||
|
} catch { |
||||
|
|
||||
|
}finally { |
||||
|
loading.value = false |
||||
|
} |
||||
|
} |
||||
|
/** 初始化 **/ |
||||
|
onMounted(async () => { |
||||
|
getConfig() |
||||
|
getRuleList() |
||||
|
}) |
||||
|
</script> |
||||
|
<style lang="scss" scoped> |
||||
|
.box { |
||||
|
margin: 50px auto; |
||||
|
width: 500px; |
||||
|
background: white; |
||||
|
padding: 20px; |
||||
|
border: 1px solid #dedede; |
||||
|
} |
||||
|
.dialog-footer { |
||||
|
display: flex; |
||||
|
width: 160px; |
||||
|
margin: 0 auto; |
||||
|
} |
||||
|
</style> |
Loading…
Reference in new issue