123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524 |
- <script setup lang="ts">
- defineOptions({
- // name 作为一种规范最好必须写上并且和路由的name保持一致
- name: "rolePower"
- });
- import { ref, reactive } from "vue";
- import { ElMessageBox, ElMessage } from "element-plus";
- import { Search } from "@element-plus/icons-vue";
- import addRole from "./components/addRole.vue";
- import addPerson from "./components/addPerson.vue";
- import { getDeleteUserApi } from "@/api/userSetting";
- import {
- getMenuList,
- getMenuListCodeForRole,
- postAddMenuList
- } from "@/api/menu";
- import { postPageRole, postDelRole, postPageUserByRole } from "@/api/roles";
- import pngcaret from "@/assets/icon-png/caret-right-small.svg";
- import UserPageTable from "@/components/UserPageTable/index.vue";
- const UserTable = ref();
- // 新增角色
- const addRoleRef = ref();
- const addRoleShow = ref(false);
- // 新增角色组人员
- const addPersonRef = ref();
- const addPersonShow = ref(false);
- const tableData = ref([]);
- interface Role {
- id?: number;
- roleName: string;
- records: Array<string>;
- }
- interface ApiResponse {
- code: number;
- data: {
- records: Role[];
- // 可能还有其他字段,比如 total, page, etc.
- };
- }
- const rolesList = reactive<any>({
- data: [],
- dataUser: [],
- rolesName: "",
- addPerson: {}
- });
- // 角色列表
- let pageSize = reactive({
- pageNumber: 1,
- pageSize: 5
- });
- const load = () => {
- pageSize.pageSize += 5;
- postPageRoleApi();
- };
- const loadSystem = async () => {
- pageSize.pageSize += 5;
- postPageRoleApi();
- };
- // 系统角色
- const postPageRoleApi = async () => {
- const { code, data }: ApiResponse = await postPageRole({
- ...pageSize,
- roleType: "system"
- });
- const res: ApiResponse = await postPageRole({
- ...pageSize,
- roleType: "user"
- });
- if (code === 200) {
- rolesList.data = [];
- data.records.map((item, index) => {
- rolesList.data.push({ ...item, id: index + 2 });
- });
- }
- if (res.code === 200) {
- rolesList.dataUser = [];
- res.data.records.map((item, index) => {
- rolesList.dataUser.push({ ...item, id: index + 3 });
- });
- }
- };
- // 自定义角色
- postPageRoleApi();
- // 查看角色组
- const bgColor = ref(null);
- const lookRoles = item => {
- console.log(item);
- paramsPageUser.roleName = item.roleName;
- paramsPageUser.roleCode = item.roleCode;
- bgColor.value = item.id;
- rolesList.rolesName = item.roleName;
- Object.assign(rolesList.addPerson, item);
- postPageUserByRoleApi();
- getMenuListCodeForRoleApi(item);
- };
- // 添加角色
- const addRoles = () => {
- addRoleRef.value.open();
- addRoleShow.value = true;
- };
- // 编辑角色
- const editRoleName = item => {
- addRoleRef.value.open(item);
- addRoleShow.value = true;
- };
- // 删除角色
- const postDelRoleApi = async item => {
- console.log("item", item);
- const { code } = await postDelRole(item);
- if (code === 200) {
- ElMessage({
- message: "删除成功",
- type: "success"
- });
- postPageRoleApi();
- }
- };
- const deleteRole = item => {
- ElMessageBox.confirm(
- `角色删除后不能恢复,是否确认删除角色【${item.roleName}】吗?`,
- "确认删除角色吗",
- {
- type: "warning"
- }
- )
- .then(() => {
- postDelRoleApi(item);
- })
- .catch(() => {
- // catch error
- ElMessage({
- message: "已取消"
- });
- });
- };
- // 标签选择
- const activeName = ref("first");
- // 添加角色组成员
- const AddRolesPerson = () => {
- if (rolesList.rolesName) {
- addPersonRef.value.open(rolesList.addPerson);
- addPersonShow.value = true;
- } else {
- ElMessage.warning("请先选择角色");
- }
- };
- // 删除角色组成员
- const deltetePerson = item => {
- ElMessageBox.confirm(
- `人员删除后不能恢复,是否确认删除【${item.realName}】吗?`,
- "确认删除人员吗",
- {
- type: "warning"
- }
- )
- .then(() => {
- getDeleteUserApi(item.userCode, postPageUserByRoleApi);
- })
- .catch(() => {
- // catch error
- ElMessage({
- message: "已取消"
- });
- });
- };
- // 成员管理
- const paramsPageUser = reactive({
- pageNumber: 1,
- pageSize: 10,
- roleName: "",
- roleCode: "",
- realName: "",
- userCodes: []
- });
- const total = ref(0);
- const postPageUserByRoleApi = async () => {
- const { code, data } = await postPageUserByRole(paramsPageUser);
- console.log(data);
- if (code === 200) {
- tableData.value = data.records;
- if (data.totalRow) {
- total.value = data.totalRow;
- }
- }
- };
- // 菜单权限
- const handleClick = (tab, event) => {
- console.log(tab, event);
- };
- const getMenuListApi = async () => {
- const { code, data } = await getMenuList();
- console.log("菜单", data);
- };
- getMenuListApi();
- // const postAddMenuListApi = async () => {
- // const { code } = await postAddMenuList({
- // menuName: "指标库",
- // menuType: "menu",
- // parentCode: "",
- // orderNum: 0,
- // url: "",
- // moduleUrl: "/IndexDefine",
- // icon: "",
- // remark: "",
- // menuCode: ""
- // });
- // };
- // postAddMenuListApi();
- // {
- // menuName: "新建模板",
- // menuType: "menu",
- // parentCode: "menu340271989673566208",
- // orderNum: 0,
- // url: "",
- // moduleUrl: "/evaluate/children/change/components/newAdd",
- // icon: "",
- // remark: "",
- // menuCode: ""
- // }
- const getMenuListCodeForRoleApi = async item => {
- console.log("item", item);
- const { code, data } = await getMenuListCodeForRole({
- roleCode: item.roleCode
- });
- // console.log("菜单", data);
- };
- const handleSizeChange = val => {
- paramsPageUser.pageSize = val;
- postPageUserByRoleApi();
- };
- const handleCurrentChange = val => {
- paramsPageUser.pageNumber = val;
- postPageUserByRoleApi();
- };
- </script>
- <template>
- <div class="flex w-full h-full">
- <!-- 新增角色 -->
- <addRole
- ref="addRoleRef"
- v-model="addRoleShow"
- @handleClick="postPageRoleApi"
- />
- <!-- 新增角色组成员 -->
- <addPerson
- ref="addPersonRef"
- v-model="addPersonShow"
- @handeClick="postPageUserByRoleApi"
- />
- <!-- 主体内容 -->
- <div class="box-left">
- <div class="w-[100%]">
- <div><el-text type="info">系统角色</el-text></div>
- </div>
- <!-- v-infinite-scroll="loadSystem" -->
- <div
- v-infinite-scroll="loadSystem"
- infinite-scroll-immediate="false"
- class="h-1/4 w-[100%] overflow-auto infinite-list"
- >
- <div
- v-for="(item, index) in rolesList.data"
- :key="index"
- class="w-[100%] flex justify-between items-center roles-text"
- >
- <pngcaret class="mr-1 mt-2" />
- <div
- :class="[
- 'w-[100%] flex justify-between items-center mt-2 cursor-pointer',
- { 'roles-bg': bgColor === item.id }
- ]"
- >
- <div
- class="flex justify-between items-center"
- @click="lookRoles(item)"
- >
- <span class="">{{ item.roleName }}</span>
- </div>
- <div class="flex justify-between items-center">
- <el-dropdown trigger="click">
- <span>
- <el-icon><Operation /></el-icon>
- </span>
- <template #dropdown>
- <el-dropdown-menu class="setting">
- <el-dropdown-item @click="editRoleName(item)">
- 编辑名称
- </el-dropdown-item>
- <el-dropdown-item>
- <el-link type="danger" @click="deleteRole(item)"
- >删除</el-link
- >
- </el-dropdown-item>
- </el-dropdown-menu>
- </template>
- </el-dropdown>
- </div>
- </div>
- </div>
- </div>
- <el-divider />
- <div class="w-[100%]">
- <div><el-text type="info">自定义角色</el-text></div>
- </div>
- <div
- v-infinite-scroll="load"
- class="h-2/5 w-[100%] overflow-auto infinite-list"
- >
- <div
- v-for="(item, index) in rolesList.dataUser"
- :key="index"
- class="w-[100%] flex justify-between items-center roles-text"
- >
- <pngcaret class="mr-1 mt-2" />
- <div
- :class="[
- 'w-[100%] flex justify-between items-center mt-2 cursor-pointer',
- { 'roles-bg': bgColor === item.id }
- ]"
- >
- <div
- class="flex justify-between items-center"
- @click="lookRoles(item)"
- >
- <span class="">{{ item.roleName }}</span>
- </div>
- <div class="flex justify-between items-center">
- <el-dropdown trigger="click">
- <span>
- <el-icon><Operation /></el-icon>
- </span>
- <template #dropdown>
- <el-dropdown-menu class="setting">
- <Auth :value="['编辑角色']">
- <el-dropdown-item @click="editRoleName(item)">
- 编辑名称
- </el-dropdown-item>
- </Auth>
- <Auth :value="['删除']">
- <el-dropdown-item>
- <el-link type="danger" @click="deleteRole(item)"
- >删除</el-link
- >
- </el-dropdown-item>
- </Auth>
- </el-dropdown-menu>
- </template>
- </el-dropdown>
- </div>
- </div>
- </div>
- </div>
- <el-divider />
- <Auth :value="['新建角色']">
- <el-button type="primary" class="addRole" plain @click="addRoles()"
- >新增角色</el-button
- >
- </Auth>
- </div>
- <!-- <div v-if="rolesList.rolesName" class="box-right"> -->
- <div class="box-right">
- <h3>{{ rolesList.rolesName }}</h3>
- <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
- <el-tab-pane label="成员管理" name="first">
- <div class="flex justify-between mb-3">
- <el-input
- v-model="paramsPageUser.realName"
- placeholder="搜索姓名"
- class="mb-2"
- style="max-width: 300px"
- :prefix-icon="Search"
- @change="postPageUserByRoleApi"
- />
- <Auth :value="['添加成员']">
- <el-button type="primary" @click="AddRolesPerson"
- >添加成员</el-button
- >
- </Auth>
- </div>
- <el-table :data="tableData" style="width: 100%">
- <el-table-column prop="realName" label="姓名" />
- <el-table-column prop="hospitalCode" label="工号" />
- <el-table-column prop="jobTitle" label="职称" />
- <el-table-column prop="dept" label="部门" />
- <el-table-column prop="phone" label="手机号" />
- <el-table-column label="操作">
- <template #default="{ row }">
- <el-dropdown trigger="click" class="mr-2">
- <Auth :value="['移除成员']">
- <el-text type="danger" @click="deltetePerson(row)">
- 移除
- </el-text>
- </Auth>
- </el-dropdown>
- </template>
- </el-table-column>
- </el-table>
- <div class="h-[80px]">
- <div class="float-left mt-3 total">共{{ total }}条数据</div>
- <div class="absolute right-0 mr-20 mt-3">
- <el-pagination
- v-model:current-page="paramsPageUser.pageNumber"
- v-model:page-size="paramsPageUser.pageSize"
- background
- layout="prev, pager, next"
- :total="total"
- @size-change="handleSizeChange"
- @current-change="handleCurrentChange"
- />
- </div>
- </div>
- </el-tab-pane>
- <Auth :value="['权限管理']">
- <el-tab-pane label="权限管理" name="second">
- <el-table :data="tableData" border style="width: 100%">
- <el-table-column prop="date" label="模块">
- <template #default="{ row }">
- <div>
- <input v-model="row.show" type="checkbox" />{{ row.date }}
- <br />
- <input v-model="row.show1" type="checkbox" />{{ row.name }}
- <br />
- <input v-model="row.show2" type="checkbox" />{{
- row.address
- }}
- </div>
- </template>
- </el-table-column>
- <el-table-column prop="name" label="菜单">
- <template #default="{ row }">
- <div>
- <input v-model="row.show" type="checkbox" />{{ row.date }}
- </div>
- <div>
- <input v-model="row.show" type="checkbox" />{{ row.date }}
- </div>
- </template>
- </el-table-column>
- <el-table-column prop="address" label="全选">
- <template #default="{ row }">
- <div>
- <input v-model="row.show" type="checkbox" />{{ row.date }}
- </div>
- </template>
- </el-table-column>
- <el-table-column prop="address" label="权限点">
- <template #default="{ row }">
- <div>
- <input v-model="row.show" type="checkbox" />{{ row.date }}
- </div>
- </template>
- </el-table-column>
- </el-table>
- </el-tab-pane>
- </Auth>
- </el-tabs>
- </div>
- </div>
- </template>
- <style lang="scss" scoped>
- .total {
- font-size: 14px;
- // font-family: PingFangSC-Regular;
- font-weight: 400;
- line-height: 22px;
- color: #0009;
- letter-spacing: 0;
- }
- .box-left {
- position: relative;
- width: 25%;
- // border: 1px solid red;
- height: 100%;
- padding: 10px 20px;
- border-right: 1px solid #999;
- }
- .box-right {
- width: 70%;
- height: 100%;
- padding: 10px 20px;
- }
- .addRole {
- position: absolute;
- bottom: 70px;
- width: calc(100% - 50px);
- }
- .infinite-list {
- -ms-overflow-style: none; /* IE和Edge */
- scrollbar-width: none; /* Firefox */
- // border: 1px solid red;
- }
- /* 隐藏滚动条 */
- .infinite-list::-webkit-scrollbar {
- display: none; /* 对于 Webkit 浏览器(Chrome, Safari等) */
- }
- // ::v-deep .el-dropdown {
- // line-height: 1;
- // }
- // ::v-deep .el-tree-node__expand-icon {
- // line-height: 10px;
- // border: 1px solid red;
- // }
- .roles-bg {
- color: #0052d9;
- background-color: #0053d91a;
- }
- .roles-text {
- font-size: 14px;
- // font-family: PingFangSC-Regular;
- font-weight: 400;
- line-height: 22px;
- color: #000000e6;
- letter-spacing: 0;
- }
- </style>
|