|
|
@@ -0,0 +1,209 @@
|
|
|
+<script setup>
|
|
|
+import { onMounted, ref } from 'vue'
|
|
|
+import { ElMessage, ElMessageBox } from 'element-plus'
|
|
|
+import { useUserStore } from '@/stores/system/user';
|
|
|
+import { storeToRefs } from 'pinia';
|
|
|
+const userStore = useUserStore();
|
|
|
+const { tableData, total, pageNum, pageSize } = storeToRefs(userStore);
|
|
|
+// 选中的⽤户ID数组
|
|
|
+const selectedUserIds = ref([]);
|
|
|
+const queryFunction = function () {
|
|
|
+ userStore.queryData({
|
|
|
+ pageNum: pageNum.value, pageSize: pageSize.value
|
|
|
+ });
|
|
|
+}
|
|
|
+const userAddFrom = ref({
|
|
|
+ userName: '',
|
|
|
+ password: '',
|
|
|
+ fullName: '',
|
|
|
+ phoneNumber: '',
|
|
|
+ avatarAddress: ''
|
|
|
+});
|
|
|
+const userAddFromRules = {
|
|
|
+ userName: [{ required: true, message: '请输⼊⽤户名', trigger: 'blur' }],
|
|
|
+ password: [{ required: true, message: '请输⼊密码', trigger: 'blur' }],
|
|
|
+ fullName: [{ required: true, message: '请输⼊姓名', trigger: 'blur' }]
|
|
|
+};
|
|
|
+// 创建表单引⽤
|
|
|
+const userAddFromRef = ref();
|
|
|
+onMounted(() => {
|
|
|
+ queryFunction();
|
|
|
+})
|
|
|
+const handleSizeChange = function (val) {
|
|
|
+ userStore.pageSize = val;
|
|
|
+ queryFunction();
|
|
|
+}
|
|
|
+const handleCurrentChange = function (val) {
|
|
|
+ userStore.pageNum = val;
|
|
|
+ queryFunction();
|
|
|
+}
|
|
|
+const handleAdd = async () => {
|
|
|
+ if (!userAddFromRef.value) return
|
|
|
+ try {
|
|
|
+ // 这⾥可以打开添加⽤户对话框,并传递userAddFrom数据
|
|
|
+ const valid = await userAddFromRef.value.validate();
|
|
|
+ if (valid) {
|
|
|
+ userStore.addUser(userAddFrom.value);
|
|
|
+ userStore.dialogFormVisible = false;
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ // console.error('添加⽤户失败:', error);
|
|
|
+ // 可以显示错误提示给⽤户,例如使⽤ElMessage
|
|
|
+ ElMessage.error('添加⽤户失败,请重试');
|
|
|
+ }
|
|
|
+};
|
|
|
+const handleEdit = (row) => {
|
|
|
+ // 这⾥可以打开编辑⽤户对话框,并传递row数据
|
|
|
+ userStore.editUser(row);
|
|
|
+};
|
|
|
+// 当前选中的⾏
|
|
|
+const handleSelectionChange = (rows) => {
|
|
|
+ // 获取选中⾏的ID
|
|
|
+ selectedUserIds.value = rows.map(row => row.id);
|
|
|
+};
|
|
|
+const handleDelete = (row) => {
|
|
|
+ // 使⽤Element Plus的MessageBox组件实现确认对话框
|
|
|
+ ElMessageBox.confirm('确定要删除这个⽤户吗?', '提示', {
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning'
|
|
|
+ }).then(() => {
|
|
|
+ userStore.deleteUser(row.id);
|
|
|
+ }).catch(() => {
|
|
|
+ // ⽤户点击取消时的处理
|
|
|
+ });
|
|
|
+};
|
|
|
+// 批量删除选中的⽤户
|
|
|
+const handleBatchDelete = () => {
|
|
|
+ if (selectedUserIds.value.length === 0) {
|
|
|
+ ElMessage.warning('请⾄少选择⼀条记录进⾏删除');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ ElMessageBox.confirm('确定要批量删除选中的⽤户吗?', '提示', {
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning'
|
|
|
+ }).then(() => {
|
|
|
+ userStore.batchDeleteUser(selectedUserIds.value);
|
|
|
+ }).catch(() => {
|
|
|
+ // ⽤户点击取消时的处理
|
|
|
+ });
|
|
|
+};
|
|
|
+</script>
|
|
|
+<template>
|
|
|
+ <div class="data-table-container">
|
|
|
+ <div class="search-from">
|
|
|
+ <!-- 搜索表单 -->
|
|
|
+ </div>
|
|
|
+ <div class="operate-buttons">
|
|
|
+ <el-button size="default" type="primary" @click="userStore.dialogFo
|
|
|
+ rmVisible = true">
|
|
|
+ <i class="el-icon-plus el-icon--left"></i>新增
|
|
|
+ </el-button>
|
|
|
+ <el-button size="default" type="danger" @click="handleBatchDelete">
|
|
|
+ <i class="el-icon-delete el-icon--left"></i>批量删除
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
+ <div class="data-table">
|
|
|
+ <div class="table-container">
|
|
|
+ <el-table height="600" border fit stripe :data="tableData" style="width: 100%" max-height="600"
|
|
|
+ v-loading="userStore.loading" element-loading-text="拼命加载中" element-loading-spinner="el-icon-loading"
|
|
|
+ element-loading-background="rgba(0, 0, 0, 0.1)" @selection-change="handleSelectionChange">
|
|
|
+ <el-table-column type="selection" width="55" />
|
|
|
+ <el-table-column type="index" label="序号" width="55" />
|
|
|
+ <el-table-column prop="userName" label="⽤户名" />
|
|
|
+ <el-table-column prop="fullName" label="姓名" />
|
|
|
+ <el-table-column prop="phoneNumber" label="⼿机号" />
|
|
|
+ <el-table-column label="头像" width="88">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-image style="width: 40px; height: 40px" :src="row.avatarAddress" :zoom-rate="1.2" :max-scale="7"
|
|
|
+ :min-scale="0.2" show-progress :initial-index="4" fit="cover" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="createTime" label="创建时间" />
|
|
|
+ <el-table-column fixed="right" label="操作" min-width="80">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-button link type="primary" size="small" @click="handleD
|
|
|
+ elete(row)">
|
|
|
+ 删除
|
|
|
+ </el-button>
|
|
|
+ <el-button link type="primary" size="small" @click="handleE
|
|
|
+ dit(row)">
|
|
|
+ 修改
|
|
|
+ </el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </div>
|
|
|
+ <div class="pagination-container">
|
|
|
+ <el-pagination :currentPage="pageNum" :page-sizes="[10, 20, 50, 100]" :page-size="pageSize"
|
|
|
+ layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handleSizeChange"
|
|
|
+ @current-change="handleCurrentChange" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <el-dialog v-model="userStore.dialogFormVisible" title="新增⽤户" width="600" center>
|
|
|
+ <el-form ref="userAddFromRef" :model="userAddFrom" :rules="userAddFromRules">
|
|
|
+ <el-form-item prop="userName">
|
|
|
+ <el-input v-model="userAddFrom.userName" autocomplete="off" place holder="请输⼊⽤户名" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="password">
|
|
|
+ <el-input v-model="userAddFrom.password" type="password" autocomp lete="off" placeholder="请输⼊⽤户名" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="fullName">
|
|
|
+ <el-input v-model="userAddFrom.fullName" autocomplete="off" place holder="请输⼊姓名" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item>
|
|
|
+ <el-input v-model="userAddFrom.phoneNumber" autocomplete="off" pl aceholder="请输⼊⼿机号" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item>
|
|
|
+ <el-input v-model="userAddFrom.avatarAddress" autocomplete="off" placeholder="请上传头像" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <template #footer>
|
|
|
+ <div class="dialog-footer">
|
|
|
+ <el-button @click="userStore.dialogFormVisible = false">取消</el-button>
|
|
|
+ <el-button type="primary" @click="handleAdd">
|
|
|
+ 确定
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+</template>
|
|
|
+<style scoped lang="less">
|
|
|
+.data-table-container {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ flex: 1;
|
|
|
+ overflow: hidden;
|
|
|
+
|
|
|
+ .search-from {
|
|
|
+ padding-top: 20px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .operate-buttons {
|
|
|
+ height: 54px;
|
|
|
+ line-height: 54px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .data-table {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ flex: 1;
|
|
|
+ overflow: hidden;
|
|
|
+
|
|
|
+ .table-container {
|
|
|
+ flex: 1;
|
|
|
+ overflow: hidden;
|
|
|
+ }
|
|
|
+
|
|
|
+ .pagination-container {
|
|
|
+ height: 70px;
|
|
|
+ display: flex;
|
|
|
+ justify-content: flex-end;
|
|
|
+ align-items: center;
|
|
|
+ margin-right: 24px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|