如何实现用户自定义表头字段

目录

 

前言:

开发步骤

综上:

源代码:

github网址:https://github.com/tanghh0410/CustomizeTheHeader


前言:

我们系统当中有一个用户自定义显示字段的功能我觉得挺有意思的,我重新写了一个demo来演示这个自定义显示的功能。

为什么会有这个需求?

:系统当中有很多表单,拿project 这个表单来说的话,表头字段有五十个,可能有的表单更多,对于用户来说不需要在页面显示那么多字段,也就是说实际上用的没有50个。

功能使用场景:

:用户soup_tang在页面上设置显示了20个,用户 csdn 博客在页面上设置显示了30个,无论页面刷新与否,数据库里面需要保存的是用户最后一次修改的值,而且俩个用户的字段不能混淆。

开发步骤

需要注意的前半部分我会将这个功能全过一遍,文末我会将所有的源码贴出。

在看的过程中,觉得小编写的不错的话,不妨给小编点个赞喔,有不对的地方欢迎评论区指出。(报拳)

(1) 整篇文章的架构(需要注意的这是我以前搭建shiro的一个小例子,shiro 包下面的文件与本文无关)

(2)准备数据库表

用户自定义显示表头这个功能我总共用到了四张表

show_column  user_column   bos_user  project

让我们分别来看一下每张表里面有什么数据

bos_user

project

show_column

user_column

(3)接口

package com.example.controller;

import com.example.service.ShowColumnService;
import com.example.vo.CommonVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Author tanghh
 * @Date 2020/5/28 11:07
 */
@RestController
@RequestMapping(value = "/field")
public class TestController {

    @Autowired
    private ShowColumnService showColumnService;

    @PostMapping(value = "/listShowColumnInfo")
    public List listShowColumnInfo(@RequestBody CommonVo vo){
        return showColumnService.listShowColumnField(vo);
    }
}

(4)业务逻辑层

ShowColumnServiceImpl
package com.example.service.impl;

import com.example.repository.ShowColumnRepository;
import com.example.repository.jpa.ShowColumnJPARepository;
import com.example.service.ShowColumnService;
import com.example.vo.CommonVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author tanghh
 * @Date 2020/5/28 11:28
 */
@Service
public class ShowColumnServiceImpl implements ShowColumnService {
    private Logger logger = LoggerFactory.getLogger(ShowColumnServiceImpl.class);
    @Autowired
    private ShowColumnRepository showColumnRepository;

    @Override
    public List listShowColumnField(CommonVo vo) {
        try{
            //查询项目数据
            List projectList = showColumnRepository.listShowColumnData(vo);
            return projectList;
        }catch (Exception e){
            logger.error("查询失败",e);
            return null;
        }
    }


}

(5)查询数据的responsitory

package com.example.repository.impl;

import com.example.repository.ShowColumnRepository;
import com.example.util.SpliceFiledUtil;
import com.example.vo.CommonVo;
import com.google.common.base.Strings;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: tanghh18
 * @Date: 2020/5/29 16:06
 */
@Repository
public class ShowColumnRepositoryImpl extends BaseRepository implements ShowColumnRepository {

    /**
     * 查询搜索项目页面数据
     * @param vo
     * @return
     */
    @Override
    public List listShowColumnData(CommonVo vo) {
        StringBuffer stringBuffer = new StringBuffer();
        Map map = new HashMap();
        stringBuffer.append("select * from project a where a.is_del='0' ");
        //查询页面字段(查询为id 为1 的用户字段)
        String page = vo.getPage();
        int uid = 1;
        List projectColumnList = listMyColumnField(page,uid);
        //根据搜索框拼接查询条件
        if(!Strings.isNullOrEmpty(vo.getInput())){
          String inputCondition = SpliceFiledUtil.spliceInputCondition(projectColumnList);
          stringBuffer.append(" "+inputCondition);
          map.put("input","%"+vo.getInput()+"%");
        }
        //替换需要查询的字段
        String sql = stringBuffer.toString();
        String fieldCondition = SpliceFiledUtil.spliceFiledCondition(projectColumnList);
        sql = sql.replace("*",fieldCondition);
        System.out.println("执行的sql 为---:"+sql);
        return this.getList(sql,map);
    }

