提交 d6f45940 作者: 龚洪江

Merge branch 'develop'

......@@ -6,17 +6,11 @@ COPY package.json .
COPY package-lock.json .
RUN npm ci
COPY . .
#EXPOSE 5173
#CMD ["npm", "run", "dev"]
#RUN \
# if [[ $PROFILES_ACTIVE=="development" ]]; then echo "env PROFILES_ACTIVE=development. exec npm run buildDev" && npm run buildDev; \
# else echo "env PROFILES_ACTIVE not found. exec npm run build" && npm run build; \
# fi
RUN \
if [ "${PROFILES_ACTIVE}" = "development" ]; then echo "env PROFILES_ACTIVE=development. exec npm run buildDev" && npm run buildDev; \
else echo "env PROFILES_ACTIVE !=development. exec npm run build" && npm run build; \
fi
RUN npm run build
# nginx
FROM nginx:alpine as production
......
#请求接口地址
VITE_REQUEST_BASE_URL='https://www.iuav.shop'
#VITE_REQUEST_BASE_URL='https://test.iuav.shop'
#VITE_REQUEST_BASE_URL='https://www.iuav.shop'
VITE_REQUEST_BASE_URL='https://test.iuav.shop'
#VITE_REQUEST_BASE_URL='/api'
#旧版接口地址
#VITE_REQUEST_BASE_URL='https://iuav.mmcuav.cn'
......
......@@ -14,4 +14,4 @@ patches:
images:
- name: REGISTRY/NAMESPACE/IMAGE:TAG
newName: mmc-registry.cn-shenzhen.cr.aliyuncs.com/sharefly-dev/admin
newTag: 3d01c556f245af2ef9ce589600a0c716b455c84c
newTag: 01280aac6badac09fd839261006483b7d09bb7d4
......@@ -3,7 +3,7 @@ kind: Deployment
metadata:
name: admin-deployment
spec:
replicas: 2
replicas: 1
strategy:
type: RollingUpdate
rollingUpdate:
......
import './assets/style/App.scss';
import PrivateRouter from '~/router/privateRouter';
import { BrowserRouter } from 'react-router-dom';
const App = () => (
<>
<PrivateRouter />
<BrowserRouter>
<PrivateRouter />
</BrowserRouter>
</>
);
......
......@@ -24,6 +24,11 @@ export type BackEndLoginType = InterFunction<
phoneNum: string;
remark: string;
};
roleInfo: {
id: number;
roleName: string;
roleNo: string;
};
}
>;
// 上传图片
......
import { InterFunction, InterItemFunction } from '~/api/interface';
import { InterFunction, InterListFunction } from '~/api/interface';
//论坛-列表
export type forumListType = InterItemFunction<
export type forumListType = InterListFunction<
{ keyword?: string },
{
id: number;
description: string;
mediaVO: null;
show: number;
userBaseInfo: {
nickName: string;
userImg: string;
userName: null;
phone: string;
uid: string;
userImg: string;
userName: string;
};
show: number;
id: number;
}[]
userAccountId: number;
dynamicPublishTime: string;
checkStatus: 0 | 1 | 2;
}
>;
//论坛-删除
export type deleteForumType = InterFunction<{ dynamicId: number }, any>;
......@@ -44,3 +48,8 @@ export type likeUserInfoType = InterFunction<
{ dynamicId: number },
{ nickName: string; userImg: string; userName: string }[]
>;
// 论坛-审核
export type checkDynamicType = InterFunction<
{ dynamicId: number; status: number },
NonNullable<unknown>
>;
......@@ -45,6 +45,11 @@ export type listBAccountPageType = InterListFunction<
phoneNum: string;
remark: string;
};
roleInfoDTO: {
id: number;
roleName: string;
roleNo: string;
};
}
>;
// 账号-新增
......@@ -62,6 +67,8 @@ export type insertBAccountType = InterFunction<
provinceCode?: number;
remark?: string;
userName: string;
companyId: number;
roleId: number;
},
NonNullable<unknown>
>;
......
import {
checkDynamicType,
deleteForumType,
forumDetailType,
forumListType,
......@@ -23,4 +24,7 @@ export class ForumManageAPI {
// 论坛-点赞人信息
static getLikeUserInfoList: likeUserInfoType = (params) =>
axios.get('/release/backstage/forum/likeUserInfo', { params });
// 动态审核
static checkDynamic: checkDynamicType = (params) =>
axios.get('/release/backstage/forum/checkDynamic', { params });
}
......@@ -176,8 +176,7 @@ const AddOrEditSkuModal: React.FC<ModalProps & selfProps> = ({
setIsCustomProd(e.target.value === 1);
};
// // 清除表单
const onCancel = () => {
// 关闭前恢复初始值
const clearEvent = () => {
skuForm.resetFields();
selfProduct.resetFields();
setSelfProductData([
......@@ -195,6 +194,10 @@ const AddOrEditSkuModal: React.FC<ModalProps & selfProps> = ({
productSpecCPQVO: {},
});
setIsCustomProd(false);
};
const onCancel = () => {
// 关闭前恢复初始值
clearEvent();
handleCancel();
};
//获取产品列表
......@@ -335,7 +338,7 @@ const AddOrEditSkuModal: React.FC<ModalProps & selfProps> = ({
delProductSpecId: selfIds,
});
}
// onCancel();
clearEvent();
});
// 验证自定义表单
......
......@@ -16,7 +16,7 @@ interface selfProps {
deleteSku: (record: specEntity) => void;
isDetail: boolean;
}
//机构列表
const StockSku: React.FC<selfProps> = ({
addOrEditSku,
specData,
......
......@@ -5,6 +5,7 @@ import { RouteObjectType, routerList } from '~/router/router';
import { useLocation, useNavigate } from 'react-router-dom';
import { GetRouteByID, getRouteID, getRoutePid } from '~/utils/router';
import { useSelector } from 'react-redux';
import { authRouterList, routerItem } from '~/router';
type MenuItem = Required<MenuProps>['items'][number];
......@@ -30,11 +31,9 @@ export function MenuView() {
// 点击侧边栏事件 onSelect改为onClick
const onSelect: MenuProps['onClick'] = (keys) => {
setSelectedKeys([keys.key]);
// setSelectedKeys(keys.selectedKeys);
const id = Number(keys.key);
const current = GetRouteByID(id, routerList);
// console.log(current?.path);
if (current) navigate(current?.path);
const current: routerItem | undefined = GetRouteByID(id, routerList);
navigate({ pathname: current?.path });
};
// 递归将路由转换为侧边栏数据
const getItem = (routerList: RouteObjectType[]) => {
......@@ -61,7 +60,9 @@ export function MenuView() {
// 组件挂载
useEffect(() => {
// 设置侧边栏数据
setItems(getItem(routerList));
authRouterList().then((value) => {
setItems(getItem(value));
});
// 设置当前选中的项目
setOpenKeys([getRoutePid(routerList, location.pathname).toString()]);
// 设置当前选中的项目的subMenu
......@@ -84,13 +85,6 @@ export function MenuView() {
items={items}
style={{ backgroundColor: ' #F3F6FF ' }}
/>
{/* <div className="sider-collapsed" onClick={() => setCollapsed(!collapsed)}> */}
{/* <Button */}
{/* className="collapsed-icon" */}
{/* type="link" */}
{/* icon={collapsed ? <RightOutlined /> : <LeftOutlined />} */}
{/* /> */}
{/* </div> */}
</Sider>
);
}
......@@ -5,6 +5,7 @@ import { Button, Dropdown, MenuProps, Modal } from 'antd';
import Logo from '../../../assets/icon/logo_big.png';
import './index.scss';
import { REMOVE_MENU, REMOVE_MENU_ID, SET_COLLAPSE } from '~/store/module/menu';
import { REMOVE_ROLE_ID } from '~/store/module/userInfo';
import { useDispatch, useSelector } from 'react-redux';
import { useNavigate } from 'react-router-dom';
import Cookies from 'js-cookie';
......@@ -41,6 +42,7 @@ export function TitleView() {
Cookies.remove('SHAREFLY-TOKEN');
dispatch(REMOVE_MENU());
dispatch(REMOVE_MENU_ID());
dispatch(REMOVE_ROLE_ID());
},
});
}}
......
......@@ -13,8 +13,6 @@ import { authRouterList } from '~/router';
// 请求的类型
type ReqType = InterReqType<BackEndLoginType>;
// 返回的类型
// type ResType = InterDataType<BackEndLoginType>;
function LoginView() {
// eslint-disable-next-line @typescript-eslint/no-unused-vars,@typescript-eslint/ban-ts-comment
......@@ -39,21 +37,21 @@ function LoginView() {
Cookies.set('remember', String(values?.remember));
// 存用户信息
dispatch(SET_USERINFO(res.result));
// 获取用户的权限
await getFirstRoute();
// console.log('SXTB_TOKEN --->', Cookies.get('SXTB-TOKEN'));
localStorage.setItem('roleId', res.result.roleInfo.id.toString());
authRouterList().then((value: any) => {
if (value.length) {
navigate({ pathname: value[0].children.find((v: any) => !v.meta.hidden)?.path });
} else {
message.warning('请先配置权限');
}
//获取第一个路由
});
// 获取第一个路由
} else {
message.error('登录失败,请检查账号信息');
}
};
// 获取第一个路由
const getFirstRoute = () => {
// 获取可用的路由表
const routeList = authRouterList();
// 获取第一个路由
navigate(routeList[0]?.children?.[0]?.path);
// console.log('获取第一个路由--->', routeList[0]?.children?.[0]?.path);
};
// componentDidMount
useEffect(() => {
// 是否保存密码
......
......@@ -3,13 +3,20 @@ import { Button, message, Modal, Table, Tooltip } from 'antd';
import { ColumnsType } from 'antd/es/table';
import { useEffect, useState } from 'react';
import DynamicDetailModal from './components/dynamicDetailModal';
import { ForumManageAPI } from '../../../api';
import { InterDataType, InterReqListType, PaginationProps } from '../../../api/interface';
import { forumDetailType, forumListType } from '../../../api/interface/forumManageType';
import { ForumManageAPI } from '~/api';
import { InterDataType, InterListType, InterReqListType, PaginationProps } from '~/api/interface';
import { forumDetailType, forumListType } from '~/api/interface/forumManageType';
import './index.scss';
// 动态审核状态
const checkStatusList = [
{ label: '审核中', value: 0 },
{ label: '审核通过', value: 1 },
{ label: '审核不通过', value: 2 },
];
//论坛列表返回类型
type forumType = InterDataType<forumListType>['list'];
type forumType = InterListType<forumListType>;
//论坛列表参数类型
type forumParameters = InterReqListType<forumListType>;
//论坛详情返回类型
......@@ -44,6 +51,12 @@ const DynamicList = () => {
),
},
{
title: '审核状态',
align: 'center',
dataIndex: 'checkStatus',
render: (text: number) => checkStatusList.find((i) => i.value === text)?.label || text,
},
{
title: '用户UID',
align: 'center',
render: (_text: string, record) => <div>{record.userBaseInfo?.uid || ''}</div>,
......@@ -54,18 +67,41 @@ const DynamicList = () => {
render: (_text: string, record) => <div>{record.userBaseInfo?.phone || ''}</div>,
},
{
title: '发布时间',
align: 'center',
dataIndex: 'dynamicPublishTime',
},
{
title: '操作',
align: 'center',
fixed: 'right',
width: 180,
render: (_text: string, record) => (
<>
<Button
type='link'
onClick={() => handleCheckStatus(record)}
disabled={record.checkStatus !== 0}
>
审核
</Button>
<Button type='link' onClick={() => lookDynamicDetail(record)}>
查看详情
详情
</Button>
<Button type='link' onClick={() => deleteForumClick(record)}>
强制删除
<Button
type='link'
onClick={() => deleteForumClick(record)}
danger
disabled={record.checkStatus === 0}
>
删除
</Button>
<Button type='link' onClick={() => hiddenForumClick(record)}>
{record.show ? '恢复显示' : '强制隐藏'}
<Button
type='link'
onClick={() => hiddenForumClick(record)}
disabled={record.checkStatus === 0}
>
{record.show ? '显示' : '隐藏'}
</Button>
</>
),
......@@ -155,7 +191,30 @@ const DynamicList = () => {
}
});
};
// 是否确认审核
const handleCheckStatus = (record: forumType[0]) => {
Modal.confirm({
title: `确认审核`,
content: `请确认是否审核通过?通过后动态将展示在论坛列表`,
okText: '审核通过',
cancelText: '审核不通过',
onOk: async () => {
const res = await ForumManageAPI.checkDynamic({ dynamicId: record.id, status: 1 });
if (res && res.code === '200') {
message.success('操作成功');
paginationChange(pagination.pageNo, pagination.pageSize);
}
},
onCancel: async () => {
const res = await ForumManageAPI.checkDynamic({ dynamicId: record.id, status: 2 });
if (res && res.code === '200') {
message.success('操作成功');
paginationChange(pagination.pageNo, pagination.pageSize);
}
},
});
};
// 组件挂载
useEffect(() => {
getDynamicList();
}, []);
......@@ -163,6 +222,7 @@ const DynamicList = () => {
<div className='dynamic-list'>
<SearchBox search={searchColumnsData} searchData={searchSuccess} />
<Table
size={'small'}
bordered
columns={tableColumns}
dataSource={tableData}
......
......@@ -76,6 +76,7 @@ const GoodsAddOrEditOrDetail = () => {
};
const addOrEditSkuModalCancel = () => {
setAddOrEditSkuModalShow(false);
setCurtRowData({});
};
const addOrEditSkuModalOk = (data: specEntity) => {
if (Object.keys(curtRowData).length != 0) {
......@@ -85,7 +86,7 @@ const GoodsAddOrEditOrDetail = () => {
} else {
setSpecData([...specData, data]);
}
setAddOrEditSkuModalShow(false);
addOrEditSkuModalCancel();
};
//根据目录获取分类列表
const getCategoryList = (directoryId: number) => {
......
......@@ -77,6 +77,7 @@ const GoodsAddOrEditOrDetail = () => {
};
const addOrEditSkuModalCancel = () => {
setAddOrEditSkuModalShow(false);
setCurtRowData({});
};
const addOrEditSkuModalOk = (data: specEntity) => {
if (Object.keys(curtRowData).length != 0) {
......@@ -86,7 +87,7 @@ const GoodsAddOrEditOrDetail = () => {
} else {
setSpecData([...specData, data]);
}
setAddOrEditSkuModalShow(false);
addOrEditSkuModalCancel();
};
//根据目录获取分类列表
const getCategoryList = (directoryId: number) => {
......
import SearchBox, { searchColumns } from '~/components/search-box';
import { Table } from 'antd';
import { ColumnsType } from 'antd/es/table';
const PilotTrainingOrder = () => {
const search: searchColumns[] = [
{ label: '买家账号', placeholder: '请输入买家账号', name: '', type: 'input' },
{ label: '订单编号', placeholder: '请输入买家账号', name: '', type: 'input' },
];
const tableColumns: ColumnsType<any> = [
{
title: '序号',
align: 'center',
},
{
title: '机构名称',
align: 'center',
},
{
title: '商品名称',
align: 'center',
},
{
title: '商品图片',
align: 'center',
},
{
title: '订单金额',
align: 'center',
},
{
title: '买家信息',
align: 'center',
},
{
title: '订单状态',
align: 'center',
},
{
title: '订单编号',
align: 'center',
},
{
title: '备注',
align: 'center',
},
{
title: '操作',
align: 'center',
},
];
return (
<div className='pilot-train-order'>
<SearchBox search={search} />
<Table bordered columns={tableColumns} />
</div>
);
};
export default PilotTrainingOrder;
import { Button, Form, Input, Radio, Select } from 'antd';
import { Uploader } from '~/components/uploader';
import { EnvironmentOutlined, UploadOutlined } from '@ant-design/icons';
import './index.scss';
const BaseInfo = () => {
return (
<div className='base-info'>
<div className='base-info-header'>基本信息:</div>
<div className='base-info-form'>
<Form labelCol={{ span: 2 }} wrapperCol={{ span: 7 }}>
<Form.Item label='机构主图'>
<Uploader fileUpload listType='picture-card'>
<UploadOutlined />
</Uploader>
</Form.Item>
<Form.Item label='机构副图'>
<Uploader fileUpload listType='picture-card'>
<UploadOutlined />
</Uploader>
</Form.Item>
<Form.Item label='机构视频'>
<Uploader fileUpload listType='text'>
<Button icon={<UploadOutlined />} type='primary'>
上传视频
</Button>
</Uploader>
</Form.Item>
<Form.Item label='机构名称'>
<Input placeholder='请输入机构名称' />
</Form.Item>
<Form.Item label='机构地区'>
<Button icon={<EnvironmentOutlined />} type='primary'></Button>
</Form.Item>
<Form.Item label='考点机构'>
<Radio.Group>
<Radio value={1}></Radio>
<Radio value={0}></Radio>
</Radio.Group>
</Form.Item>
<Form.Item label='机构规模'>
<Select placeholder='请选择机构规模'>
<Select.Option>2-4名</Select.Option>
<Select.Option>4-6名</Select.Option>
<Select.Option>6-8名</Select.Option>
<Select.Option>10名以上</Select.Option>
</Select>
</Form.Item>
<Form.Item label='机构描述'>
<Input.TextArea placeholder='请选择机构描述' />
</Form.Item>
</Form>
</div>
</div>
);
};
export default BaseInfo;
const SkuInfo = () => {
return <div className='sku-info'></div>;
};
export default SkuInfo;
import BaseInfo from './components/baseInfo';
const AddOrEditInstitution = () => {
return (
<div className='institution-form'>
<BaseInfo />
</div>
);
};
export default AddOrEditInstitution;
import SearchBox, { searchColumns } from '~/components/search-box';
import { Button, Table } from 'antd';
import { ColumnsType } from 'antd/es/table';
import { PlusOutlined } from '@ant-design/icons';
import { useNavigate } from 'react-router-dom';
const InstitutionsList = () => {
const navigate = useNavigate();
const search: searchColumns[] = [
{ label: '机构名称', name: '', placeholder: '请输入机构名称', type: 'input' },
{ label: '培训类型', name: '', placeholder: '请选择培训类型', type: 'select', options: [] },
{ label: '选择日期', name: '', placeholder: '请选择日期', type: 'rangePicker', options: [] },
];
const tableColumns: ColumnsType<any> = [
{
title: '序号',
align: 'center',
},
{
title: '机构名称',
align: 'center',
},
{
title: '培训类型',
align: 'center',
},
{
title: '创建日期',
align: 'center',
},
{
title: '操作',
align: 'center',
},
];
const toAddInstitutions = () => {
navigate('/pilotTraining/institutionsList/add');
};
return (
<div className='institutions-list'>
<SearchBox
search={search}
child={
<Button icon={<PlusOutlined />} type='primary' onClick={toAddInstitutions}>
新增
</Button>
}
/>
<Table bordered columns={tableColumns} />
</div>
);
};
export default InstitutionsList;
import SearchBox, { searchColumns } from '~/components/search-box';
import { Button, Table } from 'antd';
import { Button, Table, Image } from 'antd';
import { PlusOutlined } from '@ant-design/icons';
import { ColumnsType } from 'antd/es/table';
import { useState } from 'react';
import { useEffect, useState } from 'react';
import AddOrEditTagModal from './components/addOrEditTagModal';
import { InterDataType, InterReqType } from '~/api/interface';
import { cooperationListTag } from '~/api/interface/customManageType';
import { CustomManageAPI } from '~/api';
// 列表类型
type TableType = InterDataType<cooperationListTag>;
// 请求的参数
type ReqType = InterReqType<cooperationListTag>;
// 搜索表单的数据
let query: ReqType = {};
//行业新闻
const TagManage = () => {
const searchColumnsData: searchColumns[] = [
......@@ -18,31 +29,91 @@ const TagManage = () => {
{
title: '序号',
align: 'center',
render: (_text, _record, index) => (pagination.current - 1) * pagination.pageSize + index + 1,
},
{
title: '标签名称',
align: 'center',
dataIndex: 'tagName',
},
{
title: '标签描述',
align: 'center',
dataIndex: 'tagDescription',
width: '250px',
ellipsis: true,
},
{
title: '标签类型',
title: '标签需求',
align: 'center',
dataIndex: 'tagRequire',
width: '250px',
ellipsis: true,
},
{
title: '标签等级图标',
align: 'center',
dataIndex: 'tagImg',
render: (text) => <Image src={text} alt={'图标'} style={{ width: '32px', height: '32px' }} />,
},
{
title: '操作',
align: 'center',
fixed: 'right',
width: '100px',
render: () => (
<>
<Button type='link'>编辑</Button>
<Button type='link'>删除</Button>
<Button type='link' danger>
删除
</Button>
</>
),
},
];
const [tableData] = useState<any>([{ id: 1 }]);
// 表格数据
const [tableData, setTableData] = useState<TableType>([]);
// 表格分页配置
// eslint-disable-next-line @typescript-eslint/no-unused-vars,@typescript-eslint/ban-ts-comment
// @ts-ignore
const [pagination, setPagination] = useState({
total: 0,
pageSize: 10,
current: 1,
totalPage: 0,
});
// 加载列表
const getTableList = async (value = {}) => {
// 只需要修改这个地方的接口即可
const res = await CustomManageAPI.cooperationListTag({
pageNo: pagination.current,
pageSize: pagination.pageSize,
...value,
...query,
});
if (res && res.code === '200') {
// const { list, pageNo, totalCount, pageSize, totalPage } = res.result; // 解构
// setPagination({
// total: totalCount,
// current: pageNo,
// pageSize,
// totalPage,
// });
setTableData(res.result);
}
};
// 翻页
// eslint-disable-next-line @typescript-eslint/no-unused-vars,@typescript-eslint/ban-ts-comment
// @ts-ignore
const paginationChange = (pageNo: number, pageSize: number) => {
getTableList({ pageNo, pageSize }).then();
};
// 表单提交
const onFinish = (data: ReqType) => {
pagination.current = 1;
query = data;
getTableList(data).then();
};
const [addOrEditTagModalShow, setAddOrEditTagModalShow] = useState<boolean>(false);
const addOrEditTagClick = () => {
......@@ -51,6 +122,9 @@ const TagManage = () => {
const addOrEditTagModalCancel = () => {
setAddOrEditTagModalShow(false);
};
useEffect(() => {
getTableList().then();
}, []);
return (
<div className='tag-manage'>
<SearchBox
......@@ -60,8 +134,15 @@ const TagManage = () => {
新建
</Button>
}
searchData={onFinish}
/>
<Table bordered columns={tableColumns} dataSource={tableData} rowKey='id'></Table>
<Table
bordered
columns={tableColumns}
dataSource={tableData}
rowKey='id'
size={'small'}
></Table>
<AddOrEditTagModal open={addOrEditTagModalShow} onCancel={addOrEditTagModalCancel} />
</div>
);
......
......@@ -14,6 +14,7 @@ interface propType {
open: boolean;
closed: any;
data?: TableType[0];
roleList: { label: string; value: number }[];
}
const AddEditModal: React.FC<propType> = (props) => {
AddEditModal.defaultProps = {
......@@ -77,7 +78,8 @@ const AddEditModal: React.FC<propType> = (props) => {
if (!data) return;
form.setFieldsValue({
...data,
companyId: companyList.find((i) => i.label === data.companyName)?.value || undefined,
companyId: companyList.find((i) => i.label === data.companyName)?.value,
roleId: data.roleInfoDTO.id,
});
}, [companyList]);
return (
......@@ -147,7 +149,7 @@ const AddEditModal: React.FC<propType> = (props) => {
<Select
placeholder={'请选择角色'}
style={{ width: '168px' }}
options={[{ value: 1, label: '超级管理员' }]}
options={props.roleList}
/>
</Form.Item>
</Col>
......
......@@ -36,6 +36,8 @@ function AccountManageView() {
current: 1,
totalPage: 0,
});
//角色列表
const [roleList, setRoleList] = useState<{ label: string; value: number }[]>([]);
// 加载列表
const getTableList = async (value = {}) => {
// 只需要修改这个地方的接口即可
......@@ -87,10 +89,17 @@ function AccountManageView() {
const getEditAuth = (value: TableType[0]) => {
return value.companyInfoVO.id !== userInfo.companyInfoVO.id && userInfo.companyInfoVO.id !== 1;
};
//角色列表
const getRoleList = () => {
SystemManageAPI.getListRoleInfoPage({ pageNo: 1, pageSize: 9999 }).then(({ result }) => {
setRoleList((result.list || []).map((v) => ({ value: v.id, label: v.roleName })));
});
};
// componentDidMount
useEffect(() => {
query = {};
getTableList().then();
getRoleList();
}, []);
// 表格结构
const columns: ColumnsType<TableType[0]> = [
......@@ -126,9 +135,10 @@ function AccountManageView() {
title: '角色',
align: 'center',
width: '10%',
render: (_text: string, record) => <div>{record.roleInfoDTO.roleName}</div>,
},
{ title: '手机号', dataIndex: 'phoneNum', align: 'center', width: '150px' },
{ title: '邮箱', align: 'center', width: '12%', dataIndex: 'email' },
{ title: '邮箱', align: 'center', width: '18%', dataIndex: 'email' },
{
title: '备注',
align: 'center',
......@@ -217,7 +227,7 @@ function AccountManageView() {
name: 'roleId',
type: 'Select',
placeholder: '请选择账号角色',
options: [],
options: roleList,
},
{
label: '状态',
......@@ -271,6 +281,7 @@ function AccountManageView() {
setEditData(undefined);
paginationChange(pagination.current, pagination.pageSize);
}}
roleList={roleList}
/>
<ChangeModal
open={changeModalVisible}
......
......@@ -45,7 +45,7 @@ const LimitInfo = () => {
return data.reduce((pre: number[], cur) => {
pre.push(cur.id);
if (cur.children) {
pre.push(...getChildKeys(cur.children));
pre.push(...getAllKeys(cur.children));
}
return pre;
}, []);
......
import { createBrowserRouter, RouteObject } from 'react-router-dom';
import { RouteObjectType, routerList, whiteRouterList } from '~/router/router';
import { RouteObject } from 'react-router-dom';
import { RouteObjectType, routerList } from '~/router/router';
import { InterDataType } from '~/api/interface';
import { listMenuInfoType } from '~/api/interface/systemManageType';
import { SystemManageAPI } from '~/api';
//菜单类型
type menuType = InterDataType<listMenuInfoType>;
// 获取用户权限路由列表
export const authRouterList = () => {
// TODO: 获取用户权限
// 模拟获取用户权限成功
// 获取用户能使用的全部路由
// TODO: 在此处对用户权限进行判断,返回不同的路由表
// 获取用户可用路由列表
return [...routerList];
export const authRouterList = async () => {
if (localStorage.getItem('roleId')) {
const { result } = await SystemManageAPI.getListRoleMenuInfo({
roleId: Number(localStorage.getItem('roleId')),
});
const ids: number[] = getAllKeys([result]);
const getRouteList = (data: RouteObjectType[]) => {
return data.reduce((pre: RouteObjectType[], cur) => {
const Obj: RouteObjectType = { ...cur };
if (ids.includes(Obj.meta.id) || Obj.meta.hidden) {
if (Obj.children) {
Obj.children = [...getRouteList(Obj.children)];
}
pre.push(Obj);
}
return pre;
}, []);
};
return Promise.resolve([...getRouteList(routerList)]);
}
return Promise.resolve([]);
};
//获取全部节点
const getAllKeys = (data: menuType[]) => {
return data.reduce((pre: number[], cur) => {
pre.push(cur.id);
if (cur.children) {
pre.push(...getAllKeys(cur.children));
}
return pre;
}, []);
};
// 整合路由数据
export const routes = [...authRouterList(), ...whiteRouterList];
// 导出路由表
export const router = createBrowserRouter(routes);
// 路由表类型
export type routerItem = RouteObject & RouteObjectType;
import { authRouterList, router } from '~/router/index';
import { RouterProvider } from 'react-router-dom';
import { useEffect } from 'react';
import { authRouterList } from '~/router/index';
import { useNavigate, useLocation, useRoutes } from 'react-router-dom';
import { useEffect, useState } from 'react';
import Cookies from 'js-cookie';
import { whiteRouterList } from '~/router/router';
import { message } from 'antd';
function PrivateRouter() {
// 路由钩子
// const location = useLocation();
const location = useLocation();
const navigate = useNavigate();
const [router, setRouter] = useState(whiteRouterList);
// 在切换路由之前判断
const beforeEach = () => {
// TODO: 判断是否登录 (需要改为实时获取地址栏的路由)
const path = location.pathname;
const token = Cookies.get('SHAREFLY-TOKEN');
if (!token && path !== '/login') {
location.replace('/login');
return;
}
// 如果该用户没有权限,跳转到登录页
if (authRouterList().length === 0) {
message.info('请先配置权限!', 2000).then(() => {
location.replace('/login');
});
navigate('/login', { replace: true });
return;
}
};
useEffect(() => {
beforeEach();
// 整合路由数据
authRouterList().then((value) => {
if (value.length) {
const routes = [...value, ...whiteRouterList];
setRouter(routes); //不同账号登录时,重新更新路由(有瑕疵)
} else if (localStorage.getItem('roleId')) {
message.warning('该账号暂无权限');
navigate('/login', { replace: true });
}
});
}, [location.pathname]);
return <RouterProvider router={router} />;
return useRoutes(router);
}
export default PrivateRouter;
import React from 'react';
import { Navigate, RouteObject } from 'react-router-dom';
import { RouteObject } from 'react-router-dom';
import ErrorPage from '~/pages/common/error';
import LayoutView from '~/components/layout';
import {
......@@ -72,6 +72,7 @@ const ServiceOrderView = React.lazy(() => import('src/pages/orderManage/serviceO
const ProductOrderDetail = React.lazy(() => import('~/pages/orderManage/productOrder/detail'));
const ServiceOrderDetail = React.lazy(() => import('~/pages/orderManage/serviceOrder/detail'));
const EquipmentOrderDetail = React.lazy(() => import('~/pages/orderManage/equipmentOrder/detail'));
const PilotTrainingOrderView = React.lazy(() => import('~/pages/orderManage/pilotTrainingOrder'));
//商品管理
import CourseManageView from '~/pages/mallManage/courseManage'; //课程管理
......@@ -101,6 +102,15 @@ const CategoryDetail = React.lazy(() => import('~/pages/categoryManage/category/
// 目录管理
const DirectoryManage = React.lazy(() => import('~/pages/categoryManage/directoryManage'));
//飞手培训
const InstitutionsListView = React.lazy(
() => import('~/pages/pilotTraining/ licensureExamination/institutionsList'),
);
//机构上传
const AddInstitutionsView = React.lazy(
() => import('~/pages/pilotTraining/ licensureExamination/addOrEditInstitution'),
);
// 系统管理
import AccountManageView from '~/pages/systemManage/accountManage';
import TenderManageView from '~/pages/resourceManage/tenderManage';
......@@ -154,16 +164,6 @@ const withLoadingComponent = (comp: JSX.Element) => (
// 路由白名单
export const whiteRouterList: Array<RouteObject & RouteObjectType> = [
{
path: '/',
element: <Navigate to='/orderManage/productOrder' />,
meta: {
id: 0,
title: '销售订单',
icon: MacCommandOutlined,
},
errorElement: <ErrorPage />,
},
{
path: '/login',
element: withLoadingComponent(<LoginView />),
meta: {
......@@ -190,6 +190,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/customManage/customList',
element: withLoadingComponent(<CustomListView />),
errorElement: <ErrorPage />,
meta: {
id: 220,
title: '客户列表',
......@@ -199,6 +200,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/customManage/customMoney',
element: withLoadingComponent(<CustomMoneyView />),
errorElement: <ErrorPage />,
meta: {
id: 26200,
title: '现金管理',
......@@ -209,6 +211,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/customManage/customMoney/detail',
element: withLoadingComponent(<CustomMoneyDetail />),
errorElement: <ErrorPage />,
meta: {
id: 26200,
title: '现金变更',
......@@ -219,6 +222,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/customManage/customIdentity',
element: withLoadingComponent(<CustomIdentityView />),
errorElement: <ErrorPage />,
meta: {
id: 240,
title: '加盟入驻',
......@@ -240,6 +244,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/resourceManage/requirementsGathering',
element: withLoadingComponent(<RequirementsGatheringView />),
errorElement: <ErrorPage />,
meta: {
id: 410,
title: '需求收集',
......@@ -249,6 +254,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/resourceManage/materielManage',
element: withLoadingComponent(<MaterielManageView />),
errorElement: <ErrorPage />,
meta: {
id: 420,
title: '宣传管理',
......@@ -258,6 +264,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/resourceManage/materielManage/detail',
element: withLoadingComponent(<MaterielManageDetail />),
errorElement: <ErrorPage />,
meta: {
id: 30100,
title: '宣传管理详情',
......@@ -268,6 +275,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/resourceManage/tagManage',
element: withLoadingComponent(<TagManageView />),
errorElement: <ErrorPage />,
meta: {
id: 430,
title: '标签管理',
......@@ -277,6 +285,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/resourceManage/industryNews',
element: withLoadingComponent(<IndustryNewsView />),
errorElement: <ErrorPage />,
meta: {
id: 440,
title: '行业新闻',
......@@ -286,6 +295,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/resourceManage/tenderManage',
element: withLoadingComponent(<TenderManageView />),
errorElement: <ErrorPage />,
meta: {
id: 450,
title: '招标快讯',
......@@ -295,6 +305,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/resourceManage/tenderManage/detail',
element: withLoadingComponent(<TenderManageDetail />),
errorElement: <ErrorPage />,
meta: {
id: 30500,
title: '招标快讯详情',
......@@ -305,6 +316,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/resourceManage/tenderManage/feedback',
element: withLoadingComponent(<TenderManageFeedback />),
errorElement: <ErrorPage />,
meta: {
id: 30500,
title: '用户反馈',
......@@ -315,6 +327,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/resourceManage/businessCaseManage',
element: withLoadingComponent(<BusinessCaseManage />),
errorElement: <ErrorPage />,
meta: {
id: 460,
title: '业务案例',
......@@ -336,6 +349,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/forumManage/dynamicList',
element: withLoadingComponent(<DynamicListView />),
errorElement: <ErrorPage />,
meta: {
id: 610,
title: '动态列表',
......@@ -357,6 +371,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/orderManage/productOrder',
element: withLoadingComponent(<ProductOrderView />),
errorElement: <ErrorPage />,
meta: {
id: 810,
title: '商城订单',
......@@ -366,6 +381,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/orderManage/productOrder/detail',
element: withLoadingComponent(<ProductOrderDetail />),
errorElement: <ErrorPage />,
meta: {
id: 10010,
title: '商城订单 / 详情',
......@@ -376,6 +392,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/orderManage/equipmentOrder',
element: withLoadingComponent(<EquipmentOrderView />),
errorElement: <ErrorPage />,
meta: {
id: 820,
title: '租赁订单',
......@@ -385,6 +402,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/orderManage/equipmentOrder/detail',
element: withLoadingComponent(<EquipmentOrderDetail />),
errorElement: <ErrorPage />,
meta: {
id: 10020,
title: '租赁订单 / 详情',
......@@ -395,6 +413,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/orderManage/serviceOrder',
element: withLoadingComponent(<ServiceOrderView />),
errorElement: <ErrorPage />,
meta: {
id: 830,
title: '服务订单',
......@@ -404,6 +423,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/orderManage/serviceOrder/detail',
element: withLoadingComponent(<ServiceOrderDetail />),
errorElement: <ErrorPage />,
meta: {
id: 10010,
title: '服务订单 / 详情',
......@@ -411,6 +431,16 @@ export const routerList: Array<RouteObjectType> = [
hidden: true,
},
},
{
path: '/orderManage/pilotTrainingOrder',
element: withLoadingComponent(<PilotTrainingOrderView />),
errorElement: <ErrorPage />,
meta: {
id: 10040,
title: '培训订单',
icon: <CreditCardOutlined />,
},
},
],
},
{
......@@ -426,6 +456,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/mallManage/courseManage',
element: withLoadingComponent(<CourseManageView />),
errorElement: <ErrorPage />,
meta: {
id: 1010,
icon: <BookOutlined />,
......@@ -435,6 +466,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/mallManage/serviceList',
element: withLoadingComponent(<ServiceListView />),
errorElement: <ErrorPage />,
meta: {
id: 1020,
icon: <SmileOutlined />,
......@@ -444,6 +476,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/mallManage/serviceDetail',
element: withLoadingComponent(<ServiceDetailView />),
errorElement: <ErrorPage />,
meta: {
id: 10120,
icon: <SmileOutlined />,
......@@ -454,6 +487,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/mallManage/serviceIntroduce',
element: withLoadingComponent(<ServiceIntroduceView />),
errorElement: <ErrorPage />,
meta: {
id: 10120,
icon: <SmileOutlined />,
......@@ -464,6 +498,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/mallManage/rentGoods',
element: withLoadingComponent(<RentListView />),
errorElement: <ErrorPage />,
meta: {
id: 1030,
icon: <SmileOutlined />,
......@@ -473,6 +508,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/mallManage/rentGoods/add',
element: withLoadingComponent(<RentAddOrEditOrDetailView />),
errorElement: <ErrorPage />,
meta: {
id: 10135,
icon: <SmileOutlined />,
......@@ -483,6 +519,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/mallManage/rentGoods/edit',
element: withLoadingComponent(<RentAddOrEditOrDetailView />),
errorElement: <ErrorPage />,
meta: {
id: 10136,
icon: <SmileOutlined />,
......@@ -493,6 +530,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/mallManage/rentGoods/detail',
element: withLoadingComponent(<RentAddOrEditOrDetailView />),
errorElement: <ErrorPage />,
meta: {
id: 10136,
icon: <SmileOutlined />,
......@@ -503,6 +541,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/mallManage/mallGoods',
element: withLoadingComponent(<MallGoodsView />),
errorElement: <ErrorPage />,
meta: {
id: 1040,
icon: <SmileOutlined />,
......@@ -512,6 +551,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/mallManage/mallGoods/add',
element: withLoadingComponent(<MallAddOrEditOrDetailView />),
errorElement: <ErrorPage />,
meta: {
id: 10145,
icon: <SmileOutlined />,
......@@ -522,6 +562,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/mallManage/mallGoods/edit',
element: withLoadingComponent(<MallAddOrEditOrDetailView />),
errorElement: <ErrorPage />,
meta: {
id: 10146,
icon: <SmileOutlined />,
......@@ -532,6 +573,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/mallManage/mallGoods/detail',
element: withLoadingComponent(<MallAddOrEditOrDetailView />),
errorElement: <ErrorPage />,
meta: {
id: 10146,
icon: <SmileOutlined />,
......@@ -542,6 +584,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/mallManage/produceList',
element: withLoadingComponent(<ProduceListView />),
errorElement: <ErrorPage />,
meta: {
id: 1050,
icon: <SmileOutlined />,
......@@ -551,6 +594,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/mallManage/produceDetail',
element: withLoadingComponent(<ProduceDetailView />),
errorElement: <ErrorPage />,
meta: {
id: 10160,
icon: <SmileOutlined />,
......@@ -561,6 +605,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/mallManage/makeList',
element: withLoadingComponent(<MakeListView />),
errorElement: <ErrorPage />,
meta: {
id: 1060,
icon: <SmileOutlined />,
......@@ -601,6 +646,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/categoryManage/jobServicesCategory/1',
element: withLoadingComponent(<CategoryManage />),
errorElement: <ErrorPage />,
meta: {
id: 1210,
title: '作业服务分类',
......@@ -610,6 +656,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/categoryManage/jobServicesCategory/2',
element: withLoadingComponent(<CategoryManage />),
errorElement: <ErrorPage />,
meta: {
id: 1220,
title: '设备租赁分类',
......@@ -619,6 +666,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/categoryManage/jobServicesCategory/3',
element: withLoadingComponent(<CategoryManage />),
errorElement: <ErrorPage />,
meta: {
id: 1230,
title: '飞手培训分类',
......@@ -628,6 +676,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/categoryManage/jobServicesCategory/4',
element: withLoadingComponent(<CategoryManage />),
errorElement: <ErrorPage />,
meta: {
id: 1240,
title: '产品商城分类',
......@@ -637,6 +686,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/categoryManage/jobServicesCategory/0',
element: withLoadingComponent(<CategoryManage />),
errorElement: <ErrorPage />,
meta: {
id: 1250,
title: '通用分类',
......@@ -646,6 +696,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/categoryManage/detail/:id',
element: withLoadingComponent(<CategoryDetail />),
errorElement: <ErrorPage />,
meta: {
id: 18600,
title: '分类详情',
......@@ -656,6 +707,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/categoryManage/DirectoryManage',
element: withLoadingComponent(<DirectoryManage />),
errorElement: <ErrorPage />,
meta: {
id: 1260,
title: '目录管理',
......@@ -832,6 +884,39 @@ export const routerList: Array<RouteObjectType> = [
// ],
// },
{
path: '/pilotTraining',
element: <LayoutView />,
errorElement: <ErrorPage />,
meta: {
id: 1500,
icon: <SettingOutlined />,
title: '飞手培训',
},
children: [
{
path: '/pilotTraining/institutionsList',
element: withLoadingComponent(<InstitutionsListView />),
errorElement: <ErrorPage />,
meta: {
id: 1510,
title: '执照考试',
icon: <UserOutlined />,
},
},
{
path: '/pilotTraining/institutionsList/add',
element: withLoadingComponent(<AddInstitutionsView />),
errorElement: <ErrorPage />,
meta: {
id: 1520,
title: '机构上传',
icon: <UserOutlined />,
hidden: true,
},
},
],
},
{
path: '/systemManage',
element: <LayoutView />,
errorElement: <ErrorPage />,
......@@ -844,6 +929,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/systemManage/accountManage',
element: withLoadingComponent(<AccountManageView />),
errorElement: <ErrorPage />,
meta: {
id: 1410,
title: '账号管理',
......@@ -853,6 +939,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/systemManage/accountLimit',
element: withLoadingComponent(<AccountLimit />),
errorElement: <ErrorPage />,
meta: {
id: 1420,
title: '权限角色',
......@@ -862,6 +949,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/systemManage/limitInfo',
element: withLoadingComponent(<LimitInfo />),
errorElement: <ErrorPage />,
meta: {
id: 28300,
title: '权限信息',
......@@ -872,6 +960,7 @@ export const routerList: Array<RouteObjectType> = [
{
path: '/systemManage/companyManage',
element: withLoadingComponent(<CompanyManageView />),
errorElement: <ErrorPage />,
meta: {
id: 1430,
title: '单位管理',
......
......@@ -2,6 +2,8 @@ import { createSlice } from '@reduxjs/toolkit';
const initialState = {
userInfo: JSON.parse(localStorage.getItem('SXTB-ADMIN-USER-INFO') as string) || [],
roleId: -1,
roleList: [],
};
export const userInfoSlice = createSlice({
......@@ -12,9 +14,24 @@ export const userInfoSlice = createSlice({
state.userInfo = action.payload;
localStorage.setItem('SXTB-ADMIN-USER-INFO', JSON.stringify(action.payload));
},
SET_ROLE_ID(state, action) {
state.roleId = action.payload;
localStorage.setItem('roleId', action.payload);
},
REMOVE_ROLE_ID() {
localStorage.removeItem('roleId');
},
SET_ROLE_LIST(state, action) {
state.roleList = action.payload;
localStorage.setItem('roleObj', JSON.stringify(action.payload));
},
REMOVE_ROLE_LIST() {
localStorage.removeItem('roleObj');
},
},
});
export const { SET_USERINFO } = userInfoSlice.actions;
export const { SET_USERINFO, SET_ROLE_ID, SET_ROLE_LIST, REMOVE_ROLE_LIST, REMOVE_ROLE_ID } =
userInfoSlice.actions;
export const UserInfo = userInfoSlice.reducer;
// 过滤路由
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
import { limitEntity } from '@/api/modules/role';
export const filterRouter = (list: any, routeList: limitEntity[]) => {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论