ljlong_2630
1 month ago
4 changed files with 200 additions and 4 deletions
@ -0,0 +1,29 @@ |
|||
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'}) |
|||
} |
|||
// 验证密码是否过期
|
|||
export const validateResetTime = (userId:number) => { |
|||
return request.get({ url: '/system/password/validateResetTime?userId=' + userId}) |
|||
} |
@ -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