feat 添加分页组件

This commit is contained in:
LittleBoy 2022-12-08 10:00:44 +08:00
parent 33e66e6ef0
commit 34483e80f7
8 changed files with 164 additions and 34 deletions

View File

@ -123,9 +123,10 @@ table{
width: 100%; width: 100%;
border-left: solid 1px #eee; border-left: solid 1px #eee;
border-top: solid 1px #eee; border-top: solid 1px #eee;
border-collapse: collapse;
} }
td,th { td,th {
border-right: solid 1px #eee; border-right: solid 1px #eee;
border-bottom: solid 1px #eee; border-bottom: solid 1px #eee;
padding:2px 4px; padding:6px;
} }

View File

@ -0,0 +1,101 @@
<template>
<div class="page-wrapper">
<span v-if="showRefresh" class="refresh" @click="$emit('refresh')">刷新</span>
<span v-if="page > 1" class="prev-page page-item" @click="$emit('page-change',--page)">上一页</span>
<span class="page-item page-first" :class="{'current-page':page == 1}"
@click="$emit('page-change',(page=1))">1</span>
<template v-for="index in pageData">
<span class="page-item" :class="{'current-page':page == index}" @click="$emit('page-change',(page=index))">{{
index
}}</span>
</template>
<span class="page-item page-end" :class="{'current-page':page == totalPage}"
@click="$emit('page-change',(page=totalPage))">{{
totalPage
}}</span>
<span v-if="page < totalPage" class="page-item next-page" @click="$emit('page-change',++ page)">下一页</span>
</div>
</template>
<script>
import {computed, defineComponent, ref} from 'vue'
export default defineComponent({
name: "Pager",
props: {
/**
* 总条数
*/
total: {
type: Number,
require: true
},
showRefresh: {
type: Boolean,
default: false
},
/**
* 每页的条数
*/
pageSize: {
type: Number,
default: 10
},
currentPage: {
type: Number,
default: 1
}
},
emits: ['refresh', 'page-change'],
setup(props) {
const totalPage = computed(() => Math.ceil((props.total || 0) / props.pageSize))
const page = ref(props.currentPage)
const pageData = computed(() => {
// 使
let start = page.value - 2, end = page.value + 2
if (start <= 1) {
//
end += 1 - start;
start = 2;
}
if (end >= totalPage.value) {
end = totalPage.value - 1;
start = end - 4;
if (start <= 1) {
start = 2;
}
}
const pages = []
for (; start <= end; start++) {
pages.push(start)
}
return pages
})
return {
totalPage, page, pageData
}
}
})
</script>
<style scoped lang="less">
.page-wrapper {
margin: 20px 0;
.page-item {
cursor: pointer;
border: solid 1px var(--primary-2);
border-radius: var(--border-radius-middle);
display: inline-block;
padding: 4px 10px;
margin: 0 5px;
min-width: 40px;
text-align: center;
&:hover, &.current-page {
border-color: var(--primary-color);
color: var(--primary-color)
}
}
}
</style>

View File

@ -0,0 +1,4 @@
import PagerComponent from './Pager.vue'
const Pager = PagerComponent
export default Pager

View File

