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