    /**
     * 查询页面字段
     * @return
     */
    @Override
    public List listMyColumnField(String page,int uid) {
        Map map = new HashMap();
//        String sql = "select * from show_column where is_del = 0 and page=:page";
        String sql = "SELECT a.page,a.field_name,a.database_name,a.entity_name,a.field_order,b.field_open,b.user_id from show_column a LEFT JOIN user_column b \n" +
                "ON a.id = b.column_id  WHERE a.is_del = '0' AND b.is_del = '0'  AND  a.page = :page and b.user_id=:user_id  AND b.field_open = '0'";
        map.put("page",page);
        map.put("user_id",uid);
        return this.getList(sql,map);
    }
}

(6)测试id 为1 ,名称为soup_tang 。试一下这个条件接口的返回结果

postman测试这个接口,可以看到project表里面的俩个字段都已经查询出来了。

(7)接下来测试 id 为1 名称为soup_tang 这个用户,加上搜索条件以后接口的返回结果

soup_tang这个用户返回了项目地点为上海的这条数据 

(8)接下来我们测试一下id为2 名称为csdn博客 这个用户查询,看一下接口的返回结果:

接口同样是返回了俩条数据 

(9)接下来我们测试一下id为2 名称为csdn博客 这个用户加上一个条件为上海的查询,看一下接口的返回结果:

我在数据库中将该用户的项目地点字段关闭了,如果程序没问题此时应该是没有数据的。0代表开启 1代表关闭

综上:

可以看到我们已经实现了俩个用户显示不同的字段,并且拥有不同的字段查询,这个功能还可以往更多地方延展,比如我们直接将这些字段返回,在页面上渲染出来,。我们可以设置用户手动拖拽的表头宽度,我们可以设置该字段次显主显必显等等,

源代码:

(1)TestController

package com.example.controller;

import com.example.service.ShowColumnService;
import com.example.vo.CommonVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Author tanghh
 * @Date 2020/5/28 11:07
 */
@RestController
@RequestMapping(value = "/field")
public class TestController {

    @Autowired
    private ShowColumnService showColumnService;

    @PostMapping(value = "/listShowColumnInfo")
    public List listShowColumnInfo(@RequestBody CommonVo vo){
        return showColumnService.listShowColumnField(vo);
    }
}

(2)ShowColumnServiceImpl

package com.example.service.impl;

import com.example.repository.ShowColumnRepository;
import com.example.repository.jpa.ShowColumnJPARepository;
import com.example.service.ShowColumnService;
import com.example.vo.CommonVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author tanghh
 * @Date 2020/5/28 11:28
 */
@Service
public class ShowColumnServiceImpl implements ShowColumnService {
    private Logger logger = LoggerFactory.getLogger(ShowColumnServiceImpl.class);
    @Autowired
    private ShowColumnRepository showColumnRepository;

    @Override
    public List listShowColumnField(CommonVo vo) {
        try{
            //查询项目数据
            List projectList = showColumnRepository.listShowColumnData(vo);
            return projectList;
        }catch (Exception e){
            logger.error("查询失败",e);
            return null;
        }
    }


}

(3)ShowColumnRepositoryImpl

package com.example.repository.impl;

import com.example.repository.ShowColumnRepository;
import com.example.util.SpliceFiledUtil;
import com.example.vo.CommonVo;
import com.google.common.base.Strings;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: tanghh18
 * @Date: 2020/5/29 16:06
 */
@Repository
public class ShowColumnRepositoryImpl extends BaseRepository implements ShowColumnRepository {

    /**
     * 查询搜索项目页面数据
     * @param vo
     * @return
     */
    @Override
    public List listShowColumnData(CommonVo vo) {
        StringBuffer stringBuffer = new StringBuffer();
        Map map = new HashMap();
        stringBuffer.append("select * from project a where a.is_del='0' ");
        //查询页面字段(查询为id 为1 的用户字段)
        String page = vo.getPage();
        int uid = 2;
        List projectColumnList = listMyColumnField(page,uid);
        //根据搜索框拼接查询条件
        if(!Strings.isNullOrEmpty(vo.getInput())){
          String inputCondition = SpliceFiledUtil.spliceInputCondition(projectColumnList);
          stringBuffer.append(" "+inputCondition);
          map.put("input","%"+vo.getInput()+"%");
        }
        //替换需要查询的字段
        String sql = stringBuffer.toString();
        String fieldCondition = SpliceFiledUtil.spliceFiledCondition(projectColumnList);
        sql = sql.replace("*",fieldCondition);
        System.out.println("执行的sql 为---:"+sql);
        return this.getList(sql,map);
    }

