feat(web): 完成用户管理模块
This commit is contained in:
8
.idea/GitCommitMessageStorage.xml
generated
Normal file
8
.idea/GitCommitMessageStorage.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="GitCommitMessageStorage">
|
||||||
|
<option name="messageStorage">
|
||||||
|
<MessageStorage />
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
12
.idea/dataSources.xml
generated
12
.idea/dataSources.xml
generated
@@ -13,5 +13,17 @@
|
|||||||
</jdbc-additional-properties>
|
</jdbc-additional-properties>
|
||||||
<working-dir>$ProjectFileDir$</working-dir>
|
<working-dir>$ProjectFileDir$</working-dir>
|
||||||
</data-source>
|
</data-source>
|
||||||
|
<data-source source="LOCAL" name="homeless" uuid="9af017b2-2a8b-45b4-899c-ef4fb185b77c">
|
||||||
|
<driver-ref>mysql.8</driver-ref>
|
||||||
|
<synchronize>true</synchronize>
|
||||||
|
<jdbc-driver>com.mysql.cj.jdbc.Driver</jdbc-driver>
|
||||||
|
<jdbc-url>jdbc:mysql://frp-air.top:43458</jdbc-url>
|
||||||
|
<jdbc-additional-properties>
|
||||||
|
<property name="com.intellij.clouds.kubernetes.db.host.port" />
|
||||||
|
<property name="com.intellij.clouds.kubernetes.db.enabled" value="false" />
|
||||||
|
<property name="com.intellij.clouds.kubernetes.db.container.port" />
|
||||||
|
</jdbc-additional-properties>
|
||||||
|
<working-dir>$ProjectFileDir$</working-dir>
|
||||||
|
</data-source>
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
package com.eshore.gringotts.web.domain.user.controller;
|
||||||
|
|
||||||
|
import com.eshore.gringotts.web.configuration.amis.AmisListResponse;
|
||||||
|
import com.eshore.gringotts.web.configuration.amis.AmisResponse;
|
||||||
|
import com.eshore.gringotts.web.domain.user.service.UserService;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户管理
|
||||||
|
*
|
||||||
|
* @author lanyuanxiaoyao
|
||||||
|
* @date 2024-11-15
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/user_management")
|
||||||
|
public class UserManagementController {
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(UserManagementController.class);
|
||||||
|
|
||||||
|
private final UserService userService;
|
||||||
|
|
||||||
|
public UserManagementController(UserService userService) {
|
||||||
|
this.userService = userService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/list")
|
||||||
|
public AmisListResponse list() {
|
||||||
|
return AmisListResponse.responseListData(userService.list());
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/disable/{username}")
|
||||||
|
public AmisResponse<Object> disable(@PathVariable String username) {
|
||||||
|
userService.disable(username);
|
||||||
|
return AmisResponse.responseSuccess();
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/enable/{username}")
|
||||||
|
public AmisResponse<Object> enable(@PathVariable String username) {
|
||||||
|
userService.enable(username);
|
||||||
|
return AmisResponse.responseSuccess();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -79,5 +79,9 @@ public class User {
|
|||||||
* 数据监管方
|
* 数据监管方
|
||||||
*/
|
*/
|
||||||
CHECKER,
|
CHECKER,
|
||||||
|
/**
|
||||||
|
* 系统管理员
|
||||||
|
*/
|
||||||
|
ADMINISTRATOR,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,10 @@ import com.blinkfox.fenix.jpa.FenixJpaRepository;
|
|||||||
import com.blinkfox.fenix.specification.FenixJpaSpecificationExecutor;
|
import com.blinkfox.fenix.specification.FenixJpaSpecificationExecutor;
|
||||||
import com.eshore.gringotts.web.domain.user.entity.User;
|
import com.eshore.gringotts.web.domain.user.entity.User;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
import org.springframework.data.jpa.repository.Modifying;
|
||||||
|
import org.springframework.data.jpa.repository.Query;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User操作
|
* User操作
|
||||||
@@ -16,4 +19,9 @@ import org.springframework.stereotype.Repository;
|
|||||||
public interface UserRepository extends FenixJpaRepository<User, Long>, FenixJpaSpecificationExecutor<User> {
|
public interface UserRepository extends FenixJpaRepository<User, Long>, FenixJpaSpecificationExecutor<User> {
|
||||||
Boolean existsByUsername(String username);
|
Boolean existsByUsername(String username);
|
||||||
Optional<User> findByUsername(String username);
|
Optional<User> findByUsername(String username);
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
@Modifying
|
||||||
|
@Query("update User u set u.state = ?2 where u.username = ?1")
|
||||||
|
void updateStateByUsername(String username, User.State state);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,11 @@ import cn.hutool.crypto.SecureUtil;
|
|||||||
import com.eshore.gringotts.web.domain.user.controller.UserController;
|
import com.eshore.gringotts.web.domain.user.controller.UserController;
|
||||||
import com.eshore.gringotts.web.domain.user.entity.User;
|
import com.eshore.gringotts.web.domain.user.entity.User;
|
||||||
import com.eshore.gringotts.web.domain.user.repository.UserRepository;
|
import com.eshore.gringotts.web.domain.user.repository.UserRepository;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import org.eclipse.collections.api.factory.Lists;
|
||||||
|
import org.eclipse.collections.api.list.ImmutableList;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@@ -68,6 +72,20 @@ public class UserService {
|
|||||||
return userRepository.existsByUsername(username);
|
return userRepository.existsByUsername(username);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void disable(String username) {
|
||||||
|
userRepository.updateStateByUsername(username, User.State.DISABLED);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void enable(String username) {
|
||||||
|
userRepository.updateStateByUsername(username, User.State.NORMAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ImmutableList<UserListItem> list() {
|
||||||
|
List<User> users = userRepository.findAll();
|
||||||
|
return Lists.immutable.ofAll(users)
|
||||||
|
.collect(UserListItem::new);
|
||||||
|
}
|
||||||
|
|
||||||
private String encryptPassword(String password) {
|
private String encryptPassword(String password) {
|
||||||
String salt = "tY2gNdkt7x%%HcCAFc";
|
String salt = "tY2gNdkt7x%%HcCAFc";
|
||||||
return SecureUtil.sha256(StrUtil.format("{}{}", salt, password));
|
return SecureUtil.sha256(StrUtil.format("{}{}", salt, password));
|
||||||
@@ -127,4 +145,23 @@ public class UserService {
|
|||||||
this.token = token.getTokenValue();
|
this.token = token.getTokenValue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class UserListItem {
|
||||||
|
private Long id;
|
||||||
|
private String username;
|
||||||
|
private User.Role role;
|
||||||
|
private User.State state;
|
||||||
|
private LocalDateTime createTime;
|
||||||
|
private LocalDateTime updateTime;
|
||||||
|
|
||||||
|
public UserListItem(User user) {
|
||||||
|
this.id = user.getId();
|
||||||
|
this.username = user.getUsername();
|
||||||
|
this.role = user.getRole();
|
||||||
|
this.state = user.getState();
|
||||||
|
this.createTime = user.getCreateTime();
|
||||||
|
this.updateTime = user.getUpdateTime();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,3 +47,120 @@ function paginationTemplate(perPage = 20, maxButtons = 5) {
|
|||||||
],
|
],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function mappingField(field, mapping) {
|
||||||
|
let mapData = {
|
||||||
|
'*': `<span class='label bg-gray-300'>\${${field}}</span>`,
|
||||||
|
}
|
||||||
|
mapping.forEach(item => {
|
||||||
|
mapData[item['value']] = `<span class='label ${item['color']}'>${item['label']}</span>`
|
||||||
|
})
|
||||||
|
return {
|
||||||
|
type: 'mapping',
|
||||||
|
value: `\${${field}}`,
|
||||||
|
map: mapData,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function mappingItem(label, value, color = 'bg-info') {
|
||||||
|
return {
|
||||||
|
label: label,
|
||||||
|
value: value,
|
||||||
|
color: color,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const userRoleMapping = [
|
||||||
|
mappingItem('数据提供方', 'PROVIDER', 'bg-blue-500'),
|
||||||
|
mappingItem('数据使用方', 'CUSTOMER', 'bg-purple-500'),
|
||||||
|
mappingItem('审核监管方', 'CHECKER', 'bg-cyan-500'),
|
||||||
|
mappingItem('系统管理员', 'ADMINISTRATOR', 'bg-green-500'),
|
||||||
|
]
|
||||||
|
|
||||||
|
const userStateMapping = [
|
||||||
|
mappingItem('审查中', 'CHECKING', 'bg-warning'),
|
||||||
|
mappingItem('正常', 'NORMAL', 'bg-success'),
|
||||||
|
mappingItem('禁用', 'DISABLED', 'bg-danger'),
|
||||||
|
]
|
||||||
|
|
||||||
|
function userAddDialog() {
|
||||||
|
return {
|
||||||
|
actionType: 'dialog',
|
||||||
|
dialog: {
|
||||||
|
title: '新用户注册',
|
||||||
|
actions: [
|
||||||
|
{
|
||||||
|
type: 'reset',
|
||||||
|
label: '清空',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'submit',
|
||||||
|
label: '注册',
|
||||||
|
level: 'primary',
|
||||||
|
}
|
||||||
|
],
|
||||||
|
body: {
|
||||||
|
type: 'form',
|
||||||
|
api: '${base}/user/register',
|
||||||
|
mode: 'horizontal',
|
||||||
|
canAccessSuperData: false,
|
||||||
|
horizontal: {
|
||||||
|
left: 2,
|
||||||
|
},
|
||||||
|
body: [
|
||||||
|
{
|
||||||
|
type: 'input-email',
|
||||||
|
name: 'username',
|
||||||
|
label: '邮箱',
|
||||||
|
placeholder: '请输入邮箱',
|
||||||
|
required: true,
|
||||||
|
clearable: true,
|
||||||
|
clearValueOnEmpty: true,
|
||||||
|
validateApi: '${base}/user/exists_username/${username}'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'input-password',
|
||||||
|
name: 'password',
|
||||||
|
label: '密码',
|
||||||
|
placeholder: '请输入密码',
|
||||||
|
required: true,
|
||||||
|
clearable: true,
|
||||||
|
clearValueOnEmpty: true,
|
||||||
|
validations: {
|
||||||
|
matchRegexp: /^(?=.*\d)(?!.*(\d)\1{2})(?!.*(012|123|234|345|456|567|678|789|987|876|765|654|543|432|321|210))(?=.*[a-zA-Z])(?=.*[^\da-zA-Z\s]).{8,16}$/
|
||||||
|
},
|
||||||
|
validationErrors: {
|
||||||
|
matchRegexp: '密码至少包含字母、数字、特殊字符,8-16位,并且不能连续出现3个大小连续或相同的数字',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'input-password',
|
||||||
|
name: 'confirm-password',
|
||||||
|
label: '确认密码',
|
||||||
|
placeholder: '请再次输入密码',
|
||||||
|
required: true,
|
||||||
|
clearable: true,
|
||||||
|
validations: {
|
||||||
|
equalsField: 'password'
|
||||||
|
},
|
||||||
|
validationErrors: {
|
||||||
|
equalsField: '两次输入密码不一致',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'radios',
|
||||||
|
name: 'role',
|
||||||
|
label: '角色',
|
||||||
|
required: true,
|
||||||
|
selectFirst: true,
|
||||||
|
options: [
|
||||||
|
{label: '数据提供方', value: 'PROVIDER'},
|
||||||
|
{label: '数据使用方', value: 'CUSTOMER'},
|
||||||
|
{label: '审查监管方', value: 'CHECKER'},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
function overviewTab() {
|
||||||
|
return {
|
||||||
|
title: '概览',
|
||||||
|
icon: 'fa fa-house',
|
||||||
|
body: [
|
||||||
|
'hello world'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
function userTab() {
|
||||||
|
return {
|
||||||
|
title: '用户管理',
|
||||||
|
icon: 'fa fa-user',
|
||||||
|
body: [
|
||||||
|
{
|
||||||
|
type: 'crud',
|
||||||
|
api: {
|
||||||
|
method: 'get',
|
||||||
|
url: '${base}/user_management/list'
|
||||||
|
},
|
||||||
|
...crudCommonOptions(),
|
||||||
|
headerToolbar: [
|
||||||
|
'reload',
|
||||||
|
{
|
||||||
|
type: 'action',
|
||||||
|
icon: 'fa fa-plus',
|
||||||
|
tooltip: '新增账号',
|
||||||
|
...userAddDialog(),
|
||||||
|
}
|
||||||
|
],
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
name: 'username',
|
||||||
|
label: '邮箱',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '角色',
|
||||||
|
width: 120,
|
||||||
|
...mappingField('role', userRoleMapping)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '账号状态',
|
||||||
|
width: 80,
|
||||||
|
...mappingField('state', userStateMapping)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '创建时间',
|
||||||
|
width: 150,
|
||||||
|
type: 'tpl',
|
||||||
|
tpl: '${DATETOSTR(createTime)}'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '更新时间',
|
||||||
|
width: 150,
|
||||||
|
type: 'tpl',
|
||||||
|
tpl: '${DATETOSTR(updateTime)}'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '操作',
|
||||||
|
width: 100,
|
||||||
|
type: 'operation',
|
||||||
|
fixed: 'right',
|
||||||
|
className: 'nowrap',
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
visibleOn: "${state === 'CHECKING'}",
|
||||||
|
label: '审核',
|
||||||
|
icon: 'fa fa-fingerprint',
|
||||||
|
level: 'primary',
|
||||||
|
size: 'xs',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
visibleOn: "${state === 'NORMAL'}",
|
||||||
|
label: '禁用',
|
||||||
|
icon: 'fa fa-ban',
|
||||||
|
level: 'danger',
|
||||||
|
size: 'xs',
|
||||||
|
confirmText: '确认禁用账号${username}?',
|
||||||
|
confirmTitle: '禁用账号',
|
||||||
|
actionType: 'ajax',
|
||||||
|
api: 'get:${base}/user_management/disable/${username}',
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
visibleOn: "${state === 'DISABLED'}",
|
||||||
|
label: '启用',
|
||||||
|
icon: 'fa fa-check',
|
||||||
|
level: 'success',
|
||||||
|
size: 'xs',
|
||||||
|
confirmText: '确认启用账号${username}?',
|
||||||
|
confirmTitle: '启用账号',
|
||||||
|
actionType: 'ajax',
|
||||||
|
api: 'get:${base}/user_management/enable/${username}',
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -25,43 +25,67 @@
|
|||||||
<script src="assets/sdk/sdk.js"></script>
|
<script src="assets/sdk/sdk.js"></script>
|
||||||
<script src="assets/component/constants.js"></script>
|
<script src="assets/component/constants.js"></script>
|
||||||
<script src="assets/component/common.js"></script>
|
<script src="assets/component/common.js"></script>
|
||||||
|
<script src="assets/component/pages/overview-tab.js"></script>
|
||||||
|
<script src="assets/component/pages/user-tab.js"></script>
|
||||||
<script>
|
<script>
|
||||||
(function () {
|
(function () {
|
||||||
let amis = amisRequire('amis/embed')
|
let amis = amisRequire('amis/embed')
|
||||||
let amisJSON = {
|
let amisJSON = {
|
||||||
type: 'page',
|
className: 'h-full',
|
||||||
title: information.title,
|
type: 'service',
|
||||||
subTitle: '提供合法合规的数据要素可信供给工具',
|
api: {
|
||||||
body: {
|
method: 'get',
|
||||||
debug: true,
|
url: '${base}/user/state',
|
||||||
type: 'service',
|
headers: {
|
||||||
api: {
|
token: '${token}'
|
||||||
method: 'get',
|
|
||||||
url: '${base}/user/state',
|
|
||||||
headers: {
|
|
||||||
token: '${token}'
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
onEvent: {
|
},
|
||||||
fetchInited: {
|
onEvent: {
|
||||||
actions: [
|
fetchInited: {
|
||||||
{
|
actions: [
|
||||||
expression: '${!event.data.responseData.token}',
|
{
|
||||||
actionType: 'url',
|
expression: '${!event.data.responseData.token}',
|
||||||
args: {
|
actionType: 'url',
|
||||||
url: '/login.html',
|
args: {
|
||||||
}
|
url: '/login.html',
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
body: [
|
||||||
|
{
|
||||||
|
type: 'page',
|
||||||
|
title: information.title,
|
||||||
|
subTitle: '提供合法合规的数据要素可信供给工具',
|
||||||
|
toolbar: [
|
||||||
|
{
|
||||||
|
type: 'dropdown-button',
|
||||||
|
label: '${username}',
|
||||||
|
align: 'right',
|
||||||
|
trigger: 'hover',
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
label: '个人资料',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '退出登陆',
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
bodyClassName: 'p-0',
|
||||||
|
body: {
|
||||||
|
className: 'h-full border-0',
|
||||||
|
type: 'tabs',
|
||||||
|
tabsMode: 'vertical',
|
||||||
|
tabs: [
|
||||||
|
userTab(),
|
||||||
|
overviewTab(),
|
||||||
]
|
]
|
||||||
}
|
},
|
||||||
},
|
}
|
||||||
body: [
|
]
|
||||||
{
|
|
||||||
type: 'tpl',
|
|
||||||
tpl: '${username}'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
let debug = false
|
let debug = false
|
||||||
amis.embed(
|
amis.embed(
|
||||||
|
|||||||
@@ -56,84 +56,8 @@
|
|||||||
actions: [
|
actions: [
|
||||||
{
|
{
|
||||||
type: 'action',
|
type: 'action',
|
||||||
actionType: 'dialog',
|
|
||||||
label: '注册',
|
label: '注册',
|
||||||
dialog: {
|
...userAddDialog(),
|
||||||
title: '新用户注册',
|
|
||||||
actions: [
|
|
||||||
{
|
|
||||||
type: 'reset',
|
|
||||||
label: '清空',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'submit',
|
|
||||||
label: '注册',
|
|
||||||
level: 'primary',
|
|
||||||
}
|
|
||||||
],
|
|
||||||
body: {
|
|
||||||
type: 'form',
|
|
||||||
api: '${base}/user/register',
|
|
||||||
mode: 'horizontal',
|
|
||||||
canAccessSuperData: false,
|
|
||||||
horizontal: {
|
|
||||||
left: 2,
|
|
||||||
},
|
|
||||||
body: [
|
|
||||||
{
|
|
||||||
type: 'input-email',
|
|
||||||
name: 'username',
|
|
||||||
label: '邮箱',
|
|
||||||
placeholder: '请输入邮箱',
|
|
||||||
required: true,
|
|
||||||
clearable: true,
|
|
||||||
clearValueOnEmpty: true,
|
|
||||||
validateApi: '${base}/user/exists_username/${username}'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'input-password',
|
|
||||||
name: 'password',
|
|
||||||
label: '密码',
|
|
||||||
placeholder: '请输入密码',
|
|
||||||
required: true,
|
|
||||||
clearable: true,
|
|
||||||
clearValueOnEmpty: true,
|
|
||||||
validations: {
|
|
||||||
matchRegexp: /^(?=.*\d)(?!.*(\d)\1{2})(?!.*(012|123|234|345|456|567|678|789|987|876|765|654|543|432|321|210))(?=.*[a-zA-Z])(?=.*[^\da-zA-Z\s]).{8,16}$/
|
|
||||||
},
|
|
||||||
validationErrors: {
|
|
||||||
matchRegexp: '密码至少包含字母、数字、特殊字符,8-16位,并且不能连续出现3个大小连续或相同的数字',
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'input-password',
|
|
||||||
name: 'confirm-password',
|
|
||||||
label: '确认密码',
|
|
||||||
placeholder: '请再次输入密码',
|
|
||||||
required: true,
|
|
||||||
clearable: true,
|
|
||||||
validations: {
|
|
||||||
equalsField: 'password'
|
|
||||||
},
|
|
||||||
validationErrors: {
|
|
||||||
equalsField: '两次输入密码不一致',
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'radios',
|
|
||||||
name: 'role',
|
|
||||||
label: '角色',
|
|
||||||
required: true,
|
|
||||||
selectFirst: true,
|
|
||||||
options: [
|
|
||||||
{label: '数据提供方', value: 'PROVIDER'},
|
|
||||||
{label: '数据使用方', value: 'CUSTOMER'},
|
|
||||||
{label: '审查监管方', value: 'CHECKER'},
|
|
||||||
]
|
|
||||||
},
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'action',
|
type: 'action',
|
||||||
|
|||||||
Reference in New Issue
Block a user