九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
30分鐘內(nèi)搞定 50張表的 CRUD,666!

大家好,我是田哥

醫(yī)院項目里確實存在大量的CRUD,其實嘛,醫(yī)院項目畢竟還是重點偏向于后臺管理系統(tǒng),不過,我前段時間增加了外網(wǎng)預約掛號功能,但再怎么說,也還是偏向于后臺,比較主要的工作量都在后臺。做過后臺系統(tǒng)的都知道,后臺系統(tǒng)會存在大量的CRUD。但話又說回來,不是后臺系統(tǒng)也存在大部分功能都是CRUD的。

于是,來找我能不能搞一個就可以了,其他的復制過去,再改改就成了。

想想也是哈,那么多重復的CRUD,只是字段不同而已。

但,也別小看這個改字段的過程,或許因為你改錯一個、少改一個字段,你需要花時間去排查的。

所以,我覺得很有必要搞一個代碼生成工具,一次性把controller、service、mappper代碼生成,甚至把HTML、數(shù)據(jù)導出、權(quán)限控制、swagger文檔都給生成出來。

精彩文章

資料:秒殺系統(tǒng)設計,文檔、代碼和視頻

用Spring Boot搞了個醫(yī)院項目,附源碼!

???面試:說說MyBatis 插件機制

QPS、TPS、并發(fā)用戶數(shù)、吞吐量關(guān)系

1000多道面試題,多久能背完?

dubbo源碼深度分析:62個文檔+中文注釋+流程圖+思維導圖

下面給大家介紹一個代碼生成工具:

演示

我們只要創(chuàng)建好我們的業(yè)務表,即可搞定代碼生成。比如:我們來建個表:sys_test,三個字段,主鍵自增。

