Compare commits

..

2 Commits

Author SHA1 Message Date
0f50d47844 用户列表分页渲染 2024-10-29 10:51:27 +08:00
fb5f6d9ea7 解决pinia问题 2024-10-28 17:56:03 +08:00
8 changed files with 173 additions and 153 deletions

View File

@ -2,7 +2,7 @@
import axios from "axios"; import axios from "axios";
const myAxios = axios.create({ const myAxios = axios.create({
withCredentials:true, withCredentials:true,
baseURL: 'http://127.0.0.1:8888/api'//测试服务器 baseURL: 'http://localhost:8888/api'//测试服务器
}); });
// 添加请求拦截器 // 添加请求拦截器
axios.interceptors.request.use(function (config) { axios.interceptors.request.use(function (config) {

View File

@ -83,79 +83,83 @@
<!--</style>--> <!--</style>-->
<template> <template>
<div style=" height: 70px; width: 1248px; display: flex; <div style=" height: 70px; width: 1248px; display: flex;
justify-content: space-between; align-items: center;"> justify-content: space-between; align-items: center;">
<div style=" display: flex; justify-content: center; <div style=" display: flex; justify-content: center;
align-items: center; margin-left: 10px"> align-items: center; margin-left: 10px">
<el-icon @click="changeState" v-show="showLog" size="20px" style="margin-right: 10px"><Expand/></el-icon> <el-icon @click="changeState" v-show="showLog" size="20px" style="margin-right: 10px">
<el-icon @click="changeState" v-show="!showLog" size="20px" style="margin-right: 10px"><Fold /></el-icon> <Expand />
</el-icon>
<el-icon @click="changeState" v-show="!showLog" size="20px" style="margin-right: 10px">
<Fold />
</el-icon>
<el-breadcrumb separator="/"> <el-breadcrumb separator="/">
<a-breadcrumb-item>{{route.name}}</a-breadcrumb-item> <a-breadcrumb-item>{{ route.name }}</a-breadcrumb-item>
</el-breadcrumb> </el-breadcrumb>
</div> </div>
<div :style="{display: 'flex', justifyContent:'center', alignItems: 'center', marginRight: offset + 'px'}"> <div :style="{ display: 'flex', justifyContent: 'center', alignItems: 'center', marginRight: offset + 'px' }">
<el-avatar style="margin-right: 10px"> <el-avatar style="margin-right: 10px">
<img src="../../assets/admin.jpg" alt=""> <img :src="store.loginUser.userAvatar" alt="">
</el-avatar> </el-avatar>
<el-dropdown style="cursor: pointer;" size="default"> <el-dropdown style="cursor: pointer;" size="default">
<span class="el-dropdown-link" style="font-size: 16px; font-weight: bold;"> <span class="el-dropdown-link" style="font-size: 16px; font-weight: bold;">
<span>用户名称</span><el-icon class="el-icon--right"><arrow-down /></el-icon> <span>{{ store.loginUser.userName }}</span><el-icon class="el-icon--right"><arrow-down /></el-icon>
</span> </span>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
<el-dropdown-item @click="$router.push('/PersonalCenter')">个人信息</el-dropdown-item> <el-dropdown-item @click="$router.push('/PersonalCenter')">个人信息</el-dropdown-item>
<el-dropdown-item @click="logout">退出登录</el-dropdown-item> <el-dropdown-item @click="logout">退出登录</el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
</template> </template>
</el-dropdown> </el-dropdown>
</div> </div>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref} from 'vue' import { ref } from 'vue'
import emitter from '@/utils/emitter' import emitter from '@/utils/emitter'
import {useRoute, useRouter} from "vue-router"; import { useRoute, useRouter } from "vue-router";
import myAxios from '@/api/myAxios'; import myAxios from '@/api/myAxios';
import { userStore } from '@/store/userStore'; import { userStore } from '@/store/userStore';
import { ElMessage } from 'element-plus'; import { ElMessage } from 'element-plus';
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
const offset = ref(20) const offset = ref(20)
const showLog = ref(false) const showLog = ref(false)
const store = userStore() const store = userStore()
const logout = async () => {
const res: any = await myAxios.post("/user/logout",{}) const logout = async () => {
console.log(res) const res: any = await myAxios.post("/user/logout", {})
if(res.data.code == 1 && res.data) { if (res.data.code == 1 && res.data) {
store.$reset() store.$reset()
await router.replace('/') await router.replace('/')
ElMessage({ ElMessage({
type: 'info', type: 'info',
message: '登出成功', message: '登出成功',
}) })
}
} }
const changeState = () => { }
showLog.value = !showLog.value const changeState = () => {
emitter.emit('Aside', showLog.value) showLog.value = !showLog.value
if(showLog.value){ emitter.emit('Aside', showLog.value)
offset.value = -116 if (showLog.value) {
}else{ offset.value = -116
offset.value = 20 } else {
} offset.value = 20
} }
}
</script> </script>
<style scoped> <style scoped>
:deep(.el-tooltip__trigger:focus-visible) { :deep(.el-tooltip__trigger:focus-visible) {
outline: unset; outline: unset;
} }
</style> </style>

View File

@ -6,8 +6,10 @@ export const userStore = defineStore( 'user' , {
state: () => { state: () => {
return { return {
loginUser: { loginUser: {
userName: '未登录', id: 0,
phone: '',
userAvatar: '', userAvatar: '',
userName: '未登录',
userRole: 'notLogin' userRole: 'notLogin'
} }
} }
@ -15,13 +17,11 @@ export const userStore = defineStore( 'user' , {
//actions是用于定义和处理状态更改的方法。它们可以包含任意的逻辑如异步请求、数据处理和状态更新。 //actions是用于定义和处理状态更改的方法。它们可以包含任意的逻辑如异步请求、数据处理和状态更新。
actions: { actions: {
//获取登录用户信息 //获取登录用户信息
async getLoginUser() { async getLoginUser(res:any) {
//请求登录信息 //请求登录信息
const res = await myAxios.get('/user/get') // const res = await myAxios.get('/user/get')
// console.log(res.data) console.log(res,121212312312)
if( res.data.code === 1 && res ?.data ) { this.updateUser( res )
this.updateUser( res.data )
}
}, },
//更新用户信息 //更新用户信息
//更新state //更新state

View File

@ -1,34 +0,0 @@
import axios from 'axios'
const instance = axios.create({
baseURL: 'http://localhost:9090'
})
instance.interceptors.request.use(
config =>{ // 拦截器成功函数
if(config.methods == "post"){
config.data = querystring.stringify(config.data)
}
// config:包含着网络请求的所有信息
return config;
},
error =>{ // 拦截器失败函数
// 返回错误信息
return Promise.reject(error)
}
)
// 拦截器----获取数据之前
instance.interceptors.response.use(
response =>{ // 拦截器成功函数
return response.status == 200 ? Promise.resolve(response):Promise.reject(response)
},
error =>{ // 拦截器失败函数
const { response } = error;
errorHandle(response.status,response.info)
}
)
export default instance

View File

@ -247,7 +247,6 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import instance from '@/utils/request';
import { ElMessage } from 'element-plus'; import { ElMessage } from 'element-plus';
import { ref, onMounted } from 'vue'; import { ref, onMounted } from 'vue';
const pageNum = ref(0); const pageNum = ref(0);

View File

@ -51,7 +51,7 @@
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button> <el-button @click="cancel" >取消</el-button>
<el-button type="primary" @click="dialogVisible = false"> <el-button type="primary" @click="dialogVisible = false">
提交 提交
</el-button> </el-button>
@ -78,15 +78,13 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref , reactive} from 'vue' import { ref } from 'vue'
import { ElMessageBox } from 'element-plus' import { userStore } from '../../store/userStore';
import { ElMessage } from 'element-plus'
import type { UploadFile } from 'element-plus'; const store = userStore()
const dialogImageUrl = ref(''); const dialogImageUrl = ref('');
const disabled = ref(false); const disabled = ref(false);
const uploadedFiles = ref<UploadFile[]>([]);//
const uploadedDescription = ref<UploadFile[]>([]);//
const imageUrl = ref('') const imageUrl = ref('')
const selectedItems = ref([]) const selectedItems = ref([])
const dialogVisible = ref(false) const dialogVisible = ref(false)
@ -95,26 +93,37 @@ const form = ref({
type_name: '', type_name: '',
tips: '' tips: ''
}) })
const tableData = ref([
const handleSelectionChange = (row: any) => {
selectedItems.value = JSON.parse(JSON.stringify(row))
}
const Add_type =()=>{
dialogVisible.value = true;
form.value = {
img: '',
type_name: '',
tips: ''
}
}
const tableData = [
{ {
img: 'https://s21.ax1x.com/2024/10/24/pAdzjZ6.png', img: 'https://s21.ax1x.com/2024/10/24/pAdzjZ6.png',
type_name: '材料包', type_name: '材料包',
tips: '提供用户自定义DIY', tips: '提供用户自定义DIY',
} }
] ])
const Add_type =()=>{
dialogVisible.value = true;
if(form.value.type_name) {
form.value = {
img: '',
type_name: '',
tips: ''
}
}
tableData.value.push(form.value)
}
const cancel = () => {
dialogVisible.value = false
resetForm();
}
const resetForm = () => {
form.value = {
img: '',
type_name: '',
tips: ''
}
};
// const handleClose = (done: () => void) => { // const handleClose = (done: () => void) => {
// ElMessageBox.confirm('?') // ElMessageBox.confirm('?')
@ -125,6 +134,9 @@ const tableData = [
// // catch error // // catch error
// }) // })
// } // }
const handleSelectionChange = (row: any) => {
selectedItems.value = JSON.parse(JSON.stringify(row))
}
const handleFileUpload = (event: Event) => { const handleFileUpload = (event: Event) => {
const target = event.target as HTMLInputElement; const target = event.target as HTMLInputElement;

View File

@ -54,11 +54,11 @@
userAccount: username.value, userAccount: username.value,
userPassword: password.value userPassword: password.value
}) })
// console.log(res.data.code) console.log(res.data.code)
if(res.data.code === 1 && res ?.data) { if(res.data.code === 1 && res ?.data) {
//pinia //pinia
await store.getLoginUser() await store.getLoginUser(res.data.data)
// //
await router.replace('/PersonalCenter') await router.replace('/PersonalCenter')
} }
} }

View File

@ -3,7 +3,7 @@
<div style="margin: 10px 0"> <div style="margin: 10px 0">
<el-input style="width: 200px; height: 30px; margin-right: 10px;" suffix-icon="Search" placeholder="请输入用户名" v-model="username"></el-input> <el-input style="width: 200px; height: 30px; margin-right: 10px;" suffix-icon="Search" placeholder="请输入用户名" v-model="username"></el-input>
<el-button class="ml-5" type="primary" @click="load" style="height: 25px;">搜索</el-button> <el-button class="ml-5" type="primary" @click="onSearch(username)" style="height: 25px;">搜索</el-button>
<el-button type="warning" @click="reset" style="height:25px">重置</el-button> <el-button type="warning" @click="reset" style="height:25px">重置</el-button>
</div> </div>
<!-- <div style="margin: 15px 0">--> <!-- <div style="margin: 15px 0">-->
@ -28,13 +28,13 @@
@selection-change="handleSelectionChange" :header-cell-style="{'text-align': 'center'}"> @selection-change="handleSelectionChange" :header-cell-style="{'text-align': 'center'}">
<el-table-column type="selection" width="55"></el-table-column> <el-table-column type="selection" width="55"></el-table-column>
<el-table-column prop="id" label="序号" width="50"></el-table-column> <el-table-column prop="id" label="序号" width="50"></el-table-column>
<el-table-column prop="username" label="用户昵称" ></el-table-column> <el-table-column prop="userName" label="用户昵称" ></el-table-column>
<el-table-column prop="avatar" label="头像"></el-table-column> <el-table-column prop="userAvatar" label="头像"></el-table-column>
<el-table-column prop="identity" label="身份"></el-table-column> <el-table-column prop="userRole" label="身份"></el-table-column>
<el-table-column prop="phone" label="手机号"></el-table-column> <el-table-column prop="phone" label="手机号"></el-table-column>
<el-table-column label="操作"> <el-table-column label="操作">
<template slot-scope="scope"> <!-- <template slot-scope="scope">
<el-button type="success" @click="handleEdit(scope.row)">编辑 <i class="el-icon-edit"></i></el-button> <el-button type="success" @click="detail(scope.row)">详情 <i class="el-icon-edit"></i></el-button>
<el-popconfirm <el-popconfirm
class="ml-5" class="ml-5"
@ -45,22 +45,22 @@
title="您确定删除吗?" title="您确定删除吗?"
@confirm="del(scope.row.id)" @confirm="del(scope.row.id)"
> >
<el-button type="danger" slot="reference">删除 <i class="el-icon-remove-outline"></i></el-button> <el-button type="danger" slot="reference">封禁 <i class="el-icon-remove-outline"></i></el-button>
</el-popconfirm> </el-popconfirm>
</template> </template> -->
</el-table-column> </el-table-column>
</el-table> </el-table>
<!-- 分页查询 -->
<div style="padding: 10px 0"> <div style="padding: 10px 0">
<el-pagination <el-pagination
@size-change="handleSizeChange" :current-page="searchParams.current"
@current-change="handleCurrentChange" :page-size="searchParams.pageSize"
:current-page="pageNum"
:page-size="pageSize"
:page-sizes="[2, 5, 10, 20]" :page-sizes="[2, 5, 10, 20]"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:small="null" :small="null"
:disabled="null" background
:background="null"
layout="total, sizes, prev, pager, next, jumper" layout="total, sizes, prev, pager, next, jumper"
:total="total" :total="total"
/> />
@ -69,29 +69,68 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ElMessage } from 'element-plus';
import instance from '@/utils/request'; import myAxios from '@/api/myAxios';
import {ref, onMounted} from 'vue' import {ref, onMounted} from 'vue'
import { da } from 'element-plus/es/locales.mjs';
//
const tableData = ref([]) const tableData = ref([])
const pageNum = ref(0) //
const pageSize = ref(0)
const total = ref(0) const total = ref(0)
//
const searchParams: any = ref({
//
current: 1,
//
pageSize: 5
})
onMounted(() => { onMounted(() => {
load() getUserList()
}) })
const username = ref('') const username = ref('')
const reset =()=>{ const reset =()=>{
username.value = '' username.value = ''
onSearch(username.value)
getUserList()
} }
const load = async () => { //
await instance.get('/admin/findAllUsers').then(res => { const getUserList = async () => {
console.log(res.data.data) //({...})POST.value,Object
res.data.data.foreach((item:any) => { const res = await myAxios.post('/user/list/page/vo',{...searchParams.value})
console.log(item) if(res.data.code === 1) {
}) //
tableData.value = res.data.data tableData.value = res.data.data.records
}) //
total.value = parseInt(res.data.data.total)
}else {
ElMessage({
type: 'info',
message: '查询失败',
})
}
}
const handleSelectionChange = (val:any)=>{
console.log(val)
}
//
const handleSizeChange = (newSize:any) => {
searchParams.value.pageSize = newSize //
getUserList() //
};
//
const handleCurrentChange = (Current:any) => {
searchParams.value.current = Current //
getUserList() //
};
//
const onSearch = (data : String)=>{
console.log(data)
searchParams.value.userName = data
searchParams.value.current = 1
getUserList()
} }
</script> </script>