用户管理增删改查全部完成
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