整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          SpringBoot集成LayUI實現查詢列表

          SpringBoot集成LayUI實現查詢列表

          面介紹了SpringBoot集成LayUI和前端模板Thymeleaf,今天介紹一下數據列表的實現,線上一個簡單的支持查詢條件的列表實現。話不多說上代碼

          上前端界面user.html

          <!DOCTYPE html>
          <html>
          <head>
              <meta charset="utf-8">
              <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
              <title>后臺管理系統</title>
              <link rel="stylesheet" href="/css/layui.css">
          </head>
          <body>
          <div style="padding: 15px;">
              <blockquote class="layui-elem-quote layui-text">
                  系統用戶
              </blockquote>
              <form class="layui-form layui-row layui-col-space16">
                  <div class="layui-form-item">
                      <div class="layui-inline">
                          <label class="layui-form-label">用戶標識</label>
                          <div class="layui-input-inline">
                              <input type="text" name="userId" value="" placeholder="" class="layui-input"
                                     lay-affix="clear">
                          </div>
                          <label class="layui-form-label">郵箱</label>
                          <div class="layui-input-inline">
                              <input type="text" name="email" value="" placeholder="" class="layui-input"
                                     lay-affix="clear">
                          </div>
                          <label class="layui-form-label">用戶狀態</label>
                          <div class="layui-input-inline">
                              <input type="text" name="userStatus" value="" placeholder="" class="layui-input"
                                     lay-affix="clear">
                          </div>
                      </div>
                  </div>
                  <div class="layui-form-item">
                      <button class="layui-btn" id="demo-table-search" lay-submit lay-filter="demo-table-search">查詢</button>
                      <button type="reset" class="layui-btn layui-btn-primary">重置</button>
                      <button type="button" class="layui-btn layui-btn-primary" lay-on="test-iframe-handle">創建</button>
                  </div>
              </form>
              <table class="layui-hide" id="ID-table-demo-search"></table>
          
          </div>
          <script src="/layui.js"></script>
          <!-- 工具欄模板 -->
          <script type="text/html" id="barDemo">
              <div class="layui-clear-space">
                  <a class="layui-btn layui-btn-xs" lay-event="detail">查看</a>
                  <a class="layui-btn layui-btn-xs" lay-event="edit">編輯</a>
                  <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">刪除</a>
              </div>
          </script>
          <script>
              layui.use(function () {
                  var table=layui.table;
                  var form=layui.form;
                  var laydate=layui.laydate;
                  var $=layui.$;
                  var util=layui.util;
          
                  // 創建表格實例
                  table.render({
                      elem: '#ID-table-demo-search',
                      contentType: 'application/json',
                      url: '/sysUser/list',
                      method: 'POST',
                      cols: [
                          [
                              {field: 'userId', title: '用戶標識'},
                              {field: 'nickName', title: '昵稱'},
                              {field: 'email', title: '郵箱'},
                              {field: 'userStatus', title: '用戶狀態'},
                              {field: 'createTime', title: '創建時間'},
                              {fixed: 'right', title: '操作', width: 234, minWidth: 125, templet: '#barDemo'}
                          ]
                      ],
                      page: true,
                      height: 510,
                      limit: 10, // 每頁默認顯示的數量,
                  });
                 
                  // 搜索提交
                  form.on('submit(demo-table-search)', function (data) {
                      var field=data.field; // 獲得表單字段
                      // 執行搜索重載
                      table.reloadData('ID-table-demo-search', {
                          page: {
                              curr: 1 // 重新從第 1 頁開始
                          },
                          where: field // 搜索的字段
                      });
                      return false; // 阻止默認 form 跳轉
                  });
          
              });
          </script>
          </body>
          </html>
          

          這里有個坑

          表格渲染列的時候,注意 cols: [[ 不要連著寫,盡量換個行,因為集成了Thymeleaf,會把 [[ 作為特殊符號

          LayUI列表頁請求結構

          // 忽略getset方法
          public class PageReq {
              // 返回數據量
              public int limit;
              // 頁數
              public int page;
              // 排序字段
              private String orderField;
              // 排序
              private String orderBy;
          
              @JsonIgnore
              public int getOffset() {
                  if (page==0) {
                      return 0;
                  }
                  int tmp=(page - 1) * limit;
                  return tmp < 0 ? 0 : tmp;
              }
          }
          

          需要分頁的請求參數

          // 忽略getset方法
          public class SysUserParam extends PageReq{
          
              private Long userId;
              /**
               * 郵箱
               */
              private String email;
              /**
               * 用戶狀態
               */
              private String userStatus;
          
              private String nickNameFullLike;
          }

          LayUI列表頁統一返回結構

          // 忽略getset方法  
          public class Response<T> implements Serializable {
              //錯誤信息
              private String msg;
              //錯誤碼 0 成功 -1024 失敗
              private Integer code;
              // 返回數據
              private T data;
              // 返回數據量
              private Integer count;
          
              public static <T> Response buildSuccess() {
                  return new Response("", 0, null, null);
              }
          
              public static <T> Response buildFail() {
                  return new Response("", -1024, null, null);
              }
          
              public static <T> Response buildFail(String msg) {
                  return new Response(msg, -1024, null, null);
              }
          
              public static <T> Response buildSuccess(T data, Integer count) {
                  return new Response("", 0, data, count);
              }
          
              public Response(String msg, Integer code, T date, Integer count) {
                  this.msg=msg;
                  this.code=code;
                  this.data=date;
                  this.count=count;
              }
           
          }
          

          Controller代碼

          
          @RestController
          @RequestMapping("/sysUser")
          public class UserController {
              private Logger logger=LoggerFactory.getLogger(UserController.class);
              @Resource
              private SysUserBiz sysUserBiz;
              /**
               * 根據主鍵查詢系統用戶
               */
              @PostMapping("/list")
              public Response<List<SysUserVO>> queryByParam(@RequestBody SysUserParam sysUserParam){
                  try {
                      return sysUserBiz.selectByCondition(sysUserParam.adaptor());
                  }catch (Exception e){
                      logger.error("queryUserList Exception",e);
                      return Response.buildFail();
                  }
              }
          }


          后面的底層SQL就忽略了,主要是看前端和controller的交互,以及參數返回值的約定

          看下實現效果

          默認進入的截圖

          帶查詢條件的截圖

          總感覺有點水,下次努力

          立和使用列表

          定義列表

          <dl></dl>列表標簽定義列表;
          <dt>定義列表標題;
          <dd>定義列表內容;

          說明:

          1. dt和dd對應著的, 一個dt可以對應著多個dd;

          2. dd完全是為了dt服務的, 對標題進行描述;

          實例:

          <dl>
          <dt>標題1</dt><dd>內容11</dd><dd>內容12</dd>
          <dt>標題2</dt><dd>內容21</dd><dd>內容22</dd>
          </dl>


          有序列表(unordered list)

          <ol></ol> 列表標簽定義一個標有數字的列表;

          <ol type="value"></ol>

          1 默認值。數字有序列表。(1、2、3、4)

          a 按字母順序排列的有序列表,小寫。(a、b、c、d)

          A 按字母順序排列的有序列表,大寫。(A、B、C、D)

          i 羅馬字母,小寫。(i, ii, iii, iv)

          I 羅馬字母,大寫。(I, II, III, IV)

          <ol>
          <li>聯系人:</li>xxx
          <li>聯系地址:</li>北京市豐臺區
          <li>郵政編碼:</li>100036
          </ol>


          無序列表(ordered list)

          <ul></ul> 列表標簽定義一個標有圓點的列表;

          <ul type="value"></ul>

          disc 默認值,實心圓。

          circle 空心圓。

          square 實心方塊。

          <ul>
          <li></li>
          <li></li>
          <li></li>
          </ul>


          目錄列表 所有主流瀏覽器都支持 <dir> 標簽。。

          <dir></dir>標簽定義目錄列表。

          <dir>
          <li>HTML</li>
          <li>XHTML</li>
          <li>CSS</li>
          </dir>

          菜單列表 目前所有主流瀏覽器都不支持 <menu> 標簽。

          <menu></menu>標簽可定義一個菜單列表。

          <menu>
          <li>html</li>
          <li>xhtml</li>
          </menu>

          在實際工作中, 它的用途較少, 大部分我們還是用ul;

          另外還可以使用:

          <div align=""></div>分區標簽,用來排版大塊HTML段落,也用于格式化表


          .搭建文章列表頁面

          <script setup>
          import {
              Edit,
              Delete
          } from '@element-plus/icons-vue'
          
          import { ref } from 'vue'
          
          //文章分類數據模型
          const categorys=ref([    ])
          
          //用戶搜索時選中的分類id
          const categoryId=ref('')
          
          //用戶搜索時選中的發布狀態
          const state=ref('')
          
          //文章列表數據模型
          const articles=ref([])
          
          //分頁條數據模型
          const pageNum=ref(1)//當前頁
          const total=ref(20)//總條數
          const pageSize=ref(3)//每頁條數
          
          //當每頁條數發生了變化,調用此函數
          const onSizeChange=(size)=> {
              pageSize.value=size
              articleList()
          }
          //當前頁碼發生變化,調用此函數
          const onCurrentChange=(num)=> {
              pageNum.value=num
              articleList()
          }
          
          
          //回顯文章分類
          import { articleCategoryListService, articleListService,articleAddService } from '@/api/article.js'
          const articleCategoryList=async ()=> {
              let result=await articleCategoryListService();
          
              categorys.value=result.data;
          }
          
          //獲取文章列表數據
          const articleList=async ()=> {
              let params={
                  pageNum: pageNum.value,
                  pageSize: pageSize.value,
                  categoryId: categoryId.value ? categoryId.value : null,
                  state: state.value ? state.value : null
              }
              let result=await articleListService(params);
          
              //渲染視圖
              total.value=result.data.total;
              articles.value=result.data.items;
          
              //處理數據,給數據模型擴展一個屬性categoryName,分類名稱
              for (let i=0; i < articles.value.length; i++) {
                  let article=articles.value[i];
                  for (let j=0; j < categorys.value.length; j++) {
                      if (article.categoryId==categorys.value[j].id) {
                          article.categoryName=categorys.value[j].categoryName;
                      }
                  }
              }
          }
          
          
          articleCategoryList()
          articleList();
          
          import { QuillEditor } from '@vueup/vue-quill'
          import '@vueup/vue-quill/dist/vue-quill.snow.css'
          import { Plus } from '@element-plus/icons-vue'
          //控制抽屜是否顯示
          const visibleDrawer=ref(false)
          //添加表單數據模型
          const articleModel=ref({
              title: '',
              categoryId: '',
              coverImg: '',
              content: '',
              state: ''
          })
          
          
          //導入token
          import { useTokenStore } from '@/stores/token.js';
          const tokenStore=useTokenStore();
          
          //上傳成功的回調函數
          const uploadSuccess=(result)=>{
              articleModel.value.coverImg=result.data;
              console.log(result.data);
          }
          
          //添加文章
          import {ElMessage} from 'element-plus'
          const addArticle=async (clickState)=>{
              //把發布狀態賦值給數據模型
              articleModel.value.state=clickState;
          
              //調用接口
              let result=await articleAddService(articleModel.value);
          
              ElMessage.success(result.msg? result.msg:'添加成功');
          
              //讓抽屜消失
              visibleDrawer.value=false;
          
              //刷新當前列表
              articleList()
          }
          </script>
          <template>
              <el-card class="page-container">
                  <template #header>
                      <div class="header">
                          <span>文章管理</span>
                          <div class="extra">
                              <el-button type="primary" @click="visibleDrawer=true">添加文章</el-button>
                          </div>
                      </div>
                  </template>
                  <!-- 搜索表單 -->
                  <el-form inline>
                      <el-form-item label="文章分類:">
                          <el-select placeholder="請選擇" v-model="categoryId">
                              <el-option v-for="c in categorys" :key="c.id" :label="c.categoryName" :value="c.id">
                              </el-option>
                          </el-select>
                      </el-form-item>
          
                      <el-form-item label="發布狀態:">
                          <el-select placeholder="請選擇" v-model="state">
                              <el-option label="已發布" value="已發布"></el-option>
                              <el-option label="草稿" value="草稿"></el-option>
                          </el-select>
                      </el-form-item>
                      <el-form-item>
                          <el-button type="primary" @click="articleList">搜索</el-button>
                          <el-button @click="categoryId=''; state=''">重置</el-button>
                      </el-form-item>
                  </el-form>
                  <!-- 文章列表 -->
                  <el-table :data="articles" style="width: 100%">
                      <el-table-column label="文章標題" width="400" prop="title"></el-table-column>
                      <el-table-column label="分類" prop="categoryName"></el-table-column>
                      <el-table-column label="發表時間" prop="createTime"> </el-table-column>
                      <el-table-column label="狀態" prop="state"></el-table-column>
                      <el-table-column label="操作" width="100">
                          <template #default="{ row }">
                              <el-button :icon="Edit" circle plain type="primary"></el-button>
                              <el-button :icon="Delete" circle plain type="danger"></el-button>
                          </template>
                      </el-table-column>
                      <template #empty>
                          <el-empty description="沒有數據" />
                      </template>
                  </el-table>
                  <!-- 分頁條 -->
                  <el-pagination v-model:current-page="pageNum" v-model:page-size="pageSize" :page-sizes="[3, 5, 10, 15]"
                      layout="jumper, total, sizes, prev, pager, next" background :total="total" @size-change="onSizeChange"
                      @current-change="onCurrentChange" style="margin-top: 20px; justify-content: flex-end" />
          
                  <!-- 抽屜 -->
                  <el-drawer v-model="visibleDrawer" title="添加文章" direction="rtl" size="50%">
                      <!-- 添加文章表單 -->
                      <el-form :model="articleModel" label-width="100px">
                          <el-form-item label="文章標題">
                              <el-input v-model="articleModel.title" placeholder="請輸入標題"></el-input>
                          </el-form-item>
                          <el-form-item label="文章分類">
                              <el-select placeholder="請選擇" v-model="articleModel.categoryId">
                                  <el-option v-for="c in categorys" :key="c.id" :label="c.categoryName" :value="c.id">
                                  </el-option>
                              </el-select>
                          </el-form-item>
                          <el-form-item label="文章封面">
          
                              <!-- 
                                  auto-upload:設置是否自動上傳
                                  action:設置服務器接口路徑
                                  name:設置上傳的文件字段名
                                  headers:設置上傳的請求頭
                                  on-success:設置上傳成功的回調函數
                               -->
                             
                              <el-upload class="avatar-uploader" :auto-upload="true" :show-file-list="false"
                              action="/api/upload"
                              name="file"
                              :headers="{'Authorization':tokenStore.token}"
                              :on-success="uploadSuccess"
                              >
                                  <img v-if="articleModel.coverImg" :src="articleModel.coverImg" class="avatar" />
                                  <el-icon v-else class="avatar-uploader-icon">
                                      <Plus />
                                  </el-icon>
                              </el-upload>
                          </el-form-item>
                          <el-form-item label="文章內容">
                              <div class="editor">
                                  <quill-editor theme="snow" v-model:content="articleModel.content" contentType="html">
                                  </quill-editor>
                              </div>
                          </el-form-item>
                          <el-form-item>
                              <el-button type="primary" @click="addArticle('已發布')">發布</el-button>
                              <el-button type="info" @click="addArticle('草稿')">草稿</el-button>
                          </el-form-item>
                      </el-form>
                  </el-drawer>
              </el-card>
          </template>
          <style lang="scss" scoped>
          .page-container {
              min-height: 100%;
              box-sizing: border-box;
          
              .header {
                  display: flex;
                  align-items: center;
                  justify-content: space-between;
              }
          }
          
          /* 抽屜樣式 */
          .avatar-uploader {
              :deep() {
                  .avatar {
                      width: 178px;
                      height: 178px;
                      display: block;
                  }
          
                  .el-upload {
                      border: 1px dashed var(--el-border-color);
                      border-radius: 6px;
                      cursor: pointer;
                      position: relative;
                      overflow: hidden;
                      transition: var(--el-transition-duration-fast);
                  }
          
                  .el-upload:hover {
                      border-color: var(--el-color-primary);
                  }
          
                  .el-icon.avatar-uploader-icon {
                      font-size: 28px;
                      color: #8c939d;
                      width: 178px;
                      height: 178px;
                      text-align: center;
                  }
              }
          }
          
          .editor {
              width: 100%;
          
              :deep(.ql-editor) {
                  min-height: 200px;
              }
          }
          </style>

          2.main.js引入語言包

          import { createApp } from 'vue'
          import ElementPlus from 'element-plus'
          import 'element-plus/dist/index.css'
          
          import App from './App.vue'
          
          import locale from 'element-plus/dist/locale/zh-cn.js'
          
          const app=createApp(App);
          
          app.use(ElementPlus,{locale});
          app.mount('#app')
          

          3.article.js添加函數

          
          //文章列表查詢
          export const articleListService=(params)=>{
             return  request.get('/article',{params:params})
          }
          

          4.獲取文章列表,搜索按鈕事件

          //獲取文章列表數據
          const articleList=async ()=> {
              let params={
                  pageNum: pageNum.value,
                  pageSize: pageSize.value,
                  categoryId: categoryId.value ? categoryId.value : null,
                  state: state.value ? state.value : null
              }
              let result=await articleListService(params);
          
              //渲染視圖
              total.value=result.data.total;
              articles.value=result.data.items;
          
              //處理數據,給數據模型擴展一個屬性categoryName,分類名稱
              for (let i=0; i < articles.value.length; i++) {
                  let article=articles.value[i];
                  for (let j=0; j < categorys.value.length; j++) {
                      if (article.categoryId==categorys.value[j].id) {
                          article.categoryName=categorys.value[j].categoryName;
                      }
                  }
              }
          }
          

          5.重置

          <el-form-item>
              <el-button type="primary" @click="articleList">搜索</el-button>
              <el-button @click="categoryId=''; state=''">重置</el-button>
          </el-form-item>

          6.分頁數據和函數


          主站蜘蛛池模板: 一区二区不卡久久精品| 伊人久久精品无码麻豆一区| 高清在线一区二区| 国产成人精品无码一区二区三区| 亚洲一区二区三区高清在线观看 | 国产人妖在线观看一区二区| 精品一区二区三区免费观看| 亚洲视频一区调教| 免费看无码自慰一区二区| 亚洲av无码片区一区二区三区 | 国产精品亚洲高清一区二区 | 人妻视频一区二区三区免费| 亚洲AV综合色一区二区三区| 国产午夜精品免费一区二区三区| 国产伦精品一区二区三区免费下载| 91福利一区二区| 在线观看日本亚洲一区| 日本精品一区二区三区在线视频一 | 亚洲一区免费视频| 爆乳熟妇一区二区三区| 亚洲AV成人一区二区三区在线看 | 国产亚洲情侣一区二区无| 成人区精品一区二区不卡| 精品无码日韩一区二区三区不卡| 国产一区二区内射最近更新| 日韩AV在线不卡一区二区三区| 中文字幕一区二区三区在线不卡| 在线观看一区二区三区av| 精品视频在线观看一区二区| 精品少妇ay一区二区三区| 亚洲美女一区二区三区| 无码国产伦一区二区三区视频| 国产av夜夜欢一区二区三区| 精品国产一区二区三区香蕉| 色狠狠AV一区二区三区| 日韩精品人妻一区二区三区四区 | 激情一区二区三区| 精品无码人妻一区二区三区品| 国产短视频精品一区二区三区| 中文字幕一区二区精品区| 日本一道一区二区免费看|