fixbug: 🐛 登录功能完善和已知问题修改
This commit is contained in:
parent
e6e7adda34
commit
5e69aed97e
|
@ -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: '非常弱' },
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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,
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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';
|
||||||
};
|
};
|
||||||
|
|
|
@ -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' }],
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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' });
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue