Commit 268f5fd7 by zhangleyuan

feat:menu左侧菜单的渲染

parent 23251a65
/* /*
* @Author: 吴文洁 * @Author: 吴文洁
* @Date: 2020-08-31 09:34:31 * @Date: 2020-08-31 09:34:31
* @LastEditors: wufan * @LastEditors: zhangleyuan
* @LastEditTime: 2020-12-02 11:40:41 * @LastEditTime: 2020-12-03 10:19:49
* @Description: * @Description:
* @Copyright: 杭州杰竞科技有限公司 版权所有 * @Copyright: 杭州杰竞科技有限公司 版权所有
*/ */
...@@ -41,8 +41,8 @@ class Axios { ...@@ -41,8 +41,8 @@ class Axios {
headers: { headers: {
storeId: User.getStoreId(), storeId: User.getStoreId(),
storeUserId: User.getStoreUserId(), storeUserId: User.getStoreUserId(),
userId: "1333700901723144193" || User.getUserId(), userId: User.getUserId(),
token: "277c5bcc5ac441b297544c4f9fdf7420" || User.getToken(), token: User.getToken(),
product: "xmCloudClass", product: "xmCloudClass",
'Content-Type': options.requestType === 'form' ? 'application/x-www-form-urlencoded' : 'application/json; charset=UTF-8', 'Content-Type': options.requestType === 'form' ? 'application/x-www-form-urlencoded' : 'application/json; charset=UTF-8',
} }
......
...@@ -19,6 +19,9 @@ ...@@ -19,6 +19,9 @@
margin-left:8px; margin-left:8px;
color:#666666; color:#666666;
} }
.error-input{
border: 1px solid #FF4F4F !important;
}
.error-message{ .error-message{
font-size:14px; font-size:14px;
color:#FF4F4F; color:#FF4F4F;
......
...@@ -15,13 +15,72 @@ function ChangePhoneModal(props: changePhoneModalProps) { ...@@ -15,13 +15,72 @@ function ChangePhoneModal(props: changePhoneModalProps) {
const [newPhone,setNewPhone] = useState(''); const [newPhone,setNewPhone] = useState('');
const [phoneVerify,setPhoneVerify] = useState(''); const [phoneVerify,setPhoneVerify] = useState('');
const [codeText, setCodeText] = useState('发送验证码'); const [codeText, setCodeText] = useState('发送验证码');
const [waitStatus, setWaitStatus] = useState(false); // 验证码是否在倒计时
const [newPhoneError,setNewPhoneError] = useState(false);
const [phoneVerifyError,setPhoneVerifyError] = useState(false);
//Todo //Todo
const [errorMessageText,setErrorMessageText] = useState('验证码有误'); const [errorMessageText,setErrorMessageText] = useState('');
useEffect(() => { useEffect(() => {
}) })
// function checkPhone():any{
// }
function checkPhoneVerify():any{
if(!phoneVerify){
setErrorMessageText('请输入验证码');
setPhoneVerifyError(true);
return;
}
}
function handleSendCode():any{
if (waitStatus) return;
if(!newPhone){
setErrorMessageText('请输入手机号');
setNewPhoneError(true);
return;
}
if(newPhone.length < 11){
setErrorMessageText('请输入11位手机号');
setNewPhoneError(true);
return;
}
let timer:any;
timeSub(60,0);
function timeSub(waitTime:number, unit:number):any{
clearTimeout(timer);
timer = setTimeout(function () {
if (waitTime == 0) {
setCodeText('发送验证码')
setWaitStatus(false)
clearTimeout(timer);
} else {
setCodeText(`${waitTime}秒后重发`)
setWaitStatus(true)
timeSub(--waitTime, 1000);
}
}, unit || 0);
}
}
function handleConfirm():any{ function handleConfirm():any{
if(!newPhone){
setErrorMessageText('请输入手机号');
setNewPhoneError(true);
return;
}
if(newPhone.length < 11){
setErrorMessageText('请输入11位手机号');
setNewPhoneError(true);
return;
}
if(!phoneVerify){
setErrorMessageText('请输入验证码');
setPhoneVerifyError(true);
return;
}
onClose(); onClose();
} }
return ( return (
...@@ -49,24 +108,39 @@ function ChangePhoneModal(props: changePhoneModalProps) { ...@@ -49,24 +108,39 @@ function ChangePhoneModal(props: changePhoneModalProps) {
<div className="desc">请输入新的手机号</div> <div className="desc">请输入新的手机号</div>
<div className="new-phone-content"> <div className="new-phone-content">
<Input <Input
type="text" type="number"
maxLength={11}
name="newPhone" name="newPhone"
placeholder="请输入新手机号" placeholder="请输入新手机号"
value={newPhone} value={newPhone}
onChange={(e) => { setNewPhone(e.target.value) }} className={ newPhoneError ? 'error-input' : ''}
onChange={(e) => {
setNewPhone(e.target.value);
setNewPhoneError(false);
setErrorMessageText('')
}}
style={{ width:200,height:32}} style={{ width:200,height:32}}
/> />
</div> </div>
<div className="verify-content"> <div className="verify-content">
<Input <Input
type="text" type="number"
name="phoneVerify" name="phoneVerify"
placeholder="请输入手机号" maxLength={4}
value={newPhone} placeholder="请输入验证码"
onChange={(e) => { setNewPhone(e.target.value) }} value={phoneVerify}
className={ phoneVerifyError ? 'error-input' : ''}
onChange={(e) => {
setPhoneVerify(e.target.value);
setPhoneVerifyError(false);
setErrorMessageText('')
}}
style={{ width:200,height:32}} style={{ width:200,height:32}}
/> />
<span className="send-code">{codeText}</span> <span className="send-code"
onClick={() => {
handleSendCode();
}}>{codeText}</span>
</div> </div>
<div className="error-message">{errorMessageText}</div> <div className="error-message">{errorMessageText}</div>
</Modal> </Modal>
......
...@@ -24,6 +24,9 @@ ...@@ -24,6 +24,9 @@
margin-left:8px; margin-left:8px;
color:#666666; color:#666666;
} }
.error-input{
border: 1px solid #FF4F4F !important;
}
.error-message{ .error-message{
font-size:14px; font-size:14px;
color:#FF4F4F; color:#FF4F4F;
......
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import { Modal, Form, Button, Input, Radio, Row, Col } from 'antd'; import { Modal, Form, Button, Input, Radio, Row, Col ,InputNumber } from 'antd';
import _ from 'underscore'; import _ from 'underscore';
import './IdentificationModal.less'; import './IdentificationModal.less';
...@@ -13,32 +13,33 @@ function IdentificationModal(props: IdentificationModalProps) { ...@@ -13,32 +13,33 @@ function IdentificationModal(props: IdentificationModalProps) {
const {onClose, phone ,onConfirm} = props; const {onClose, phone ,onConfirm} = props;
const [phoneVerify, setPhoneverify] = useState(''); // 验证身份的验证码 const [phoneVerify, setPhoneverify] = useState(''); // 验证身份的验证码
const [codeText, setCodeText] = useState('发送验证码'); const [codeText, setCodeText] = useState('发送验证码');
const [checking, setChecking] = useState(false);
const [waitStatus, setWaitStatus] = useState(false); // 验证码是否在倒计时 const [waitStatus, setWaitStatus] = useState(false); // 验证码是否在倒计时
//Todo const [phoneVerifyError,setPhoneVerifyError] = useState(false);
const [errorMessageText,setErrorMessageText] = useState('验证码有误');
const [errorMessageText,setErrorMessageText] = useState('');
useEffect(() => { useEffect(() => {
}) })
function handleConfirm():any { function handleConfirm():any {
if(!phoneVerify){ if(!phoneVerify){
setPhoneVerifyError(true);
setErrorMessageText('请输入验证码'); setErrorMessageText('请输入验证码');
return; return;
} }
// 请求身份确定的接口
onConfirm(); onConfirm();
} }
function handleSendCode() {
function handleSendCode():any {
if (waitStatus) return; if (waitStatus) return;
let timer:any; let timer:any;
timeSub(60,0); timeSub(60,0);
setChecking(true)
function timeSub(waitTime:number, unit:number):any{ function timeSub(waitTime:number, unit:number):any{
clearTimeout(timer); clearTimeout(timer);
timer = setTimeout(function () { timer = setTimeout(function () {
if (waitTime == 0) { if (waitTime == 0) {
setCodeText('发送验证码') setCodeText('发送验证码')
setChecking(false)
setWaitStatus(false) setWaitStatus(false)
clearTimeout(timer); clearTimeout(timer);
} else { } else {
...@@ -76,17 +77,22 @@ function IdentificationModal(props: IdentificationModalProps) { ...@@ -76,17 +77,22 @@ function IdentificationModal(props: IdentificationModalProps) {
<div className="phone">{phone}</div> <div className="phone">{phone}</div>
<div className="verify-content"> <div className="verify-content">
<Input <Input
type="text" type="number"
name="phoneverify" name="phoneverify"
placeholder="验证码" placeholder="验证码"
className={ phoneVerifyError ? 'error-input' : ''}
maxLength={4}
value={phoneVerify} value={phoneVerify}
onChange={(e) => { setPhoneverify(e.target.value) }} onChange={(e) => {
setPhoneverify(e.target.value);
setPhoneVerifyError(false);
setErrorMessageText('')
}}
style={{ width:200,height:32}} style={{ width:200,height:32}}
/> />
<span <span
className="send-code" className="send-code"
onClick={() => { onClick={() => {
if (checking) return;
handleSendCode(); handleSendCode();
}}> }}>
{codeText} {codeText}
......
/* /*
* @Author: 吴文洁 * @Author: 吴文洁
* @Date: 2019-07-10 10:30:49 * @Date: 2019-07-10 10:30:49
<<<<<<< Updated upstream
* @LastEditors: wufan * @LastEditors: wufan
* @LastEditTime: 2020-12-02 18:02:14 * @LastEditTime: 2020-12-02 18:02:14
=======
* @LastEditors: zhangleyuan
* @LastEditTime: 2020-12-02 19:47:15
>>>>>>> Stashed changes
* @Description: * @Description:
*/ */
import React, { useContext, useEffect } from 'react'; import React, { useContext, useEffect } from 'react';
...@@ -66,7 +71,7 @@ const App: React.FC = (props: any) => { ...@@ -66,7 +71,7 @@ const App: React.FC = (props: any) => {
<ConfigProvider locale={zhCN}> <ConfigProvider locale={zhCN}>
<Main/> <Main/>
</ConfigProvider> </ConfigProvider>
<Menu/> <Menu />
</div> </div>
) )
} }
......
...@@ -3,7 +3,7 @@ import React, { useReducer } from 'react'; ...@@ -3,7 +3,7 @@ import React, { useReducer } from 'react';
import { basicReducer } from "@/store/reducers"; import { basicReducer } from "@/store/reducers";
import {XMContext} from '@/store/context' import {XMContext} from '@/store/context'
const AppContext: React.FC = (props: any) => { const AppContext: React.FC = (props: any) => {
const [xmState, xmDispatch] = useReducer(basicReducer, {}); const [xmState, xmDispatch] = useReducer(basicReducer, {storeUserPermissionList:[]});
return <XMContext.Provider value={{ xmState, dispatch: xmDispatch }}><App /> </XMContext.Provider> return <XMContext.Provider value={{ xmState, dispatch: xmDispatch }}><App /> </XMContext.Provider>
} }
......
...@@ -6,6 +6,7 @@ import './Login.less'; ...@@ -6,6 +6,7 @@ import './Login.less';
import {Input,Popover,message} from 'antd'; import {Input,Popover,message} from 'antd';
import CheckBeforeSendCode from '../../components/CheckBeforeSendCode'; import CheckBeforeSendCode from '../../components/CheckBeforeSendCode';
import Service from "../../common/js/service" import Service from "../../common/js/service"
import User from '@/common/js/user';
import axios from 'axios'; import axios from 'axios';
function Login(props) { function Login(props) {
const [phone, setPhone] = useState(''); // 登录手机号 const [phone, setPhone] = useState(''); // 登录手机号
...@@ -89,8 +90,8 @@ function Login(props) { ...@@ -89,8 +90,8 @@ function Login(props) {
if (!data.success) { if (!data.success) {
setErrorMessage(data.message); setErrorMessage(data.message);
} else { } else {
localStorage.setItem('userId',data.userId); User.setUserId(data.result.userId);
localStorage.setItem('xmToken',data.xmToken); User.setToken(data.result.xmToken);
} }
}) })
} }
......
import React from "react";
import { HashRouter as Router, withRouter, Link } from "react-router-dom";
import "./Menu.less";
import classNames from "classnames";
import { Menu, Modal, Badge } from "antd";
import {
AppstoreOutlined,
MenuUnfoldOutlined,
MenuFoldOutlined,
PieChartOutlined,
DesktopOutlined,
ContainerOutlined,
PlayCircleOutlined
} from '@ant-design/icons';
import Bus from '@/core/bus'
const MenuItem = Menu.Item;
const SubMenu = Menu.SubMenu;
const mircoLink = ["cloudclass"];
window.Router = Router;
class Menus extends React.Component {
constructor(props) {
super(props);
this.state = {
menuType: 1, // 目录的宽屏和窄屏模式
};
}
async componentDidMount() {
Bus.bind("menuTypeChange", (menuType) => {
if (menuType) {
this.setState({ menuType });
} else {
this.setState({ openKeys: [] }, () => this.setState({ menuType }));
}
})
}
render() {
return (
<div id="left-container"
className={
this.state.menuType
? "left-container"
: "left-container left-container-vertical"
}>
<div className="left">
<div className="nav">
<Menu
defaultSelectedKeys={["1"]}
defaultOpenKeys={["sub1"]}
mode={this.state.menuType ? "inline" : "vertical"}
theme="dark"
inlineCollapsed={this.state.collapsed}
>
<SubMenu
key="1"
title={
<span
>
<span className="title">
<span
className="iconfont icon"
dangerouslySetInnerHTML={{ __html: "&#xe831;" }}
></span>
{!!this.state.menuType && (
<span className="menu-name" id="menu_home">
课程管理
</span>
)}
</span>
</span>
}
>
<Menu.Item key="1-1">
<span className="name">直播课</span>
</Menu.Item>
<Menu.Item key="1-2">
<span className="name">视频课</span>
</Menu.Item>
</SubMenu>
<Menu.Item key="2">
<span
>
<span className="title">
<span
className="iconfont icon"
dangerouslySetInnerHTML={{ __html: "&#xe83b;" }}
></span>
{!!this.state.menuType && (
<span className="menu-name" id="menu_home">
资料云盘
</span>
)}
</span>
</span>
</Menu.Item>
<SubMenu
key="3"
title={
<span
>
<span className="title">
<span
className="iconfont icon"
dangerouslySetInnerHTML={{ __html: "&#xe82e;" }}
></span>
{!!this.state.menuType && (
<span className="menu-name" id="menu_home">
店铺管理
</span>
)}
</span>
</span>
}
>
<Menu.Item key="3-1">
<span className="name">讲师管理</span>
</Menu.Item>
<Menu.Item key="3-2">
<span className="name">用户管理</span>
</Menu.Item>
<Menu.Item key="3-3">
<span className="name">课程分类</span>
</Menu.Item>
<Menu.Item key="3-4">
<span className="name">店铺装修</span>
</Menu.Item>
</SubMenu>
</Menu>
</div>
</div>
<div></div>
</div>
);
}
}
export default withRouter(Menus);
import React, { useContext, useEffect, useState } from 'react';
import {
withRouter,
} from 'react-router-dom';
import { Menu } from 'antd';
import { menuList } from '../../routes//config/menuList'
import { XMContext } from '../../store/context';
import Bus from '@/core/bus'
import "./Menu.less";
const { SubMenu } = Menu;
function Aside(props: any) {
const ctx: any = useContext(XMContext);
const [selectKey, setSelectKey] = useState();
const [openKeys, setOpenKeys] = useState(['']);
const [menuType,setMenuType] = useState(1);
useEffect(() => {
const link = props.location.pathname;
menuList.map((item: any, index: any) => {
if (link.indexOf(item.link) !== -1) {
setSelectKey(item.groupCode);
setOpenKeys([])
} else if (item.children) {
item.children.map((_item: any, _index: any) => {
if (link.indexOf(_item.link) !== -1) {
setSelectKey(_item.groupCode + index + _index);
}
})
}
return item;
})
}, [props.location.pathname])
function taggleMenu(item: any) {
window.RCHistory.push(item.link)
}
function onOpenChange(openKeys: string[]) {
setOpenKeys(openKeys)
}
return (
<div
id="left-container"
className={
menuType
? "left-container"
: "left-container left-container-vertical"
}
>
<div className="left">
<div className="nav">
<Menu
style={{ minHeight: "100%", background: '#0E1935' }}
defaultSelectedKeys={selectKey}
selectedKeys={selectKey}
openKeys={openKeys}
onOpenChange={onOpenChange}
mode="inline"
theme="dark"
inlineCollapsed={false}
>
{
menuList.map((item: any, index: any) => {
if (ctx.xmState.storeUserPermissionList.indexOf(item.groupCode) === -1) {
return null;
}
if (item.children) {
return <SubMenu key={item.groupCode} style={{ marginTop: 0 }} title={<div>
<span style={{ marginRight: 6 }} className="iconfont icon" dangerouslySetInnerHTML={{ __html:item.icon}}></span>
<span>{item.groupName}</span></div>}>
{
item.children.map((item: any, _index: any) => {
return <Menu.Item onClick={() => { taggleMenu(item) }} style={{ marginTop: 0 }} key={item.groupCode + index + _index}>
<span>{item.groupName}</span>
</Menu.Item>
})
}
</SubMenu>
} else {
return <Menu.Item onClick={() => { taggleMenu(item) }} key={item.groupCode}>
<span style={{ marginRight: 6 }} className="iconfont icon" dangerouslySetInnerHTML={{ __html:item.icon}}></span>
<span>{item.groupName}</span>
</Menu.Item>
}
})
}
</Menu>
</div>
</div>
</div>
);
}
export default withRouter(Aside);
\ No newline at end of file
/*
* @Author: wufan
* @Date: 2020-07-09 14:03:09
* @Last Modified by: mikey.zhaopeng
* @Last Modified time: 2020-11-28 13:53:12
* 店铺管理-员工管理
*/
import React, { useEffect, useState } from "react";
import { withRouter } from "react-router-dom";
import _ from "underscore";
import PageControl from "@/components/PageControl";
import { CheckBox } from "@/components";
import { Button, Table, Tooltip, Modal, message, Row, Col, Input } from "antd";
import StoreService from "@/domains/store-domain/storeService";
import "./CourseCatalogPage.less";
const { confirm } = Modal;
const { Search } = Input;
declare var window: any;
interface RecordTypes {
storeUserId: string,
role: string
}
function CourseCatalogPage() {
const [courseCatalogList, setCourseCatalogList] = useState([
{
key: 1,
name: 'John Brown',
type: 'parent',
children: [
{
key: 11,
name: 'John Brown',
type: 'child'
},
{
key: 12,
name: 'John Brown',
type: 'child'
}
]
},
{
key: 2,
name: 'Jim Green',
type: 'parent',
children: [
{
key: 11,
name: 'John Brown',
type: 'child'
},
{
key: 12,
name: 'John Brown',
type: 'child'
}
]
},
{
key: 3,
name: 'Not Expandable',
type: 'parent',
children: [
{
key: 11,
name: 'John Brown',
type: 'child'
},
{
key: 12,
name: 'John Brown',
type: 'child'
}
]
},
{
key: 4,
name: 'Joe Black',
type: 'parent',
children: [
{
key: 11,
name: 'John Brown',
type: 'child'
},
{
key: 12,
name: 'John Brown',
type: 'child'
}
]
},
]);
const [query, setQuery] = useState({
current: 0,
size: 10,
name: "",
phone: "",
identity: "ALL",
instId: "1837447" || window.currentUserInstInfo.instId,
});
const [total, setTotal] = useState(0);
useEffect(() => {
}, [query]);
function parseColumn():any{
return [
{ title: '分类名称',
dataIndex: 'name',
key: 'name',
},
{
title: '操作',
dataIndex: 'action',
key: 'action',
width:300,
render: (val: string, record: any) => {
return (
<div className="operation">
{ record.type==="parent" &&
<>
<span
className="add"
>
添加子分类
</span>
<span className="divider-line">{" | "}</span>
</>
}
<span
>
编辑
</span>
<span className="divider-line">{" | "}</span>
<span
>
删除
</span>
</div>
)
},
},
]
}
return (
<div className=" page employee-manage-page">
<div className="page-content">
<div className="content-header">员工管理</div>
<div className="box">
<div className="box-header">
<Button
type="primary"
className="add-show-btn"
>
添加分类
</Button>
</div>
<div className="box-body">
<Table
columns={ parseColumn() }
pagination={false}
expandable={{
rowExpandable: record => record.name !== '还未添加子分类',
}}
dataSource={courseCatalogList}
/>
</div>
<div className="box-footer">
<PageControl
current={query.current}
pageSize={query.size}
total={total}
toPage={(page) => {
}}
/>
</div>
</div>
{/* {
isModalOpen && <EmployeeAddOrEditModal isOpen={isModalOpen} choosedItem={choosedItem} onClose={()=>{setIsModalOpen(false)}}/>
} */}
</div>
</div>
);
}
export default withRouter(CourseCatalogPage);
/* /*
* @Author: 吴文洁 * @Author: 吴文洁
* @Date: 2020-04-29 10:26:32 * @Date: 2020-04-29 10:26:32
* @LastEditors: wufan * @LastEditors: zhangleyuan
* @LastEditTime: 2020-11-30 15:59:10 * @LastEditTime: 2020-12-03 10:17:14
* @Description: 内容线路由配置 * @Description: 内容线路由配置
*/ */
import TestPage from '@/modules/test'; import TestPage from '@/modules/test';
...@@ -10,7 +10,7 @@ import EmployeesManagePage from '@/modules/store-manege/EmployeesManagePage'; ...@@ -10,7 +10,7 @@ import EmployeesManagePage from '@/modules/store-manege/EmployeesManagePage';
import personalInfoPage from '@/modules/personalInfo'; import personalInfoPage from '@/modules/personalInfo';
import UserManagePage from '@/modules/store-manege/UserManagePage'; import UserManagePage from '@/modules/store-manege/UserManagePage';
import StoreDecorationPage from '@/modules/store-manege/StoreDecorationPage'; import StoreDecorationPage from '@/modules/store-manege/StoreDecorationPage';
import CourseCatalogPage from '@/modules/store-manege/CourseCatalogPage'
const mainRoutes = [ const mainRoutes = [
{ {
path: '/home', path: '/home',
...@@ -37,6 +37,11 @@ const mainRoutes = [ ...@@ -37,6 +37,11 @@ const mainRoutes = [
component: StoreDecorationPage, component: StoreDecorationPage,
name: '店铺装修' name: '店铺装修'
}, },
{
path: '/course-catalog',
component:CourseCatalogPage,
name: '课程分类'
},
] ]
export default mainRoutes; export default mainRoutes;
\ No newline at end of file
const menuList = [
{
name: "课程管理",
code: "CourseManage",
icon: "&#xe733;",
childrens: [
{
name: "",
code: "StuFile",
hash: "/clue_manage"
},
{
name: "跟进管理",
code: "FollowManage",
hash: "/follow_manage"
}
]
},
{
name: "教务中心",
code: "EduAdministration",
icon: "&#xe734;",
childrens: [
{
name: "学员管理",
code: "StudentManagement",
hash: "/student"
},
{
name: "班级管理",
code: "ClassManagement",
hash: "/class_manager"
},
{
name: "课表管理",
code: "ScheduleManagement",
hash: "/plan/menu"
},
{
name: "上课记录",
code: "ClassRecord",
hash: "/class_record/take_name_record"
},
{
name: "课程管理",
code: "CourseManagement",
hash: "/course_fees_manage/course_manage"
},
{
name: "物品/费用",
code: "ProductExpense",
hash: "/course_fees"
},
{
name: "在线商城",
code: "onlineStore",
hash: "/mall",
isNew: true,
expired: 1600099200000
},
{
name: "老师管理",
code: "TeacherManagement",
hash: "/teacher"
},
{
name: "刷卡考勤",
code: "CardAttendance",
hash: "/attendance_card/record",
isShow: true
},
{
name: "人脸考勤",
code: "FaceAttendance",
hash: "/attendance_face",
isShow: true
}
]
},
{
name: "云课堂",
code: 'LiveCourse',
icon: "&#xe7ae;",
childrens: [
{
name: '大班直播',
code: 'BigLiveBroadcast',
hash: '/cloud_class_large'
},
{
name: '视频课',
code: 'VideoClass',
hash: '/cloudclass/video_course'
},
{
name: '互动班课',
code: 'InteractiveClass',
hash: '/cloud_class_interactive'
},
{
name: '资料云盘',
code: 'ClassBook',
hash: '/cloudclass/prepare_lesson'
// hash: '/cloud_class_prepare_lesson',
}
]
},
{
name: "家校互动",
code: "AfterClass",
icon: "&#xe732;",
childrens: [
{
name: "课后作业",
code: "Homework",
hash: "/home_school_homework"
},
{
name: "课后点评",
code: "StuTeaRating",
hash: "/teacher_student_evaluate/student"
},
{
name: "成长档案",
code: "GrowthFile",
hash: "/archives_list/class_record"
},
{
name: "电子相册",
code: "ElectronAlbums",
hash: "/album"
},
{
name: "成绩单",
code: "ScoreSheet",
hash: "/home_school_achievement"
},
{
name: "通知管理",
code: "NotificationManagement",
hash: "/home_school_notification"
}
]
},
{
name: "营销中心",
code: "MarketingCenter",
icon: "&#xe735;",
childrens: [
{
name: "小麦秀",
code: "XMShow",
hash: "/dynamic"
},
{
name: "麦田表单",
code: "XMForm",
hash: "/e_form"
},
{
name: '转介绍',
code: 'XMReferral',
hash: '/member_market_transfer_event'
},
{
name: "优惠券",
code: "XMCoupon",
hash: "/member_market/coupon"
},
{
name: "小麦粒",
code: ["XMpointsBasic", "XMpoints"],
hash: "/points_manage"
},
{
name: "微官网",
code: "MicoWebsite",
hash: "/new_site"
},
{
name: '礼品集市',
code: 'GiftMarket',
hash: '/market_mall'
}
]
},
{
name: "财务中心",
code: "FinanceCenter",
icon: "&#xe7f5;",
childrens: [
{
name: "订单管理",
code: "OrderManagement",
hash: "/order_manage/order_list"
},
{
name: "收支明细",
code: "IncomeExpenditure",
hash: "/income_expanse_manage/income_expanse_list"
},
{
name: "小麦收银",
code: "XMCounter",
hash: "/cash_list"
},
{
name: "小麦钱包",
code: "XMWallet",
hash: "/xm_finance"
},
{
name: "课消记录",
code: "ClassConsumeRecord",
hash: "/course_consumption_record"
},
{
name: '工资结算',
code: 'XMSalarySettlement',
hash: '/wage_calculation/payroll'
},
{
name: "充值管理",
code: "XMAsset",
hash: "/recharge_manage"
},
{
name: "保险",
code: "InsuranceOrder",
hash: "/insurance_list"
},
{
name: "确认收入报表",
code: "ConfirmIncome",
hash: "/income_confirm_form"
}
]
},
{
name: "数据中心",
code: "DataCenter",
icon: "&#xe6b3;",
childrens: [
{
name: "销售数据",
code: "SalesData",
hash: "/sales_data"
},
{
name: "教务数据",
code: "EduDate",
hash: "/academic_data"
},
{
name: "家校数据",
code: "ZeusData",
hash: "/zeus_data"
},
{
name: "财务数据",
code: "FinanceData",
hash: "/financial_data"
}
]
},
{
name: "机构设置",
code: "InstSetting",
icon: "&#xe6b1;",
childrens: [
{
name: "员工管理",
code: "AccountManagement",
hash: "/orgnization_account"
},
{
name: "规则设置",
code: "RuleSetting",
hash: "/academic_setting"
},
{
name: "机构展示",
code: "InstShow",
hash: "/orgnization_desc"
},
{
name: "操作日志",
code: "OperationLog",
hash: "/operation_log"
},
{
name: "服务订购",
code: "ServiceOrder",
hash: "/current_suit"
},
{
name: "短信管理",
code: "SMSManagement",
hash: "/account_setting"
}
]
}
];
export default menuList;
\ No newline at end of file
export const menuList: any = [
{
groupName: "课程管理",
groupCode: "CloudCourse",
icon: '&#xe831;',
children: [
{
groupName: "直播课",
groupCode: "CourseLiveClass",
icon: '',
link: ''
},
{
groupName: "视频课",
groupCode: "CourseVideoClass",
icon: '',
link: ''
}
]
},
{
groupName: "资料云盘",
groupCode: "CloudDisk",
icon: '&#xe83b;',
link: ''
},
{
groupName: "店铺管理",
groupCode: "CloudShop",
icon: '&#xe82e;',
children: [
{
groupName: "员工管理",
groupCode: "ShopStaff",
link: '/employees-manage'
},
{
groupName: "用户管理",
groupCode: "ShopUser",
link: '/user-manage'
},
{
groupName: "课程分类",
groupCode: "CourseCategory",
link: '/course-catalog'
},
{
groupName: "店铺装修",
groupCode: "ShopDecoration",
link: '/store-decoration'
}
]
},
]
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment