From fcf7e374048de27ffd9c4423e28a944394626554 Mon Sep 17 00:00:00 2001 From: wang_yp <357754663@qq.com> Date: Tue, 8 Apr 2025 12:24:31 +0800 Subject: [PATCH] fix(im) --- src/components/layout/layout.tsx | 4 +- src/components/layout/layout_config.ts | 18 ++-- src/pages/dashbord/index.tsx | 6 +- src/pages/dep/index.tsx | 50 ++++++++++ src/pages/dep/permission.less | 8 ++ src/pages/dep/permission_config.tsx | 97 +++++++++++++++++++ src/pages/menu/{menu.tsx => index.tsx} | 8 +- src/pages/menu/menu_config.tsx | 66 ++----------- .../permission/{permission.tsx => index.tsx} | 0 src/pages/role/{role.tsx => index.tsx} | 8 +- src/pages/role/role_config.tsx | 2 +- src/pages/source/source.tsx | 62 +++++++----- src/router/index.tsx | 18 +++- src/service/user_config.ts | 19 +++- src/store/index.ts | 6 +- src/store/menu.ts | 15 +++ src/store/role.ts | 15 +++ src/store/user.ts | 4 +- src/util/xmsx.ts | 55 +++++++++++ 19 files changed, 352 insertions(+), 109 deletions(-) create mode 100644 src/pages/dep/index.tsx create mode 100644 src/pages/dep/permission.less create mode 100644 src/pages/dep/permission_config.tsx rename src/pages/menu/{menu.tsx => index.tsx} (90%) rename src/pages/permission/{permission.tsx => index.tsx} (100%) rename src/pages/role/{role.tsx => index.tsx} (90%) create mode 100644 src/store/menu.ts create mode 100644 src/store/role.ts create mode 100644 src/util/xmsx.ts diff --git a/src/components/layout/layout.tsx b/src/components/layout/layout.tsx index 6049717..797d380 100644 --- a/src/components/layout/layout.tsx +++ b/src/components/layout/layout.tsx @@ -24,7 +24,7 @@ const LayOut = (props: Store) => { }; const logoStyle = { width: 60, color: "white" }; const contentstyle = { - padding: 12, + padding: "12px 0px 12px 12px", margin: 0, minHeight: 280, background: colorBgContainer, @@ -45,7 +45,7 @@ const LayOut = (props: Store) => { return (
-
logo
+
黄甲数据
{ console.log(e.key==="loginout") if (e.key==="loginout"){ diff --git a/src/components/layout/layout_config.ts b/src/components/layout/layout_config.ts index bf25eaf..87dbc10 100644 --- a/src/components/layout/layout_config.ts +++ b/src/components/layout/layout_config.ts @@ -14,18 +14,20 @@ export const items = [ children: [{ label: "数据管理", key: "/source/list" }], }, { - key: "/permission", + key: "/permi", label: `权限管理`, children: [ - { label: `角色管理`, key: "/permission/role" }, - { label: `菜单管理`, key: "/permission/menu" }, + { label: `权限管理`, key: "/permi/permi" }, + { label: `角色管理`, key: "/permi/role" }, + { label: `菜单管理`, key: "/permi/menu" }, + { label: `部门管理`, key: "/permi/dep" } ], }, - { - key: "/sys", - label: `系统管理`, - children: [{ label: `部门管理`, key: "/dep" }], - }, + // { + // key: "/sys", + // label: `系统管理`, + // children: [], + // }, ]; export const headItems = [ diff --git a/src/pages/dashbord/index.tsx b/src/pages/dashbord/index.tsx index 8014209..ccb7332 100644 --- a/src/pages/dashbord/index.tsx +++ b/src/pages/dashbord/index.tsx @@ -1,4 +1,4 @@ -import { Button, Space } from "antd"; +import { Space } from "antd"; import { inject, observer } from "mobx-react"; import { Store } from "antd/lib/form/interface"; import React from "react"; @@ -8,9 +8,7 @@ const Dashbord = (props: Store) => { return (
- + 数据看板
); diff --git a/src/pages/dep/index.tsx b/src/pages/dep/index.tsx new file mode 100644 index 0000000..d2198cd --- /dev/null +++ b/src/pages/dep/index.tsx @@ -0,0 +1,50 @@ +import { Button, Space, Modal, FormInstance } from "antd"; +import { inject, observer } from "mobx-react"; +import BTable from "@/components/b_table"; +import { useEffect, useState } from "react"; +import { Store } from "antd/lib/form/interface"; +import React from "react"; +import { columns } from "./permission_config"; +import "./permission.less"; + +const Dep = (props: Store) => { + const { usrStore } = props; + const [isModalOpen, setIsModalOpen] = useState(false); + const formRef = React.useRef(null); + const [userId, setId] = useState(null); + + useEffect(() => {}, []); + + const addHandler = () => {}; + return ( +
+ + + + + formRef.current?.resetFields()} + onOk={() => formRef.current?.submit()} + okText="确定" + cancelText="取消" + onCancel={() => { + setId(null); + setIsModalOpen(false); + }} + > + +
+ ); +}; + +export default inject("usrStore")(observer(Dep)); diff --git a/src/pages/dep/permission.less b/src/pages/dep/permission.less new file mode 100644 index 0000000..4a4054f --- /dev/null +++ b/src/pages/dep/permission.less @@ -0,0 +1,8 @@ +.contentBox{ + overflow-y: auto; + height: 100%; + .tableName{ + height: 100%; + overflow-y: auto; + } +} \ No newline at end of file diff --git a/src/pages/dep/permission_config.tsx b/src/pages/dep/permission_config.tsx new file mode 100644 index 0000000..34761da --- /dev/null +++ b/src/pages/dep/permission_config.tsx @@ -0,0 +1,97 @@ +import { FormType } from "@/components/form/interface"; +import { UserDataType } from "@/model/userModel"; +import { ColumnsType } from "antd/lib/table"; +import { Image } from "antd"; +import { getBirthDateAndGender } from "@/util/util"; +export const defaultConfig = (team, per) => [ + { + type: FormType.input, + label: "用户名", + name: "user_name", + value: "", + rules: [{ required: true, message: "请输入用户名称!" }], + }, + + { + type: FormType.inputNumber, + label: "年龄", + name: "age", + value: "", + rules: [{ required: true, message: "请输入年龄" }], + }, + { + type: FormType.input, + label: "身份证", + name: "id_card", + value: "", + rules: [{ required: true, message: "请输入身份证" }], + }, + { + type: FormType.input, + label: "登录账号", + name: "account", + value: "", + rules: [{ required: true, message: "请输入登录账号" }], + }, + + { + type: FormType.input, + label: "联系电话", + name: "tel", + value: "", + }, + + { + type: FormType.input, + label: "邮箱", + name: "email", + value: "", + }, + { + type: FormType.upload, + label: "头像", + name: "head_img", + value: [], + }, +]; + +export const columns: ColumnsType = [ + { + title: "用户名", + dataIndex: "user_name", + width: 200, + fixed: "left", + }, + { + title: "性别", + width: 150, + render: (render) => ( + {getBirthDateAndGender(render.id_card)?.gender} + ), + }, + + { + title: "头像", + dataIndex: "head_img", + width: 150, + render: (head_img) => { + return ; + }, + }, + + { + title: "登录账号", + width: 150, + dataIndex: "account", + }, + { + title: "身份证", + width: 150, + dataIndex: "id_card", + }, + { + title: "联系电话", + width: 150, + dataIndex: "tel", + }, +]; diff --git a/src/pages/menu/menu.tsx b/src/pages/menu/index.tsx similarity index 90% rename from src/pages/menu/menu.tsx rename to src/pages/menu/index.tsx index 841255d..7d9d251 100644 --- a/src/pages/menu/menu.tsx +++ b/src/pages/menu/index.tsx @@ -8,7 +8,7 @@ import { columns } from "./menu_config"; import "./menu.less"; const Menu = (props: Store) => { - const { usrStore } = props; + const { menuStore } = props; const [isModalOpen, setIsModalOpen] = useState(false); const formRef = React.useRef(null); const [userId, setId] = useState(null); @@ -23,10 +23,10 @@ const Menu = (props: Store) => { 添加菜单 { ); }; -export default inject("usrStore")(observer(Menu)); +export default inject("menuStore")(observer(Menu)); diff --git a/src/pages/menu/menu_config.tsx b/src/pages/menu/menu_config.tsx index 34761da..d0edb1f 100644 --- a/src/pages/menu/menu_config.tsx +++ b/src/pages/menu/menu_config.tsx @@ -6,92 +6,46 @@ import { getBirthDateAndGender } from "@/util/util"; export const defaultConfig = (team, per) => [ { type: FormType.input, - label: "用户名", - name: "user_name", + label: "菜单名称", + name: "name", value: "", - rules: [{ required: true, message: "请输入用户名称!" }], + rules: [{ required: true, message: "请输入名称!" }], }, { type: FormType.inputNumber, - label: "年龄", - name: "age", + label: "icon", + name: "icon", value: "", rules: [{ required: true, message: "请输入年龄" }], }, { type: FormType.input, - label: "身份证", + label: "路径", name: "id_card", value: "", rules: [{ required: true, message: "请输入身份证" }], }, - { - type: FormType.input, - label: "登录账号", - name: "account", - value: "", - rules: [{ required: true, message: "请输入登录账号" }], - }, - - { - type: FormType.input, - label: "联系电话", - name: "tel", - value: "", - }, - - { - type: FormType.input, - label: "邮箱", - name: "email", - value: "", - }, - { - type: FormType.upload, - label: "头像", - name: "head_img", - value: [], - }, ]; export const columns: ColumnsType = [ { - title: "用户名", - dataIndex: "user_name", - width: 200, + title: "菜单名称", + dataIndex: "name", fixed: "left", }, { - title: "性别", - width: 150, + title: "icon图标", render: (render) => ( {getBirthDateAndGender(render.id_card)?.gender} ), }, { - title: "头像", + title: "路径", dataIndex: "head_img", - width: 150, render: (head_img) => { return ; }, }, - - { - title: "登录账号", - width: 150, - dataIndex: "account", - }, - { - title: "身份证", - width: 150, - dataIndex: "id_card", - }, - { - title: "联系电话", - width: 150, - dataIndex: "tel", - }, ]; diff --git a/src/pages/permission/permission.tsx b/src/pages/permission/index.tsx similarity index 100% rename from src/pages/permission/permission.tsx rename to src/pages/permission/index.tsx diff --git a/src/pages/role/role.tsx b/src/pages/role/index.tsx similarity index 90% rename from src/pages/role/role.tsx rename to src/pages/role/index.tsx index b6bebc8..e7cd74a 100644 --- a/src/pages/role/role.tsx +++ b/src/pages/role/index.tsx @@ -8,7 +8,7 @@ import { columns } from "./role_config"; import "./role.less"; const Role = (props: Store) => { - const { usrStore } = props; + const { roleStore } = props; const [isModalOpen, setIsModalOpen] = useState(false); const formRef = React.useRef(null); const [userId, setId] = useState(null); @@ -23,10 +23,10 @@ const Role = (props: Store) => { 添加角色 { ); }; -export default inject("usrStore")(observer(Role)); +export default inject("roleStore")(observer(Role)); diff --git a/src/pages/role/role_config.tsx b/src/pages/role/role_config.tsx index 34761da..e8ac597 100644 --- a/src/pages/role/role_config.tsx +++ b/src/pages/role/role_config.tsx @@ -6,7 +6,7 @@ import { getBirthDateAndGender } from "@/util/util"; export const defaultConfig = (team, per) => [ { type: FormType.input, - label: "用户名", + label: "角色名称", name: "user_name", value: "", rules: [{ required: true, message: "请输入用户名称!" }], diff --git a/src/pages/source/source.tsx b/src/pages/source/source.tsx index 4193c84..b894723 100644 --- a/src/pages/source/source.tsx +++ b/src/pages/source/source.tsx @@ -4,7 +4,6 @@ import { Checkbox, Form, Input, - message, PaginationProps, Popconfirm, Space, @@ -16,16 +15,30 @@ import { inject, observer } from "mobx-react"; import "./source.less"; import { DataType } from "@/util/model/interface"; import Upload from "./upload"; +import toExcel from "@/util/xmsx"; const Source = (props: Store) => { const { sourceStore } = props; const [form] = Form.useForm(); const [coloums, setColumns] = useState([]); const [content, setContent] = useState([]); - const [selectKey, setSelectKey] = useState>([]); + const [selectKey, setSelectKey] = useState>([ + "01JM4XMY2N9KN23XSZJSQQM3HY", + "01JM4XMY2N9KN23XSZJSWQHHKA", + "01JM4XMY2N9KN23XSZJW02PRCF", + "01JM4XMY2N9KN23XSZJYCKT6XQ", + "01JM4XMY2N9KN23XSZK0AJ6QEZ", + "01JM4XMY2N9KN23XSZK10KM59Y", + "01JM4XMY2N9KN23XSZK479Y59M", + "01JM4XMY2N9KN23XSZK5F8Z2J8", + "01JM4XMY2N9KN23XSZK6W7Q25F", + "01JM4XMY2N9KN23XSZK7ET1GEB", + "01JM4XMY2N9KN23XSZK9DNRCZZ", + ]); const [page, setPage] = useState(1); const [editingKey, setEditingKey] = useState(""); const [loading, setLoading] = useState(false); const [selectedRowKeys, setSelectedRowKeys] = useState([]); + const [rowKeys, setRowKeys] = useState([]); const isEditing = (record) => record.key === editingKey; const edit = (record: any) => { form.setFieldsValue({ ...record }); @@ -66,17 +79,33 @@ const Source = (props: Store) => { } }; const getContent = (list, index) => { + setLoading(true); sourceStore.geContent(list, index, 20).then((res) => { res.forEach((element) => { element.key = "dbs_" + element.identity; }); setContent(res); + setLoading(false); }); }; + const getHead = () => { + let head = coloums.filter((value) => selectKey.includes(value.identity)); + console.log(head); + return head; + }; + const saveClo = () => { - if (selectKey.length === 0) { - message.info("请勾选需要收藏的数据"); + let list: any = []; + for (let i = 0; i < rowKeys.length; i++) { + let obj = {}; + for (const key in rowKeys[i]) { + if (key.indexOf("dbs") > -1) { + obj[key] = rowKeys[i][key]; + } + } + list.push(obj); } + toExcel(getHead(), list, "test.xlsx", "Sheet1"); }; const cancel = () => { setEditingKey(""); @@ -115,7 +144,7 @@ const Source = (props: Store) => { > 编辑 - { @@ -127,8 +156,8 @@ const Source = (props: Store) => { > - + */} + {/* */} ); }, @@ -169,7 +198,7 @@ const Source = (props: Store) => { }), }; }); - + const onChange: PaginationProps["onChange"] = (page) => { setPage(page); getContent(selectKey, page); @@ -181,6 +210,7 @@ const Source = (props: Store) => { fixed: true, onChange: (keys, rowKeys, info) => { setSelectedRowKeys(keys); + setRowKeys(rowKeys); }, }; return ( @@ -190,25 +220,13 @@ const Source = (props: Store) => { { setSelectKey(v); getContent(v, 1); }} /> - +
diff --git a/src/router/index.tsx b/src/router/index.tsx index c1c2eb1..cefc332 100644 --- a/src/router/index.tsx +++ b/src/router/index.tsx @@ -4,8 +4,9 @@ import Login from "@/pages/login/login"; import User from "@/pages/user/user"; import Dashbord from "@/pages/dashbord"; import Source from "@/pages/source/source"; -import Menu from "@/pages/menu/menu"; -import Role from "@/pages/role/role"; +import Menu from "@/pages/menu"; +import Role from "@/pages/role"; +import Permission from "@/pages/permission"; const routers = createHashRouter([ { @@ -28,12 +29,21 @@ const routers = createHashRouter([ element: , }, { - path: "/permission/menu", + path: "/permi/permi", + index: true, + element: , + }, { + path: "/permi/dep", + index: true, + element: , + }, + { + path: "/permi/menu", index: true, element: , }, { - path: "/permission/role", + path: "/permi/role", index: true, element: , }, diff --git a/src/service/user_config.ts b/src/service/user_config.ts index 49a774b..ea0d472 100644 --- a/src/service/user_config.ts +++ b/src/service/user_config.ts @@ -6,4 +6,21 @@ class UserConfig { static DELETE: string = "/user"; } -export default UserConfig; \ No newline at end of file + + +class RoleConfig { + static ADD: string = "/role"; + static EDIT: string = "/role"; + static LIST: string = "/role/list"; + static DELETE: string = "/role"; +} + +class MenuConfig { + static ADD: string = "/role"; + static EDIT: string = "/role"; + static LIST: string = "/role/list"; + static DELETE: string = "/role"; +} + + +export { RoleConfig, UserConfig,MenuConfig }; \ No newline at end of file diff --git a/src/store/index.ts b/src/store/index.ts index b413a34..d61eeb7 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -1,9 +1,13 @@ import usrStore from '@/store/user' import sourceStore from '@/store/source'; +import roleStore from './role'; +import menuStore from './menu'; const store = { usrStore, - sourceStore + sourceStore, + roleStore, + menuStore, }; export default store; \ No newline at end of file diff --git a/src/store/menu.ts b/src/store/menu.ts new file mode 100644 index 0000000..1eb0a6d --- /dev/null +++ b/src/store/menu.ts @@ -0,0 +1,15 @@ +import { makeObservable } from "mobx"; +import BaseStore from "./baseStore"; +import { UserDataType } from "@/model/userModel"; +import { RoleConfig } from "@/service/user_config"; + +class MenuStore extends BaseStore { + + constructor() { + super(RoleConfig) + makeObservable(this, { + }) + } +} +const menuStore = new MenuStore(); +export default menuStore; \ No newline at end of file diff --git a/src/store/role.ts b/src/store/role.ts new file mode 100644 index 0000000..5db40b8 --- /dev/null +++ b/src/store/role.ts @@ -0,0 +1,15 @@ +import { makeObservable } from "mobx"; +import BaseStore from "./baseStore"; +import { UserDataType } from "@/model/userModel"; +import { RoleConfig } from "@/service/user_config"; + +class RoleStore extends BaseStore { + + constructor() { + super(RoleConfig) + makeObservable(this, { + }) + } +} +const roleStore = new RoleStore(); +export default roleStore; \ No newline at end of file diff --git a/src/store/user.ts b/src/store/user.ts index 1986be5..06c05fc 100644 --- a/src/store/user.ts +++ b/src/store/user.ts @@ -3,7 +3,7 @@ import { base } from "@/service/base"; import BaseStore from "./baseStore"; import { UserDataType, UserInfos } from "@/model/userModel"; import { message } from "antd"; -import UserConfig from "@/service/user_config"; +import { UserConfig } from "@/service/user_config"; class UserStore extends BaseStore { _userinfo: UserInfos = {}; // 用户信息 @@ -63,7 +63,7 @@ class UserStore extends BaseStore { closeLoginDilog() { this.isNeedLogin = false; } - + setUserDetaul(data) { this.userDetail = data } diff --git a/src/util/xmsx.ts b/src/util/xmsx.ts new file mode 100644 index 0000000..4936deb --- /dev/null +++ b/src/util/xmsx.ts @@ -0,0 +1,55 @@ +const toHTML = (titles, datas) =>{ + // 显示表格边框 + var table = ''; + + // header,设置行高为32px + table += ''; + // 遍历拼接header行 + for (var t = 0; t < titles.length; t++) { + // 设置header行样式为垂直居中、列宽90px、水平居中 + table += ''; + } + table += ''; + + // body + for (var d = 0; d < datas.length; d++) { + // 设置行高为24px,垂直居中,水平居中 + table += ''; + let h = datas[d] + for (let value in h) { + table += ''; + } + table += ''; + } + table += '
' + titles[t].title + '
' + h[value] + '
'; + + return table; +}; + + +const toExcel =(titles, datas, fileName, sheetName) =>{ + /* + 参数1:标题行 + 参数2:数据 + 参数3:文件名 + 参数3:sheet名 + */ + var uri = 'data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,' + , template = '{table}' + , base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))) } + , format = function (s, c) { return s.replace(/{(\w+)}/g, function (m, p) { return c[p]; }) } + + var table = toHTML(titles, datas); + var ctx = { worksheet: sheetName, table: table }; + var data = base64(format(template, ctx)); + var alink = document.createElement('a'); + alink.append('body') + alink.href = uri + data; + alink.download = fileName; + alink.click(); + alink.remove(); + +}; + +export default toExcel; +// toExcel("titles", [{}], 'test.xlsx', 'Sheet1'); \ No newline at end of file