fixbug: 🐛 登录功能完善和已知问题修改

This commit is contained in:
bunny 2024-10-28 16:52:28 +08:00
parent e6e7adda34
commit 5e69aed97e
9 changed files with 84 additions and 38 deletions

View File

@ -3,6 +3,7 @@ import { onMounted, ref, watch } from 'vue';
import { $t } from '@/plugins/i18n'; import { $t } from '@/plugins/i18n';
import { zxcvbn } from '@zxcvbn-ts/core'; import { zxcvbn } from '@zxcvbn-ts/core';
import { isAllEmpty } from '@pureadmin/utils'; import { isAllEmpty } from '@pureadmin/utils';
import { REGEXP_PWD } from '@/views/login/utils/rule';
const props = defineProps({ const props = defineProps({
form: { form: {
@ -11,7 +12,15 @@ const props = defineProps({
}); });
const rules = { const rules = {
password: [{ required: true, message: '请输入新密码', trigger: 'blur' }], password: [
{ required: true, message: '请输入新密码', trigger: 'blur' },
{
type: 'pattern',
message: $t('login.purePassWordRuleReg'),
trigger: ['change', 'blur'],
pattern: REGEXP_PWD,
},
],
}; };
const pwdProgress = [ const pwdProgress = [
{ color: '#e74242', text: '非常弱' }, { color: '#e74242', text: '非常弱' },

View File

@ -71,8 +71,8 @@ onMounted(() => {
</Motion> </Motion>
<!-- 登录表单 --> <!-- 登录表单 -->
<login-form v-if="currentPage === 0" /> <login-form v-if="currentPage === 'default'" />
<login-email v-if="currentPage === 1" /> <login-email v-if="currentPage === 'email'" />
</div> </div>
</div> </div>
</div> </div>

View File

@ -11,7 +11,7 @@ import { message } from '@/utils/message';
import { getTopMenu, initRouter } from '@/router/utils'; import { getTopMenu, initRouter } from '@/router/utils';
import Motion from './utils/motion'; import Motion from './utils/motion';
import { ElMessage, FormInstance } from 'element-plus'; import { ElMessage, FormInstance } from 'element-plus';
import { onBack } from '@/views/login/utils/hooks'; import { currentPage, onBack } from '@/views/login/utils/hooks';
const router = useRouter(); const router = useRouter();
const userStore = useUserStore(); const userStore = useUserStore();
@ -25,6 +25,7 @@ const ruleForm = reactive({
username: '1319900154@qq.com', username: '1319900154@qq.com',
password: 'admin123', password: 'admin123',
emailCode: '1', emailCode: '1',
type: currentPage.value,
}); });
/** /**

View File

@ -22,6 +22,7 @@ const { t } = useI18n();
const ruleForm = reactive({ const ruleForm = reactive({
username: 'bunny', username: 'bunny',
password: 'admin123', password: 'admin123',
type: currentPage.value,
}); });
/** /**
@ -93,7 +94,7 @@ onBeforeUnmount(() => {
<!-- 邮箱登录 --> <!-- 邮箱登录 -->
<Motion :delay="300"> <Motion :delay="300">
<el-form-item> <el-form-item>
<el-button class="w-full" size="default" @click="currentPage = 1"> 邮箱登录</el-button> <el-button class="w-full" size="default" @click="currentPage = 'email'"> 邮箱登录</el-button>
</el-form-item> </el-form-item>
</Motion> </Motion>
</el-form> </el-form>

View File

@ -1,9 +1,9 @@
import { ref } from 'vue'; import { ref } from 'vue';
// 0普通登录1邮箱登录其中0为普通登录 // 0普通登录1邮箱登录其中0为普通登录
export const currentPage = ref(0); export const currentPage = ref('default');
/** 返回到默认登录页面 */ /** 返回到默认登录页面 */
export const onBack = () => { export const onBack = () => {
currentPage.value = 0; currentPage.value = 'default';
}; };

View File

@ -1,5 +1,7 @@
import { computed, reactive, ref } from 'vue'; import { computed, reactive, ref } from 'vue';
import { $t } from '@/plugins/i18n'; import { $t } from '@/plugins/i18n';
import type { FormRules } from 'element-plus';
import { REGEXP_PWD } from '@/views/login/utils/rule';
// 是否是更新用户信息 // 是否是更新用户信息
export const isAddUserinfo = ref(false); export const isAddUserinfo = ref(false);
@ -36,15 +38,40 @@ export const columns: TableColumnList = [
]; ];
// 添加规则 // 添加规则
export const rules: any = reactive({ export const rules: any = reactive<FormRules>({
// 用户名 // 用户名
username: [{ required: true, message: `${$t('input')}${$t('adminUser_username')}`, trigger: 'blur' }], username: [{ required: true, message: `${$t('input')}${$t('adminUser_username')}`, trigger: 'blur' }],
// 密码 // 密码
password: [{ required: isAddUserinfo, message: `${$t('input')}${$t('adminUser_password')}`, trigger: 'blur' }], password: [
{
required: isAddUserinfo.value,
message: `${$t('input')}${$t('adminUser_password')}`,
trigger: 'blur',
},
{
type: 'pattern',
message: $t('login.purePassWordRuleReg'),
trigger: ['change', 'blur'],
pattern: REGEXP_PWD,
},
],
// 邮箱 // 邮箱
email: [ email: [
{ required: true, message: `${$t('input')}${$t('adminUser_email')}`, trigger: 'blur' }, { required: true, message: `${$t('input')}${$t('adminUser_email')}`, trigger: ['change', 'blur'] },
{ type: 'email', message: `${$t('input')}${$t('adminUser_email')}${$t('format_error')}` }, {
type: 'email',
message: `${$t('input')}${$t('adminUser_email')}${$t('format_error')}`,
trigger: ['change', 'blur'],
},
],
// 手机号
phone: [
{
type: 'pattern',
message: `${$t('input')}${$t('adminUser_phone')}${$t('format_error')}`,
trigger: ['change', 'blur'],
pattern: /^(0|86|17951)?(13[0-9]|15[012356789]|166|17[3678]|18[0-9]|14[57])[0-9]{8}$/,
},
], ],
// 状态 // 状态
status: [{ required: true, message: `${$t('input')}${$t('adminUser_status')}`, trigger: 'blur' }], status: [{ required: true, message: `${$t('input')}${$t('adminUser_status')}`, trigger: 'blur' }],

View File

@ -1,5 +1,5 @@
<script lang="ts" setup> <script lang="ts" setup>
import { computed, onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { FormInstance } from 'element-plus'; import { FormInstance } from 'element-plus';
import { powerCascadeProps, rules } from '@/views/system/power/utils/columns'; import { powerCascadeProps, rules } from '@/views/system/power/utils/columns';
import { FormProps } from '@/views/system/power/utils/types'; import { FormProps } from '@/views/system/power/utils/types';
@ -23,7 +23,6 @@ const props = withDefaults(defineProps<FormProps>(), {
const formRef = ref<FormInstance>(); const formRef = ref<FormInstance>();
const form = ref(props.formInline); const form = ref(props.formInline);
const powerStore = usePowerStore(); const powerStore = usePowerStore();
const datalist = computed(() => handleTree(powerStore.allPowerList));
onMounted(() => { onMounted(() => {
powerStore.getAllPowers(); powerStore.getAllPowers();
@ -38,13 +37,13 @@ defineExpose({ formRef });
<el-cascader v-model="form.parentId" :options="handleTree(powerStore.allPowerList)" :props="powerCascadeProps" class="w-full" clearable filterable show-all-levels /> <el-cascader v-model="form.parentId" :options="handleTree(powerStore.allPowerList)" :props="powerCascadeProps" class="w-full" clearable filterable show-all-levels />
</el-form-item> </el-form-item>
<el-form-item :label="$t('power_powerCode')" prop="powerCode"> <el-form-item :label="$t('power_powerCode')" prop="powerCode">
<el-input v-model="form.powerCode" autocomplete="off" type="text" /> <el-input v-model="form.powerCode" :placeholder="$t('power_powerCode')" autocomplete="off" type="text" />
</el-form-item> </el-form-item>
<el-form-item :label="$t('power_powerName')" prop="powerName"> <el-form-item :label="$t('power_powerName')" prop="powerName">
<el-input v-model="form.powerName" autocomplete="off" type="text" /> <el-input v-model="form.powerName" :placeholder="$t('power_powerName')" autocomplete="off" type="text" />
</el-form-item> </el-form-item>
<el-form-item :label="$t('power_requestUrl')" prop="requestUrl"> <el-form-item :label="$t('power_requestUrl')" prop="requestUrl">
<el-input v-model="form.requestUrl" autocomplete="off" type="text" /> <el-input v-model="form.requestUrl" :placeholder="$t('inputRequestUrlTip')" autocomplete="off" type="text" />
</el-form-item> </el-form-item>
</el-form> </el-form>
</template> </template>

View File

@ -1,5 +1,6 @@
import { reactive } from 'vue'; import { reactive } from 'vue';
import { $t } from '@/plugins/i18n'; import { $t } from '@/plugins/i18n';
import type { FormRules } from 'element-plus';
// 表格列 // 表格列
export const columns: TableColumnList = [ export const columns: TableColumnList = [
@ -19,11 +20,13 @@ export const columns: TableColumnList = [
]; ];
// 添加规则 // 添加规则
export const rules = reactive({ export const rules = reactive<FormRules>({
// 权限编码 // 权限编码
powerCode: [{ required: true, message: `${$t('input')}${$t('power_powerCode')}`, trigger: 'blur' }], powerCode: [{ required: true, message: `${$t('input')}${$t('power_powerCode')}`, trigger: 'blur' }],
// 权限名称 // 权限名称
powerName: [{ required: true, message: `${$t('input')}${$t('power_powerName')}`, trigger: 'blur' }], powerName: [{ required: true, message: `${$t('input')}${$t('power_powerName')}`, trigger: 'blur' }],
// 请求地址
requestUrl: [{ type: 'pattern', message: $t('inputRequestUrlTip'), pattern: /^\/.*/, trigger: 'change' }],
}); });
// 权限树形结构props // 权限树形结构props

View File

@ -2,11 +2,12 @@ import { addDialog } from '@/components/BaseDialog/index';
import RoleDialog from '@/views/system/role/role-dialog.vue'; import RoleDialog from '@/views/system/role/role-dialog.vue';
import { useRoleStore } from '@/store/system/role'; import { useRoleStore } from '@/store/system/role';
import { h, ref } from 'vue'; import { h, ref } from 'vue';
import { messageBox } from '@/utils/message'; import { message, messageBox } from '@/utils/message';
import type { FormItemProps } from '@/views/system/role/utils/types'; import type { FormItemProps } from '@/views/system/role/utils/types';
import { $t } from '@/plugins/i18n'; import { $t } from '@/plugins/i18n';
import { fetchGetPowerListByRoleId } from '@/api/v1/power'; import { fetchGetPowerListByRoleId } from '@/api/v1/power';
import { isAllEmpty } from '@pureadmin/utils'; import { isAllEmpty } from '@pureadmin/utils';
import DeleteBatchDialog from '@/components/Table/DeleteBatchDialog.vue';
// 表格ref // 表格ref
export const tableRef = ref(); export const tableRef = ref();
@ -33,9 +34,7 @@ export async function onSearch() {
roleStore.loading = false; roleStore.loading = false;
} }
/** /** 添加角色 */
* *
*/
export function onAdd() { export function onAdd() {
addDialog({ addDialog({
title: `${$t('addNew')}${$t('role')}`, title: `${$t('addNew')}${$t('role')}`,
@ -86,9 +85,7 @@ export function onUpdate(row: any) {
}); });
} }
/** /** 删除角色 */
* *
*/
export const onDelete = async (row: any) => { export const onDelete = async (row: any) => {
const id = row.id; const id = row.id;
@ -106,24 +103,33 @@ export const onDelete = async (row: any) => {
await onSearch(); await onSearch();
}; };
/** /** 批量删除 */
*
*/
export const onDeleteBatch = async () => { export const onDeleteBatch = async () => {
const ids = deleteIds.value; const ids = deleteIds.value;
const formDeletedBatchRef = ref();
addDialog({
title: $t('deleteBatchTip'),
width: '30%',
props: { formInline: { confirmText: '' } },
draggable: true,
fullscreenIcon: true,
closeOnClickModal: false,
contentRenderer: () => h(DeleteBatchDialog, { ref: formDeletedBatchRef }),
beforeSure: (done, { options }) => {
formDeletedBatchRef.value.formDeletedBatchRef.validate(async (valid: any) => {
if (!valid) return;
// 是否确认删除 const text = options.props.formInline.confirmText.toLowerCase();
const result = await messageBox({ if (text === 'yes' || text === 'y') {
title: $t('confirmDelete'),
showMessage: false,
confirmMessage: undefined,
cancelMessage: $t('confirmDelete'),
});
if (!result) return;
// 删除数据 // 删除数据
await roleStore.deleteRole(ids); await roleStore.deleteRole(ids);
await onSearch(); await onSearch();
done();
} else message($t('deleteBatchTip'), { type: 'warning' });
});
},
});
}; };
/** /**