如何實現用戶自定義表頭字段

目錄

 

前言:

開發步驟

綜上:

源代碼:

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



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章