From c8167edcd6884f41feb1cb2599059bc24697c91e Mon Sep 17 00:00:00 2001 From: wenlele Date: Wed, 9 Nov 2022 11:08:16 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E6=9D=83=E9=99=90?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/app/lib/controllers/organization/index.js | 7 +- .../src/sections/install/containers/roles.jsx | 1215 +++++++++-------- 2 files changed, 615 insertions(+), 607 deletions(-) diff --git a/api/app/lib/controllers/organization/index.js b/api/app/lib/controllers/organization/index.js index 1007c06..5f11e55 100644 --- a/api/app/lib/controllers/organization/index.js +++ b/api/app/lib/controllers/organization/index.js @@ -74,7 +74,7 @@ async function editUser (ctx) { if (existUserRes) { // 存在且传递id 或者 不传id也存在 // 修改 update - storageData.deleted = false + if ( role.includes('admin') ) { @@ -89,6 +89,8 @@ async function editUser (ctx) { // 正在修改成员 但是此时还是管理员 storageData.disabled = true storageData.role = [...role, 'admin'] + }else{ + storageData.deleted = false } await models.User.update(storageData, { where: { @@ -165,6 +167,9 @@ async function delAdmin (ctx) { let adminIndex = updateValues.role.findIndex(r => r == 'admin') if (adminIndex > -1) { updateValues.role.splice(adminIndex, 1) + if (updateValues.role.length < 1) { + updateValues.deleted = true + } } await models.User.update(updateValues, { where: { diff --git a/web/client/src/sections/install/containers/roles.jsx b/web/client/src/sections/install/containers/roles.jsx index 95a0f86..fff1b65 100644 --- a/web/client/src/sections/install/containers/roles.jsx +++ b/web/client/src/sections/install/containers/roles.jsx @@ -8,630 +8,633 @@ import MemberModal from '../components/memberModal'; import '../style.less' const Roles = (props) => { - const { dispatch, actions, user, loading, socket } = props - const { install } = actions; - const [roleAssignment, setRoleAssignment] = useState([])//角色分配 - const [roleChoose, setRoleChoose] = useState('')//角色选择 - const [query, setQuery] = useState({ limit: 10, page: 0 }); //页码信息 - const [adminModal, setAdminModal] = useState(false);//管理员弹框 - const [adminEdit, setAdminEdit] = useState(false);//管理员弹框是否修改 - const [editObj, setEditObj] = useState({});//管理员弹框修改内容 - const [memberModal, setMemberModal] = useState(false);//成员弹框 - const [memberEdit, setMemberEdit] = useState(false);//成员弹框是否修改 - const [anxincloudArr, setAnxincloudArr] = useState([]) //修改时已经选择的安心云列表 - const [anxinDelete, setAnxinDelete] = useState([]) //修改时安心云项目有删除,显示提示信息 + const { dispatch, actions, user, loading, socket } = props + const { install } = actions; + const [roleAssignment, setRoleAssignment] = useState([])//角色分配 + const [roleChoose, setRoleChoose] = useState('')//角色选择 + const [query, setQuery] = useState({ limit: 10, page: 0 }); //页码信息 + const [adminModal, setAdminModal] = useState(false);//管理员弹框 + const [adminEdit, setAdminEdit] = useState(false);//管理员弹框是否修改 + const [editObj, setEditObj] = useState({});//管理员弹框修改内容 + const [memberModal, setMemberModal] = useState(false);//成员弹框 + const [memberEdit, setMemberEdit] = useState(false);//成员弹框是否修改 + const [anxincloudArr, setAnxincloudArr] = useState([]) //修改时已经选择的安心云列表 + const [anxinDelete, setAnxinDelete] = useState([]) //修改时安心云项目有删除,显示提示信息 - const [columns, setColumns] = useState([//表格属性 - { - title: '成员', - render: (_, row) => { - let departmentsArr = [] - for (let i = 0; i < row.departments.length; i++) { - departmentsArr.push(row.departments[i].name) - } - return ( -
-
- {row.name} -
-
- {row?.departments[0]?.name || ''} -
- { - row.departments.length > 1 ? ( - -
- +{row.departments.length - 1} -
-
- ) : ('') - } -
- ) - } - }, - { - title: '项目名称', - render: (_, row) => { - let anxinerror = false - let anxinerrorArr = [] - for (let i = 0; i < row.correlationProject.length; i++) { - if (row.correlationProject[i].del == true) { - anxinerror = true - anxinerrorArr.push(row.correlationProject[i].pepProjectName) - } - } - return ( -
- { - anxinerror ? ( - -
- -
-
) : ('') - } - { - row.correlationProject.map((item, index) => { - return ( -
- { - row?.correlationProject?.length >= 3 ? ( - -
7 || item?.name?.length > 7 ? '112px' : '', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', display: index > 2 ? 'none' : '', color: item.del ? '#F93920' : '' }}> - {item.pepProjectName || item.name} -
-
- ) : row?.correlationProject?.length == 2 ? ( - -
12 || item?.name?.length > 12 ? '173.5px' : '', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', color: item.del ? '#F93920' : '' }}> - {item.pepProjectName || item.name} -
-
- ) : ( - -
25 || item?.name?.length > 25 ? '358px' : '', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', color: item.del ? '#F93920' : '' }}> - {item.pepProjectName || item.name} -
-
- ) - } -
1 ? 'none' : '' }}>
-
- ) - }) - } - { - row?.correlationProject?.length > 3 ? ( - - { - row.correlationProject.map((item, index) => { - return ( -
- {item.pepProjectName || item.name}, -
- ) - }) - } -
- } trigger="click" style={{ lineHeight: 2 }}> -
- +{row?.correlationProject?.length - 3} -
- - ) : ('') - } - - ) - } - }, - { - title: ( -
- 数据分析师 - - - -
- ), - render: (_, row) => { - let rolearr = row.role - return ( -
- { - rolearr.indexOf('data_analyst') != -1 ? ( -
-
- -
-
有权限
-
- ) : ( -
-
- -
-
无权限
-
- ) - } -
- ); - } - }, { - title: ( -
- 售后运维 - - - -
- ), - render: (_, row) => { - let rolearr = row.role - return ( -
- { - rolearr.indexOf('after_sale') != -1 ? ( -
-
- -
-
有权限
-
- ) : ( -
-
- -
-
无权限
-
- ) - } -
- ); + const [columns, setColumns] = useState([//表格属性 + { + title: '成员', + render: (_, row) => { + let departmentsArr = [] + for (let i = 0; i < row.departments.length; i++) { + departmentsArr.push(row.departments[i].name) } - }, { - title: ( -
- 资源管理者 - - - -
- ), - render: (_, row) => { - let rolearr = row.role - return ( -
- { - rolearr.indexOf('resource_manage') != -1 ? ( -
-
- -
-
有权限
-
- ) : ( -
-
- -
-
无权限
-
- ) - } -
- ); + return ( +
+
+ {row.name} +
+
+ {row?.departments[0]?.name || ''} +
+ { + row.departments.length > 1 ? ( + +
+ +{row.departments.length - 1} +
+
+ ) : ('') + } +
+ ) + } + }, + { + title: '项目名称', + render: (_, row) => { + let anxinerror = false + let anxinerrorArr = [] + for (let i = 0; i < row.correlationProject.length; i++) { + if (row.correlationProject[i].del == true) { + anxinerror = true + anxinerrorArr.push(row.correlationProject[i].pepProjectName) + } } - }, { - title: ( -
- 客户服务 - - - -
- ), - render: (_, row) => { - let rolearr = row.role - return ( -
- { - rolearr.indexOf('customer_service') != -1 ? ( -
-
- -
-
有权限
-
- ) : ( -
-
- -
-
无权限
-
- ) + return ( +
+ { + anxinerror ? ( + +
+ +
+
) : ('') + } + { + row.correlationProject.map((item, index) => { + return ( +
+ { + row?.correlationProject?.length >= 3 ? ( + +
7 || item?.name?.length > 7 ? '112px' : '', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', display: index > 2 ? 'none' : '', color: item.del ? '#F93920' : '' }}> + {item.pepProjectName || item.name} +
+
+ ) : row?.correlationProject?.length == 2 ? ( + +
12 || item?.name?.length > 12 ? '173.5px' : '', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', color: item.del ? '#F93920' : '' }}> + {item.pepProjectName || item.name} +
+
+ ) : ( + +
25 || item?.name?.length > 25 ? '358px' : '', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', color: item.del ? '#F93920' : '' }}> + {item.pepProjectName || item.name} +
+
+ ) + } +
1 ? 'none' : '' }}>
+
+ ) + }) + } + { + row?.correlationProject?.length > 3 ? ( + + { + row.correlationProject.map((item, index) => { + return ( +
+ {item.pepProjectName || item.name}, +
+ ) + }) + } +
+ } trigger="click" style={{ lineHeight: 2 }}> +
+ +{row?.correlationProject?.length - 3} +
+ + ) : ('') + } +
+ ) + } + }, + { + title: ( +
+ 数据分析师 + + + +
+ ), + render: (_, row) => { + let rolearr = row.role + return ( +
+ { + rolearr.indexOf('data_analyst') != -1 ? ( +
+
+ +
+
有权限
+
+ ) : ( +
+
+ +
+
无权限
+
+ ) + } +
+ ); + } + }, { + title: ( +
+ 售后运维 + + + +
+ ), + render: (_, row) => { + let rolearr = row.role + return ( +
+ { + rolearr.indexOf('after_sale') != -1 ? ( +
+
+ +
+
有权限
+
+ ) : ( +
+
+ +
+
无权限
+
+ ) + } +
+ ); + } + }, { + title: ( +
+ 资源管理者 + + + +
+ ), + render: (_, row) => { + let rolearr = row.role + return ( +
+ { + rolearr.indexOf('resource_manage') != -1 ? ( +
+
+ +
+
有权限
+
+ ) : ( +
+
+ +
+
无权限
+
+ ) + } +
+ ); + } + }, { + title: ( +
+ 客户服务 + + + +
+ ), + render: (_, row) => { + let rolearr = row.role + return ( +
+ { + rolearr.indexOf('customer_service') != -1 ? ( +
+
+ +
+
有权限
+
+ ) : ( +
+
+ +
+
无权限
+
+ ) + } +
+ ); + } + }, + { + title: "管理", + width: "20%", + dataIndex: "", + render: (_, row) => { + return ( +
+ {row?.disabled ? ( + + ) : ( + { + dispatch(install.putOrganizationUser({ pomsUserId: row?.id, disabled: !row?.disabled, msg: '更新成员状态' })).then(() => { + setQuery({ limit: 10, page: page.current }) + }) + }} + > + + + )} +
- ); - } - }, - { - title: "管理", - width: "20%", - dataIndex: "", - render: (_, row) => { - return ( -
- {row?.disabled ? ( - - ) : ( - { - dispatch(install.putOrganizationUser({ pomsUserId: row?.id, disabled: !row?.disabled, msg: '更新成员状态' })).then(() => { - setQuery({ limit: 10, page: page.current }) - }) - }} - > - - - )} - - { - dispatch(install.putOrganizationUser({ pomsUserId: row?.id, deleted: true, msg: '删除成员' })).then(() => { - if (page.current > 0 && mylimits.current < 2) { - setQuery({ limit: 10, page: page.current - 1 }) - } else { - setQuery({ limit: 10, page: page.current }) - } - }) - }} - > - - -
- ); - }, - }, - ]) - // const [data, setdata] = useState([])//表格数据 - const tableData = useRef([]); //表格数据 - const page = useRef(query.page);//哪一页 - const [limits, setLimits] = useState()//每页实际条数 - const mylimits = useRef(); //每页实际条数 - const [pepList, setPepList] = useState([])//角色分配 - const [pomsList, setPomsList] = useState([])//已绑定项目列表 - useEffect(() => { - getUserList(); - }, [query, roleChoose]); - useEffect(() => { - dispatch(install.getOrganizationDeps()).then((res) => {//获取项企(PEP)全部部门及其下用户 - setPepList(res.payload.data) - }) - dispatch(install.getProjectPoms()).then((res) => {//获取已绑定项目 - if (res.success) { - setPomsList(res.payload.data.rows) + setAnxinDelete(anxinErrorList) + setAnxincloudArr(myanxinArr) + setMemberModal(true); + setEditObj(row) + setMemberEdit(true) + }} + > + 编辑 + + { + dispatch(install.putOrganizationUser({ pomsUserId: row?.id, deleted: true, msg: '删除成员' })).then(() => { + if (page.current > 0 && mylimits.current < 2) { + setQuery({ limit: 10, page: page.current - 1 }) + } else { + setQuery({ limit: 10, page: page.current }) + } + }) + }} + > + + + + ); + }, + }, + ]) + // const [data, setdata] = useState([])//表格数据 + const tableData = useRef([]); //表格数据 + const page = useRef(query.page);//哪一页 + const [limits, setLimits] = useState()//每页实际条数 + const mylimits = useRef(); //每页实际条数 + const [pepList, setPepList] = useState([])//角色分配 + const [pomsList, setPomsList] = useState([])//已绑定项目列表 + + const userAdmin = user?.pomsUserInfo?.role.includes('admin') //判断当前用户是否为管理员 + useEffect(() => { + getUserList(); + }, [query, roleChoose]); + useEffect(() => { + dispatch(install.getOrganizationDeps()).then((res) => {//获取项企(PEP)全部部门及其下用户 + setPepList(res.payload.data) + }) + dispatch(install.getProjectPoms()).then((res) => {//获取已绑定项目 + if (res.success) { + setPomsList(res.payload.data.rows) + } + }) + }, []) + function getUserList () { + let searchData = { ...query, role: roleChoose } + dispatch(install.getOrganizationUser(searchData)).then((res) => {//获取成员列表 + if (res.success) { + tableData.current = res.payload.data.users.rows; + let notCreatedArr = [] + let notCreatedNum = 5 - res.payload.data.admin.length + for (let i = 0; i < notCreatedNum; i++) { + notCreatedArr.push('') } - }) - }, []) - function getUserList () { - let searchData = { ...query, role: roleChoose } - dispatch(install.getOrganizationUser(searchData)).then((res) => {//获取成员列表 - if (res.success) { - tableData.current = res.payload.data.users.rows; - let notCreatedArr = [] - let notCreatedNum = 5 - res.payload.data.admin.length - for (let i = 0; i < notCreatedNum; i++) { - notCreatedArr.push('') - } - setRoleAssignment(res.payload.data.admin.concat(notCreatedArr)) - setLimits(res.payload.data.users.count) - mylimits.current = res.payload.data.users.rows.length + if (userAdmin) notCreatedArr = [] + setRoleAssignment(res.payload.data.admin.concat(notCreatedArr)) + setLimits(res.payload.data.users.count) + mylimits.current = res.payload.data.users.rows.length + } + }) + } + function handleRow (record, index) {//斑马条纹 + // 给偶数行设置斑马纹 + if (index % 2 === 0) { + return { + style: { + background: '#FAFCFF', } - }) - } - function handleRow (record, index) {//斑马条纹 - // 给偶数行设置斑马纹 - if (index % 2 === 0) { - return { - style: { - background: '#FAFCFF', - } - }; - } else { - return {}; - } - } - function roleOnChange (e) {//角色选择 - setRoleChoose(e.target.value); - } - return ( - <> -
-
-
-
管理员设置
-
ADMINISTRATOR SETTING
-
-
-
平台最多支持5个管理员权限的关系绑定,该权限可对系统所有功能和项目进行设置和管理,包括系统权限、映射关系、工单配置等敏感操作,请谨慎使用该权限。
-
-
-
- { - roleAssignment.map((item, index) => { - return ( -
- { - item.id ? ( -
- { - item.departments?.map((itm, idx) => { - let mydepartmentsArr = [] - for (let index = 0; index < item.departments.length; index++) { - mydepartmentsArr.push(item.departments[index].name) - } - return ( -
3 ? 'none' : 'flex' - }}> - { - idx > 2 ? ( - -
- ... -
-
- - ) : ( - itm.name - ) - } -
- ) - }) - } -
- ) : ( -
+
+
+
+
管理员设置
+
ADMINISTRATOR SETTING
+
+
+
平台最多支持5个管理员权限的关系绑定,该权限可对系统所有功能和项目进行设置和管理,包括系统权限、映射关系、工单配置等敏感操作,请谨慎使用该权限。
+
+
+
+ { + roleAssignment.map((item, index) => { + return ( +
+ { + item.id ? ( +
+ { + item.departments?.map((itm, idx) => { + let mydepartmentsArr = [] + for (let index = 0; index < item.departments.length; index++) { + mydepartmentsArr.push(item.departments[index].name) + } + return ( +
3 ? 'none' : 'flex' }}> - 部门 + { + idx > 2 ? ( + +
+ ... +
+
+ + ) : ( + itm.name + ) + }
- ) - } -
-
-
- { - item.id ? ( -
{item.name}
- ) : ( -
虚席以待
- ) - } + ) + }) + } +
+ ) : ( +
+ 部门 +
+ ) + } +
+
+
+ { + item.id ? ( +
{item.name}
+ ) : ( +
虚席以待
+ ) + } -
{ - if (item.id) { - setEditObj(item) - setAdminEdit(true) - } - else { - setEditObj({}) - setAdminEdit(false) - } - setAdminModal(true) - }}> - -
- { - item.id ? ( - { - dispatch(install.deteleOrganizationAdmin({ id: item.id, msg: '删除管理员' })).then(() => getUserList()) - }} - > -
- -
-
+ {userAdmin ? "" : <>
{ + if (item.id) { + setEditObj(item) + setAdminEdit(true) + } + else { + setEditObj({}) + setAdminEdit(false) + } + setAdminModal(true) + }}> + +
+ { + item.id ? ( + { + dispatch(install.deteleOrganizationAdmin({ id: item.id, msg: '删除管理员' })).then(() => getUserList()) + }} + > +
+ +
+
- ) : ('') - } + ) : ('') + }} -
-
角色说明:拥有全平台的权限
-
-
- -
-
- ) - }) - } -
-
+
角色说明:拥有全平台的权限
+
+
+ +
+
+
+ ) + }) + } +
-
-
-
-
成员管理
-
MANAGEMENT OF MEMBERS
-
-
-
平台有4种类型的成员角色,分别是数据分析师、售后运维、资源管理者和客户服务,每名项目成员可拥有多种成员角色;
-
-
- - 全部 - 数据分析师 - 售后运维 - 资源管理者 - 客户服务 - -
-
- -
-
-
- - - -
- - 共{limits}条信息 - - { - setQuery({ limit: pageSize, page: currentPage - 1 }); - page.current = currentPage - 1 - }} - /> -
+ +
+
+
+
成员管理
+
MANAGEMENT OF MEMBERS
- {//管理员弹框 - adminModal ? - { - setAdminModal(false); +
+
平台有4种类型的成员角色,分别是数据分析师、售后运维、资源管理者和客户服务,每名项目成员可拥有多种成员角色;
+
+
+ + 全部 + 数据分析师 + 售后运维 + 资源管理者 + 客户服务 + +
+
+ +
+
+
+ +
+ +
+ + 共{limits}条信息 + + { + setQuery({ limit: pageSize, page: currentPage - 1 }); + page.current = currentPage - 1 + }} + /> +
+ + {//管理员弹框 + adminModal ? + { + setAdminModal(false); + }} + close={() => { + setAdminModal(false); + getUserList() + }} > + : '' + } + {//成员弹框 + memberModal ? + { + setMemberModal(false); + }} + close={() => { + setMemberModal(false); + getUserList() + }} > + : '' + } + + ) } function mapStateToProps (state) { - const { auth, global, OrganizationDeps } = state; - return { - loading: OrganizationDeps.isRequesting, - user: auth.user, - actions: global.actions, - // members: members.data, - }; + const { auth, global, OrganizationDeps } = state; + return { + loading: OrganizationDeps.isRequesting, + user: auth.user, + actions: global.actions, + // members: members.data, + }; } export default connect(mapStateToProps)(Roles);