parent
							
								
									1f23ba4798
								
							
						
					
					
						commit
						52d2592278
					
				| @ -0,0 +1,45 @@ | |||||||
|  | package com.ruoyi.common.core.domain.vo; | ||||||
|  | 
 | ||||||
|  | import com.ruoyi.common.annotation.Excel; | ||||||
|  | import lombok.Data; | ||||||
|  | 
 | ||||||
|  | @Data | ||||||
|  | public class SysUserVo | ||||||
|  | { | ||||||
|  |     /** 用户ID */ | ||||||
|  |     @Excel(name = "用户序号", type = Excel.Type.EXPORT, cellType = Excel.ColumnType.NUMERIC, prompt = "用户编号") | ||||||
|  |     private Long userId; | ||||||
|  | 
 | ||||||
|  |     /** 部门ID */ | ||||||
|  |     @Excel(name = "部门编号", type = Excel.Type.IMPORT) | ||||||
|  |     private Long deptId; | ||||||
|  | 
 | ||||||
|  |     /** 用户账号 */ | ||||||
|  |     @Excel(name = "登录名称") | ||||||
|  |     private String userName; | ||||||
|  | 
 | ||||||
|  |     /** 用户昵称 */ | ||||||
|  |     @Excel(name = "用户名称") | ||||||
|  |     private String nickName; | ||||||
|  | 
 | ||||||
|  |     /** 用户邮箱 */ | ||||||
|  |     @Excel(name = "用户邮箱") | ||||||
|  |     private String email; | ||||||
|  | 
 | ||||||
|  |     /** 手机号码 */ | ||||||
|  |     @Excel(name = "手机号码", cellType = Excel.ColumnType.TEXT) | ||||||
|  |     private String phonenumber; | ||||||
|  | 
 | ||||||
|  |     /** 用户性别 */ | ||||||
|  |     @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知") | ||||||
|  |     private String sex; | ||||||
|  | 
 | ||||||
|  |     /** 用户头像 */ | ||||||
|  |     private String avatar; | ||||||
|  | 
 | ||||||
|  |     /** 密码 */ | ||||||
|  |     private String password; | ||||||
|  | 
 | ||||||
|  |     //是否在线
 | ||||||
|  |     private Integer online; | ||||||
|  | } | ||||||
| @ -0,0 +1,44 @@ | |||||||
|  | import request from '@/utils/request' | ||||||
|  | 
 | ||||||
|  | // 查询消息管理列表
 | ||||||
|  | export function listMessage(query) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/kaoshi/message/list', | ||||||
|  |     method: 'get', | ||||||
|  |     params: query | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // 查询消息管理详细
 | ||||||
|  | export function getMessage(id) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/kaoshi/message/' + id, | ||||||
|  |     method: 'get' | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // 新增消息管理
 | ||||||