    /**
     * 查询页面字段
     * @return
     */
    @Override
    public List listMyColumnField(String page,int uid) {
        Map map = new HashMap();
//        String sql = "select * from show_column where is_del = 0 and page=:page";
        String sql = "SELECT a.page,a.field_name,a.database_name,a.entity_name,a.field_order,b.field_open,b.user_id from show_column a LEFT JOIN user_column b \n" +
                "ON a.id = b.column_id  WHERE a.is_del = '0' AND b.is_del = '0'  AND  a.page = :page and b.user_id=:user_id  AND b.field_open = '0'";
        map.put("page",page);
        map.put("user_id",uid);
        return this.getList(sql,map);
    }
}

(4)ShowColumnRespository

package com.example.repository;

import com.example.vo.CommonVo;

import java.util.List;

/**
 * @Author tanghh
 * @Date 2020/5/28 11:30
 */
public interface ShowColumnRepository {

    /**
     * 查询搜索项目页面数据
     * @param vo
     * @return
     */
    List listShowColumnData(CommonVo vo);


    /**
     * 查询用户自定义的字段
     * @param page
     * @param uid
     * @return
     */
    List listMyColumnField(String page,int uid);
}

(5)SpliceFiledUtil

package com.example.util;

import java.util.List;
import java.util.Map;

/**
 * @Author tanghh
 * @Date 2020/5/29 15:37
 */
public class SpliceFiledUtil {
    /**
     * 拼接查询条件
     * @param fieldList
     */
    public static String spliceInputCondition(List fieldList){
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < fieldList.size(); i++) {
             Map map = (Map) fieldList.get(i);
             if(i == 0){
                 stringBuffer.append(" and ( ");
             }
             if(map.get("database_name")!=null){
                 String databaseName = (String) map.get("database_name");
                 if(i >= 0 && i != fieldList.size() -1){
                     stringBuffer.append(" a."+ databaseName +" like :input or");
                 }else{
                     stringBuffer.append(" a."+ databaseName +" like :input ");
                 }
             }
             if(i == fieldList.size() -1){
                 stringBuffer.append(" ) ");
             }
        }
        return stringBuffer.toString();
    }

    /**
     * 拼接查询的字段
     * @param fieldList
     * @return
     */
    public static String spliceFiledCondition(List fieldList){
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < fieldList.size(); i++) {
            Map map = (Map) fieldList.get(i);
            if(map.get("database_name")!=null){
                String databaseName = (String) map.get("database_name");
                if(i != fieldList.size() - 1){
                    stringBuffer.append(" a."+ databaseName +",");
                }else{
                    stringBuffer.append(" a."+ databaseName);
                }
            }
        }
        return  stringBuffer.toString();
    }
}

(6)BosUserModel

package com.example.model;

import com.sun.javafx.beans.IDProperty;

import javax.persistence.*;
import java.io.Serializable;

/**
 * @Author tanghh
 * @Date 2020/4/6 10:35
 */
@Entity
@Table(name = "bos_user", schema = "test3", catalog = "")
public class BosUserModel implements Serializable {
    private Integer id;
    private String userName;
    private String password;
    private String isDel="0";

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
    @Basic
    @Column(name = "user_name")
    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }
    @Basic
    @Column(name = "password")
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
    @Basic
    @Column(name = "is_del")
    public String getIsDel() {
        return isDel;
    }

    public void setIsDel(String isDel) {
        this.isDel = isDel;
    }
}

(7)ShowColumnModel

package com.example.model;

import javax.persistence.*;
import java.sql.Timestamp;

/**
 * @Author tanghh
 * @Date 2020/5/28 11:15
 */
@Entity
@Table(name = "show_column", schema = "test3", catalog = "")
public class ShowColumnModel {
  private Integer id;
  private String page;
  private String tableName;
  private String fieldName;
  private String dataBaseName;
  private String entityName;
  private Integer fieldOrder;
  private Integer fieldOpen;
  private Timestamp createTime;
  private Timestamp updateTime;
  private Integer isDel=0;
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
    @Basic
    @Column(name = "page")
    public String getPage() {
        return page;
    }

    public void setPage(String page) {
        this.page = page;
    }
    @Basic
    @Column(name = "table_name")
    public String getTableName() {
        return tableName;
    }

