Compare commits

..

No commits in common. "0f50d478449c1fbe563098ce3d84185a7ed70e6d" and "1bb5c652c7d821424de678120c3d8578a505df23" have entirely different histories.

8 changed files with 153 additions and 173 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://localhost:8888/api'//测试服务器 baseURL: 'http://127.0.0.1:8888/api'//测试服务器
}); });
// 添加请求拦截器 // 添加请求拦截器
axios.interceptors.request.use(function (config) { axios.interceptors.request.use(function (config) {

View File

@ -83,83 +83,79 @@
<!--</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"> <el-icon @click="changeState" v-show="showLog" size="20px" style="margin-right: 10px"><Expand/></el-icon>
<Expand /> <el-icon @click="changeState" v-show="!showLog" size="20px" style="margin-right: 10px"><Fold /></el-icon>
</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="store.loginUser.userAvatar" alt=""> <img src="../../assets/admin.jpg" 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>{{ store.loginUser.userName }}</span><el-icon class="el-icon--right"><arrow-down /></el-icon> <span>用户名称</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 logout = async () => { const res: any = await myAxios.post("/user/logout",{})
const res: any = await myAxios.post("/user/logout", {}) console.log(res)
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 = () => {
const changeState = () => { showLog.value = !showLog.value
showLog.value = !showLog.value emitter.emit('Aside', showLog.value)
emitter.emit('Aside', showLog.value) if(showLog.value){
if (showLog.value) { offset.value = -116
offset.value = -116 }else{
} else { offset.value = 20
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,10 +6,8 @@ export const userStore = defineStore( 'user' , {
state: () => { state: () => {
return { return {
loginUser: { loginUser: {
id: 0,
phone: '',
userAvatar: '',
userName: '未登录', userName: '未登录',
userAvatar: '',
userRole: 'notLogin' userRole: 'notLogin'
} }
} }
@ -17,11 +15,13 @@ export const userStore = defineStore( 'user' , {
//actions是用于定义和处理状态更改的方法。它们可以包含任意的逻辑如异步请求、数据处理和状态更新。 //actions是用于定义和处理状态更改的方法。它们可以包含任意的逻辑如异步请求、数据处理和状态更新。
actions: { actions: {
//获取登录用户信息 //获取登录用户信息
async getLoginUser(res:any) { async getLoginUser() {
//请求登录信息 //请求登录信息
// const res = await myAxios.get('/user/get') const res = await myAxios.get('/user/get')
console.log(res,121212312312) // console.log(res.data)
this.updateUser( res ) if( res.data.code === 1 && res ?.data ) {
this.updateUser( res.data )
}
}, },
//更新用户信息 //更新用户信息
//更新state //更新state

34
src/utils/request.js Normal file
View File

@ -0,0 +1,34 @@
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,6 +247,7 @@
</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="cancel" >取消</el-button> <el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="dialogVisible = false"> <el-button type="primary" @click="dialogVisible = false">
提交 提交
</el-button> </el-button>
@ -78,13 +78,15 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue' import { ref , reactive} from 'vue'
import { userStore } from '../../store/userStore'; import { ElMessageBox } from 'element-plus'
import { ElMessage } from 'element-plus'
const store = userStore() import type { UploadFile } from 'element-plus';
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)
@ -93,37 +95,26 @@ 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('?')
@ -134,9 +125,6 @@ const resetForm = () => {
// // 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(res.data.data) await store.getLoginUser()
// //
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="onSearch(username)" style="height: 25px;">搜索</el-button> <el-button class="ml-5" type="primary" @click="load" 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="userAvatar" label="头像"></el-table-column> <el-table-column prop="avatar" label="头像"></el-table-column>
<el-table-column prop="userRole" label="身份"></el-table-column> <el-table-column prop="identity" 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="detail(scope.row)">详情 <i class="el-icon-edit"></i></el-button> <el-button type="success" @click="handleEdit(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
:current-page="searchParams.current"
:page-size="searchParams.pageSize"
:page-sizes="[2, 5, 10, 20]"
@size-change="handleSizeChange" @size-change="handleSizeChange"
@current-change="handleCurrentChange" @current-change="handleCurrentChange"
:current-page="pageNum"
:page-size="pageSize"
:page-sizes="[2, 5, 10, 20]"
:small="null" :small="null"
background :disabled="null"
:background="null"
layout="total, sizes, prev, pager, next, jumper" layout="total, sizes, prev, pager, next, jumper"
:total="total" :total="total"
/> />
@ -69,68 +69,29 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ElMessage } from 'element-plus';
import myAxios from '@/api/myAxios'; import instance from '@/utils/request';
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(() => {
getUserList() load()
}) })
const username = ref('') const username = ref('')
const reset =()=>{ const reset =()=>{
username.value = '' username.value = ''
onSearch(username.value)
getUserList()
} }
// const load = async () => {
const getUserList = async () => { await instance.get('/admin/findAllUsers').then(res => {
//({...})POST.value,Object console.log(res.data.data)
const res = await myAxios.post('/user/list/page/vo',{...searchParams.value}) res.data.data.foreach((item:any) => {
if(res.data.code === 1) { console.log(item)
// })
tableData.value = res.data.data.records tableData.value = res.data.data
// })
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>