|
|
@@ -1,187 +1,570 @@
|
|
|
<template>
|
|
|
- <div class="tenant-manage-container">
|
|
|
- <!-- 新增租户表单 -->
|
|
|
- <el-form
|
|
|
- ref="tenantFormRef"
|
|
|
- :model="tenantForm"
|
|
|
- :rules="tenantRules"
|
|
|
- label-width="120px"
|
|
|
- class="tenant-form"
|
|
|
+ <el-container class="tenant-manage-container">
|
|
|
+ <el-row :gutter="20" class="layout-wrapper">
|
|
|
+ <!-- 左侧:租户树状结构 -->
|
|
|
+ <el-col :xs="24" :sm="24" :md="6" :lg="6" class="left-panel-col">
|
|
|
+ <el-card class="left-panel" shadow="hover">
|
|
|
+ <template #header>
|
|
|
+ <div class="card-header">
|
|
|
+ <span>租户列表</span>
|
|
|
+ <el-button type="primary" size="small" @click="openAddTenantDialog">
|
|
|
+ 新增租户
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <el-tree
|
|
|
+ ref="treeRef"
|
|
|
+ :data="tenantTreeData"
|
|
|
+ node-key="id"
|
|
|
+ :props="{ children: 'children', label: 'label' }"
|
|
|
+ :expand-on-click-node="false"
|
|
|
+ @node-click="handleNodeClick"
|
|
|
+ highlight-current
|
|
|
+ class="tree-container"
|
|
|
+ />
|
|
|
+ </el-card>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ <!-- 右侧:用户表格 -->
|
|
|
+ <el-col :xs="24" :sm="24" :md="18" :lg="18" class="right-panel-col">
|
|
|
+ <el-card v-if="selectedTenant" class="right-panel" shadow="hover">
|
|
|
+ <template #header>
|
|
|
+ <div class="card-header">
|
|
|
+ <span>{{ selectedTenant.name }} - 用户列表</span>
|
|
|
+ <el-button type="primary" size="small" @click="openAddUserDialog">
|
|
|
+ 新增用户
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <el-table :data="userTableData" stripe border class="user-table" max-height="600">
|
|
|
+ <el-table-column prop="id" label="ID" width="100" />
|
|
|
+ <el-table-column prop="username" label="用户名" width="150" />
|
|
|
+ <el-table-column prop="email" label="邮箱" min-width="200" />
|
|
|
+ <el-table-column prop="status" label="状态" width="100">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-tag :type="row.status === 'active' ? 'success' : 'info'">
|
|
|
+ {{ row.status === 'active' ? '活跃' : '禁用' }}
|
|
|
+ </el-tag>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="操作" width="200" fixed="right" align="center">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-space>
|
|
|
+ <el-button type="primary" size="small" link @click="handleEditUser(row)">
|
|
|
+ 编辑
|
|
|
+ </el-button>
|
|
|
+ <el-button type="danger" size="small" link @click="handleDeleteUser(row)">
|
|
|
+ 删除
|
|
|
+ </el-button>
|
|
|
+ </el-space>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </el-card>
|
|
|
+ <el-empty v-else description="请选择左侧租户查看用户列表" />
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <!-- 新增/编辑租户对话框 -->
|
|
|
+ <el-dialog
|
|
|
+ v-model="tenantDialogVisible"
|
|
|
+ :title="isEditingTenant ? '编辑租户' : '新增租户'"
|
|
|
+ width="500px"
|
|
|
+ @close="resetTenantForm"
|
|
|
>
|
|
|
- <el-form-item label="机构名" prop="name">
|
|
|
- <el-input v-model="tenantForm.name" placeholder="请输入机构名" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="机构简介" prop="introduction">
|
|
|
- <el-input
|
|
|
- v-model="tenantForm.introduction"
|
|
|
- type="textarea"
|
|
|
- :maxlength="512"
|
|
|
- show-word-limit
|
|
|
- placeholder="请输入机构简介(512字内)"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="机构地址" prop="address">
|
|
|
- <el-input v-model="tenantForm.address" placeholder="请输入机构地址" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item>
|
|
|
- <el-button type="primary" @click="submitTenantForm">新增租户</el-button>
|
|
|
- </el-form-item>
|
|
|
- </el-form>
|
|
|
-
|
|
|
- <!-- 新增用户表单(显示在新增租户成功后) -->
|
|
|
- <el-form
|
|
|
- v-if="showUserForm"
|
|
|
- ref="userFormRef"
|
|
|
- :model="userForm"
|
|
|
- :rules="userRules"
|
|
|
- label-width="120px"
|
|
|
- class="user-form"
|
|
|
+ <el-form ref="tenantFormRef" :model="tenantForm" :rules="tenantRules" label-width="100px">
|
|
|
+ <el-form-item label="机构名" prop="name">
|
|
|
+ <el-input v-model="tenantForm.name" placeholder="请输入机构名" clearable />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="机构简介" prop="introduction">
|
|
|
+ <el-input
|
|
|
+ v-model="tenantForm.introduction"
|
|
|
+ type="textarea"
|
|
|
+ :maxlength="512"
|
|
|
+ show-word-limit
|
|
|
+ placeholder="请输入机构简介(512字内)"
|
|
|
+ clearable
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="机构地址" prop="address">
|
|
|
+ <el-input v-model="tenantForm.address" placeholder="请输入机构地址" clearable />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <template #footer>
|
|
|
+ <el-space>
|
|
|
+ <el-button @click="tenantDialogVisible = false">取消</el-button>
|
|
|
+ <el-button type="primary" @click="submitTenantForm">确定</el-button>
|
|
|
+ </el-space>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <!-- 新增/编辑用户对话框 -->
|
|
|
+ <el-dialog
|
|
|
+ v-model="userDialogVisible"
|
|
|
+ :title="isEditingUser ? '编辑用户' : '新增用户'"
|
|
|
+ width="500px"
|
|
|
+ @close="resetUserForm"
|
|
|
>
|
|
|
- <el-form-item label="用户名" prop="username">
|
|
|
- <el-input v-model="userForm.username" placeholder="请输入用户名" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="密码" prop="password">
|
|
|
- <el-input
|
|
|
- v-model="userForm.password"
|
|
|
- type="password"
|
|
|
- placeholder="请输入密码"
|
|
|
- show-password
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="机构ID" prop="organizationId">
|
|
|
- <el-input
|
|
|
- v-model="userForm.organizationId"
|
|
|
- placeholder="新增租户后会生成机构ID"
|
|
|
- disabled
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item>
|
|
|
- <el-button type="primary" @click="submitUserForm">新增用户</el-button>
|
|
|
- </el-form-item>
|
|
|
- </el-form>
|
|
|
- </div>
|
|
|
+ <el-form ref="userFormRef" :model="userForm" :rules="userRules" label-width="100px">
|
|
|
+ <el-form-item label="用户名" prop="username">
|
|
|
+ <el-input v-model="userForm.username" placeholder="请输入用户名" clearable />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="邮箱" prop="email">
|
|
|
+ <el-input v-model="userForm.email" placeholder="请输入邮箱" clearable />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item v-if="!isEditingUser" label="密码" prop="password">
|
|
|
+ <el-input
|
|
|
+ v-model="userForm.password"
|
|
|
+ type="password"
|
|
|
+ placeholder="请输入密码"
|
|
|
+ show-password
|
|
|
+ clearable
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="状态" prop="status">
|
|
|
+ <el-select v-model="userForm.status" placeholder="请选择状态" clearable>
|
|
|
+ <el-option label="活跃" value="active" />
|
|
|
+ <el-option label="禁用" value="disabled" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <template #footer>
|
|
|
+ <el-space>
|
|
|
+ <el-button @click="userDialogVisible = false">取消</el-button>
|
|
|
+ <el-button type="primary" @click="submitUserForm">确定</el-button>
|
|
|
+ </el-space>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+ </el-container>
|
|
|
</template>
|
|
|
|
|
|
<script lang="ts" setup>
|
|
|
-import { ref, reactive } from "vue";
|
|
|
-import type { FormInstance, FormRules } from "element-plus";
|
|
|
-import { ElMessage } from "element-plus";
|
|
|
+import { ref, reactive } from 'vue'
|
|
|
+import type { FormInstance, FormRules } from 'element-plus'
|
|
|
+import { ElMessage, ElMessageBox } from 'element-plus'
|
|
|
|
|
|
// 表单引用
|
|
|
-const tenantFormRef = ref<FormInstance>();
|
|
|
-const userFormRef = ref<FormInstance>();
|
|
|
+const tenantFormRef = ref<FormInstance>()
|
|
|
+const userFormRef = ref<FormInstance>()
|
|
|
+const treeRef = ref()
|
|
|
+
|
|
|
+// 租户数据接口
|
|
|
+interface Tenant {
|
|
|
+ id: string
|
|
|
+ name: string
|
|
|
+ introduction: string
|
|
|
+ address: string
|
|
|
+ children?: Tenant[]
|
|
|
+}
|
|
|
+
|
|
|
+// 树节点数据接口
|
|
|
+interface TreeNode {
|
|
|
+ id: string
|
|
|
+ label: string
|
|
|
+ children?: TreeNode[]
|
|
|
+ data?: Tenant
|
|
|
+}
|
|
|
+
|
|
|
+// 用户数据接口
|
|
|
+interface User {
|
|
|
+ id: string
|
|
|
+ username: string
|
|
|
+ email: string
|
|
|
+ password?: string
|
|
|
+ status: 'active' | 'disabled'
|
|
|
+ tenantId: string
|
|
|
+}
|
|
|
|
|
|
// 租户表单数据
|
|
|
interface TenantForm {
|
|
|
- name: string;
|
|
|
- introduction: string;
|
|
|
- address: string;
|
|
|
+ id?: string
|
|
|
+ name: string
|
|
|
+ introduction: string
|
|
|
+ address: string
|
|
|
}
|
|
|
|
|
|
// 用户表单数据
|
|
|
interface UserForm {
|
|
|
- username: string;
|
|
|
- password: string;
|
|
|
- organizationId: string;
|
|
|
+ id?: string
|
|
|
+ username: string
|
|
|
+ email: string
|
|
|
+ password: string
|
|
|
+ status: 'active' | 'disabled'
|
|
|
+ tenantId: string
|
|
|
}
|
|
|
|
|
|
+// 租户树数据
|
|
|
+const tenantTreeData = ref<TreeNode[]>([
|
|
|
+ {
|
|
|
+ id: 'tenant-1',
|
|
|
+ label: 'A公司',
|
|
|
+ data: {
|
|
|
+ id: 'tenant-1',
|
|
|
+ name: 'A公司',
|
|
|
+ introduction: '这是A公司的介绍',
|
|
|
+ address: '北京市朝阳区'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'tenant-2',
|
|
|
+ label: 'B公司',
|
|
|
+ data: {
|
|
|
+ id: 'tenant-2',
|
|
|
+ name: 'B公司',
|
|
|
+ introduction: '这是B公司的介绍',
|
|
|
+ address: '上海市浦东新区'
|
|
|
+ }
|
|
|
+ }
|
|
|
+])
|
|
|
+
|
|
|
+// 用户表格数据
|
|
|
+const userTableData = ref<User[]>([
|
|
|
+ {
|
|
|
+ id: 'user-1',
|
|
|
+ username: 'admin',
|
|
|
+ email: 'admin@example.com',
|
|
|
+ status: 'active',
|
|
|
+ tenantId: 'tenant-1'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'user-2',
|
|
|
+ username: 'user1',
|
|
|
+ email: 'user1@example.com',
|
|
|
+ status: 'active',
|
|
|
+ tenantId: 'tenant-1'
|
|
|
+ }
|
|
|
+])
|
|
|
+
|
|
|
+// 选中的租户
|
|
|
+const selectedTenant = ref<Tenant | null>(null)
|
|
|
+
|
|
|
+// 对话框显示状态
|
|
|
+const tenantDialogVisible = ref(false)
|
|
|
+const userDialogVisible = ref(false)
|
|
|
+
|
|
|
+// 编辑状态
|
|
|
+const isEditingTenant = ref(false)
|
|
|
+const isEditingUser = ref(false)
|
|
|
+
|
|
|
// 租户表单数据和验证规则
|
|
|
const tenantForm = reactive<TenantForm>({
|
|
|
- name: "",
|
|
|
- introduction: "",
|
|
|
- address: "",
|
|
|
-});
|
|
|
+ name: '',
|
|
|
+ introduction: '',
|
|
|
+ address: ''
|
|
|
+})
|
|
|
|
|
|
const tenantRules = reactive<FormRules>({
|
|
|
name: [
|
|
|
- { required: true, message: "请输入机构名", trigger: "blur" },
|
|
|
- { min: 2, max: 20, message: "长度在 2 到 20 个字符", trigger: "blur" },
|
|
|
+ { required: true, message: '请输入机构名', trigger: 'blur' },
|
|
|
+ { min: 2, max: 50, message: '长度在 2 到 50 个字符', trigger: 'blur' }
|
|
|
],
|
|
|
introduction: [
|
|
|
- { required: true, message: "请输入机构简介", trigger: "blur" },
|
|
|
- { max: 512, message: "机构简介不能超过512个字", trigger: "blur" },
|
|
|
+ { required: true, message: '请输入机构简介', trigger: 'blur' },
|
|
|
+ { max: 512, message: '机构简介不能超过512个字', trigger: 'blur' }
|
|
|
],
|
|
|
address: [
|
|
|
- { required: true, message: "请输入机构地址", trigger: "blur" },
|
|
|
- { min: 5, max: 100, message: "长度在 5 到 100 个字符", trigger: "blur" },
|
|
|
- ],
|
|
|
-});
|
|
|
+ { required: true, message: '请输入机构地址', trigger: 'blur' },
|
|
|
+ { min: 5, max: 100, message: '长度在 5 到 100 个字符', trigger: 'blur' }
|
|
|
+ ]
|
|
|
+})
|
|
|
|
|
|
// 用户表单数据和验证规则
|
|
|
const userForm = reactive<UserForm>({
|
|
|
- username: "",
|
|
|
- password: "",
|
|
|
- organizationId: "",
|
|
|
-});
|
|
|
+ username: '',
|
|
|
+ email: '',
|
|
|
+ password: '',
|
|
|
+ status: 'active',
|
|
|
+ tenantId: ''
|
|
|
+})
|
|
|
|
|
|
const userRules = reactive<FormRules>({
|
|
|
username: [
|
|
|
- { required: true, message: "请输入用户名", trigger: "blur" },
|
|
|
- { min: 3, max: 20, message: "长度在 3 到 20 个字符", trigger: "blur" },
|
|
|
+ { required: true, message: '请输入用户名', trigger: 'blur' },
|
|
|
+ { min: 3, max: 20, message: '长度在 3 到 20 个字符', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ email: [
|
|
|
+ { required: true, message: '请输入邮箱', trigger: 'blur' },
|
|
|
+ { type: 'email', message: '请输入正确的邮箱格式', trigger: 'blur' }
|
|
|
],
|
|
|
password: [
|
|
|
- { required: true, message: "请输入密码", trigger: "blur" },
|
|
|
- { min: 6, max: 20, message: "长度在 6 到 20 个字符", trigger: "blur" },
|
|
|
+ { required: true, message: '请输入密码', trigger: 'blur' },
|
|
|
+ { min: 6, max: 20, message: '长度在 6 到 20 个字符', trigger: 'blur' }
|
|
|
],
|
|
|
- organizationId: [{ required: true, message: "请输入机构ID", trigger: "blur" }],
|
|
|
-});
|
|
|
+ status: [{ required: true, message: '请选择状态', trigger: 'change' }]
|
|
|
+})
|
|
|
+
|
|
|
+// 模拟生成ID
|
|
|
+const generateId = (prefix: string): string => {
|
|
|
+ return prefix + '-' + Math.random().toString(36).substr(2, 9)
|
|
|
+}
|
|
|
+
|
|
|
+// 处理树节点点击
|
|
|
+const handleNodeClick = (data: TreeNode) => {
|
|
|
+ selectedTenant.value = data.data || null
|
|
|
+ // 根据选中的租户ID过滤用户列表
|
|
|
+ if (selectedTenant.value) {
|
|
|
+ userTableData.value = userTableData.value.filter(
|
|
|
+ (user) => user.tenantId === selectedTenant.value!.id
|
|
|
+ )
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 打开新增租户对话框
|
|
|
+const openAddTenantDialog = () => {
|
|
|
+ isEditingTenant.value = false
|
|
|
+ resetTenantForm()
|
|
|
+ tenantDialogVisible.value = true
|
|
|
+}
|
|
|
|
|
|
-// 控制用户表单的显示
|
|
|
-const showUserForm = ref(false);
|
|
|
+// 打开新增用户对话框
|
|
|
+const openAddUserDialog = () => {
|
|
|
+ if (!selectedTenant.value) {
|
|
|
+ ElMessage.warning('请先选择一个租户')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ isEditingUser.value = false
|
|
|
+ resetUserForm()
|
|
|
+ userForm.tenantId = selectedTenant.value.id
|
|
|
+ userDialogVisible.value = true
|
|
|
+}
|
|
|
|
|
|
-// 模拟生成机构ID
|
|
|
-const generateOrgId = (): string => {
|
|
|
- return "ORG_" + Math.random().toString(36).substr(2, 9).toUpperCase();
|
|
|
-};
|
|
|
+// 重置租户表单
|
|
|
+const resetTenantForm = () => {
|
|
|
+ tenantForm.id = undefined
|
|
|
+ tenantForm.name = ''
|
|
|
+ tenantForm.introduction = ''
|
|
|
+ tenantForm.address = ''
|
|
|
+ tenantFormRef.value?.clearValidate()
|
|
|
+}
|
|
|
+
|
|
|
+// 重置用户表单
|
|
|
+const resetUserForm = () => {
|
|
|
+ userForm.id = undefined
|
|
|
+ userForm.username = ''
|
|
|
+ userForm.email = ''
|
|
|
+ userForm.password = ''
|
|
|
+ userForm.status = 'active'
|
|
|
+ userForm.tenantId = ''
|
|
|
+ userFormRef.value?.clearValidate()
|
|
|
+}
|
|
|
|
|
|
// 提交租户表单
|
|
|
const submitTenantForm = async () => {
|
|
|
- if (!tenantFormRef.value) return;
|
|
|
+ if (!tenantFormRef.value) return
|
|
|
try {
|
|
|
await tenantFormRef.value.validate((valid) => {
|
|
|
if (valid) {
|
|
|
- // 这里应该是API调用
|
|
|
- console.log("提交租户表单:", tenantForm);
|
|
|
- userForm.organizationId = generateOrgId();
|
|
|
- showUserForm.value = true;
|
|
|
- ElMessage.success("租户创建成功!");
|
|
|
+ if (isEditingTenant.value) {
|
|
|
+ // 编辑租户
|
|
|
+ const index = tenantTreeData.value.findIndex((t) => t.id === tenantForm.id)
|
|
|
+ if (index > -1) {
|
|
|
+ tenantTreeData.value[index].label = tenantForm.name
|
|
|
+ tenantTreeData.value[index].data = {
|
|
|
+ id: tenantForm.id!,
|
|
|
+ name: tenantForm.name,
|
|
|
+ introduction: tenantForm.introduction,
|
|
|
+ address: tenantForm.address
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ElMessage.success('租户编辑成功!')
|
|
|
+ } else {
|
|
|
+ // 新增租户
|
|
|
+ const newId = generateId('tenant')
|
|
|
+ const newTenant: TreeNode = {
|
|
|
+ id: newId,
|
|
|
+ label: tenantForm.name,
|
|
|
+ data: {
|
|
|
+ id: newId,
|
|
|
+ name: tenantForm.name,
|
|
|
+ introduction: tenantForm.introduction,
|
|
|
+ address: tenantForm.address
|
|
|
+ }
|
|
|
+ }
|
|
|
+ tenantTreeData.value.push(newTenant)
|
|
|
+ ElMessage.success('租户创建成功!')
|
|
|
+ }
|
|
|
+ tenantDialogVisible.value = false
|
|
|
+ resetTenantForm()
|
|
|
}
|
|
|
- });
|
|
|
+ })
|
|
|
} catch (error) {
|
|
|
- console.error("租户表单验证失败:", error);
|
|
|
- ElMessage.error("请检查租户表单输入");
|
|
|
+ console.error('租户表单验证失败:', error)
|
|
|
+ ElMessage.error('请检查租户表单输入')
|
|
|
}
|
|
|
-};
|
|
|
+}
|
|
|
+
|
|
|
+// 处理编辑用户
|
|
|
+const handleEditUser = (row: User) => {
|
|
|
+ isEditingUser.value = true
|
|
|
+ userForm.id = row.id
|
|
|
+ userForm.username = row.username
|
|
|
+ userForm.email = row.email
|
|
|
+ userForm.status = row.status
|
|
|
+ userForm.tenantId = row.tenantId
|
|
|
+ userForm.password = ''
|
|
|
+ userDialogVisible.value = true
|
|
|
+}
|
|
|
+
|
|
|
+// 处理删除用户
|
|
|
+const handleDeleteUser = (row: User) => {
|
|
|
+ ElMessageBox.confirm('确定删除该用户吗?', '提示', {
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning'
|
|
|
+ })
|
|
|
+ .then(() => {
|
|
|
+ const index = userTableData.value.findIndex((u) => u.id === row.id)
|
|
|
+ if (index > -1) {
|
|
|
+ userTableData.value.splice(index, 1)
|
|
|
+ }
|
|
|
+ ElMessage.success('用户删除成功!')
|
|
|
+ })
|
|
|
+ .catch(() => {
|
|
|
+ ElMessage.info('已取消删除')
|
|
|
+ })
|
|
|
+}
|
|
|
|
|
|
// 提交用户表单
|
|
|
const submitUserForm = async () => {
|
|
|
- if (!userFormRef.value) return;
|
|
|
+ if (!userFormRef.value) return
|
|
|
try {
|
|
|
await userFormRef.value.validate((valid) => {
|
|
|
if (valid) {
|
|
|
- // 这里应该是API调用
|
|
|
- console.log("提交用户表单:", userForm);
|
|
|
- ElMessage.success("用户创建成功!");
|
|
|
+ if (isEditingUser.value) {
|
|
|
+ // 编辑用户
|
|
|
+ const index = userTableData.value.findIndex((u) => u.id === userForm.id)
|
|
|
+ if (index > -1) {
|
|
|
+ userTableData.value[index] = {
|
|
|
+ id: userForm.id!,
|
|
|
+ username: userForm.username,
|
|
|
+ email: userForm.email,
|
|
|
+ status: userForm.status,
|
|
|
+ tenantId: userForm.tenantId
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ElMessage.success('用户编辑成功!')
|
|
|
+ } else {
|
|
|
+ // 新增用户
|
|
|
+ const newUser: User = {
|
|
|
+ id: generateId('user'),
|
|
|
+ username: userForm.username,
|
|
|
+ email: userForm.email,
|
|
|
+ status: userForm.status,
|
|
|
+ tenantId: userForm.tenantId
|
|
|
+ }
|
|
|
+ userTableData.value.push(newUser)
|
|
|
+ ElMessage.success('用户创建成功!')
|
|
|
+ }
|
|
|
+ userDialogVisible.value = false
|
|
|
+ resetUserForm()
|
|
|
}
|
|
|
- });
|
|
|
+ })
|
|
|
} catch (error) {
|
|
|
- console.error("用户表单验证失败:", error);
|
|
|
- ElMessage.error("请检查用户表单输入");
|
|
|
+ console.error('用户表单验证失败:', error)
|
|
|
+ ElMessage.error('请检查用户表单输入')
|
|
|
}
|
|
|
-};
|
|
|
+}
|
|
|
</script>
|
|
|
|
|
|
<style scoped>
|
|
|
.tenant-manage-container {
|
|
|
padding: 20px;
|
|
|
+ height: 100%;
|
|
|
+ width: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+.layout-wrapper {
|
|
|
+ width: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+.left-panel-col {
|
|
|
+ margin-bottom: 20px;
|
|
|
+}
|
|
|
+
|
|
|
+.left-panel {
|
|
|
+ height: 100%;
|
|
|
+ min-height: 500px;
|
|
|
+}
|
|
|
+
|
|
|
+.right-panel {
|
|
|
+ height: 100%;
|
|
|
+ min-height: 500px;
|
|
|
+}
|
|
|
+
|
|
|
+.card-header {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ width: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+.card-header span {
|
|
|
+ font-weight: 600;
|
|
|
+ font-size: 14px;
|
|
|
+}
|
|
|
+
|
|
|
+.tree-container {
|
|
|
+ max-height: 600px;
|
|
|
+ overflow-y: auto;
|
|
|
+}
|
|
|
+
|
|
|
+.user-table {
|
|
|
+ width: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+/* Element Plus 组件样式调整 */
|
|
|
+:deep(.el-card__header) {
|
|
|
+ padding: 15px 20px;
|
|
|
+ border-bottom: 1px solid #ebeef5;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.el-card__body) {
|
|
|
+ padding: 20px;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.el-tree) {
|
|
|
+ background-color: transparent;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.el-tree-node__content) {
|
|
|
+ height: 32px;
|
|
|
}
|
|
|
|
|
|
-.tenant-form {
|
|
|
- max-width: 600px;
|
|
|
- margin-bottom: 40px;
|
|
|
+:deep(.el-table) {
|
|
|
+ font-size: 13px;
|
|
|
}
|
|
|
|
|
|
-.user-form {
|
|
|
- max-width: 600px;
|
|
|
+:deep(.el-table__body-wrapper) {
|
|
|
+ max-height: 600px;
|
|
|
+ overflow-y: auto;
|
|
|
+}
|
|
|
+
|
|
|
+/* 响应式设计 */
|
|
|
+@media (max-width: 1200px) {
|
|
|
+ .left-panel {
|
|
|
+ min-height: 400px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .right-panel {
|
|
|
+ min-height: 400px;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+@media (max-width: 768px) {
|
|
|
+ .tenant-manage-container {
|
|
|
+ padding: 10px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .left-panel {
|
|
|
+ min-height: 300px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .right-panel {
|
|
|
+ min-height: 400px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .left-panel-col {
|
|
|
+ margin-bottom: 20px;
|
|
|
+ }
|
|
|
}
|
|
|
</style>
|