面介紹了SpringBoot集成LayUI和前端模板Thymeleaf,今天介紹一下數據列表的實現,線上一個簡單的支持查詢條件的列表實現。話不多說上代碼
<!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,會把 [[ 作為特殊符號
// 忽略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;
}
// 忽略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;
}
}
@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>
<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>
<ul></ul> 列表標簽定義一個標有圓點的列表;
<ul type="value"></ul>
disc 默認值,實心圓。
circle 空心圓。
square 實心方塊。
<ul>
<li></li>
<li></li>
<li></li>
</ul>
<dir></dir>標簽定義目錄列表。
<dir>
<li>HTML</li>
<li>XHTML</li>
<li>CSS</li>
</dir>
<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.分頁數據和函數
*請認真填寫需求信息,我們會在24小時內與您取得聯系。