@ -1,5 +1,6 @@
import {toast} from "../components/message"; import {toast} from "../components/message";
import {useUserStore} from "../service/store"; import {useUserStore} from "../service/store";
import router from '../router'
export type HttpMethod = 'get' | 'post' | 'delete' | 'put' export type HttpMethod = 'get' | 'post' | 'delete' | 'put'
@ -99,9 +100,11 @@ class Http {
// 需要统一处理数据 // 需要统一处理数据
if (code === 403) { if (code === 403) {
toast("登录凭证无效或者已过期") toast("登录凭证无效或者已过期")
// if (r.fullPath != '/login') { // 通过router获取当前路由
// router.replace('/login'); const route = router.currentRoute;
// } if (route.fullPath != '/login') {
router.replace('/login');
}
return; return;
} else if (err) { } else if (err) {
toast(httpConfig.globalErrorHandler[code]) toast(httpConfig.globalErrorHandler[code])

View File

@ -1,35 +1,38 @@
<template> <template>
<table> <div>
<tr> <table>
<th>UID</th> <tr>
<th>昵称</th> <th>UID</th>
<th>OPEN_ID</th> <th>昵称</th>
<th>性别</th> <th>OPEN_ID</th>
<th>地区</th> <th>性别</th>
<th>推荐者</th> <th>地区</th>
<th>状态</th> <th>推荐者</th>
<th>积分</th> <th>状态</th>
<th>注册时间</th> <th>积分</th>
<th>操作</th> <th>注册时间</th>
</tr> <th>操作</th>
<tr v-for="u in userList" :key="u.id"> </tr>
<td>{{ u.id }}</td> <tr v-for="u in userList" :key="u.id">
<td>{{ u.nickname }}</td> <td>{{ u.id }}</td>
<td>{{ u.openId }}</td> <td>{{ u.nickname }}</td>
<td>{{ GenderEnum[u.gender] || '未知' }}</td> <td>{{ u.openId }}</td>
<td>{{ u.province + '-' + u.city }}</td> <td>{{ GenderEnum[u.gender] || '未知' }}</td>
<td>{{ u.parent?.nickname || '-' }}</td> <td>{{ u.province + '-' + u.city }}</td>
<td>{{ StatusEnum[u.status] || '未知' }}</td> <td>{{ u.parent?.nickname || '-' }}</td>
<td>{{ u.pointInfo?.totalPoint }}</td> <td>{{ StatusEnum[u.status] || '未知' }}</td>
<td>{{ u.firstLoginTime }}</td> <td>{{ u.pointInfo?.totalPoint }}</td>
<td> <td>{{ u.firstLoginTime }}</td>
<span @click="editUser(u)">编辑</span> <td>
<span>禁用</span> <span @click="editUser(u)">编辑</span>
<span @click="removeUser(u.id)">删除</span> <span>禁用</span>
</td> <span @click="removeUser(u.id)">删除</span>
</tr> </td>
</table> </tr>
</table>
<Pager :total="userTotalCount" show-refresh @refresh="loadUserList" @page-change="onPageChange"/>
</div>
<Modal v-model="modalVisible"> <Modal v-model="modalVisible">
<div> <div>
<div> <div>
@ -60,6 +63,7 @@ import {onMounted, reactive, ref} from "vue";
import http, {DataListModel} from "../../util/http"; import http, {DataListModel} from "../../util/http";
import message from "../../components/message"; import message from "../../components/message";
import Modal from "../../components/modal/modal.vue"; import Modal from "../../components/modal/modal.vue";
import Pager from "../../components/pager/Pager.vue";
// //
const GenderEnum = { const GenderEnum = {
1: '男', 2: '女' 1: '男', 2: '女'
@ -88,6 +92,11 @@ const editUserData = reactive({
}); });
const userTotalCount = ref(0) const userTotalCount = ref(0)
function onPageChange(currentPage: number) {
param.page = currentPage;
loadUserList();
}
function loadUserList() { function loadUserList() {
http.post<DataListModel<UserInfoModel>>('/admin/user/list', param).then(res => { http.post<DataListModel<UserInfoModel>>('/admin/user/list', param).then(res => {
userList.value = res.items userList.value = res.items

View File

@ -34,6 +34,12 @@ public class UserAdminController {
userStoreMap.put("test", UserAdminInfo.create(2, "test", "123123")); userStoreMap.put("test", UserAdminInfo.create(2, "test", "123123"));
} }
@PostMapping
public UserInfo update(@RequestBody UserInfo userInfo) {
if (!userInfoService.updateById(userInfo)) throw BizException.saveFail();
return userInfo;
}
@SneakyThrows @SneakyThrows
@PostMapping("login") @PostMapping("login")
public UserAdminInfo login(@Validated @RequestBody UserAdminInfo user) { public UserAdminInfo login(@Validated @RequestBody UserAdminInfo user) {

View File

@ -20,4 +20,8 @@ public class BizException extends RuntimeException {
public static BizException create(int code,String message) { public static BizException create(int code,String message) {
return new BizException(code, message); return new BizException(code, message);
} }
public static BizException saveFail() {
return create(1022,"保存失败");
}
} }

View File

@ -10,6 +10,7 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
@ -24,6 +25,7 @@ public class UserInfo implements Serializable {
* 用户id * 用户id
*/ */
@TableId(type = IdType.AUTO) @TableId(type = IdType.AUTO)
@NotNull
private Integer id; private Integer id;
/** /**
* 微信openid * 微信openid