|  | export function addMessage(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/kaoshi/message', | ||||||
|  |     method: 'post', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // 修改消息管理
 | ||||||
|  | export function updateMessage(data) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/kaoshi/message', | ||||||
|  |     method: 'put', | ||||||
|  |     data: data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // 删除消息管理
 | ||||||
|  | export function delMessage(id) { | ||||||
|  |   return request({ | ||||||
|  |     url: '/kaoshi/message/' + id, | ||||||
|  |     method: 'delete' | ||||||
|  |   }) | ||||||
|  | } | ||||||
| @ -0,0 +1,308 @@ | |||||||
|  | <template> | ||||||
|  |   <div class="app-container"> | ||||||
|  |     <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> | ||||||
|  |       <el-form-item label="教师id" prop="teacherId"> | ||||||
|  |         <el-input | ||||||
|  |           v-model="queryParams.teacherId" | ||||||
|  |           placeholder="请输入教师id" | ||||||
|  |           clearable | ||||||
|  |           @keyup.enter.native="handleQuery" | ||||||
|  |         /> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item label="学生id" prop="studentId"> | ||||||
|  |         <el-input | ||||||
|  |           v-model="queryParams.studentId" | ||||||
|  |           placeholder="请输入学生id" | ||||||
|  |           clearable | ||||||
|  |           @keyup.enter.native="handleQuery" | ||||||
|  |         /> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item label="消息" prop="source"> | ||||||
|  |         <el-input | ||||||
|  |           v-model="queryParams.source" | ||||||
|  |           placeholder="请输入消息" | ||||||
|  |           clearable | ||||||
|  |           @keyup.enter.native="handleQuery" | ||||||
|  |         /> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item label="是否查看" prop="tf"> | ||||||
|  |         <el-input | ||||||
|  |           v-model="queryParams.tf" | ||||||
|  |           placeholder="请输入是否查看" | ||||||
|  |           clearable | ||||||
|  |           @keyup.enter.native="handleQuery" | ||||||
|  |         /> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item label="创建时间" prop="createtime"> | ||||||
|  |         <el-date-picker clearable | ||||||
|  |           v-model="queryParams.createtime" | ||||||
|  |           type="date" | ||||||
|  |           value-format="yyyy-MM-dd" | ||||||
|  |           placeholder="请选择创建时间"> | ||||||
|  |         </el-date-picker> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item> | ||||||
|  |         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> | ||||||
|  |         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> | ||||||
|  |       </el-form-item> | ||||||
|  |     </el-form> | ||||||
|  | 
 | ||||||
|  |     <el-row :gutter="10" class="mb8"> | ||||||
|  |       <el-col :span="1.5"> | ||||||
|  |         <el-button | ||||||
|  |           type="primary" | ||||||
|  |           plain | ||||||
|  |           icon="el-icon-plus" | ||||||
|  |           size="mini" | ||||||
|  |           @click="handleAdd" | ||||||
|  |           v-hasPermi="['kaoshi:message:add']" | ||||||
|  |         >新增</el-button> | ||||||
|  |       </el-col> | ||||||
|  |       <el-col :span="1.5"> | ||||||
|  |         <el-button | ||||||
|  |           type="success" | ||||||
|  |           plain | ||||||
|  |           icon="el-icon-edit" | ||||||
|  |           size="mini" | ||||||
|  |           :disabled="single" | ||||||
|  |           @click="handleUpdate" | ||||||
|  |           v-hasPermi="['kaoshi:message:edit']" | ||||||
|  |         >修改</el-button> | ||||||
|  |       </el-col> | ||||||
|  |       <el-col :span="1.5"> | ||||||
|  |         <el-button | ||||||
|  |           type="danger" | ||||||
|  |           plain | ||||||
|  |           icon="el-icon-delete" | ||||||
|  |           size="mini" | ||||||
|  |           :disabled="multiple" | ||||||
|  |           @click="handleDelete" | ||||||
|  |           v-hasPermi="['kaoshi:message:remove']" | ||||||
|  |         >删除</el-button> | ||||||
|  |       </el-col> | ||||||
|  |       <el-col :span="1.5"> | ||||||
|  |         <el-button | ||||||
|  |           type="warning" | ||||||
|  |           plain | ||||||
|  |           icon="el-icon-download" | ||||||
|  |           size="mini" | ||||||
|  |           @click="handleExport" | ||||||
|  |           v-hasPermi="['kaoshi:message:export']" | ||||||
|  |         >导出</el-button> | ||||||
|  |       </el-col> | ||||||
|  |       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> | ||||||
|  |     </el-row> | ||||||
|  | 
 | ||||||
|  |     <el-table v-loading="loading" :data="messageList" @selection-change="handleSelectionChange"> | ||||||
|  |       <el-table-column type="selection" width="55" align="center" /> | ||||||
|  |       <el-table-column label="id" align="center" prop="id" /> | ||||||
|  |       <el-table-column label="教师id" align="center" prop="teacherId" /> | ||||||
|  |       <el-table-column label="学生id" align="center" prop="studentId" /> | ||||||
|  |       <el-table-column label="消息" align="center" prop="source" /> | ||||||
|  |       <el-table-column label="是否查看" align="center" prop="tf" /> | ||||||
|  |       <el-table-column label="创建时间" align="center" prop="createtime" width="180"> | ||||||
|  |         <template slot-scope="scope"> | ||||||
|  |           <span>{{ parseTime(scope.row.createtime, '{y}-{m}-{d}') }}</span> | ||||||
|  |         </template> | ||||||
|  |       </el-table-column> | ||||||
|  |       <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> | ||||||
|  |         <template slot-scope="scope"> | ||||||
|  |           <el-button | ||||||
|  |             size="mini" | ||||||
|  |             type="text" | ||||||
|  |             icon="el-icon-edit" | ||||||
|  |             @click="handleUpdate(scope.row)" | ||||||
|  |             v-hasPermi="['kaoshi:message:edit']" | ||||||
|  |           >修改</el-button> | ||||||
|  |           <el-button | ||||||
|  |             size="mini" | ||||||
|  |             type="text" | ||||||
|  |             icon="el-icon-delete" | ||||||
|  |             @click="handleDelete(scope.row)" | ||||||
|  |             v-hasPermi="['kaoshi:message:remove']" | ||||||
|  |           >删除</el-button> | ||||||
|  |         </template> | ||||||
|  |       </el-table-column> | ||||||
|  |     </el-table> | ||||||
|  |      | ||||||
|  |     <pagination | ||||||
|  |       v-show="total>0" | ||||||
|  |       :total="total" | ||||||
|  |       :page.sync="queryParams.pageNum" | ||||||
|  |       :limit.sync="queryParams.pageSize" | ||||||
|  |       @pagination="getList" | ||||||
|  |     /> | ||||||
|  | 
 | ||||||
|  |     <!-- 添加或修改消息管理对话框 --> | ||||||
|  |     <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> | ||||||
|  |       <el-form ref="form" :model="form" :rules="rules" label-width="80px"> | ||||||
|  |         <el-form-item label="教师id" prop="teacherId"> | ||||||
|  |           <el-input v-model="form.teacherId" placeholder="请输入教师id" /> | ||||||
|  |         </el-form-item> | ||||||
|  |         <el-form-item label="学生id" prop="studentId"> | ||||||
|  |           <el-input v-model="form.studentId" placeholder="请输入学生id" /> | ||||||
|  |         </el-form-item> | ||||||
|  |         <el-form-item label="消息" prop="source"> | ||||||
|  |           <el-input v-model="form.source" placeholder="请输入消息" /> | ||||||
|  |         </el-form-item> | ||||||
|  |         <el-form-item label="是否查看" prop="tf"> | ||||||
|  |           <el-input v-model="form.tf" placeholder="请输入是否查看" /> | ||||||
|  |         </el-form-item> | ||||||
|  |       </el-form> | ||||||
|  |       <div slot="footer" class="dialog-footer"> | ||||||
|  |         <el-button type="primary" @click="submitForm">确 定</el-button> | ||||||
|  |         <el-button @click="cancel">取 消</el-button> | ||||||
|  |       </div> | ||||||
|  |     </el-dialog> | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  | import { listMessage, getMessage, delMessage, addMessage, updateMessage } from "@/api/kaoshi/message"; | ||||||
|  | 
 | ||||||
|  | export default { | ||||||
|  |   name: "Message", | ||||||
|  |   data() { | ||||||
|  |     return { | ||||||
|  |       // 遮罩层 | ||||||
|  |       loading: true, | ||||||
|  |       // 选中数组 | ||||||
|  |       ids: [], | ||||||
|  |       // 非单个禁用 | ||||||
|  |       single: true, | ||||||
|  |       // 非多个禁用 | ||||||
|  |       multiple: true, | ||||||
|  |       // 显示搜索条件 | ||||||
|  |       showSearch: true, | ||||||
|  |       // 总条数 | ||||||
|  |       total: 0, | ||||||
|  |       // 消息管理表格数据 | ||||||
|  |       messageList: [], | ||||||
|  |       // 弹出层标题 | ||||||
|  |       title: "", | ||||||
|  |       // 是否显示弹出层 | ||||||
|  |       open: false, | ||||||
|  |       // 查询参数 | ||||||
|  |       queryParams: { | ||||||
|  |         pageNum: 1, | ||||||
|  |         pageSize: 10, | ||||||
|  |         teacherId: null, | ||||||
|  |         studentId: null, | ||||||
|  |         source: null, | ||||||
|  |         tf: null, | ||||||
|  |         createtime: null | ||||||
|  |       }, | ||||||
|  |       // 表单参数 | ||||||
|  |       form: {}, | ||||||
|  |       // 表单校验 | ||||||
|  |       rules: { | ||||||
|  |         teacherId: [ | ||||||
|  |           { required: true, message: "教师id不能为空", trigger: "blur" } | ||||||
|  |         ], | ||||||
|  |         studentId: [ | ||||||
|  |           { required: true, message: "学生id不能为空", trigger: "blur" } | ||||||
|  |         ], | ||||||
|  |       } | ||||||
|  |     }; | ||||||
|  |   }, | ||||||
|  |   created() { | ||||||
|  |     this.getList(); | ||||||
|  |   }, | ||||||
|  |   methods: { | ||||||
|  |     /** 查询消息管理列表 */ | ||||||
|  |     getList() { | ||||||
|  |       this.loading = true; | ||||||
|  |       listMessage(this.queryParams).then(response => { | ||||||
|  |         this.messageList = response.rows; | ||||||
|  |         this.total = response.total; | ||||||
|  |         this.loading = false; | ||||||
|  |       }); | ||||||
|  |     }, | ||||||
|  |     // 取消按钮 | ||||||
|  |     cancel() { | ||||||
|  |       this.open = false; | ||||||
|  |       this.reset(); | ||||||
|  |     }, | ||||||
|  |     // 表单重置 | ||||||
|  |     reset() { | ||||||
|  |       this.form = { | ||||||
|  |         id: null, | ||||||
|  |         teacherId: null, | ||||||
|  |         studentId: null, | ||||||
|  |         source: null, | ||||||
|  |         tf: null, | ||||||
|  |         createtime: null | ||||||
|  |       }; | ||||||
|  |       this.resetForm("form"); | ||||||
|  |     }, | ||||||
|  |     /** 搜索按钮操作 */ | ||||||
|  |     handleQuery() { | ||||||
|  |       this.queryParams.pageNum = 1; | ||||||
|  |       this.getList(); | ||||||
|  |     }, | ||||||
|  |     /** 重置按钮操作 */ | ||||||
|  |     resetQuery() { | ||||||
|  |       this.resetForm("queryForm"); | ||||||
|  |       this.handleQuery(); | ||||||
|  |     }, | ||||||
|  |     // 多选框选中数据 | ||||||
|  |     handleSelectionChange(selection) { | ||||||
|  |       this.ids = selection.map(item => item.id) | ||||||
|  |       this.single = selection.length!==1 | ||||||
|  |       this.multiple = !selection.length | ||||||
|  |     }, | ||||||
|  |     /** 新增按钮操作 */ | ||||||
|  |     handleAdd() { | ||||||
|  |       this.reset(); | ||||||
|  |       this.open = true; | ||||||
|  |       this.title = "添加消息管理"; | ||||||
|  |     }, | ||||||
|  |     /** 修改按钮操作 */ | ||||||
|  |     handleUpdate(row) { | ||||||
|  |       this.reset(); | ||||||
|  |       const id = row.id || this.ids | ||||||
|  |       getMessage(id).then(response => { | ||||||
|  |         this.form = response.data; | ||||||
|  |         this.open = true; | ||||||
|  |         this.title = "修改消息管理"; | ||||||
|  |       }); | ||||||
|  |     }, | ||||||
|  |     /** 提交按钮 */ | ||||||
|  |     submitForm() { | ||||||
|  |       this.$refs["form"].validate(valid => { | ||||||
|  |         if (valid) { | ||||||
|  |           if (this.form.id != null) { | ||||||
|  |             updateMessage(this.form).then(response => { | ||||||
|  |               this.$modal.msgSuccess("修改成功"); | ||||||
|  |               this.open = false; | ||||||
|  |               this.getList(); | ||||||
|  |             }); | ||||||
|  |           } else { | ||||||
|  |             addMessage(this.form).then(response => { | ||||||
|  |               this.$modal.msgSuccess("新增成功"); | ||||||
|  |               this.open = false; | ||||||
|  |               this.getList(); | ||||||
|  |             }); | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       }); | ||||||
|  |     }, | ||||||
|  |     /** 删除按钮操作 */ | ||||||
|  |     handleDelete(row) { | ||||||
|  |       const ids = row.id || this.ids; | ||||||
|  |       this.$modal.confirm('是否确认删除消息管理编号为"' + ids + '"的数据项?').then(function() { | ||||||
|  |         return delMessage(ids); | ||||||
|  |       }).then(() => { | ||||||
|  |         this.getList(); | ||||||
|  |         this.$modal.msgSuccess("删除成功"); | ||||||
|  |       }).catch(() => {}); | ||||||
|  |     }, | ||||||
|  |     /** 导出按钮操作 */ | ||||||
|  |     handleExport() { | ||||||
|  |       this.download('kaoshi/message/export', { | ||||||
|  |         ...this.queryParams | ||||||
|  |       }, `message_${new Date().getTime()}.xlsx`) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | </script> | ||||||
| @ -0,0 +1,90 @@ | |||||||
|  | <template> | ||||||
|  |   <div class="header-container"> | ||||||
|  |     <div class="left-section"> | ||||||
|  |       <span :class="collapseBtnClass" class="collapse-icon" @click="collapse"></span> | ||||||
|  |     </div> | ||||||
|  |     <div class="logout-container"> | ||||||
|  |       <span class="logout-btn" @click="logout">退出</span> | ||||||
|  |     </div> | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  | import axios from "axios"; | ||||||
|  | 
 | ||||||
|  | export default { | ||||||
|  |   name: "Header", | ||||||
|  |   props: { | ||||||
|  |     collapseBtnClass: String, | ||||||
|  |     collapse: Boolean, | ||||||
|  |   }, | ||||||
|  |   methods: { | ||||||
|  |     async logout() { | ||||||
|  |       try{ | ||||||
|  |         // 执行登出操作 | ||||||
|  |         const token = this.$store.state.tokens[this.userId]; | ||||||
|  |         if (!token) { | ||||||
|  |           alert("用户未登录,请重新登录!"); | ||||||
|  |           return; | ||||||
|  |         } | ||||||
|  |         const response = await axios.post("http://localhost:8080/logout", {}, { | ||||||
|  |           headers: { | ||||||
|  |             Authorization: `Bearer ${token}`, | ||||||
|  |             'Content-Type': 'application/json', | ||||||
|  |           }, | ||||||
|  |         }) | ||||||
|  |         console.log(response); | ||||||
|  |         await this.$store.dispatch("clearToken", this.userId); // 调用 Vuex 登出逻辑 | ||||||
|  |         this.$message.success("退出成功!"); | ||||||
|  |         await this.$router.push("/login"); // 跳转到登录页面 | ||||||
|  |       }catch (error){ | ||||||
|  |         this.$message.error("接口异常!"); | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   created() { | ||||||
|  |     // 从路由参数中获取 userId | ||||||
|  |     this.userId = this.$route.query.userId; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style scoped lang="scss"> | ||||||
|  | .header-container { | ||||||
|  |   display: flex; | ||||||
|  |   justify-content: space-between; | ||||||
|  |   align-items: center; | ||||||
|  |   font-size: 14px; | ||||||
|  |   line-height: 50px; | ||||||
|  |   padding: 0 20px; | ||||||
|  |   border-bottom: 1px solid #ddd; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .left-section { | ||||||
|  |   flex: 1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .collapse-icon { | ||||||
|  |   cursor: pointer; | ||||||
|  |   font-size: 20px; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .logout-container { | ||||||
|  |   display: flex; | ||||||
|  |   align-items: center; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .logout-btn { | ||||||
|  |   cursor: pointer; | ||||||
|  |   font-size: 16px; | ||||||
|  |   color: #409EFF; | ||||||
|  |   padding: 5px 10px; | ||||||
|  |   border-radius: 4px; | ||||||
|  |   transition: background-color 0.3s ease, color 0.3s ease; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .logout-btn:hover { | ||||||
|  |   background-color: #409EFF; | ||||||
|  |   color: #fff; | ||||||
|  | } | ||||||
|  | </style> | ||||||
| @ -0,0 +1,192 @@ | |||||||
|  | <template> | ||||||
|  |   <el-container style="min-height: 100vh; background-color: #f5f7fa;"> | ||||||
|  |     <!-- 侧边栏 --> | ||||||
|  |     <el-aside :width="sideWidth+'px'" style="background-color: #f1f3f5; box-shadow: 2px 0 6px rgba(0, 21, 41, 0.1); transition: all 0.3s;"> | ||||||
|  |       <Aside :isCollapse="isCollapse" :logoTextShow="logoTextShow" /> | ||||||
|  |     </el-aside> | ||||||
|  | 
 | ||||||
|  |     <el-container> | ||||||
|  |       <!-- Header --> | ||||||
|  |       <el-header style="border-bottom: 1px solid #e0e0e0; background-color: #fff;"> | ||||||
|  |         <Header :collapseBtnClass="collapseBtnClass" :collapse="collapse" /> | ||||||
|  |       </el-header> | ||||||
|  | 
 | ||||||
|  |       <el-main style="padding: 20px; background-color: #fff; border-radius: 8px;"> | ||||||
|  |         <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px;"> | ||||||
|  |           <el-tabs v-model="activeTab" @tab-click="fetchUserList" style="flex-grow: 1;"> | ||||||
|  |             <el-tab-pane label="老师" name="teacher"></el-tab-pane> | ||||||
|  |             <el-tab-pane label="学生" name="student"></el-tab-pane> | ||||||
|  |             <el-tab-pane label="无权限" name="null"></el-tab-pane> | ||||||
|  |           </el-tabs> | ||||||
|  | 
 | ||||||
|  |           <!-- 刷新按钮 --> | ||||||
|  |           <el-button @click="refreshData" size="small" type="primary" style="background-color: #409EFF; border-color: #409EFF;margin-right: 10px"> | ||||||
|  |             刷新 | ||||||
|  |           </el-button> | ||||||
|  |         </div> | ||||||
|  | 
 | ||||||
|  |         <!-- 表格 --> | ||||||
|  |         <el-table :data="userList" border style="width: 100%; margin-top: 20px; background-color: #ffffff; border-radius: 8px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);"> | ||||||
|  |           <el-table-column prop="userId" label="ID" width="80" /> | ||||||
|  |           <el-table-column prop="userName" label="用户名" /> | ||||||
|  |           <el-table-column prop="nickName" label="昵称" /> | ||||||
|  |           <el-table-column prop="online" label="是否在线" width="300"> | ||||||
|  |             <template #default="scope"> | ||||||
|  |               <el-tag :type="scope.row.online === 1 ? 'success' : 'warning'"> | ||||||
|  |                 {{ scope.row.online === 1 ? '在线' : '离线' }} | ||||||
|  |               </el-tag> | ||||||
|  |             </template> | ||||||
|  |           </el-table-column> | ||||||
|  |           <el-table-column label="操作" width="150"> | ||||||
|  |             <template #default="scope"> | ||||||
|  |               <div style="display: flex; align-items: center;"> | ||||||
|  |                 <el-button @click="viewDetails(scope.row)" size="small" type="success" style="margin-right: 10px;">详细</el-button> | ||||||
|  |                 <el-button v-if="scope.row.online" @click="kickOutUser(scope.row)" size="small" type="danger">强退</el-button> | ||||||
|  |               </div> | ||||||
|  |             </template> | ||||||
|  |           </el-table-column> | ||||||
|  |         </el-table> | ||||||
|  | 
 | ||||||
|  |         <!-- User Details Dialog --> | ||||||
|  |         <el-dialog :visible.sync="dialogVisible" title="User Details" width="500px" :style="{borderRadius: '8px'}"> | ||||||
|  |           <el-form :model="selectedUser" label-width="120px"> | ||||||
|  |             <el-form-item label="ID"> | ||||||
|  |               <span>{{ selectedUser.id }}</span> | ||||||
|  |             </el-form-item> | ||||||
|  |             <el-form-item label="Name"> | ||||||
|  |               <span>{{ selectedUser.name }}</span> | ||||||
|  |             </el-form-item> | ||||||
|  |             <el-form-item label="Email"> | ||||||
|  |               <span>{{ selectedUser.email }}</span> | ||||||
|  |             </el-form-item> | ||||||
|  |             <el-form-item label="Role"> | ||||||
|  |               <span>{{ selectedUser.role }}</span> | ||||||
|  |             </el-form-item> | ||||||
|  |           </el-form> | ||||||
|  |         </el-dialog> | ||||||
|  |       </el-main> | ||||||
|  |     </el-container> | ||||||
|  |   </el-container> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  | import Header from "@/components/gl/Header.vue"; | ||||||
|  | import Aside from "@/components/gl/Aside.vue"; | ||||||
|  | import axios from "axios"; | ||||||
|  | 
 | ||||||
|  | export default { | ||||||
|  |   name: "UserCenter", | ||||||
|  |   components: { Aside, Header }, | ||||||
|  |   data() { | ||||||
|  |     return { | ||||||
|  |       collapseBtnClass: "el-icon-s-fold", | ||||||
|  |       isCollapse: false, | ||||||
|  |       sideWidth: 200, | ||||||
|  |       logoTextShow: true, | ||||||
|  |       activeTab: "teacher", // 默认选中角色为 "teacher" | ||||||
|  |       userList: [], // 表格数据 | ||||||
|  |       dialogVisible: false, // 弹窗显示状态 | ||||||
|  |       selectedUser: {}, // 当前选中用户 | ||||||
|  |       // 分页数据 | ||||||
|  |       currentPage: 1, | ||||||
|  |       pageSize: 10, | ||||||
|  |       total: 0, // 总记录数 | ||||||
|  |     }; | ||||||
|  |   }, | ||||||
|  |   methods: { | ||||||
|  |     collapse() { | ||||||
|  |       this.isCollapse = !this.isCollapse; | ||||||
|  |       if (this.isCollapse) { | ||||||
|  |         this.sideWidth = 64; | ||||||
|  |         this.collapseBtnClass = "el-icon-s-unfold"; | ||||||
|  |         this.logoTextShow = false; | ||||||
|  |       } else { | ||||||
|  |         this.sideWidth = 200; | ||||||
|  |         this.collapseBtnClass = "el-icon-s-fold"; | ||||||
|  |         this.logoTextShow = true; | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     async fetchUserList() { | ||||||
|  |       try { | ||||||
|  |         // 获取用户Token | ||||||
|  |         const token = this.$store.state.tokens[this.userId]; | ||||||
|  |         if (!token) { | ||||||
|  |           alert("用户未登录,请重新登录!"); | ||||||
|  |           this.$router.push("/login"); | ||||||
|  |           return false; | ||||||
|  |         } | ||||||
|  |         const response = await axios.get("http://localhost:8080/system/role/selectUserByRoleKey", { | ||||||
|  |           params: { | ||||||
|  |             roleKey: this.activeTab, | ||||||
|  |           }, | ||||||
|  |           headers: { | ||||||
|  |             Authorization: `Bearer ${token}`, | ||||||
|  |             'Content-Type': 'application/json', | ||||||
|  |           }, | ||||||
|  |         }); | ||||||
|  |         this.userList = response.data; | ||||||
|  |         console.log(response); | ||||||
|  |       } catch (error) { | ||||||
|  |         console.error("接口获取失败:", error); | ||||||
|  |         this.$message.error("接口请求异常"); | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     viewDetails(user) { | ||||||
|  |       this.selectedUser = user; // 设置当前选中用户 | ||||||
|  |       this.dialogVisible = true; // 打开详情弹窗 | ||||||
|  |     }, | ||||||
|  |     // 新增刷新数据的方法 | ||||||
|  |     refreshData() { | ||||||
|  |       this.fetchUserList(); // 重新加载数据 | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   mounted() { | ||||||
|  |     this.fetchUserList(); // 页面加载时初始化数据 | ||||||
|  |   }, | ||||||
|  |   created() { | ||||||
|  |     this.userId = this.$route.query.userId; // 从路由获取用户ID | ||||||
|  |   }, | ||||||
|  | }; | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style scoped lang="scss"> | ||||||
|  | .el-table { | ||||||
|  |   border-radius: 8px; | ||||||
|  |   box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .el-header { | ||||||
|  |   background-color: #ffffff; | ||||||
|  |   box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .el-button { | ||||||
|  |   font-weight: 500; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .el-dialog { | ||||||
|  |   border-radius: 8px; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .el-tabs { | ||||||
|  |   background-color: #fff; | ||||||
|  |   border-radius: 8px; | ||||||
|  |   box-shadow: 0 4px 8px rgba(0, 0, 0, 0.05); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .el-aside { | ||||||
|  |   box-shadow: 2px 0 6px rgba(0, 21, 41, 0.1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .el-tag { | ||||||
|  |   border-radius: 12px; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .el-table-column { | ||||||
|  |   text-align: center; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .el-form-item span { | ||||||
|  |   color: #555; | ||||||
|  | } | ||||||
|  | </style> | ||||||
					Loading…
					
					
				
		Reference in new issue