    public void setTableName(String tableName) {
        this.tableName = tableName;
    }
    @Basic
    @Column(name = "field_name")
    public String getFieldName() {
        return fieldName;
    }

    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }
    @Basic
    @Column(name = "database_name")
    public String getDataBaseName() {
        return dataBaseName;
    }

    public void setDataBaseName(String dataBaseName) {
        this.dataBaseName = dataBaseName;
    }
    @Basic
    @Column(name = "entity_name")
    public String getEntityName() {
        return entityName;
    }

    public void setEntityName(String entityName) {
        this.entityName = entityName;
    }
    @Basic
    @Column(name = "field_order")
    public Integer getFieldOrder() {
        return fieldOrder;
    }

    public void setFieldOrder(Integer fieldOrder) {
        this.fieldOrder = fieldOrder;
    }
    @Basic
    @Column(name = "field_open")
    public Integer getFieldOpen() {
        return fieldOpen;
    }

    public void setFieldOpen(Integer fieldOpen) {
        this.fieldOpen = fieldOpen;
    }
    @Basic
    @Column(name = "create_time")
    public Timestamp getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Timestamp createTime) {
        this.createTime = createTime;
    }

    @Basic
    @Column(name = "update_time")
    public Timestamp getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Timestamp updateTime) {
        this.updateTime = updateTime;
    }
    @Basic
    @Column(name = "is_del")
    public Integer getIsDel() {
        return isDel;
    }

    public void setIsDel(Integer isDel) {
        this.isDel = isDel;
    }
}

(8)UserColumnModel

package com.example.model;

import javax.persistence.*;

/**
 * @Author tanghh
 * @Date 2020/5/31 14:06
 */
@Entity
@Table(name = "user_column", schema = "shiro_demo", catalog = "")
public class UserColumnModel {
    private Integer id;
    private Integer columnId;
    private Integer userId;
    private String fieldOpen;
    private String isDel="0";

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
    @Basic
    @Column(name = "column_id")
    public Integer getColumnId() {
        return columnId;
    }

    public void setColumnId(Integer columnId) {
        this.columnId = columnId;
    }
    @Basic
    @Column(name = "user_id")
    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }
    @Basic
    @Column(name = "field_open")
    public String getFieldOpen() {
        return fieldOpen;
    }

    public void setFieldOpen(String fieldOpen) {
        this.fieldOpen = fieldOpen;
    }
    @Basic
    @Column(name = "is_del")
    public String getIsDel() {
        return isDel;
    }

    public void setIsDel(String isDel) {
        this.isDel = isDel;
    }
}

(9)执行sql:

CREATE TABLE `show_column` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `page` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '字段所在页面',
  `table_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `field_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '字段名称',
  `database_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '数据库字段名称',
  `entity_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '实体类字段名称',
  `field_order` int(11) DEFAULT NULL COMMENT '默认排序',
  `field_open` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '是否启用(0-是,1-否)',
  `is_del` int(11) DEFAULT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=10299 DEFAULT CHARSET=utf8 COMMENT='全局字段表';

CREATE TABLE `user_column` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '序号',
  `column_id` int(11) DEFAULT NULL COMMENT '与show_column表字段关联的id',
  `user_id` int(11) DEFAULT NULL COMMENT '与用户表关联的id',
  `field_open` char(2) DEFAULT NULL COMMENT '字段是否开启(0代表开启 1代表关闭)',
  `is_del` char(2) DEFAULT NULL COMMENT '字段是否删除',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;

CREATE TABLE `bos_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '序号',
  `user_name` varchar(255) DEFAULT NULL COMMENT '用户名',
  `password` varchar(255) DEFAULT NULL COMMENT '密码',
  `is_del` char(2) DEFAULT NULL COMMENT '是否删除 (0代表不删 1代表已删除)',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

INSERT INTO `bos_user`(`user_name`, `password`, `is_del`) VALUES (1, 'soup_tang', 'c4ca4238a0b923820dcc509a6f75849b', '0');
INSERT INTO `bos_user`(`user_name`, `password`, `is_del`) VALUES (2, 'csdn博客', 'c4ca4238a0b923820dcc509a6f75849b', '0');


INSERT INTO `project`(`customer_name`, `project_name`, `project_group`, `type1`, `type2`, `type3`, `project_address`, `project_leader`, `superior_manager`, `business_leader`, `project_checker`, `is_del`) VALUES (1, '客户名称11', '项目名称11', '1111', NULL, NULL, NULL, '上海', '测试人员', '测试人员', '测试人员', '测试人员', '0');
INSERT INTO `project`(`customer_name`, `project_name`, `project_group`, `type1`, `type2`, `type3`, `project_address`, `project_leader`, `superior_manager`, `business_leader`, `project_checker`, `is_del`) VALUES (2, '客户名称2222', '项目名称33333', '111', NULL, NULL, NULL, '安徽', '测试人员', '测试人员', '测试人员', '测试人员', '0');



猜你喜欢

转载自blog.csdn.net/tangthh123/article/details/106454774
今日推荐