目录
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');