CREATE TABLE `sys_test` (
  `id` int NOT NULL,
  `name` varchar(255CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `create_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
ENGINE=InnoDB DEFAULT CHARSET=utf8;

然后到代碼生成頁面,把系統(tǒng)數(shù)據(jù)庫表全部查出來。

點擊生成按鈕,或者可以選多張表,一次性全部生成好。

技術(shù)棧:Spring Boot +shiro+thymeleaf+MyBatis-plus+MySQL

我們來看看,這個工具生成出來的代碼長什么樣。

controller層:頁面跳轉(zhuǎn)、swagger API 、分頁查詢....

@Controller
@RequestMapping("/")
public class SysTestController {
    @Autowired
    private SysTestService sysTestService;


    /**
    * 跳轉(zhuǎn)到頁面
    */

    @GetMapping("/index/sysTest")
    public String sysTest() {
        return "systest/list";
        }

    @ApiOperation(value = "新增")
    @PostMapping("sysTest/add")
    @RequiresPermissions("sysTest:add")
    @ResponseBody
    public DataResult add(@RequestBody SysTestEntity sysTest){
        sysTestService.save(sysTest);
        return DataResult.success();
    }

    @ApiOperation(value = "刪除")
    @DeleteMapping("sysTest/delete")
    @RequiresPermissions("sysTest:delete")
    @ResponseBody
    public DataResult delete(@RequestBody @ApiParam(value = "id集合") List<String> ids){
        sysTestService.removeByIds(ids);
        return DataResult.success();
    }

    @ApiOperation(value = "更新")
    @PutMapping("sysTest/update")
    @RequiresPermissions("sysTest:update")
    @ResponseBody
    public DataResult update(@RequestBody SysTestEntity sysTest){
        sysTestService.updateById(sysTest);
        return DataResult.success();
    }

    @ApiOperation(value = "查詢分頁數(shù)據(jù)")
    @PostMapping("sysTest/listByPage")
    @RequiresPermissions("sysTest:list")
    @ResponseBody
    public DataResult findListByPage(@RequestBody SysTestEntity sysTest){
        Page page = new Page(sysTest.getPage(), sysTest.getLimit());
        LambdaQueryWrapper<SysTestEntity> queryWrapper = Wrappers.lambdaQuery();
        //查詢條件示例
        //queryWrapper.eq(SysTestEntity::getId, sysTest.getId());
        IPage<SysTestEntity> iPage = sysTestService.page(page, queryWrapper);
        return DataResult.success(iPage);
    }

}

entity代碼:

@Data
@TableName("sys_test")
public class SysTestEntity extends BaseEntity implements Serializable {
 private static final long serialVersionUID = 1L;

 /**
  * 
  */

 @TableId("id")
 private Integer id;

 /**
  * 
  */

 @TableField("name")
 private String name;

 /**
  * 
  */

 @TableField("create_time")
 private Date createTime;


}

mapper代碼:

/**
 *  
 * @author tiange 
 * @date 2022-11-15 22:15:56
 */

public interface SysTestMapper extends BaseMapper<SysTestEntity{
 
}

service接口層代碼:

public interface SysTestService extends IService<SysTestEntity{

}

service實現(xiàn)層代碼:

@Service("sysTestService")
public class SysTestServiceImpl extends ServiceImpl<SysTestMapperSysTestEntityimplements SysTestService {

}

SysTestMapper.xml代碼:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.company.project.mapper.SysTestMapper">

 <!-- 可根據(jù)自己的需求,是否要使用 -->
    <resultMap type="com.company.project.entity.SysTestEntity" id="sysTestMap">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="createTime" column="create_time"/>
    </resultMap>


</mapper>

html代碼:

<!DOCTYPE html>
<html lang="en" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro"
      xmlns:th="http://www.thymeleaf.org">

<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <link rel="stylesheet" th:href="@{/layui/css/layui.css}"/>
  <link rel="stylesheet" th:href="@{/css/custom.form.css}">
    <style id="layuimini-bg-color">
    </style>
<body>
<div class="panel panel-default operation" hidden>
  <div class="panel-heading title"></div>
<div class="layui-card-body">
<form class="layui-form " action="" lay-filter="info" style="width: 700px;margin-top: 10px">
      <input name="id" hidden/>
        <div class="layui-form-item">
      <label class="layui-form-label"></label>
      <div class="layui-input-block">
        <input type="name" name="name" placeholder="請輸入" autocomplete="off" class="layui-input">
      </div>
    </div>
        <div class="layui-form-item">
      <label class="layui-form-label"></label>
      <div class="layui-input-block">
        <input type="createTime" name="createTime" placeholder="請輸入" autocomplete="off" class="layui-input">
      </div>
    </div>
  <div class="layui-form-item">
  <div class="layui-input-block">
    <button type="submit" class="layui-btn" lay-submit="" lay-filter="submit">保存</button>
    <button  class="layui-btn layui-btn-primary" id="btn_cancel">返回</button>
  </div>
</div>
</form>
</div>
</div>

<div class="table_div">
  <div id="searchParam"  shiro:hasPermission="sysTest:list">
    <form class="layui-form ">
      <div class="layui-form-item">
        <div class="layui-input-inline">
          <input type="text" id="key" class="layui-input"  autocomplete="off" placeholder="請輸入">
        </div>

        <div class="layui-input-inline ">
          <button class="layui-btn" onclick="search()"  id="search">查詢</button>
          <button class="layui-btn"   id="export">導出全部</button>
        </div>
      </div>
    </form>
  </div>
  <table class="layui-table" id="showTable" lay-filter="showTable" ></table>
</div>
<script type="text/html" id="toolbar">
  <div class="layui-btn-container">
    <button class="layui-btn layui-btn-sm" lay-event="add"  shiro:hasPermission="sysTest:add">添加</button>
    <button class="layui-btn layui-btn-sm" lay-event="batchDeleted" shiro:hasPermission="sysTest:delete">刪除</button>
  </div>
</script>
<script type="text/html" id="tool">
  <a class="layui-btn layui-btn-xs" lay-event="edit" shiro:hasPermission="sysTest:update">編輯</a>
  <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del" shiro:hasPermission="sysTest:delete">刪除</a>
</script>

</body>
</html>
<script th:inline="javascript" type="text/javascript">
  var ctx = '[[@{/}]]'.replaceAll("\"""").replace('//''/');
</script>
<script th:src="@{/layui/layui.all.js}"></script>
<script th:src="@{/js/core.util.js}"></script>
<script>
  //獲取token
  var token = CoreUtil.getData("access_token");
  //地址欄轉(zhuǎn)義token中的#號
  var tokenQuery = token.replace("#""%23");
  var tableIns1;
  var table = layui.table;
  var form = layui.form;
  var layer = layui.layer;
  var $ = jQuery = layui.jquery;
  var laydate = layui.laydate;

  layui.use(['table''layer''laydate'], function ({

    //加載table
    tableIns1 = table.render({
      elem'#showTable'
      , contentType'application/json'
      , headers: {"authorization": token}
      , pagetrue //開啟分頁
      , url: ctx + 'sysTest/listByPage' //數(shù)據(jù)接口
      , method'POST'
      , parseDatafunction (res//將原始數(shù)據(jù)解析成 table 組件所規(guī)定的數(shù)據(jù)
        return {
          "code": res.code, //解析接口狀態(tài)
          "msg": res.msg, //解析提示文本
          "count": CoreUtil.isEmpty(res.data) ? 0 : res.data.total, //解析數(shù)據(jù)長度
          "data": CoreUtil.isEmpty(res.data) ? null : res.data.records //解析數(shù)據(jù)列表
        }
      }
      , cols: [
        [
          {type'checkbox'fixed'left'},
          {field'id'title''sorttrue},
          {field'name'title''sorttrue},
          {field'createTime'title''sorttrue},
          {width120toolbar"#tool"title'操作'}
        ]
      ]
      , toolbar'#toolbar'
    });


    //表頭工具
    table.on('toolbar(showTable)'function(obj){
      switch(obj.event){
        case 'batchDeleted':
          var checkStatus = table.checkStatus(obj.config.id);
          var data = checkStatus.data;
          if(data.length==0){
            layer.msg("請選擇要批量刪除的列");
          }else {
            var ids = [];
            $(data).each(function (index,item{
              ids.push(item.id);
            });
            tipDialog(ids);
          }
          break;
        case 'add':
          $(".table_div").hide();
          $(".operation").show();
          $(".title").html("新增");
          setTimeout(function ({
            form.val('info', {
              "test""test"
              , "id"""
              , "name"""
              , "createTime"""
            });
          }, 200);
          break;
      };
    });
    //列操作
    table.on('tool(showTable)',function (obj{
      var data = obj.data;
      switch (obj.event) {
        case 'del':
          var ids=[];
          ids.push(data.id);
          tipDialog(ids);
          break;
        case 'edit':
          $(".table_div").hide();
          $(".operation").show();
          $(".title").html("編輯");
          setTimeout(function ({
            form.val('info', {
              "test""test"
                , "id": data.id
                , "name": data.name
                , "createTime": data.createTime
            });
          }, 200);
          break;
      }
    });

    //導出
    $('#export').on('click'function ({
      //原先分頁limit
      var exportParams = {
        limit10000,
        key: $("#key").val()
      };
      CoreUtil.sendPost(ctx + "sysTest/listByPage", exportParams, function (res{
        //初始化渲染數(shù)據(jù)
        if (res.data != null && res.data.records != null) {
          table.exportFile(tableIns1.config.id, res.data.records, 'xls');
        }
      });
    });

    //刪除
    var tipDialog=function (ids{
      layer.open({
        content"確定要刪除么?",
        yesfunction(index, layero){
          layer.close(index); //如果設定了yes回調(diào),需進行手工關(guān)閉
          CoreUtil.sendDelete(ctx + "sysTest/delete",ids,function (res{
            layer.msg(res.msg, {time:1000},function ({
              search();
            });
          });
        }
      });
    };

    //返回
    $("#btn_cancel").click(function({
      $(".table_div").show();
      $(".operation").hide();
      return false;
    });

    //監(jiān)聽保存
    form.on('submit(submit)'function(data){
      if(data.field.id===undefined || data.field.id===null || data.field.id===""){
        CoreUtil.sendPost(ctx + "sysTest/add",data.field,function (res{
          $(".table_div").show();
          $(".operation").hide();
          search();
        });
      }else {
        CoreUtil.sendPut(ctx + "sysTest/update",data.field,function (res{
          $(".table_div").show();
          $(".operation").hide();
          search();
        });
      }

      return false;
    });
  });

  //執(zhí)行查詢
  function search({
    //這里以搜索為例
    tableIns1.reload({
      where: { //設定異步數(shù)據(jù)接口的額外參數(shù),任意設
        key: $("#key").val()
      }
      , page: {
        curr1 //重新從第 1 頁開始
      }
    });
  };
</script>

以上代碼,既然代碼生成了,我們接著就是把這些代碼放到對應的包目錄下就完事了,一個CRUD就搞定了。

不需要咱們動手寫一行代碼,是不是很爽?

我們在回頭去看看醫(yī)院項目,其實不管是醫(yī)院項目,很多后臺管理項目都是這個樣,大部分功能都是CRUD。另外,這個代碼生成還有其他功能:導出Excel功能、權(quán)限控制、swagger API文檔。

關(guān)于后臺項目,我們只要把以上這些功能搞定,剩下的工作量還能有多少?

所以嘛,如果你每天還在搞后臺管理這種系統(tǒng),那你完全可以使用這種方式來節(jié)約自己的時間,把更多時間留給自己學習其他技術(shù)。

按照這種方法,不說50張表,就算是100張表,你也可以輕松搞定的。

再說幾句

以上說的代碼生成,只能說實現(xiàn)了一些簡單的CRUD,因為業(yè)務中肯定沒那么簡單的,很多一個增加功能可能會關(guān)聯(lián)很多表。

比如說:掛號功能,哪個科室?掛號類型?醫(yī)生是否在崗、每天每個時間段醫(yī)生預約人數(shù)是否已滿?等問題。

最后來說說醫(yī)院項目,醫(yī)院項目的外網(wǎng)預約掛號功能設計和開發(fā)已經(jīng)完成。

同時,醫(yī)院項目拆分成多個項目,也就是很多人所謂的分布式項目,目前項目基本結(jié)構(gòu)已搞定。

新醫(yī)院項目技術(shù)棧:

Spring Boot + Dubbo +Nacos +RabbitMQ +Redis +MyBatis+MySQL+Thmeleaf+shiro

項目整體結(jié)構(gòu),暫定,后期可能會變動:

后面繼續(xù)迭代,爭取把分庫分表、分布式事務也落實到這個項目中來。

好了,今天就分享這么多。

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
后端:Layui實現(xiàn)文件上傳功能
動態(tài)數(shù)據(jù)tab切換顯示
除了密碼以外表單里的其他的數(shù)值都能取到,不知道為什么
node.js操作文件實現(xiàn)增、刪、改、查
前端jquery技術(shù)一些簡單控件,以及數(shù)據(jù)綁定傳輸問題
webUploader大文件斷點續(xù)傳學習心得
更多類似文章 >>
生活服務
熱點新聞
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服