用户管理增删改查全部完成
This commit is contained in:
@@ -0,0 +1,17 @@
|
|||||||
|
package com.cxyxiaomo.epp.PageTable.enums;
|
||||||
|
|
||||||
|
public enum AddType {
|
||||||
|
CAN_NOT_ADD("plainText"),
|
||||||
|
INPUT("input"),
|
||||||
|
SELECT("select");
|
||||||
|
|
||||||
|
private final String value;
|
||||||
|
|
||||||
|
private AddType(String value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
@@ -1,7 +1,7 @@
|
|||||||
package com.cxyxiaomo.epp.common.enums;
|
package com.cxyxiaomo.epp.PageTable.enums;
|
||||||
|
|
||||||
public enum EditType {
|
public enum EditType {
|
||||||
PLAIN_TEXT("plainText"),
|
CAN_NOT_EDIT("plainText"),
|
||||||
INPUT("input"),
|
INPUT("input"),
|
||||||
SELECT("select");
|
SELECT("select");
|
||||||
|
|
@@ -1,7 +1,7 @@
|
|||||||
package com.cxyxiaomo.epp.common.enums;
|
package com.cxyxiaomo.epp.PageTable.enums;
|
||||||
|
|
||||||
public enum SearchType {
|
public enum SearchType {
|
||||||
CAN_NOT_SEARCH(null),
|
CAN_NOT_SEARCH("null"),
|
||||||
INPUT("input"),
|
INPUT("input"),
|
||||||
SELECT("select");
|
SELECT("select");
|
||||||
|
|
@@ -1,4 +1,4 @@
|
|||||||
package com.cxyxiaomo.epp.common.query;
|
package com.cxyxiaomo.epp.PageTable.query;
|
||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
@@ -0,0 +1,85 @@
|
|||||||
|
package com.cxyxiaomo.epp.PageTable.utils;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSONArray;
|
||||||
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
import com.cxyxiaomo.epp.PageTable.enums.AddType;
|
||||||
|
import com.cxyxiaomo.epp.PageTable.enums.EditType;
|
||||||
|
import com.cxyxiaomo.epp.PageTable.enums.SearchType;
|
||||||
|
|
||||||
|
public class FieldBuilder {
|
||||||
|
|
||||||
|
public final static String SEARCH_PLACEHOLDER_SAME_AS_FIELDNAME = "<SEARCH_PLACEHOLDER_SAME_AS_FIELDNAME>";
|
||||||
|
|
||||||
|
public final static String EDIT_PLACEHOLDER_SAME_AS_ADD_PLACEHOLDER = "<EDIT_PLACEHOLDER_SAME_AS_ADD_PLACEHOLDER>";
|
||||||
|
private JSONArray columns;
|
||||||
|
|
||||||
|
public static FieldBuilder create() {
|
||||||
|
FieldBuilder builder = new FieldBuilder();
|
||||||
|
builder.columns = new JSONArray();
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param field 对应 POJO 中的属性名称 <br>
|
||||||
|
* 用于新增/修改弹窗 <br>
|
||||||
|
* @param prop 显示的字段名 如果需要翻译(例如roleId->roleName)则填写翻译后的字段 <br>
|
||||||
|
* 用于渲染表格时指定显示列 <br>
|
||||||
|
* @param fieldName 列的显示名称 <br>
|
||||||
|
* @param defaultValue 新增弹窗中的默认值 <br>
|
||||||
|
* @param showInTable <br>
|
||||||
|
* @param searchPlaceholder 搜索的placeholder <br>
|
||||||
|
* 如果为 null 则使用 fieldName <br>
|
||||||
|
* @param addPlaceholder <br>
|
||||||
|
* @param editPlaceholder <br>
|
||||||
|
* @param searchType 该筛选字段显示为什么类型 <br>
|
||||||
|
* @param addType 新增弹窗中该字段显示为什么类型 <br>
|
||||||
|
* @param editType 修改弹窗中该字段显示为什么类型 <br>
|
||||||
|
* @param fieldRuleListBuilder 提交时的表单验证 <br>
|
||||||
|
* @param mockDataPattern mock数据正则 <br>
|
||||||
|
* @return FieldBuilder
|
||||||
|
*/
|
||||||
|
public FieldBuilder add(String field, String prop, String fieldName, Object defaultValue,
|
||||||
|
Boolean showInTable, SearchType searchType, AddType addType, EditType editType,
|
||||||
|
String searchPlaceholder, String addPlaceholder, String editPlaceholder,
|
||||||
|
FieldRuleListBuilder fieldRuleListBuilder, String mockDataPattern) {
|
||||||
|
JSONObject jsonObject = new JSONObject(2);
|
||||||
|
|
||||||
|
/* 实际字段 */
|
||||||
|
// 用于筛选、增删改
|
||||||
|
jsonObject.put("field", field);
|
||||||
|
|
||||||
|
/* 表格数据 */
|
||||||
|
// 展示字段
|
||||||
|
jsonObject.put("prop", prop);
|
||||||
|
// 表格列显示名称
|
||||||
|
jsonObject.put("label", fieldName);
|
||||||
|
// 表格是否展示该字段
|
||||||
|
jsonObject.put("showInTable", showInTable);
|
||||||
|
|
||||||
|
/* 筛选 */
|
||||||
|
// 上方筛选条件
|
||||||
|
jsonObject.put("searchType", searchType.getValue());
|
||||||
|
jsonObject.put("searchPlaceholder", SEARCH_PLACEHOLDER_SAME_AS_FIELDNAME.equals(searchPlaceholder) ? fieldName : searchPlaceholder);
|
||||||
|
|
||||||
|
/* 弹窗 */
|
||||||
|
// 新增弹窗
|
||||||
|
jsonObject.put("addType", addType.getValue());
|
||||||
|
jsonObject.put("addPlaceholder", addPlaceholder);
|
||||||
|
// 修改弹窗
|
||||||
|
jsonObject.put("editType", editType.getValue());
|
||||||
|
jsonObject.put("editPlaceholder", EDIT_PLACEHOLDER_SAME_AS_ADD_PLACEHOLDER.equals(editPlaceholder) ? addPlaceholder : editPlaceholder);
|
||||||
|
// 新增/修改时的前端表单验证
|
||||||
|
jsonObject.put("validateRules", fieldRuleListBuilder.build());
|
||||||
|
// 新增弹窗 字段默认值
|
||||||
|
jsonObject.put("default", defaultValue);
|
||||||
|
|
||||||
|
jsonObject.put("mockRegex", mockDataPattern);
|
||||||
|
|
||||||
|
columns.add(jsonObject);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public JSONArray build() {
|
||||||
|
return columns;
|
||||||
|
}
|
||||||
|
}
|
@@ -1,16 +1,16 @@
|
|||||||
package com.cxyxiaomo.epp.common.utils;
|
package com.cxyxiaomo.epp.PageTable.utils;
|
||||||
|
|
||||||
import com.alibaba.fastjson2.JSONArray;
|
import com.alibaba.fastjson2.JSONArray;
|
||||||
import com.alibaba.fastjson2.JSONObject;
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
public class PageTableFieldMapperBuilder {
|
public class FieldMapperBuilder {
|
||||||
|
|
||||||
private JSONArray columns;
|
private JSONArray columns;
|
||||||
|
|
||||||
public static PageTableFieldMapperBuilder create() {
|
public static FieldMapperBuilder create() {
|
||||||
PageTableFieldMapperBuilder builder = new PageTableFieldMapperBuilder();
|
FieldMapperBuilder builder = new FieldMapperBuilder();
|
||||||
builder.columns = new JSONArray();
|
builder.columns = new JSONArray();
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
@@ -27,7 +27,7 @@ public class PageTableFieldMapperBuilder {
|
|||||||
// return this;
|
// return this;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
public PageTableFieldMapperBuilder add(String prop, String label, HashMap mapper) {
|
public FieldMapperBuilder add(String prop, String label, HashMap mapper) {
|
||||||
JSONObject jsonObject = new JSONObject(2);
|
JSONObject jsonObject = new JSONObject(2);
|
||||||
jsonObject.put("key", prop);
|
jsonObject.put("key", prop);
|
||||||
jsonObject.put("value", label);
|
jsonObject.put("value", label);
|
@@ -0,0 +1,86 @@
|
|||||||
|
package com.cxyxiaomo.epp.PageTable.utils;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Element Plus 表单验证
|
||||||
|
* GiHub refer: https://github.com/yiminghe/async-validator
|
||||||
|
*/
|
||||||
|
public class FieldRuleBuilder {
|
||||||
|
|
||||||
|
private String fieldDisplayName;
|
||||||
|
private JSONObject rules;
|
||||||
|
|
||||||
|
public static FieldRuleBuilder create(String fieldDisplayName) {
|
||||||
|
FieldRuleBuilder builder = new FieldRuleBuilder();
|
||||||
|
builder.rules = new JSONObject();
|
||||||
|
builder.fieldDisplayName = fieldDisplayName;
|
||||||
|
// 默认在 blur 时触发验证
|
||||||
|
// builder.rules.put("trigger", "blur");
|
||||||
|
builder.rules.put("trigger", "change");
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FieldRuleBuilder trigger(String trigger) {
|
||||||
|
rules.put("trigger", trigger);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FieldRuleBuilder message(String message) {
|
||||||
|
rules.put("message", message);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FieldRuleBuilder required() {
|
||||||
|
rules.put("required", true);
|
||||||
|
rules.put("message", fieldDisplayName + "不能为空");
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FieldRuleBuilder pattern(String regEx) {
|
||||||
|
rules.put("pattern", regEx);
|
||||||
|
rules.put("message", fieldDisplayName + "输入不符合要求,请检查");
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FieldRuleBuilder number() {
|
||||||
|
rules.put("type", "number");
|
||||||
|
rules.put("message", fieldDisplayName + "必须为数字");
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FieldRuleBuilder min(Integer min) {
|
||||||
|
rules.put("min", min);
|
||||||
|
rules.put("message", fieldDisplayName + "过短");
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FieldRuleBuilder max(Integer max) {
|
||||||
|
rules.put("max", max);
|
||||||
|
rules.put("message", fieldDisplayName + "过长");
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FieldRuleBuilder minMax(Integer min, Integer max) {
|
||||||
|
rules.put("min", min);
|
||||||
|
rules.put("max", max);
|
||||||
|
rules.put("message", fieldDisplayName + "长度应在 " + min + " 至 " + max + " 之间");
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FieldRuleBuilder length(Integer len) {
|
||||||
|
rules.put("min", len);
|
||||||
|
rules.put("max", len);
|
||||||
|
rules.put("message", fieldDisplayName + "位数不对,应为 " + len + " 位");
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FieldRuleBuilder add(String field, Object value) {
|
||||||
|
rules.put(field, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public JSONObject build() {
|
||||||
|
return rules;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,23 @@
|
|||||||
|
package com.cxyxiaomo.epp.PageTable.utils;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSONArray;
|
||||||
|
|
||||||
|
public class FieldRuleListBuilder {
|
||||||
|
|
||||||
|
private JSONArray ruleList;
|
||||||
|
|
||||||
|
public static FieldRuleListBuilder create() {
|
||||||
|
FieldRuleListBuilder builder = new FieldRuleListBuilder();
|
||||||
|
builder.ruleList = new JSONArray();
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FieldRuleListBuilder add(FieldRuleBuilder fieldRuleBuilder) {
|
||||||
|
ruleList.add(fieldRuleBuilder.build());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public JSONArray build() {
|
||||||
|
return ruleList;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,29 @@
|
|||||||
|
package com.cxyxiaomo.epp.PageTable.utils;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSONArray;
|
||||||
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
|
||||||
|
public class FieldValidateBuilder {
|
||||||
|
|
||||||
|
private JSONObject validates;
|
||||||
|
|
||||||
|
public static FieldValidateBuilder create() {
|
||||||
|
FieldValidateBuilder builder = new FieldValidateBuilder();
|
||||||
|
builder.validates = new JSONObject();
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FieldValidateBuilder add(String field, FieldRuleBuilder fieldRuleBuilder) {
|
||||||
|
JSONArray jsonArray = validates.getJSONArray(field);
|
||||||
|
if (jsonArray == null) {
|
||||||
|
jsonArray = new JSONArray();
|
||||||
|
}
|
||||||
|
jsonArray.add(fieldRuleBuilder.build());
|
||||||
|
validates.put(field, jsonArray);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public JSONObject build() {
|
||||||
|
return validates;
|
||||||
|
}
|
||||||
|
}
|
@@ -1,4 +1,4 @@
|
|||||||
package com.cxyxiaomo.epp.common.utils;
|
package com.cxyxiaomo.epp.PageTable.utils;
|
||||||
|
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
@@ -1,58 +0,0 @@
|
|||||||
package com.cxyxiaomo.epp.common.utils;
|
|
||||||
|
|
||||||
import com.alibaba.fastjson2.JSONArray;
|
|
||||||
import com.alibaba.fastjson2.JSONObject;
|
|
||||||
import com.cxyxiaomo.epp.common.enums.EditType;
|
|
||||||
import com.cxyxiaomo.epp.common.enums.SearchType;
|
|
||||||
|
|
||||||
public class PageTableFieldBuilder {
|
|
||||||
|
|
||||||
private JSONArray columns;
|
|
||||||
|
|
||||||
public static PageTableFieldBuilder create() {
|
|
||||||
PageTableFieldBuilder builder = new PageTableFieldBuilder();
|
|
||||||
builder.columns = new JSONArray();
|
|
||||||
return builder;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param field 对应 POJO 中的属性名称 <br>
|
|
||||||
* 用于新增/修改弹窗 <br>
|
|
||||||
* @param prop 显示的字段名 如果需要翻译(例如roleId->roleName)则填写翻译后的字段 <br>
|
|
||||||
* 用于渲染表格时指定显示列 <br>
|
|
||||||
* @param label 列的显示名称 <br>
|
|
||||||
* @param canSearch 该字段能否在表格上方被筛选 <br>
|
|
||||||
* @param searchType 该筛选字段显示为什么类型 <br>
|
|
||||||
* @param canEdit 该字段能否在新增/修改弹窗中被修改 <br>
|
|
||||||
* @param editType 新增/修改弹窗中该字段显示为什么类型 <br>
|
|
||||||
* @param defaultWhenAdd 新增弹窗中的默认值 <br>
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public PageTableFieldBuilder add(String field, String prop, String label,
|
|
||||||
Boolean canSearch, SearchType searchType,
|
|
||||||
Boolean canEdit, EditType editType, Object defaultWhenAdd) {
|
|
||||||
JSONObject jsonObject = new JSONObject(2);
|
|
||||||
// 表格数据
|
|
||||||
jsonObject.put("prop", prop);
|
|
||||||
jsonObject.put("label", label);
|
|
||||||
|
|
||||||
// 上方筛选条件
|
|
||||||
jsonObject.put("canSearch", canSearch);
|
|
||||||
jsonObject.put("searchType", searchType.getValue());
|
|
||||||
|
|
||||||
// 新增、修改弹窗
|
|
||||||
jsonObject.put("field", field);
|
|
||||||
jsonObject.put("canEdit", canEdit);
|
|
||||||
jsonObject.put("editType", editType.getValue());
|
|
||||||
|
|
||||||
// 新增弹窗 字段默认值
|
|
||||||
jsonObject.put("default", defaultWhenAdd);
|
|
||||||
|
|
||||||
columns.add(jsonObject);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JSONArray build() {
|
|
||||||
return columns;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -45,4 +45,13 @@ public class UserVO implements Serializable {
|
|||||||
List<UserVO> userVOList = userList.stream().map(UserVO::convertFrom).collect(Collectors.toList());
|
List<UserVO> userVOList = userList.stream().map(UserVO::convertFrom).collect(Collectors.toList());
|
||||||
return userVOList;
|
return userVOList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static User convertTo(UserVO userVO) {
|
||||||
|
if (userVO == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
User user = new User();
|
||||||
|
BeanUtils.copyProperties(userVO, user);
|
||||||
|
return user;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -99,10 +99,10 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- 热部署 -->
|
<!-- 热部署 -->
|
||||||
<dependency>
|
<!--<dependency>-->
|
||||||
<groupId>org.springframework.boot</groupId>
|
<!-- <groupId>org.springframework.boot</groupId>-->
|
||||||
<artifactId>spring-boot-devtools</artifactId>
|
<!-- <artifactId>spring-boot-devtools</artifactId>-->
|
||||||
</dependency>
|
<!--</dependency>-->
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
@@ -2,14 +2,17 @@ package com.cxyxiaomo.epp.user.controller;
|
|||||||
|
|
||||||
import com.alibaba.fastjson2.JSONArray;
|
import com.alibaba.fastjson2.JSONArray;
|
||||||
import com.alibaba.fastjson2.JSONObject;
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
import com.cxyxiaomo.epp.common.enums.EditType;
|
import com.cxyxiaomo.epp.PageTable.enums.AddType;
|
||||||
import com.cxyxiaomo.epp.common.enums.SearchType;
|
import com.cxyxiaomo.epp.PageTable.enums.EditType;
|
||||||
|
import com.cxyxiaomo.epp.PageTable.enums.SearchType;
|
||||||
|
import com.cxyxiaomo.epp.PageTable.query.PageQuery;
|
||||||
|
import com.cxyxiaomo.epp.PageTable.utils.FieldBuilder;
|
||||||
|
import com.cxyxiaomo.epp.PageTable.utils.FieldMapperBuilder;
|
||||||
|
import com.cxyxiaomo.epp.PageTable.utils.FieldRuleBuilder;
|
||||||
|
import com.cxyxiaomo.epp.PageTable.utils.FieldRuleListBuilder;
|
||||||
import com.cxyxiaomo.epp.common.pojo.Role;
|
import com.cxyxiaomo.epp.common.pojo.Role;
|
||||||
import com.cxyxiaomo.epp.common.pojo.User;
|
import com.cxyxiaomo.epp.common.pojo.User;
|
||||||
import com.cxyxiaomo.epp.common.query.PageQuery;
|
|
||||||
import com.cxyxiaomo.epp.common.response.Res;
|
import com.cxyxiaomo.epp.common.response.Res;
|
||||||
import com.cxyxiaomo.epp.common.utils.PageTableFieldBuilder;
|
|
||||||
import com.cxyxiaomo.epp.common.utils.PageTableFieldMapperBuilder;
|
|
||||||
import com.cxyxiaomo.epp.common.vo.UserVO;
|
import com.cxyxiaomo.epp.common.vo.UserVO;
|
||||||
import com.cxyxiaomo.epp.user.service.RoleService;
|
import com.cxyxiaomo.epp.user.service.RoleService;
|
||||||
import com.cxyxiaomo.epp.user.service.UserService;
|
import com.cxyxiaomo.epp.user.service.UserService;
|
||||||
@@ -66,7 +69,7 @@ public class UserController {
|
|||||||
*/
|
*/
|
||||||
@PostMapping("/rpc/getUserById")
|
@PostMapping("/rpc/getUserById")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public User getUserById(Long id) {
|
public User getUserById(Integer id) {
|
||||||
return userService.getUserById(id);
|
return userService.getUserById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,7 +81,6 @@ public class UserController {
|
|||||||
@GetMapping("/manage/getUserList")
|
@GetMapping("/manage/getUserList")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public Res getUserList(PageQuery pageQuery, UserVO userVO) {
|
public Res getUserList(PageQuery pageQuery, UserVO userVO) {
|
||||||
|
|
||||||
// 查询分页数据
|
// 查询分页数据
|
||||||
PageHelper.startPage(pageQuery.getPageIndex(), pageQuery.getPageSize());
|
PageHelper.startPage(pageQuery.getPageIndex(), pageQuery.getPageSize());
|
||||||
List<User> userList = userService.getUserList(userVO);
|
List<User> userList = userService.getUserList(userVO);
|
||||||
@@ -86,29 +88,82 @@ public class UserController {
|
|||||||
List<User> list = userPageInfo.getList();
|
List<User> list = userPageInfo.getList();
|
||||||
List<UserVO> voList = UserVO.convertFrom(list);
|
List<UserVO> voList = UserVO.convertFrom(list);
|
||||||
|
|
||||||
|
// id列 字段名(区分大小写;以VO中的变量名为准)
|
||||||
|
// 新增、修改弹窗时,使用该列作为主键列进行操作
|
||||||
|
String idFieldName = "id";
|
||||||
|
|
||||||
// 指定前端表格显示列
|
// 指定前端表格显示列
|
||||||
JSONArray columns = PageTableFieldBuilder.create()
|
JSONArray columns = FieldBuilder.create()
|
||||||
.add("username", "username", "用户名",
|
.add("username", "username", "账号", "",
|
||||||
true, SearchType.INPUT,
|
true, SearchType.INPUT, AddType.INPUT, EditType.CAN_NOT_EDIT,
|
||||||
false, EditType.PLAIN_TEXT, null)
|
FieldBuilder.SEARCH_PLACEHOLDER_SAME_AS_FIELDNAME,
|
||||||
.add("roleId", "roleName", "角色",
|
"用户名", FieldBuilder.EDIT_PLACEHOLDER_SAME_AS_ADD_PLACEHOLDER,
|
||||||
true, SearchType.SELECT,
|
FieldRuleListBuilder.create()
|
||||||
true, EditType.SELECT, 0)
|
.add(FieldRuleBuilder.create("用户名").required())
|
||||||
.add("realname", "realname", "真实姓名",
|
.add(FieldRuleBuilder.create("用户名").minMax(2, 10)),
|
||||||
true, SearchType.INPUT,
|
"DPD @word(2, 10)"
|
||||||
true, EditType.INPUT, "")
|
)
|
||||||
.add("phoneNumber", "phoneNumber", "电话",
|
.add("password", "password", "密码", "",
|
||||||
true, SearchType.INPUT,
|
false, SearchType.CAN_NOT_SEARCH, AddType.INPUT, EditType.INPUT,
|
||||||
true, EditType.INPUT, "")
|
null,
|
||||||
.add("idNumber", "idNumber", "身份证号",
|
"必填", "若不修改则留空",
|
||||||
true, SearchType.INPUT,
|
FieldRuleListBuilder.create()
|
||||||
true, EditType.INPUT, "")
|
.add(FieldRuleBuilder.create("用户密码").minMax(2, 10)),
|
||||||
.add("buildingId", "buildingId", "门栋/单元号",
|
"DPD @word(2, 10)"
|
||||||
true, SearchType.INPUT,
|
)
|
||||||
true, EditType.INPUT, "")
|
.add("roleId", "roleName", "角色", "",
|
||||||
.add("doorplate", "doorplate", "门牌号",
|
true, SearchType.SELECT, AddType.SELECT, EditType.SELECT,
|
||||||
true, SearchType.INPUT,
|
"用户角色",
|
||||||
true, EditType.INPUT, "")
|
"用户的角色", FieldBuilder.EDIT_PLACEHOLDER_SAME_AS_ADD_PLACEHOLDER,
|
||||||
|
FieldRuleListBuilder.create()
|
||||||
|
.add(FieldRuleBuilder.create("角色").required()),
|
||||||
|
"DPD @pick([\"1\", \"2\", \"3\", \"4\", \"5\", \"6\"])"
|
||||||
|
)
|
||||||
|
.add("realname", "realname", "真实姓名", "",
|
||||||
|
true, SearchType.INPUT, AddType.INPUT, EditType.INPUT,
|
||||||
|
FieldBuilder.SEARCH_PLACEHOLDER_SAME_AS_FIELDNAME,
|
||||||
|
"用户的真实姓名", FieldBuilder.EDIT_PLACEHOLDER_SAME_AS_ADD_PLACEHOLDER,
|
||||||
|
FieldRuleListBuilder.create()
|
||||||
|
.add(FieldRuleBuilder.create("真实姓名").required())
|
||||||
|
.add(FieldRuleBuilder.create("真实姓名").minMax(2, 15)),
|
||||||
|
"DPD @cword(2, 8)"
|
||||||
|
)
|
||||||
|
.add("phoneNumber", "phoneNumber", "电话", "",
|
||||||
|
true, SearchType.INPUT, AddType.INPUT, EditType.INPUT,
|
||||||
|
"电话号码",
|
||||||
|
"支持11位手机号码、区号-7/8位座机号码", FieldBuilder.EDIT_PLACEHOLDER_SAME_AS_ADD_PLACEHOLDER,
|
||||||
|
FieldRuleListBuilder.create()
|
||||||
|
.add(FieldRuleBuilder.create("电话").required())
|
||||||
|
.add(FieldRuleBuilder.create("电话").pattern("^(1[3-9]\\d{9})$|^(0\\d{2,3}-?\\d{7,8})$")),
|
||||||
|
"DTD /^(1[3-9]\\d{9})$|^(0\\d{2,3}-?\\d{7,8})$/"
|
||||||
|
)
|
||||||
|
.add("idNumber", "idNumber", "身份证号", "",
|
||||||
|
true, SearchType.INPUT, AddType.INPUT, EditType.INPUT,
|
||||||
|
FieldBuilder.SEARCH_PLACEHOLDER_SAME_AS_FIELDNAME,
|
||||||
|
"支持15位、18位数字、17位数字+X格式", FieldBuilder.EDIT_PLACEHOLDER_SAME_AS_ADD_PLACEHOLDER,
|
||||||
|
FieldRuleListBuilder.create()
|
||||||
|
.add(FieldRuleBuilder.create("身份证号").required())
|
||||||
|
.add(FieldRuleBuilder.create("身份证号").min(15))
|
||||||
|
.add(FieldRuleBuilder.create("身份证号").max(18))
|
||||||
|
.add(FieldRuleBuilder.create("身份证号").pattern("^(\\d{15})$|^(\\d{18})$|^(\\d{17}(\\d|X|x))$")),
|
||||||
|
"DTD /^(\\d{15})$|^(\\d{18})$|^(\\d{17}(\\d|X|x))$/"
|
||||||
|
)
|
||||||
|
.add("buildingId", "buildingId", "门栋单元", "",
|
||||||
|
true, SearchType.INPUT, AddType.INPUT, EditType.INPUT,
|
||||||
|
FieldBuilder.SEARCH_PLACEHOLDER_SAME_AS_FIELDNAME,
|
||||||
|
"门栋及单元号,例如:11-05(11栋05单元)", FieldBuilder.EDIT_PLACEHOLDER_SAME_AS_ADD_PLACEHOLDER,
|
||||||
|
FieldRuleListBuilder.create()
|
||||||
|
.add(FieldRuleBuilder.create("门栋/单元号").minMax(2, 10)),
|
||||||
|
"DTD /^\\d{2}-\\d{2}$/"
|
||||||
|
)
|
||||||
|
.add("doorplate", "doorplate", "门牌号", "",
|
||||||
|
true, SearchType.INPUT, AddType.INPUT, EditType.INPUT,
|
||||||
|
FieldBuilder.SEARCH_PLACEHOLDER_SAME_AS_FIELDNAME,
|
||||||
|
"门牌号,例如:2003(20楼03户)", FieldBuilder.EDIT_PLACEHOLDER_SAME_AS_ADD_PLACEHOLDER,
|
||||||
|
FieldRuleListBuilder.create()
|
||||||
|
.add(FieldRuleBuilder.create("门牌号").minMax(1, 10)),
|
||||||
|
"DTD /^\\d{4}$/"
|
||||||
|
)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
// 指定需要翻译的字段
|
// 指定需要翻译的字段
|
||||||
@@ -119,7 +174,7 @@ public class UserController {
|
|||||||
roleMap.put(role.getId(), role.getRoleName());
|
roleMap.put(role.getId(), role.getRoleName());
|
||||||
}
|
}
|
||||||
// build
|
// build
|
||||||
JSONArray fieldMapper = PageTableFieldMapperBuilder.create()
|
JSONArray fieldMapper = FieldMapperBuilder.create()
|
||||||
.add("roleId", "roleName", roleMap)
|
.add("roleId", "roleName", roleMap)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
@@ -129,31 +184,70 @@ public class UserController {
|
|||||||
map.put("list", voList);
|
map.put("list", voList);
|
||||||
map.put("columns", columns);
|
map.put("columns", columns);
|
||||||
map.put("fieldMapper", fieldMapper);
|
map.put("fieldMapper", fieldMapper);
|
||||||
|
map.put("idFieldName", idFieldName);
|
||||||
|
|
||||||
// 返回结果
|
// 返回结果
|
||||||
return Res.success(map);
|
return Res.success(map);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
@RequestMapping("/person")
|
* 新增 / 编辑用户
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@PostMapping("/manage/editUser")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public User person(String username) {
|
public Res editUser(@ModelAttribute UserVO userVO, String password) {
|
||||||
return null;
|
User user = UserVO.convertTo(userVO);
|
||||||
// return userService.getUserByUsername(username);
|
|
||||||
|
// 先查询用户名是否存在
|
||||||
|
User existUser = userService.getUserByUsername(user.getUsername());
|
||||||
|
|
||||||
|
if (user.getId() == null || user.getId() < 1) {
|
||||||
|
// 新增用户
|
||||||
|
if (existUser != null) {
|
||||||
|
return Res.error("用户名已存在,操作失败");
|
||||||
|
}
|
||||||
|
if (password == null || "".equals(password)) {
|
||||||
|
return Res.error("密码不能为空");
|
||||||
|
}
|
||||||
|
String passwordHash = DigestUtils.sha512Hex(password);
|
||||||
|
user.setPassword(passwordHash);
|
||||||
|
userService.addUser(user);
|
||||||
|
} else {
|
||||||
|
// 修改用户
|
||||||
|
if (existUser == null) {
|
||||||
|
return Res.error("用户不存在,操作失败");
|
||||||
|
}
|
||||||
|
if (password == null || "".equals(password)) {
|
||||||
|
user.setPassword(null);
|
||||||
|
} else {
|
||||||
|
String passwordHash = DigestUtils.sha512Hex(password);
|
||||||
|
user.setPassword(passwordHash);
|
||||||
|
}
|
||||||
|
userService.updateUser(user);
|
||||||
|
}
|
||||||
|
return Res.success(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequestMapping("/addUser")
|
/**
|
||||||
|
* 删除用户
|
||||||
|
*
|
||||||
|
* @param id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@PostMapping("/manage/deleteUser")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public Res addUser(String username, String name, Integer role) {
|
public Res deleteUser(Integer id) {
|
||||||
// User user = new User();
|
if (id == null || id <= 0) {
|
||||||
// user.setUsername(username);
|
return Res.error("用户不存在,删除失败");
|
||||||
// user.setPassword(username);
|
}
|
||||||
// user.setName(name);
|
// 先查询用户名是否存在
|
||||||
// if (role == 2) {
|
User existUser = userService.getUserById(id);
|
||||||
// user.setStu_id(username);
|
if (existUser == null) {
|
||||||
// }
|
return Res.error("用户不存在,删除失败");
|
||||||
// user.setRole(role);
|
}
|
||||||
// return Res.success(userService.addUser(user));
|
boolean b = userService.deleteUser(existUser.getId());
|
||||||
return null;
|
return Res.success(b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -13,9 +13,13 @@ public interface UserDao {
|
|||||||
|
|
||||||
public boolean addUser(User user);
|
public boolean addUser(User user);
|
||||||
|
|
||||||
public User getUserById(Long id);
|
public boolean updateUser(User user);
|
||||||
|
|
||||||
|
public User getUserById(Integer id);
|
||||||
|
|
||||||
User getUserByUsername(String username);
|
User getUserByUsername(String username);
|
||||||
|
|
||||||
public List<User> getUserList(UserVO userVO);
|
public List<User> getUserList(UserVO userVO);
|
||||||
|
|
||||||
|
public boolean deleteUserById(Integer userId);
|
||||||
}
|
}
|
||||||
|
@@ -18,7 +18,7 @@ public class UserService {
|
|||||||
return userDao.getUserByUsername(username);
|
return userDao.getUserByUsername(username);
|
||||||
}
|
}
|
||||||
|
|
||||||
public User getUserById(Long id) {
|
public User getUserById(Integer id) {
|
||||||
return userDao.getUserById(id);
|
return userDao.getUserById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -26,4 +26,21 @@ public class UserService {
|
|||||||
List<User> userList = userDao.getUserList(userVO);
|
List<User> userList = userDao.getUserList(userVO);
|
||||||
return userList;
|
return userList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean addUser(User user) {
|
||||||
|
user.setId(null);
|
||||||
|
if (user.getPermission() == null) {
|
||||||
|
// 填充默认值
|
||||||
|
user.setPermission("0");
|
||||||
|
}
|
||||||
|
return userDao.addUser(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean updateUser(User user) {
|
||||||
|
return userDao.updateUser(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean deleteUser(Integer userId) {
|
||||||
|
return userDao.deleteUserById(userId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -4,10 +4,48 @@
|
|||||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
<mapper namespace="com.cxyxiaomo.epp.user.dao.UserDao">
|
<mapper namespace="com.cxyxiaomo.epp.user.dao.UserDao">
|
||||||
<insert id="addUser" parameterType="com.cxyxiaomo.epp.common.pojo.User">
|
<insert id="addUser" parameterType="com.cxyxiaomo.epp.common.pojo.User">
|
||||||
INSERT INTO user (username, password)
|
INSERT INTO user (username, `password`, realname, id_number, phone_number, role_id, building_id, doorplate,
|
||||||
VALUES (#{username}, #{password})
|
permission, permission_time)
|
||||||
|
VALUES (#{username}, #{password}, #{realname}, #{idNumber}, #{phoneNumber}, #{roleId}, #{buildingId},
|
||||||
|
#{doorplate}, #{permission}, #{permissionTime})
|
||||||
</insert>
|
</insert>
|
||||||
<select id="getUserById" parameterType="java.lang.Long" resultType="com.cxyxiaomo.epp.common.pojo.User">
|
<update id="updateUser" parameterType="com.cxyxiaomo.epp.common.pojo.User">
|
||||||
|
UPDATE user
|
||||||
|
<set>
|
||||||
|
<if test="username != null and username != ''">
|
||||||
|
username = #{username},
|
||||||
|
</if>
|
||||||
|
<if test="password != null and password != ''">
|
||||||
|
`password` = #{password},
|
||||||
|
</if>
|
||||||
|
<if test="realname != null and realname != ''">
|
||||||
|
realname = #{realname},
|
||||||
|
</if>
|
||||||
|
<if test="idNumber != null and idNumber != ''">
|
||||||
|
id_number = #{idNumber},
|
||||||
|
</if>
|
||||||
|
<if test="phoneNumber != null and phoneNumber != ''">
|
||||||
|
phone_number = #{phoneNumber},
|
||||||
|
</if>
|
||||||
|
<if test="roleId != null">
|
||||||
|
role_id = #{roleId},
|
||||||
|
</if>
|
||||||
|
<if test="buildingId != null and buildingId != ''">
|
||||||
|
building_id = #{buildingId},
|
||||||
|
</if>
|
||||||
|
<if test="doorplate != null and doorplate != ''">
|
||||||
|
doorplate = #{doorplate},
|
||||||
|
</if>
|
||||||
|
<if test="permission != null">
|
||||||
|
permission = #{permission},
|
||||||
|
</if>
|
||||||
|
<if test="permissionTime != null">
|
||||||
|
permission_time = #{permissionTime},
|
||||||
|
</if>
|
||||||
|
</set>
|
||||||
|
WHERE id = #{id}
|
||||||
|
</update>
|
||||||
|
<select id="getUserById" parameterType="java.lang.Integer" resultType="com.cxyxiaomo.epp.common.pojo.User">
|
||||||
SELECT *
|
SELECT *
|
||||||
FROM user
|
FROM user
|
||||||
WHERE id = #{id}
|
WHERE id = #{id}
|
||||||
@@ -43,4 +81,10 @@
|
|||||||
AND doorplate LIKE concat('%',#{doorplate,jdbcType=VARCHAR},'%')
|
AND doorplate LIKE concat('%',#{doorplate,jdbcType=VARCHAR},'%')
|
||||||
</if>
|
</if>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<delete id="deleteUserById">
|
||||||
|
DELETE
|
||||||
|
FROM user
|
||||||
|
WHERE id = #{userId}
|
||||||
|
</delete>
|
||||||
</mapper>
|
</mapper>
|
||||||
|
@@ -11,7 +11,7 @@
|
|||||||
Target Server Version : 80012
|
Target Server Version : 80012
|
||||||
File Encoding : 65001
|
File Encoding : 65001
|
||||||
|
|
||||||
Date: 28/03/2023 22:11:06
|
Date: 29/03/2023 17:21:45
|
||||||
*/
|
*/
|
||||||
|
|
||||||
SET NAMES utf8mb4;
|
SET NAMES utf8mb4;
|
||||||
@@ -57,7 +57,7 @@ CREATE TABLE `community_gate1` (
|
|||||||
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '大门显示名称',
|
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '大门显示名称',
|
||||||
`open` tinyint(1) NOT NULL DEFAULT 1 COMMENT '大门是否开放 1为开放 2为关闭',
|
`open` tinyint(1) NOT NULL DEFAULT 1 COMMENT '大门是否开放 1为开放 2为关闭',
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '社区大门' ROW_FORMAT = DYNAMIC;
|
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '社区大门' ROW_FORMAT = DYNAMIC;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of community_gate1
|
-- Records of community_gate1
|
||||||
@@ -356,7 +356,7 @@ CREATE TABLE `role` (
|
|||||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'role_id',
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'role_id',
|
||||||
`role_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'roleName',
|
`role_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'roleName',
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
|
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of role
|
-- Records of role
|
||||||
@@ -394,31 +394,39 @@ CREATE TABLE `user` (
|
|||||||
`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码',
|
`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码',
|
||||||
`realname` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '真实姓名',
|
`realname` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '真实姓名',
|
||||||
`id_number` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '身份证号',
|
`id_number` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '身份证号',
|
||||||
`phone_number` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机号',
|
`phone_number` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机号',
|
||||||
`role_id` int(11) NOT NULL COMMENT '角色id',
|
`role_id` int(11) NOT NULL COMMENT '角色id',
|
||||||
`building_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '门栋号+单元号',
|
`building_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '门栋号+单元号',
|
||||||
`doorplate` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '门牌号',
|
`doorplate` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '门牌号',
|
||||||
`permission` int(11) NOT NULL DEFAULT 0 COMMENT '进出权限 (0-无 1-继承(普通居民) 2-永久 3-限时)',
|
`permission` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '进出权限 (0-无 1-继承(普通居民) 2-永久 3-限时)',
|
||||||
`permission_time` datetime NULL DEFAULT NULL COMMENT '进出权限失效时间',
|
`permission_time` datetime NULL DEFAULT NULL COMMENT '进出权限失效时间',
|
||||||
PRIMARY KEY (`id`) USING BTREE,
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
UNIQUE INDEX `username`(`username`) USING BTREE
|
UNIQUE INDEX `username`(`username`) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
|
) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of user
|
-- Records of user
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
INSERT INTO `user` VALUES (1, 'root', '99adc231b045331e514a516b4b7680f588e3823213abe901738bc3ad67b2f6fcb3c64efb93d18002588d3ccc1a49efbae1ce20cb43df36b38651f11fa75678e8', '管理员 密码root', '420111111111111111', '110', 1, '28-1', '1101', 0, NULL);
|
INSERT INTO `user` VALUES (1, 'root', '99adc231b045331e514a516b4b7680f588e3823213abe901738bc3ad67b2f6fcb3c64efb93d18002588d3ccc1a49efbae1ce20cb43df36b38651f11fa75678e8', '管理员 密码root', '420111111111111112', '18911111111', 1, '28-1', '1101', '0', NULL);
|
||||||
INSERT INTO `user` VALUES (2, 'admin', 'c7ad44cbad762a5da0a452f9e854fdc1e0e7a52a38015f23f3eab1d80b931dd472634dfac71cd34ebc35d16ab7fb8a90c81f975113d6c7538dc69dd8de9077ec', '社区管理员 密码admin', '420111111111111111', '111', 2, '16-3', '0203', 0, NULL);
|
INSERT INTO `user` VALUES (2, 'admin', 'c7ad44cbad762a5da0a452f9e854fdc1e0e7a52a38015f23f3eab1d80b931dd472634dfac71cd34ebc35d16ab7fb8a90c81f975113d6c7538dc69dd8de9077ec', '社区管理员 密码admin', '420111111111111111', '027-22222121', 2, '16-3', '0203', '0', NULL);
|
||||||
INSERT INTO `user` VALUES (3, 'user', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户 密码user', '420111111111111111', '112', 3, '20-2', '0802', 0, NULL);
|
INSERT INTO `user` VALUES (3, 'user', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户 密码user', '420111111111111111', '18911111111', 3, '20-2', '0802', '0', NULL);
|
||||||
INSERT INTO `user` VALUES (4, 'user2', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户2 密码user', '420111111111111111', '112', 3, '20-2', '0802', 0, NULL);
|
INSERT INTO `user` VALUES (4, 'user2', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户2 密码user', '420111111111111111', '027-22222121', 3, '20-2', '0802', '0', NULL);
|
||||||
INSERT INTO `user` VALUES (5, 'user3', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户3 密码user', '420111111111111111', '112', 3, '20-2', '0802', 0, NULL);
|
INSERT INTO `user` VALUES (5, 'user3', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户3 密码user', '420111111111111111', '112', 3, '20-2', '0802', '0', NULL);
|
||||||
INSERT INTO `user` VALUES (6, 'user4', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户4 密码user', '420111111111111111', '112', 3, '20-2', '0802', 0, NULL);
|
INSERT INTO `user` VALUES (6, 'user4', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户4 密码user', '420111111111111111', '112', 3, '20-2', '0802', '0', NULL);
|
||||||
INSERT INTO `user` VALUES (7, 'user5', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户5 密码user', '420111111111111111', '112', 3, '20-2', '0802', 0, NULL);
|
INSERT INTO `user` VALUES (7, 'user5', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户5 密码user', '420111111111111111', '112', 3, '20-2', '0802', '0', NULL);
|
||||||
INSERT INTO `user` VALUES (8, 'user6', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户6 密码user', '420111111111111111', '112', 3, '20-2', '0802', 0, NULL);
|
INSERT INTO `user` VALUES (8, 'user6', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户6 密码user', '420111111111111111', '112', 3, '20-2', '0802', '0', NULL);
|
||||||
INSERT INTO `user` VALUES (9, 'user7', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户7 密码user', '420111111111111111', '112', 3, '20-2', '0802', 0, NULL);
|
INSERT INTO `user` VALUES (9, 'user7', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户7 密码user', '420111111111111111', '112', 3, '20-2', '0802', '0', NULL);
|
||||||
INSERT INTO `user` VALUES (10, 'user8', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户8 密码user', '420111111111111111', '112', 3, '20-2', '0802', 0, NULL);
|
INSERT INTO `user` VALUES (10, 'user8', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户8 密码user', '420111111111111111', '112', 3, '20-2', '0802', '0', NULL);
|
||||||
INSERT INTO `user` VALUES (11, 'user9', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户9 密码user', '420111111111111111', '112', 3, '20-2', '0802', 0, NULL);
|
INSERT INTO `user` VALUES (11, 'user9', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户9 密码user', '420111111111111111', '13123321311', 3, '20-2', '0802', '0', NULL);
|
||||||
INSERT INTO `user` VALUES (12, 'user10', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户10 密码user', '420111111111111111', '112', 3, '20-2', '0802', 0, NULL);
|
INSERT INTO `user` VALUES (12, 'user10', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户10 密码user', '420111111111111111', '112', 3, '20-2', '0802', '0', NULL);
|
||||||
|
INSERT INTO `user` VALUES (13, 'qlrfsuxp', 'b5f2ac77c2b8a58dfbff97ff290406cee696c7b54dcd6ebdaf3fdb9205c531c720289f66f47d90c232ff36f942da5533e40e01f3472863c2d78923488fd81055', '而样分', '929309818756666037', '13480331104', 5, '24-62', '1354', '0', NULL);
|
||||||
|
INSERT INTO `user` VALUES (15, 'zqnpgccvq', 'c2bf9f49ef2c0da78eedacde07b37322aa063fa045dd6f24b1d449e5eb81d38fceb5ee656ab479f84cae1a56a4f7c6eac93242dd1cf0d0c754ce12e3b653f713', '机得什后叫', '375601190881718', '16792348638', 4, '78-16', '7138', '0', NULL);
|
||||||
|
INSERT INTO `user` VALUES (16, 'leyp', '00320b98cb7b69671f8298d0bd3340c84d954aabccddfae2f9355f91ed0342e721926ebb62192af6dd56cdc67ca54fcea65679ec6e18e3e8970d50c72bfabd22', '问组使增员了者', '576761656075477737', '13513873254', 6, '21-84', '8164', '0', NULL);
|
||||||
|
INSERT INTO `user` VALUES (17, 'kbiwiw', 'dd9d455bf8b09f491151c3af1448aca8c6136cd4c902d0b19ba5792c18577add4edf5bdb892238ab785cd8a540a22cea62d21139657f353a41be65a554330846', '感转', '634896418246896', '015-6634216', 2, '73-41', '9435', '0', NULL);
|
||||||
|
INSERT INTO `user` VALUES (18, 'dgciqwqhj', 'bec427eb1d7767afd214f6524f5aebc07e181d34cc054cbe23c7a87f262fd577dbe5b9e25e7184d192579296af7a933bea3d26017499ad499364cd8996610a69', '层开名法', '417821248186407144', '18865882572', 3, '23-78', '6264', '0', NULL);
|
||||||
|
INSERT INTO `user` VALUES (19, 'cm', '105056cce8fc85bdbecaed247db90332cf785c8fed9cbcb71dba57187aded6b81d049679a9b56155716c9e47958bc676722985956d0ab2fd040ae0e8cdb7720f', '指及价常件', '124677736597155066', '05961067874', 3, '54-64', '1370', '0', NULL);
|
||||||
|
INSERT INTO `user` VALUES (20, 'fcslfbk', '975c3a52d5435ae60a6f30f4572e754ab458613d0d6c309783bde047198f7944b75b54a62cfbae58594f30573717882aca9bebcccb3ade84fdd5a7d2dd9a0c0f', '集命问已土美石日', '464715523910577877', '0785-3674834', 4, '63-94', '2420', '0', NULL);
|
||||||
|
INSERT INTO `user` VALUES (21, 'vrk', 'f7e3fa3af542e7dd3960069eebb22b5e76adb57e5cf1df0ef0da5cea79e3e8f1a8414b612ebc6f4f08e64bddce070c7e6e55a8f4c098f90145b476acdd3f2808', '称红', '441911654591292', '17474066066', 2, '22-23', '7866', '0', NULL);
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Table structure for visitor1
|
-- Table structure for visitor1
|
||||||
|
16
frontend/package-lock.json
generated
16
frontend/package-lock.json
generated
@@ -13,6 +13,7 @@
|
|||||||
"echarts": "^5.4.1",
|
"echarts": "^5.4.1",
|
||||||
"element-plus": "^2.2.14",
|
"element-plus": "^2.2.14",
|
||||||
"md-editor-v3": "^2.2.1",
|
"md-editor-v3": "^2.2.1",
|
||||||
|
"mockjs": "^1.1.0",
|
||||||
"pinia": "^2.0.20",
|
"pinia": "^2.0.20",
|
||||||
"qs": "^6.11.1",
|
"qs": "^6.11.1",
|
||||||
"vue": "^3.2.37",
|
"vue": "^3.2.37",
|
||||||
@@ -792,9 +793,7 @@
|
|||||||
"node_modules/commander": {
|
"node_modules/commander": {
|
||||||
"version": "2.20.3",
|
"version": "2.20.3",
|
||||||
"resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
|
"resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
|
||||||
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
|
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
|
||||||
"dev": true,
|
|
||||||
"peer": true
|
|
||||||
},
|
},
|
||||||
"node_modules/core-js-pure": {
|
"node_modules/core-js-pure": {
|
||||||
"version": "3.28.0",
|
"version": "3.28.0",
|
||||||
@@ -1772,6 +1771,17 @@
|
|||||||
"ufo": "^1.1.0"
|
"ufo": "^1.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/mockjs": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/mockjs/-/mockjs-1.1.0.tgz",
|
||||||
|
"integrity": "sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"commander": "*"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"random": "bin/random"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/ms": {
|
"node_modules/ms": {
|
||||||
"version": "2.1.2",
|
"version": "2.1.2",
|
||||||
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
|
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
|
||||||
|
@@ -13,6 +13,7 @@
|
|||||||
"echarts": "^5.4.1",
|
"echarts": "^5.4.1",
|
||||||
"element-plus": "^2.2.14",
|
"element-plus": "^2.2.14",
|
||||||
"md-editor-v3": "^2.2.1",
|
"md-editor-v3": "^2.2.1",
|
||||||
|
"mockjs": "^1.1.0",
|
||||||
"pinia": "^2.0.20",
|
"pinia": "^2.0.20",
|
||||||
"qs": "^6.11.1",
|
"qs": "^6.11.1",
|
||||||
"vue": "^3.2.37",
|
"vue": "^3.2.37",
|
||||||
|
@@ -35,3 +35,29 @@ export function getUserList(params) {
|
|||||||
params: params,
|
params: params,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加/修改用户信息
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function editUser(params) {
|
||||||
|
return send_request({
|
||||||
|
url: '/user/manage/editUser',
|
||||||
|
method: 'POST',
|
||||||
|
useQS: true,
|
||||||
|
params: params,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除用户
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function deleteUser(params) {
|
||||||
|
return send_request({
|
||||||
|
url: '/user/manage/deleteUser',
|
||||||
|
method: 'POST',
|
||||||
|
useQS: true,
|
||||||
|
params: params,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
@@ -1,25 +1,23 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="manage-list-container">
|
<div class="manage-list-container">
|
||||||
<div v-if="tableData">
|
<div v-if="tableData">
|
||||||
|
<!-- {{ query }} -->
|
||||||
<!-- 筛选 -->
|
<!-- 筛选 -->
|
||||||
<div class="handle-box">
|
<div class="handle-box">
|
||||||
<template v-for="field in searchFields">
|
<template v-for="field in searchFields">
|
||||||
<el-input v-if="field.searchType == 'input'" v-model="query[field.field]"
|
<el-input v-if="field.searchType == 'input'" v-model="query[field.field]"
|
||||||
@keyup.enter.native="handleSearch" :placeholder="field.placeholder"
|
@keyup.enter.native="handleSearch" :placeholder="field.placeholder"
|
||||||
class="handle-input mr10"></el-input>
|
class="handle-input mr10"></el-input>
|
||||||
<el-select v-else-if="field.searchType == 'select'" v-model="query[field.field]" @change="handleSearch"
|
<el-select v-else-if="field.searchType == 'select'" v-model="query[field.field]" :clearable="true"
|
||||||
:placeholder="field.placeholder" class="handle-select mr10">
|
@change="handleSearch" :placeholder="field.placeholder" class="handle-select mr10">
|
||||||
<el-option key="" :label="'全部' + field.placeholder" value=""></el-option>
|
<el-option v-for="optKey in Object.keys(field.options)" :key="optKey" :label="field.options[optKey]"
|
||||||
<el-option v-for="optKey in Object.keys(field.options)" :key="optKey" :label="field.options[optKey]" :value="optKey"></el-option>
|
:value="optKey"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
<template v-else>{{ field }}</template>
|
<template v-else>{{ field }}</template>
|
||||||
</template>
|
</template>
|
||||||
<el-button type="primary" :icon="Search" @click="handleSearch">搜索</el-button>
|
<el-button type="primary" :icon="Search" @click="handleSearch">搜索</el-button>
|
||||||
<el-button type="primary" :icon="Plus" @click="handleNew" v-permiss="props.editPermiss">新增</el-button>
|
<el-button type="primary" :icon="Plus" @click="handleNew" v-permiss="props.editPermiss">新增</el-button>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
|
||||||
{{ query }}
|
|
||||||
</div>
|
|
||||||
<!-- 表格 -->
|
<!-- 表格 -->
|
||||||
<el-table :data="tableData" border class="table" ref="multipleTable" header-cell-class-name="table-header">
|
<el-table :data="tableData" border class="table" ref="multipleTable" header-cell-class-name="table-header">
|
||||||
<el-table-column prop="id" label="ID" width="55" align="center"></el-table-column>
|
<el-table-column prop="id" label="ID" width="55" align="center"></el-table-column>
|
||||||
@@ -49,25 +47,28 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 新增 / 编辑弹出框 -->
|
<!-- 新增 / 编辑弹出框 -->
|
||||||
<el-dialog title="编辑" v-model="editVisible" width="30%">
|
<el-dialog :title="formId > 0 ? '编辑' : '新增'" v-model="editVisible" style="width: 40%; min-width: 280px;">
|
||||||
<el-form label-width="70px">
|
<!-- {{ form }} -->
|
||||||
<el-form-item label="用户名">
|
<el-form ref="editForm" label-width="80px" :rules="rules" :model="form">
|
||||||
<el-input v-model="form.username"></el-input>
|
<el-form-item v-if="editVisible" v-for="field in dialogFields" :label="field.label" :prop="field.field">
|
||||||
</el-form-item>
|
<el-input v-if="(formId > 0 ? field.editType : field.addType) == 'input'"
|
||||||
<el-form-item label="角色">
|
:placeholder="formId > 0 ? field.editPlaceholder : field.addPlaceholder" class="popup-item"
|
||||||
<el-select v-model="form.roleName" placeholder="角色类型" class="handle-select mr10">
|
v-model="form[field.field]"></el-input>
|
||||||
<el-option key="1" label="管理员" value="管理员"></el-option>
|
<el-select v-else-if="(formId > 0 ? field.editType : field.addType) == 'select'" class="popup-item"
|
||||||
<el-option key="2" label="普通用户" value="普通用户"></el-option>
|
v-model="form[field.field]" :clearable="true">
|
||||||
|
<el-option v-for="optKey in Object.keys(field.options)" :key="optKey" :label="field.options[optKey]"
|
||||||
|
:value="optKey"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
<el-input v-else-if="(formId > 0 ? field.editType : field.addType) == 'plainText'" class="popup-item"
|
||||||
<el-form-item label="电话">
|
v-model="form[field.field]" :disabled="true"></el-input>
|
||||||
<el-input v-model="form.telephone"></el-input>
|
<!-- {{ field }} -->
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<span class="dialog-footer">
|
<span class="dialog-footer">
|
||||||
|
<el-button @click="doMockData(formId > 0)" type="danger" round>随机填充测试数据</el-button>
|
||||||
<el-button @click="editVisible = false">取 消</el-button>
|
<el-button @click="editVisible = false">取 消</el-button>
|
||||||
<el-button type="primary" @click="saveEdit">确 定</el-button>
|
<el-button type="primary" @click="saveEdit(editForm)">确 定</el-button>
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
@@ -76,13 +77,29 @@
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, reactive, onMounted } from 'vue';
|
import { ref, reactive, onMounted } from 'vue';
|
||||||
import { ElMessage, ElMessageBox } from 'element-plus';
|
import { FormInstance, FormRules, ElMessage, ElMessageBox } from 'element-plus';
|
||||||
import { Delete, Edit, Search, Plus } from '@element-plus/icons-vue';
|
import { Delete, Edit, Search, Plus } from '@element-plus/icons-vue';
|
||||||
import send_request from '../utils/send_request';
|
import send_request from '../utils/send_request';
|
||||||
|
import Mock from 'mockjs';
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
// 获取列表 接口函数
|
// 获取列表 接口函数
|
||||||
'getListFunc': {
|
'listFunc': {
|
||||||
|
type: Function,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
// 新增 接口函数
|
||||||
|
'addFunc': {
|
||||||
|
type: Function,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
// 修改 接口函数
|
||||||
|
'editFunc': {
|
||||||
|
type: Function,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
// 修改 接口函数
|
||||||
|
'deleteFunc': {
|
||||||
type: Function,
|
type: Function,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
@@ -93,35 +110,38 @@ const props = defineProps({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// 筛选列
|
// 筛选条件
|
||||||
const searchFields: any = ref([]);
|
const searchFields: any = ref([]); // 筛选条件字段
|
||||||
|
|
||||||
const query = reactive({
|
const query = reactive({
|
||||||
pageIndex: 1,
|
pageIndex: 1,
|
||||||
pageSize: 10
|
pageSize: 10
|
||||||
// 其他筛选条件
|
// 其他筛选条件
|
||||||
});
|
}); // 筛选条件的值
|
||||||
|
|
||||||
// 表格数据
|
// 表格
|
||||||
const tableData: any = ref(null);
|
const tableData: any = ref(null); // 表格数据
|
||||||
|
const tableFields: any = ref([]); // 表格列
|
||||||
// 表格列
|
const pageTotal = ref(0); // 总页数
|
||||||
const tableFields: any = ref([]);
|
|
||||||
|
|
||||||
// 总页数
|
|
||||||
const pageTotal = ref(0);
|
|
||||||
|
|
||||||
// 新增/编辑 弹窗列
|
|
||||||
const dialogFields: any = ref([]);
|
|
||||||
|
|
||||||
// 新增/编辑 弹窗
|
// 新增/编辑 弹窗
|
||||||
const editVisible = ref(false);
|
const dialogFields: any = ref([]); // 弹窗字段
|
||||||
let form = reactive({} as any);
|
const editVisible = ref(false); // 是否显示弹窗
|
||||||
let idx: number = -1;
|
let form = reactive({} as any); // 弹窗字段的值
|
||||||
|
let idx: number = -1; // 表格中编辑行的 index; 新增为 -1
|
||||||
|
let formId: number = -1; // 数据库 id; 新增为 -1
|
||||||
|
let idFieldName: string = ''; // id列列名
|
||||||
|
|
||||||
|
// 添加/修改记录时表单验证
|
||||||
|
const editForm = ref<FormInstance>();
|
||||||
|
// const rules: FormRules = {};
|
||||||
|
const rules = ref({} as FormRules);
|
||||||
|
|
||||||
|
//
|
||||||
|
let mockData: any = []
|
||||||
|
|
||||||
// 获取表格数据
|
// 获取表格数据
|
||||||
const getData = async () => {
|
const getData = async () => {
|
||||||
props.getListFunc(query).then((data: any) => {
|
props.listFunc(query).then((data: any) => {
|
||||||
console.log(data)
|
console.log(data)
|
||||||
|
|
||||||
// 深拷贝一份
|
// 深拷贝一份
|
||||||
@@ -141,19 +161,27 @@ const getData = async () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log("data.columns", data.columns)
|
||||||
|
|
||||||
// 表格列
|
// 表格列
|
||||||
tableFields.value = data.columns
|
tableFields.value = data.columns
|
||||||
|
.filter((field: any) => field.showInTable)
|
||||||
.map((field: any) => {
|
.map((field: any) => {
|
||||||
return { prop: field.prop, label: field.label }
|
return { prop: field.prop, label: field.label }
|
||||||
});
|
});
|
||||||
|
console.log("tableFields", tableFields.value)
|
||||||
// 表格数据
|
// 表格数据
|
||||||
tableData.value = _tableData;
|
tableData.value = _tableData;
|
||||||
// 总页数
|
// 总页数
|
||||||
pageTotal.value = data.total;
|
pageTotal.value = data.total;
|
||||||
|
|
||||||
|
// id列列名
|
||||||
|
idFieldName = data.idFieldName;
|
||||||
|
console.log("idFieldName", idFieldName)
|
||||||
|
|
||||||
// 筛选字段
|
// 筛选字段
|
||||||
searchFields.value = data.columns
|
searchFields.value = data.columns
|
||||||
.filter((field: any) => field.canSearch)
|
.filter((field: any) => field.searchType != "null")
|
||||||
.map((field: any) => {
|
.map((field: any) => {
|
||||||
let f: any = {
|
let f: any = {
|
||||||
placeholder: field.label,
|
placeholder: field.label,
|
||||||
@@ -162,6 +190,7 @@ const getData = async () => {
|
|||||||
}
|
}
|
||||||
switch (field.searchType) {
|
switch (field.searchType) {
|
||||||
case 'select':
|
case 'select':
|
||||||
|
// 如果是下拉框,那么找到下拉框的 option 数据
|
||||||
f.options = fieldsMapper.find((field: any) => field.key == f.field).mapper
|
f.options = fieldsMapper.find((field: any) => field.key == f.field).mapper
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -174,20 +203,59 @@ const getData = async () => {
|
|||||||
// 新增/修改弹窗列
|
// 新增/修改弹窗列
|
||||||
dialogFields.value = data.columns
|
dialogFields.value = data.columns
|
||||||
.map((field: any) => {
|
.map((field: any) => {
|
||||||
|
// 拼装 新增/修改弹窗 字段
|
||||||
if (typeof (query[field.field]) === "undefined") {
|
if (typeof (query[field.field]) === "undefined") {
|
||||||
query[field.field] = ''
|
query[field.field] = ''
|
||||||
}
|
}
|
||||||
let f: any = {
|
let f: any = {
|
||||||
label: field.label,
|
label: field.label,
|
||||||
field: field.field,
|
field: field.field,
|
||||||
|
addType: field.addType,
|
||||||
|
addPlaceholder: field.addPlaceholder,
|
||||||
editType: field.editType,
|
editType: field.editType,
|
||||||
|
editPlaceholder: field.editPlaceholder,
|
||||||
|
default: field.default,
|
||||||
|
}
|
||||||
|
switch (field.searchType) {
|
||||||
|
case 'select':
|
||||||
|
// 如果是下拉框,那么找到下拉框的 option 数据
|
||||||
|
f.options = fieldsMapper.find((field: any) => field.key == f.field).mapper
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return f
|
return f
|
||||||
});
|
});
|
||||||
console.log("dialogFields", dialogFields.value);
|
console.log("dialogFields", dialogFields.value);
|
||||||
|
|
||||||
// 拼装 新增/修改弹窗 字段
|
// 表单验证
|
||||||
// form =
|
for (let field of data.columns) {
|
||||||
|
rules.value[field.field] = field.validateRules
|
||||||
|
// .map((rule: any) => {
|
||||||
|
// if (rule.pattern) {
|
||||||
|
// rule.pattern = new RegExp(rule.pattern)
|
||||||
|
// console.log(rule.pattern)
|
||||||
|
// }
|
||||||
|
// return rule
|
||||||
|
// })
|
||||||
|
}
|
||||||
|
console.log("rules", rules.value)
|
||||||
|
|
||||||
|
// 测试数据
|
||||||
|
mockData = data.columns
|
||||||
|
.map((field: any) => {
|
||||||
|
let spaceIndex = field.mockRegex.indexOf(' ')
|
||||||
|
if (spaceIndex == -1) return
|
||||||
|
let type = field.mockRegex.substring(0, spaceIndex)
|
||||||
|
let str = field.mockRegex.substring(spaceIndex + 1)
|
||||||
|
return {
|
||||||
|
canEdit: field.editType != "plainText",
|
||||||
|
field: field.field,
|
||||||
|
type: type,
|
||||||
|
str: str,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
console.log("mockData", mockData)
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -203,65 +271,133 @@ const handlePageChange = (val: number) => {
|
|||||||
getData();
|
getData();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 点击进入编辑框
|
||||||
|
const handleEdit = (index: number, row: any) => {
|
||||||
|
idx = index;
|
||||||
|
formId = row[idFieldName];
|
||||||
|
form[idFieldName] = formId;
|
||||||
|
// 遍历所有编辑项,并将 row 的值赋给表格
|
||||||
|
for (let f of dialogFields.value) {
|
||||||
|
switch (f.editType) {
|
||||||
|
case "select":
|
||||||
|
// 下拉框的值要为 string 类型
|
||||||
|
form[f.field] = String(row[f.field]);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
form[f.field] = row[f.field];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
editVisible.value = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 点击进入新建框
|
||||||
|
const handleNew = () => {
|
||||||
|
idx = -1;
|
||||||
|
formId = -1;
|
||||||
|
form[idFieldName] = -1;
|
||||||
|
// 遍历所有编辑项,并将 row 的值赋给表格
|
||||||
|
for (let f of dialogFields.value) {
|
||||||
|
switch (f.editType) {
|
||||||
|
case "select":
|
||||||
|
// 下拉框的值要为 string 类型
|
||||||
|
form[f.field] = String(f.default);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
form[f.field] = f.default;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
editVisible.value = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 编辑保存到数据库
|
||||||
|
const saveEdit = async (formEl: FormInstance | undefined) => {
|
||||||
|
if (!formEl) return;
|
||||||
|
console.log("formEl", formEl);
|
||||||
|
formEl.validate(async (valid: boolean, invalidFields: any) => {
|
||||||
|
// 表单校验
|
||||||
|
if (!valid) {
|
||||||
|
// console.log("invalidFields", invalidFields);
|
||||||
|
// 对表单中的每一个不合法输入框进行遍历
|
||||||
|
Object.values(invalidFields).forEach((input: any) => {
|
||||||
|
// 对该不合法输入框的提示信息进行遍历
|
||||||
|
input.forEach((element: any) => {
|
||||||
|
ElMessage.error({ message: element.message, grouping: true });
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var result;
|
||||||
|
if (formId > 0) {
|
||||||
|
// 修改记录
|
||||||
|
var result = await props.editFunc(form)
|
||||||
|
} else {
|
||||||
|
// 新增记录
|
||||||
|
var result = await props.addFunc(form)
|
||||||
|
query.pageIndex = Math.ceil((pageTotal.value + 1) / query.pageSize);
|
||||||
|
}
|
||||||
|
console.log("result", result)
|
||||||
|
|
||||||
|
if (!result) {
|
||||||
|
ElMessage.error({ message: "添加失败" });
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 关闭弹窗
|
||||||
|
editVisible.value = false;
|
||||||
|
|
||||||
|
// 更新表格中数据
|
||||||
|
await getData();
|
||||||
|
|
||||||
|
ElMessage.success(formId > 0 ? `修改成功` : `添加成功`);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
// 删除操作
|
// 删除操作
|
||||||
const handleDelete = (index: number, row: any) => {
|
const handleDelete = (index: number, row: any) => {
|
||||||
idx = index;
|
idx = index;
|
||||||
// 二次确认删除
|
// 二次确认删除
|
||||||
ElMessageBox.confirm('确定要删除吗?', '提示', { type: 'warning' })
|
ElMessageBox.confirm('确定要删除吗?', '提示', { type: 'warning' })
|
||||||
.then(async () => {
|
.then(async () => {
|
||||||
await send_request('v1/user/delete', "POST", {
|
var result = await props.deleteFunc({
|
||||||
userId: row.id
|
id: row[idFieldName],
|
||||||
}, (data: any) => {
|
})
|
||||||
// console.log("delete index", index);
|
if (result) {
|
||||||
// console.log(data);
|
|
||||||
if (data) {
|
|
||||||
ElMessage.success('删除成功');
|
ElMessage.success('删除成功');
|
||||||
tableData.value.splice(idx, 1);
|
if (tableData.value.length == 1) {
|
||||||
|
// 删除了当前页面的最后一条记录,那么往前翻一页
|
||||||
|
if (query.pageIndex > 0) {
|
||||||
|
query.pageIndex -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tableData.value.splice(idx, 1);
|
||||||
|
// 更新表格中数据
|
||||||
|
await getData();
|
||||||
|
} else {
|
||||||
|
ElMessage.error('删除失败');
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
})
|
})
|
||||||
.catch(() => { });
|
.catch(() => { });
|
||||||
};
|
};
|
||||||
|
|
||||||
// 点击进入编辑框
|
// 生成测试数据
|
||||||
const handleEdit = (index: number, row: any) => {
|
const doMockData = (isEdit: boolean) => {
|
||||||
idx = index;
|
for (let mock of mockData) {
|
||||||
form.id = row.id;
|
if (isEdit && !mock.canEdit) continue; // 跳过不允许修改的列,例如 用户名
|
||||||
form.username = row.username;
|
switch (mock.type) {
|
||||||
form.roleName = row.roleName;
|
case "DTD":
|
||||||
form.roleId = row.roleId;
|
let regexp = new RegExp(mock.str.substring(1, mock.str.length - 2))
|
||||||
form.telephone = row.telephone;
|
// console.log(regexp)
|
||||||
editVisible.value = true;
|
form[mock.field] = Mock.mock({ 'regexp': regexp })['regexp']
|
||||||
};
|
break;
|
||||||
|
case "DPD":
|
||||||
// 编辑保存到数据库
|
form[mock.field] = Mock.mock(mock.str)
|
||||||
const saveEdit = async () => {
|
break;
|
||||||
editVisible.value = false;
|
}
|
||||||
await send_request('v1/user/edit', "POST", {
|
}
|
||||||
id: form.id,
|
|
||||||
username: form.username,
|
|
||||||
roleId: form.roleId,
|
|
||||||
roleName: form.roleName,
|
|
||||||
telephone: form.telephone
|
|
||||||
}, (data: any) => {
|
|
||||||
if (data) {
|
|
||||||
ElMessage.success('修改成功');
|
|
||||||
tableData.value[idx].username = form.username;
|
|
||||||
tableData.value[idx].roleName = form.roleName;
|
|
||||||
tableData.value[idx].telephone = form.telephone;
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleNew = () => {
|
|
||||||
editVisible.value = true;
|
|
||||||
ElMessage.success(`修改第 ${idx + 1} 行成功`);
|
|
||||||
tableData.value[idx].username = form.username;
|
|
||||||
tableData.value[idx].roleName = form.roleName;
|
|
||||||
tableData.value[idx].telephone = form.telephone;
|
|
||||||
};
|
|
||||||
|
|
||||||
// 网页加载完成后加载数据
|
// 网页加载完成后加载数据
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
@@ -302,4 +438,8 @@ onMounted(() => {
|
|||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.popup-item {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@@ -34,20 +34,7 @@ async function send_request({ url, method = "POST", params, useQS = false, callb
|
|||||||
let result = response.data;
|
let result = response.data;
|
||||||
// 判断后端是否处理成功
|
// 判断后端是否处理成功
|
||||||
if (!result.success) {
|
if (!result.success) {
|
||||||
// 用户未登录情况
|
ElMessage.error(result?.msg || "服务器错误");
|
||||||
// if (result.data && result.data.errCode == 20003) {
|
|
||||||
// ElMessage.error(result?.data?.msg || "用户未登录");
|
|
||||||
// localStorage.clear();
|
|
||||||
// // window.location.reload();
|
|
||||||
// // 如果同时发出多个请求,可能会多次进来,第二次及之后进入时,hash已经变成 #/login 了
|
|
||||||
// if (!window.location.hash.includes("/login")) {
|
|
||||||
// let newUrl = '/#/login?redirectTo=' + encodeURIComponent(window.location.hash.substring(1).split('?')[0])
|
|
||||||
// console.log("newUrl", newUrl)
|
|
||||||
// window.location.href = newUrl;
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
ElMessage.error(result?.data?.msg || "服务器错误");
|
|
||||||
// }
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
let data = result.data;
|
let data = result.data;
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<manageList :get-list-func="userApi.getUserList" editPermiss="privilege-user-setting" />
|
<manageList :list-func="userApi.getUserList" :add-func="userApi.editUser" :edit-func="userApi.editUser"
|
||||||
|
:delete-func="userApi.deleteUser" edit-permiss="privilege-user-setting" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user