bug: 🐛 用户名校验
This commit is contained in:
286
src/api/acl/api.d.ts
vendored
286
src/api/acl/api.d.ts
vendored
@@ -1,198 +1,198 @@
|
||||
declare namespace acl {
|
||||
/**
|
||||
* 权限
|
||||
*/
|
||||
export interface Permission {
|
||||
/** createdTime */
|
||||
createdTime?: string;
|
||||
/**
|
||||
* 权限
|
||||
*/
|
||||
export interface Permission {
|
||||
/** createdTime */
|
||||
createdTime?: string
|
||||
|
||||
/** 权限描述 */
|
||||
description?: string;
|
||||
/** 权限描述 */
|
||||
description?: string
|
||||
|
||||
/** id */
|
||||
id?: number;
|
||||
/** id */
|
||||
id?: number
|
||||
|
||||
/** 权限key,英文 */
|
||||
key?: string;
|
||||
/** 权限key,英文 */
|
||||
key?: string
|
||||
|
||||
/** 权限keyPath,用来做业务,(父级keyPath.key) */
|
||||
keyPath?: string;
|
||||
/** 权限keyPath,用来做业务,(父级keyPath.key) */
|
||||
keyPath?: string
|
||||
|
||||
/** 权限名称,中文用来做标识 */
|
||||
name?: string;
|
||||
/** 权限名称,中文用来做标识 */
|
||||
name?: string
|
||||
|
||||
/** 父权限key */
|
||||
parentKey?: string;
|
||||
/** 父权限key */
|
||||
parentKey?: string
|
||||
|
||||
/** 权限类型 */
|
||||
type?: 'MENU' | 'BUTTON' | 'OTHER';
|
||||
/** 权限类型 */
|
||||
type?: 'MENU' | 'BUTTON' | 'OTHER'
|
||||
|
||||
/** typeInfo */
|
||||
typeInfo?: acl.Codebook;
|
||||
/** typeInfo */
|
||||
typeInfo?: acl.Codebook
|
||||
|
||||
/** updatedTime */
|
||||
updatedTime?: string;
|
||||
}
|
||||
/** updatedTime */
|
||||
updatedTime?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* 权限信息,包含是否选中标识
|
||||
*/
|
||||
export interface PermissionInfo {
|
||||
/** createdTime */
|
||||
createdTime?: string;
|
||||
/**
|
||||
* 权限信息,包含是否选中标识
|
||||
*/
|
||||
export interface PermissionInfo {
|
||||
/** createdTime */
|
||||
createdTime?: string
|
||||
|
||||
/** 权限描述 */
|
||||
description?: string;
|
||||
/** 权限描述 */
|
||||
description?: string
|
||||
|
||||
/** id */
|
||||
id?: number;
|
||||
/** id */
|
||||
id?: number
|
||||
|
||||
/** 权限key,英文 */
|
||||
key?: string;
|
||||
/** 权限key,英文 */
|
||||
key?: string
|
||||
|
||||
/** 权限keyPath,用来做业务,(父级keyPath.key) */
|
||||
keyPath?: string;
|
||||
/** 权限keyPath,用来做业务,(父级keyPath.key) */
|
||||
keyPath?: string
|
||||
|
||||
/** 权限名称,中文用来做标识 */
|
||||
name?: string;
|
||||
/** 权限名称,中文用来做标识 */
|
||||
name?: string
|
||||
|
||||
/** 父权限key */
|
||||
parentKey?: string;
|
||||
/** 父权限key */
|
||||
parentKey?: string
|
||||
|
||||
/** 权限是否选中标识 */
|
||||
selected: boolean;
|
||||
/** 权限是否选中标识 */
|
||||
selected: boolean
|
||||
|
||||
/** 权限类型 */
|
||||
type?: 'MENU' | 'BUTTON' | 'OTHER';
|
||||
/** 权限类型 */
|
||||
type?: 'MENU' | 'BUTTON' | 'OTHER'
|
||||
|
||||
/** typeInfo */
|
||||
typeInfo?: acl.Codebook;
|
||||
/** typeInfo */
|
||||
typeInfo?: acl.Codebook
|
||||
|
||||
/** updatedTime */
|
||||
updatedTime?: string;
|
||||
}
|
||||
/** updatedTime */
|
||||
updatedTime?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* 角色
|
||||
*/
|
||||
export interface Role {
|
||||
/** createdTime */
|
||||
createdTime?: string;
|
||||
/**
|
||||
* 角色
|
||||
*/
|
||||
export interface Role {
|
||||
/** createdTime */
|
||||
createdTime?: string
|
||||
|
||||
/** 角色描述 */
|
||||
description?: string;
|
||||
/** 角色描述 */
|
||||
description?: string
|
||||
|
||||
/** id */
|
||||
id?: number;
|
||||
/** id */
|
||||
id?: number
|
||||
|
||||
/** 角色key,英文,用来做业务 */
|
||||
key: string;
|
||||
/** 角色key,英文,用来做业务 */
|
||||
key?: string
|
||||
|
||||
/** 角色名称,中文用来做标识 */
|
||||
name?: string;
|
||||
/** 角色名称,中文用来做标识 */
|
||||
name?: string
|
||||
|
||||
/** updatedTime */
|
||||
updatedTime?: string;
|
||||
}
|
||||
/** updatedTime */
|
||||
updatedTime?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* 角色信息,包含是否选中标识
|
||||
*/
|
||||
export interface RoleInfo {
|
||||
/** createdTime */
|
||||
createdTime?: string;
|
||||
/**
|
||||
* 角色信息,包含是否选中标识
|
||||
*/
|
||||
export interface RoleInfo {
|
||||
/** createdTime */
|
||||
createdTime?: string
|
||||
|
||||
/** 角色描述 */
|
||||
description?: string;
|
||||
/** 角色描述 */
|
||||
description?: string
|
||||
|
||||
/** id */
|
||||
id?: number;
|
||||
/** id */
|
||||
id?: number
|
||||
|
||||
/** 角色key,英文,用来做业务 */
|
||||
key: string;
|
||||
/** 角色key,英文,用来做业务 */
|
||||
key?: string
|
||||
|
||||
/** 角色名称,中文用来做标识 */
|
||||
name?: string;
|
||||
/** 角色名称,中文用来做标识 */
|
||||
name?: string
|
||||
|
||||
/** 角色是否选中标识 */
|
||||
selected: boolean;
|
||||
/** 角色是否选中标识 */
|
||||
selected: boolean
|
||||
|
||||
/** updatedTime */
|
||||
updatedTime?: string;
|
||||
}
|
||||
/** updatedTime */
|
||||
updatedTime?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* 树
|
||||
*/
|
||||
export interface TreeString {
|
||||
/** 下级列表 */
|
||||
children?: Array<acl.TreeString>;
|
||||
/**
|
||||
* 树
|
||||
*/
|
||||
export interface TreeString {
|
||||
/** 下级列表 */
|
||||
children?: Array<acl.TreeString>
|
||||
|
||||
/** 描述 */
|
||||
description?: string;
|
||||
/** 描述 */
|
||||
description?: string
|
||||
|
||||
/** ID */
|
||||
key: string;
|
||||
/** ID */
|
||||
key: string
|
||||
|
||||
/** 名称 */
|
||||
name: string;
|
||||
/** 名称 */
|
||||
name: string
|
||||
|
||||
/** originData */
|
||||
originData: acl.TreeableString;
|
||||
/** originData */
|
||||
originData: acl.TreeableString
|
||||
|
||||
/** 父级 ID */
|
||||
parentKey?: string;
|
||||
}
|
||||
/** 父级 ID */
|
||||
parentKey?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* 原始数据
|
||||
*/
|
||||
export interface TreeableString {
|
||||
/** description */
|
||||
description?: string;
|
||||
/**
|
||||
* 原始数据
|
||||
*/
|
||||
export interface TreeableString {
|
||||
/** description */
|
||||
description?: string
|
||||
|
||||
/** key */
|
||||
key?: string;
|
||||
/** key */
|
||||
key?: string
|
||||
|
||||
/** name */
|
||||
name?: string;
|
||||
/** name */
|
||||
name?: string
|
||||
|
||||
/** parentKey */
|
||||
parentKey?: string;
|
||||
}
|
||||
/** parentKey */
|
||||
parentKey?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户
|
||||
*/
|
||||
export interface User {
|
||||
/** createdTime */
|
||||
createdTime?: string;
|
||||
/**
|
||||
* 用户
|
||||
*/
|
||||
export interface User {
|
||||
/** createdTime */
|
||||
createdTime?: string
|
||||
|
||||
/** 邮箱 */
|
||||
email?: string;
|
||||
/** 邮箱 */
|
||||
email?: string
|
||||
|
||||
/** 真实姓名 */
|
||||
fullName?: string;
|
||||
/** 真实姓名 */
|
||||
fullName?: string
|
||||
|
||||
/** id */
|
||||
id?: number;
|
||||
/** id */
|
||||
id?: number
|
||||
|
||||
/** 手机号 */
|
||||
mobile?: string;
|
||||
/** 手机号 */
|
||||
mobile?: string
|
||||
|
||||
/** 用户名 */
|
||||
name: string;
|
||||
/** 用户名 */
|
||||
name: string
|
||||
|
||||
/** 密码 */
|
||||
password?: string;
|
||||
/** 密码 */
|
||||
password?: string
|
||||
|
||||
/** 性别 */
|
||||
sex?: 'MALE' | 'FEMALE';
|
||||
/** 性别 */
|
||||
sex?: 'MALE' | 'FEMALE'
|
||||
|
||||
/** sexInfo */
|
||||
sexInfo?: acl.Codebook;
|
||||
/** sexInfo */
|
||||
sexInfo?: acl.Codebook
|
||||
|
||||
/** updatedTime */
|
||||
updatedTime?: string;
|
||||
}
|
||||
/** updatedTime */
|
||||
updatedTime?: string
|
||||
}
|
||||
}
|
||||
|
||||
26
src/api/acl/mods/user/existName.ts
Normal file
26
src/api/acl/mods/user/existName.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
/**
|
||||
* @desc 检查用户名是否存在,true存在,false不存在
|
||||
*/
|
||||
import { defaultSuccess, defaultError, http } from '@/plugins/axios'
|
||||
import type { AxiosResponse } from 'axios'
|
||||
export interface Params {
|
||||
/** name */
|
||||
name: string
|
||||
}
|
||||
|
||||
export default async function (
|
||||
params: Params,
|
||||
success: (data: boolean) => void = defaultSuccess,
|
||||
fail: (error: { code: string; error?: string }) => void = defaultError,
|
||||
): Promise<void> {
|
||||
return http({
|
||||
method: 'get',
|
||||
url: `/user/exist-name`,
|
||||
|
||||
params,
|
||||
})
|
||||
.then((data: AxiosResponse<boolean, unknown>) => {
|
||||
success(data.data)
|
||||
})
|
||||
.catch((error: { code: string; error?: string }) => fail(error))
|
||||
}
|
||||
@@ -2,30 +2,32 @@
|
||||
* @description 用户
|
||||
*
|
||||
*/
|
||||
import saveOrUpdateUser from './saveOrUpdateUser';
|
||||
import all from './all';
|
||||
import sexes from './sexes';
|
||||
import detail from './detail';
|
||||
import deleteUser from './deleteUser';
|
||||
import resetPassword from './resetPassword';
|
||||
import permissionInfos from './permissionInfos';
|
||||
import permissions from './permissions';
|
||||
import grant from './grant';
|
||||
import roleInfos from './roleInfos';
|
||||
import grantRole from './grantRole';
|
||||
import users from './users';
|
||||
import saveOrUpdateUser from './saveOrUpdateUser'
|
||||
import all from './all'
|
||||
import existName from './existName'
|
||||
import sexes from './sexes'
|
||||
import detail from './detail'
|
||||
import deleteUser from './deleteUser'
|
||||
import resetPassword from './resetPassword'
|
||||
import permissionInfos from './permissionInfos'
|
||||
import permissions from './permissions'
|
||||
import grant from './grant'
|
||||
import roleInfos from './roleInfos'
|
||||
import grantRole from './grantRole'
|
||||
import users from './users'
|
||||
|
||||
export default {
|
||||
saveOrUpdateUser,
|
||||
all,
|
||||
sexes,
|
||||
detail,
|
||||
deleteUser,
|
||||
resetPassword,
|
||||
permissionInfos,
|
||||
permissions,
|
||||
grant,
|
||||
roleInfos,
|
||||
grantRole,
|
||||
users,
|
||||
};
|
||||
saveOrUpdateUser,
|
||||
all,
|
||||
existName,
|
||||
sexes,
|
||||
detail,
|
||||
deleteUser,
|
||||
resetPassword,
|
||||
permissionInfos,
|
||||
permissions,
|
||||
grant,
|
||||
roleInfos,
|
||||
grantRole,
|
||||
users,
|
||||
}
|
||||
|
||||
@@ -1210,6 +1210,37 @@
|
||||
},
|
||||
"parameters": []
|
||||
},
|
||||
{
|
||||
"description": "检查用户名是否存在,true存在,false不存在",
|
||||
"name": "existName",
|
||||
"method": "get",
|
||||
"path": "/user/exist-name",
|
||||
"response": {
|
||||
"typeArgs": [],
|
||||
"typeName": "boolean",
|
||||
"isDefsType": false,
|
||||
"templateIndex": -1,
|
||||
"compileTemplateKeyword": "#/definitions/",
|
||||
"enum": [],
|
||||
"typeProperties": []
|
||||
},
|
||||
"parameters": [
|
||||
{
|
||||
"required": true,
|
||||
"in": "query",
|
||||
"name": "name",
|
||||
"dataType": {
|
||||
"typeArgs": [],
|
||||
"typeName": "string",
|
||||
"isDefsType": false,
|
||||
"templateIndex": -1,
|
||||
"compileTemplateKeyword": "#/definitions/",
|
||||
"enum": [],
|
||||
"typeProperties": []
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"description": "用户性别",
|
||||
"name": "sexes",
|
||||
@@ -2255,7 +2286,7 @@
|
||||
},
|
||||
"name": "key",
|
||||
"description": "角色key,英文,用来做业务",
|
||||
"required": true
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"dataType": {
|
||||
@@ -2343,7 +2374,7 @@
|
||||
},
|
||||
"name": "key",
|
||||
"description": "角色key,英文,用来做业务",
|
||||
"required": true
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"dataType": {
|
||||
|
||||
@@ -177,12 +177,10 @@
|
||||
{
|
||||
title: t('pages.acl.user.table.columns.sex'),
|
||||
dataIndex: 'sex',
|
||||
width: 75,
|
||||
},
|
||||
{
|
||||
title: t('pages.acl.user.table.columns.operation'),
|
||||
dataIndex: 'operation',
|
||||
width: 400,
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
@@ -5,6 +5,8 @@ const { t } = i18n.global
|
||||
import { useAppStore } from '@/stores/app'
|
||||
|
||||
import { FormItem, FormConfig } from '@/components/form-render/form-render-types'
|
||||
import { Rule } from 'ant-design-vue/es/form'
|
||||
import api from '@/api'
|
||||
|
||||
export const config: FormConfig = {
|
||||
layout: 'horizontal',
|
||||
@@ -42,12 +44,8 @@ export const formItems = (sexes: Codebook[]): FormItem[] => {
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
type: 'string',
|
||||
required: true,
|
||||
whitespace: true,
|
||||
validator: validate,
|
||||
trigger: ['blur', 'change'],
|
||||
pattern: new RegExp('^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$'),
|
||||
message: '8位数字字母组合',
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -161,3 +159,18 @@ export const formItems = (sexes: Codebook[]): FormItem[] => {
|
||||
},
|
||||
]
|
||||
}
|
||||
|
||||
const validate = async (_rule: Rule, value: string) => {
|
||||
const regex = /^[a-zA-Z0-9]{4,8}$/
|
||||
if (!regex.test(value)) {
|
||||
return Promise.reject('用户名只能是4-8位字母或数字')
|
||||
} else {
|
||||
api.aclApi.user.existName({ name: value }, (data) => {
|
||||
if (data) {
|
||||
return Promise.reject('用户名已经存在')
|
||||
} else {
|
||||
return Promise.resolve()
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user