1
0
Code Issues Pull Requests Packages Projects Releases Wiki Activity GitHub Gitee

用户管理增删改查全部完成

This commit is contained in:
2023-03-29 17:24:27 +08:00
parent cf962a92da
commit 14907e3e26
24 changed files with 775 additions and 252 deletions

View File

@@ -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;
}
}

View File

@@ -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");

View File

@@ -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");

View File

@@ -1,4 +1,4 @@
package com.cxyxiaomo.epp.common.query; package com.cxyxiaomo.epp.PageTable.query;
import lombok.Getter; import lombok.Getter;

View File

@@ -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;
}
}

View File

@@ -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);

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;

View File

@@ -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;
}
}

View File

@@ -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;
}
} }

View File

@@ -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>

View File

@@ -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-0511栋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,
"门牌号例如200320楼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);
} }
} }

View File

@@ -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);
} }

View File

@@ -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);
}
} }

View File

@@ -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>

View File

@@ -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

View File

@@ -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",

View File

@@ -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",

View File

@@ -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,
});
};

View File

@@ -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); ElMessage.success('删除成功');
if (data) { if (tableData.value.length == 1) {
ElMessage.success('删除成功'); // 删除了当前页面的最后一条记录,那么往前翻一页
tableData.value.splice(idx, 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>

View File

@@ -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;

View File

@@ -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>