| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- import dayjs from "dayjs";
- import editForm from "../form.vue";
- import { handleTree } from "@/utils/tree";
- import { message } from "@/utils/message";
- import { ElMessageBox } from "element-plus";
- import { usePublicHooks } from "../../hooks";
- import { transformI18n } from "@/plugins/i18n";
- import { addDialog } from "@/components/ReDialog";
- import type { FormItemProps } from "../utils/types";
- import type { PaginationProps } from "@pureadmin/table";
- import { getKeyList, deviceDetection } from "@pureadmin/utils";
- import { getRoleList, getRoleMenu, getRoleMenuIds } from "@/api/system";
- import { type Ref, reactive, ref, onMounted, h, toRaw, watch } from "vue";
- export function useRole(treeRef: Ref) {
- const form = reactive({
- name: "",
- code: "",
- status: ""
- });
- const curRow = ref();
- const formRef = ref();
- const dataList = ref([]);
- const treeIds = ref([]);
- const treeData = ref([]);
- const isShow = ref(false);
- const loading = ref(true);
- const isLinkage = ref(false);
- const treeSearchValue = ref();
- const switchLoadMap = ref({});
- const isExpandAll = ref(false);
- const isSelectAll = ref(false);
- const { switchStyle } = usePublicHooks();
- const treeProps = {
- value: "id",
- label: "title",
- children: "children"
- };
- const pagination = reactive<PaginationProps>({
- total: 0,
- pageSize: 10,
- currentPage: 1,
- background: true
- });
- const columns: TableColumnList = [
- {
- label: "角色编号",
- prop: "id"
- },
- {
- label: "角色名称",
- prop: "name"
- },
- {
- label: "角色标识",
- prop: "code"
- },
- {
- label: "状态",
- cellRenderer: scope => (
- <el-switch
- size={scope.props.size === "small" ? "small" : "default"}
- loading={switchLoadMap.value[scope.index]?.loading}
- v-model={scope.row.status}
- active-value={1}
- inactive-value={0}
- active-text="已启用"
- inactive-text="已停用"
- inline-prompt
- style={switchStyle.value}
- onChange={() => onChange(scope as any)}
- />
- ),
- minWidth: 90
- },
- {
- label: "备注",
- prop: "remark",
- minWidth: 160
- },
- {
- label: "创建时间",
- prop: "createTime",
- minWidth: 160,
- formatter: ({ createTime }) =>
- dayjs(createTime).format("YYYY-MM-DD HH:mm:ss")
- },
- {
- label: "操作",
- fixed: "right",
- width: 210,
- slot: "operation"
- }
- ];
- // const buttonClass = computed(() => {
- // return [
- // "h-[20px]!",
- // "reset-margin",
- // "text-gray-500!",
- // "dark:text-white!",
- // "dark:hover:text-primary!"
- // ];
- // });
- function onChange({ row, index }) {
- ElMessageBox.confirm(
- `确认要<strong>${
- row.status === 0 ? "停用" : "启用"
- }</strong><strong style='color:var(--el-color-primary)'>${
- row.name
- }</strong>吗?`,
- "系统提示",
- {
- confirmButtonText: "确定",
- cancelButtonText: "取消",
- type: "warning",
- dangerouslyUseHTMLString: true,
- draggable: true
- }
- )
- .then(() => {
- switchLoadMap.value[index] = Object.assign(
- {},
- switchLoadMap.value[index],
- {
- loading: true
- }
- );
- setTimeout(() => {
- switchLoadMap.value[index] = Object.assign(
- {},
- switchLoadMap.value[index],
- {
- loading: false
- }
- );
- message(`已${row.status === 0 ? "停用" : "启用"}${row.name}`, {
- type: "success"
- });
- }, 300);
- })
- .catch(() => {
- row.status === 0 ? (row.status = 1) : (row.status = 0);
- });
- }
- function handleDelete(row) {
- message(`您删除了角色名称为${row.name}的这条数据`, { type: "success" });
- onSearch();
- }
- function handleSizeChange(val: number) {
- console.log(`${val} items per page`);
- }
- function handleCurrentChange(val: number) {
- console.log(`current page: ${val}`);
- }
- function handleSelectionChange(val) {
- console.log("handleSelectionChange", val);
- }
- async function onSearch() {
- loading.value = true;
- const { data } = await getRoleList(toRaw(form));
- dataList.value = data.list;
- pagination.total = data.total;
- pagination.pageSize = data.pageSize;
- pagination.currentPage = data.currentPage;
- setTimeout(() => {
- loading.value = false;
- }, 500);
- }
- const resetForm = formEl => {
- if (!formEl) return;
- formEl.resetFields();
- onSearch();
- };
- function openDialog(title = "新增", row?: FormItemProps) {
- addDialog({
- title: `${title}角色`,
- props: {
- formInline: {
- name: row?.name ?? "",
- code: row?.code ?? "",
- remark: row?.remark ?? ""
- }
- },
- width: "40%",
- draggable: true,
- fullscreen: deviceDetection(),
- fullscreenIcon: true,
- closeOnClickModal: false,
- contentRenderer: () => h(editForm, { ref: formRef, formInline: null }),
- beforeSure: (done, { options }) => {
- const FormRef = formRef.value.getRef();
- const curData = options.props.formInline as FormItemProps;
- function chores() {
- message(`您${title}了角色名称为${curData.name}的这条数据`, {
- type: "success"
- });
- done(); // 关闭弹框
- onSearch(); // 刷新表格数据
- }
- FormRef.validate(valid => {
- if (valid) {
- console.log("curData", curData);
- // 表单规则校验通过
- if (title === "新增") {
- // 实际开发先调用新增接口,再进行下面操作
- chores();
- } else {
- // 实际开发先调用修改接口,再进行下面操作
- chores();
- }
- }
- });
- }
- });
- }
- /** 菜单权限 */
- async function handleMenu(row?: any) {
- const { id } = row;
- if (id) {
- curRow.value = row;
- isShow.value = true;
- const { data } = await getRoleMenuIds({ id });
- treeRef.value.setCheckedKeys(data);
- } else {
- curRow.value = null;
- isShow.value = false;
- }
- }
- /** 高亮当前权限选中行 */
- function rowStyle({ row: { id } }) {
- return {
- cursor: "pointer",
- background: id === curRow.value?.id ? "var(--el-fill-color-light)" : ""
- };
- }
- /** 菜单权限-保存 */
- function handleSave() {
- const { id, name } = curRow.value;
- // 根据用户 id 调用实际项目中菜单权限修改接口
- console.log(id, treeRef.value.getCheckedKeys());
- message(`角色名称为${name}的菜单权限修改成功`, {
- type: "success"
- });
- }
- /** 数据权限 可自行开发 */
- // function handleDatabase() {}
- const onQueryChanged = (query: string) => {
- treeRef.value!.filter(query);
- };
- const filterMethod = (query: string, node) => {
- return transformI18n(node.title)!.includes(query);
- };
- onMounted(async () => {
- onSearch();
- const { data } = await getRoleMenu();
- treeIds.value = getKeyList(data, "id");
- treeData.value = handleTree(data);
- });
- watch(isExpandAll, val => {
- val
- ? treeRef.value.setExpandedKeys(treeIds.value)
- : treeRef.value.setExpandedKeys([]);
- });
- watch(isSelectAll, val => {
- val
- ? treeRef.value.setCheckedKeys(treeIds.value)
- : treeRef.value.setCheckedKeys([]);
- });
- return {
- form,
- isShow,
- curRow,
- loading,
- columns,
- rowStyle,
- dataList,
- treeData,
- treeProps,
- isLinkage,
- pagination,
- isExpandAll,
- isSelectAll,
- treeSearchValue,
- // buttonClass,
- onSearch,
- resetForm,
- openDialog,
- handleMenu,
- handleSave,
- handleDelete,
- filterMethod,
- transformI18n,
- onQueryChanged,
- // handleDatabase,
- handleSizeChange,
- handleCurrentChange,
- handleSelectionChange
- };
- }
|