Commit 8f54e0eb by chenshu

feat:初始化

parent 985b02a5
......@@ -12,6 +12,7 @@ import { Input, Button, Tree } from "antd";
import "./Classification.less";
import User from "@/common/js/user";
import KnowledgeAPI from "@/data-source/knowledge/request-api";
import Bus from "@/core/bus";
const { Search } = Input;
const { DirectoryTree } = Tree;
......@@ -31,6 +32,11 @@ class Classification extends Component {
componentDidMount() {
this.queryCategoryTree();
Bus.bind('knowledgeCategoryTree', this.queryCategoryTree)
}
componentWillUnmount() {
Bus.unbind('knowledgeCategoryTree', this.queryCategoryTree)
}
shouldComponentUpdate = (nextProps, nextState) => {
......
......@@ -127,7 +127,6 @@ class KnowledgeBaseList extends React.Component {
// 预览文件
handleScanFile = (folder) => {
console.log(folder);
const { folderFormat, folderSize, ossUrl } = folder;
switch (folderFormat) {
case "PDF":
......@@ -452,7 +451,6 @@ class KnowledgeBaseList extends React.Component {
width: 160,
fixed: "right",
render: (val, record, index) => {
console.log(this.props.categoryId);
return this.props.categoryId === "0" ? (
<div className="operate">
<div
......@@ -521,7 +519,6 @@ class KnowledgeBaseList extends React.Component {
// 前往上课数据页面
handleLinkToClassData = (item) => {
const { match } = this.props;
console.log(item);
localStorage.setItem("WatchData_CourseName", item.name);
window.RCHistory.push({
// pathname: `${match.url}/course-data?type=${item.courseType}&id=${item.liveCourseId}`,
......@@ -553,12 +550,17 @@ class KnowledgeBaseList extends React.Component {
};
render() {
const { dataSource = [], totalCount, query, match } = this.props;
const { dataSource = [], totalCount, query, match, selectedRowKeys, onSelectChange } = this.props;
const { current, size } = query;
const rowSelection = {
selectedRowKeys,
onChange: onSelectChange,
}
return (
<div className="knowledge-base-list">
<Table
rowKey={(record) => record.id}
rowSelection={rowSelection}
size="middle"
dataSource={dataSource}
columns={this.parseColumns()}
......
......@@ -9,19 +9,27 @@
import React, { useState, useEffect } from "react";
import { Button, Menu, Dropdown,message } from "antd";
import { Button, Menu, Dropdown,message, Modal } from "antd";
import SelectPrepareFileModal from "@/modules/prepare-lesson/modal/SelectPrepareFileModal";
import { DownOutlined } from "@ant-design/icons";
import AddCourse from "../modal/AddCourse";
import User from "@/common/js/user";
import Service from "@/common/js/service";
import KnowledgeAPI from "@/data-source/knowledge/request-api";
import MoveModal from '../../teach-tool/modal/MoveModal';
import Bus from "@/core/bus";
import './KnowledgeBaseOpt.less';
export default function KnowledgeBaseOpt({
categoryId,
selectedRowKeys,
updateCategoryTree,
onChange,
onChangeKeys,
}) {
const [modal, setModal] = useState(null);
const [openMoveModal, setOpenMoveModal] = useState(false);
const [data, setData] = useState([]);
const menu = (
<Menu>
......@@ -34,6 +42,36 @@ export default function KnowledgeBaseOpt({
</Menu>
);
useEffect(() => {
queryCategoryTree();
}, []);
// 查询分类树
function queryCategoryTree() {
let query = {
storeId: User.getStoreId(),
withCount: true,
};
KnowledgeAPI.getCategoryTree(query).then((res) => {
const { categoryList = [] } = res.result;
let list = renderTreeNodes(categoryList);
setData(list);
});
}
function renderTreeNodes(data) {
let newTreeData = data.map((item) => {
item.title = item.categoryName;
item.value = item.id;
item.key = item.id;
if (item.sonCategoryList) {
item.children = renderTreeNodes(item.sonCategoryList);
}
return item;
});
return newTreeData;
};
function handAddCourse() {
let modal = (
<AddCourse
......@@ -86,16 +124,126 @@ export default function KnowledgeBaseOpt({
setModal(modal);
}
return (
<div className="video-course-opt">
<Dropdown overlay={menu}>
<Button type="primary" className="mr12">
添加知识
<DownOutlined />
</Button>
</Dropdown>
function batchMove() {
if (_.isEmpty(selectedRowKeys)) {
message.warning('请先选择要移动的知识');
return null;
}
setOpenMoveModal(true);
}
function batchMoveRemote(categoryId) {
const data = {
categoryId,
ids: selectedRowKeys,
storeId: User.getStoreId(),
};
Service.Hades('public/hades/batchMoveKnowledgeCategory', data).then((res) => {
if (res.success) {
message.success('移动成功');
onChange();
Bus.trigger('knowledgeCategoryTree');
clearSelect();
} else {
message.error('移动失败');
}
}).catch(() => {
message.error('移动失败');
})
}
function batchDelete() {
if (_.isEmpty(selectedRowKeys)) {
message.warning('请先选择要删除的知识');
return null;
}
Modal.confirm({
title: "确定要删除知识吗?",
content: "删除后,不可恢复。",
icon: (
<span className="icon iconfont default-confirm-icon">&#xe839; </span>
),
okText: "删除",
cancelText: "取消",
onOk: () => {
const data = {
ids: selectedRowKeys,
storeId: User.getStoreId(),
};
Service.Hades('public/hades/batchDelKnowledge', data).then((res) => {
if (res.success) {
message.success('删除成功');
onChange();
Bus.trigger('knowledgeCategoryTree');
clearSelect();
} else {
message.error('删除失败');
}
}).catch(() => {
message.error('删除失败');
})
},
})
}
function onSelectPaper(keys) {
if (keys.length > 50) {
message.warning('最多只能选择50个知识');
return null;
}
onChangeKeys(keys);
};
function clearSelect() {
onChangeKeys([]);
}
return (
<div className="knowledge-course-opt">
{_.isEmpty(selectedRowKeys) ?
<Dropdown overlay={menu}>
<Button type="primary" className="mr8">
添加知识
<DownOutlined />
</Button>
</Dropdown>
: <div className="select-container">
<span className="con">
<div>
<span className="icon iconfont tip">&#xe6f2;</span>
<span className="text">已选择{selectedRowKeys.length}</span>
</div>
<div>
<span className="clear" onClick={clearSelect}>清空</span>
</div>
</span>
</div>
}
<Button
className="mr8"
onClick={() => {
batchMove();
}}
>批量移动</Button>
<Button
onClick={() => {
batchDelete();
}}
>批量删除</Button>
{modal}
{openMoveModal &&
<MoveModal
visible={openMoveModal}
title="知识"
data={data}
length={selectedRowKeys.length}
onCancel={() => setOpenMoveModal(false)}
onOk={(categoryId) => {
batchMoveRemote(categoryId);
setOpenMoveModal(false);
}}
/>
}
</div>
);
}
.knowledge-course-opt {
display: flex;
.select-container{
margin-right: 24px;
.con{
background: #FFF4DD;
border-radius: 4px;
padding: 3px 16px;
display: inline-flex;
align-items: center;
justify-content: space-between;
.tip{
font-size:14px;
color:#FF9D14;
margin-right:8px;
}
.text{
font-size:14px;
color:#666;
margin-right:30px;
}
.clear{
color:#5289FA;
font-size:14px;
}
}
}
}
\ No newline at end of file
......@@ -7,7 +7,7 @@
* @Copyright: © 2020 杭州杰竞科技有限公司 版权所有
*/
import React from "react";
import { message } from 'antd'
import KnowledgeBaseFilter from "./components/KnowledgeBaseFilter";
import KnowledgeBaseOpt from "./components/KnowledgeBaseOpt";
import KnowledgeBaseList from "./components/KnowledgeBaseList";
......@@ -30,6 +30,7 @@ export default class KnowledgeBase extends React.Component {
totalCount: 0, // 知识库数据总条数
categoryId: '0',
updateCategoryFlag: false,
selectedRowKeys: [],
};
}
......@@ -72,6 +73,15 @@ export default class KnowledgeBase extends React.Component {
});
};
onSelectChange = (selectedRowKeys) => {
if (selectedRowKeys.length > 50) {
message.warning('最多只能选择50个题目');
return null;
}
console.log(selectedRowKeys, 888888)
this.setState({ selectedRowKeys });
};
render() {
const {
dataSource,
......@@ -79,6 +89,7 @@ export default class KnowledgeBase extends React.Component {
query,
categoryId,
updateCategoryFlag,
selectedRowKeys,
} = this.state;
return (
<div className="page">
......@@ -105,11 +116,15 @@ export default class KnowledgeBase extends React.Component {
onChange={this.handleFetchScheduleList}
updateCategoryTree={this.updateCategoryTree}
categoryId={categoryId}
selectedRowKeys={selectedRowKeys}
onChangeKeys={(keys) => this.setState({ selectedRowKeys: keys })}
/>}
{/* 知识库列表模块 */}
<KnowledgeBaseList
query={query}
selectedRowKeys={selectedRowKeys}
onSelectChange={this.onSelectChange}
categoryId={categoryId}
dataSource={dataSource}
totalCount={totalCount}
......
......@@ -27,8 +27,10 @@ import { Route, withRouter } from "react-router-dom";
import OperatePaper from "@/modules/teach-tool/paper-manage/OperatePaper";
import User from "@/common/js/user";
import AidToolService from "@/domains/aid-tool-domain/AidToolService";
import Service from "@/common/js/service";
import _ from "underscore";
import PaperPreviewModal from "../modal/PreviewPaperModal";
import MoveModal from '../../modal/MoveModal';
import Bus from "@/core/bus";
const { Search } = Input;
......@@ -50,11 +52,13 @@ class PaperList extends Component {
dataSource: [],
paperPreviewModal: null, // 试卷预览模态框
loading: false,
selectedPaperKeys: [],
};
}
componentDidMount() {
this.queryPaperPageList();
this.queryCategoryTree();
Bus.bind("queryPaperPageList", (selectedCategoryId, count) => {
selectedCategoryId =
selectedCategoryId === "null" ? null : selectedCategoryId;
......@@ -72,6 +76,35 @@ class PaperList extends Component {
componentWillUnmount() {
Bus.unbind("queryPaperPageList", this.queryPaperPageList);
}
// 查询分类树
queryCategoryTree = () => {
let query = {
bizType: 'PAPER',
count: true,
source: 0,
userId: User.getStoreUserId(),
tenantId: User.getStoreId(),
};
AidToolService.queryCategoryTree(query).then((res) => {
const { categoryList = [] } = res.result;
let list = this.renderTreeNodes(categoryList);
this.setState({ paperData: list });
});
}
renderTreeNodes = (data) => {
let newTreeData = data.map((item) => {
item.title = item.categoryName;
item.value = item.id;
item.key = item.id;
if (item.sonCategoryList) {
item.children = this.renderTreeNodes(item.sonCategoryList);
}
return item;
});
return newTreeData;
};
// 初始化列表查询
InitSearch = (categoryId) => {
......@@ -250,7 +283,7 @@ class PaperList extends Component {
},
},
{
title: "题目数量",
title: "试卷数量",
key: "questionCnt",
dataIndex: "questionCnt",
width: this.props.type !== "modal-select" ? "12%" : "20%",
......@@ -371,58 +404,29 @@ class PaperList extends Component {
this.props.onSelect(selectedRows[0] || {});
};
/**
* 设置【更多操作】选项
*/
setMoreOperationOption() {
return (
<Menu>
<Menu.Item key="2">
<div
key="import"
onClick={() => {
this.batchMove();
}}
>
批量移动
</div>
</Menu.Item>
<Menu.Item key="1">
<div
key="import"
onClick={() => {
this.batchDelete();
}}
>
批量删除
</div>
</Menu.Item>
</Menu>
);
}
batchMove = () => {
const { selectedRowKeys } = this.state;
if (_.isEmpty(selectedRowKeys)) {
message.warning('请先选择要移动的题目');
const { selectedPaperKeys } = this.state;
if (_.isEmpty(selectedPaperKeys)) {
message.warning('请先选择要移动的试卷');
return null;
}
this.setState({ openMoveModal: true });
}
batchMoveRemote = (categoryId) => {
const { selectedRowKeys } = this.state;
const { selectedPaperKeys } = this.state;
const data = {
categoryId,
id: selectedRowKeys,
paperId: selectedPaperKeys,
source: 0,
tenantId: User.getStoreId(),
userId: User.getUserId(),
};
Service.Hades('public/hades/batchMoveQuestion', data).then((res) => {
Service.Hades('public/hades/batchMovePaperCategory', data).then((res) => {
if (res.success) {
message.success('移动成功');
this.queryQuestionPageList();
this.queryPaperPageList();
this.clearSelect();
} else {
message.error('移动失败');
}
......@@ -432,13 +436,13 @@ class PaperList extends Component {
}
batchDelete = () => {
const { selectedRowKeys } = this.state;
if (_.isEmpty(selectedRowKeys)) {
message.warning('请先选择要删除的题目');
const { selectedPaperKeys } = this.state;
if (_.isEmpty(selectedPaperKeys)) {
message.warning('请先选择要删除的试卷');
return null;
}
Modal.confirm({
title: "确定要删除题目吗?",
title: "确定要删除试卷吗?",
content: "删除后,不可恢复。",
icon: (
<span className="icon iconfont default-confirm-icon">&#xe839; </span>
......@@ -447,15 +451,16 @@ class PaperList extends Component {
cancelText: "取消",
onOk: () => {
const data = {
id: selectedRowKeys,
paperId: selectedPaperKeys,
source: 0,
tenantId: User.getStoreId(),
userId: User.getUserId(),
};
Service.Hades('public/hades/batchDeleteQuestion', data).then((res) => {
Service.Hades('public/hades/batchDeletePaper', data).then((res) => {
if (res.success) {
message.success('删除成功');
this.queryQuestionPageList();
this.queryPaperPageList();
this.clearSelect();
} else {
message.error('删除失败');
}
......@@ -466,6 +471,18 @@ class PaperList extends Component {
})
}
onSelectPaper = (selectedPaperKeys) => {
if (selectedPaperKeys.length > 50) {
message.warning('最多只能选择50个试卷');
return null;
}
this.setState({ selectedPaperKeys });
};
clearSelect = () => {
this.setState({ selectedPaperKeys: [] });
}
render() {
const {
dataSource = [],
......@@ -474,8 +491,15 @@ class PaperList extends Component {
paperPreviewModal,
selectedRowKeys,
loading,
selectedPaperKeys,
openMoveModal,
paperData,
} = this.state;
const { current, size, categoryId, paperName } = query;
const paperRowSelection = {
selectedRowKeys: selectedPaperKeys,
onChange: this.onSelectPaper,
}
const rowSelection = {
type: "radio",
selectedRowKeys,
......@@ -515,41 +539,51 @@ class PaperList extends Component {
</Row>
</div>
{this.props.type !== "modal-select" && isPermiss && categoryId && (
[_.isEmpty(selectedRowKeys) ?
<div className="select-box">
{_.isEmpty(selectedPaperKeys) ?
<Button
type="primary"
className="mr8"
onClick={() => {
window.RCHistory.push({
pathname: `${match.url}/paper-operate-page?type=new&categoryId=${categoryId}`,
});
}}
>
新建试卷
</Button>
: <div className="select-container">
<span className="con">
<div>
<span className="icon iconfont tip">&#xe6f2;</span>
<span className="text">已选择{selectedPaperKeys.length}</span>
</div>
<div>
<span className="clear" onClick={this.clearSelect}>清空</span>
</div>
</span>
</div>
}
<Button
type="primary"
className="mr8"
onClick={() => {
window.RCHistory.push({
pathname: `${match.url}/paper-operate-page?type=new&categoryId=${categoryId}`,
});
this.batchMove();
}}
>
新建试卷
</Button>
: <div className="select-container">
<span className="con">
<div>
<span className="icon iconfont tip">&#xe6f2;</span>
<span className="text">已选择{selectedRowKeys.length}</span>
</div>
<div>
<span className="clear" onClick={this.clearSelect}>清空</span>
</div>
</span>
</div>,
<Dropdown className="ml8" overlay={this.setMoreOperationOption()}>
<Button id="more_operate">
更多操作
<DownOutlined />
</Button>
</Dropdown>]
>批量移动</Button>
<Button
onClick={() => {
this.batchDelete();
}}
>批量删除</Button>
</div>
)}
<div className="paper-list-content">
<ConfigProvider renderEmpty={this.customizeRenderEmpty}>
{this.props.type !== "modal-select" ? (
<Table
rowKey={(record) => record.id}
rowKey={(record) => record.paperId}
rowSelection={paperRowSelection}
dataSource={dataSource}
columns={this.parseColumns()}
pagination={false}
......@@ -558,7 +592,7 @@ class PaperList extends Component {
/>
) : (
<Table
rowKey={(record) => record.id}
rowKey={(record) => record.paperId}
dataSource={dataSource}
size={this.props.type == "modal-select"?'small':'middle'}
rowKey={(item) => {
......@@ -591,6 +625,19 @@ class PaperList extends Component {
</div>
)}
{paperPreviewModal}
{openMoveModal &&
<MoveModal
visible={openMoveModal}
title="试卷"
data={paperData}
length={selectedRowKeys.length}
onCancel={() => this.setState({ openMoveModal: false })}
onOk={(categoryId) => {
this.batchMoveRemote(categoryId);
this.setState({ openMoveModal: false });
}}
/>
}
</div>
<Route
path={`${match.url}/paper-operate-page`}
......
.paper-list {
.select-box {
display: flex;
align-items: center;
.select-container{
margin-right: 24px;
.con{
background: #FFF4DD;
border-radius: 4px;
padding: 3px 16px;
display: inline-flex;
align-items: center;
justify-content: space-between;
.tip{
font-size:14px;
color:#FF9D14;
margin-right:8px;
}
.text{
font-size:14px;
color:#666;
margin-right:30px;
}
.clear{
color:#5289FA;
font-size:14px;
}
}
}
}
.ant-radio-wrapper{
left: -10px;
}
......
......@@ -524,7 +524,9 @@ class QuestionList extends Component {
Service.Hades('public/hades/batchMoveQuestion', data).then((res) => {
if (res.success) {
message.success('移动成功');
Bus.trigger('queryCategoryTree', 'init');
this.queryQuestionPageList();
this.clearSelect();
} else {
message.error('移动失败');
}
......@@ -557,7 +559,9 @@ class QuestionList extends Component {
Service.Hades('public/hades/batchDeleteQuestion', data).then((res) => {
if (res.success) {
message.success('删除成功');
Bus.trigger('queryCategoryTree', 'init');
this.queryQuestionPageList();
this.clearSelect();
} else {
message.error('删除失败');
}
......
......@@ -39,26 +39,26 @@
}
.select-container{
.con{
.con {
background: #FFF4DD;
border-radius: 4px;
padding:6px 16px;
padding: 3px 16px;
display: inline-flex;
align-items: center;
justify-content: space-between;
.tip{
font-size:14px;
color:#FF9D14;
margin-right:8px;
.tip {
font-size: 14px;
color: #FF9D14;
margin-right: 8px;
}
.text{
font-size:14px;
color:#666;
margin-right:30px;
.text {
font-size: 14px;
color: #666;
margin-right: 30px;
}
.clear{
color:#5289FA;
font-size:14px;
.clear {
color: #5289FA;
font-size: 14px;
}
}
}
......
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