|
|
|
@ -23,167 +23,16 @@ import ProFormRichEdit from '../components/ProFormRichEdit';
|
|
|
|
|
import type { ActionType, ProColumns } from '@ant-design/pro-table';
|
|
|
|
|
import ProTable from '@ant-design/pro-table';
|
|
|
|
|
import type { TableListItem, TableListPagination } from '../../option/data';
|
|
|
|
|
import { queryCourseList, queryCourseListByTag, queryTagList, saveSubject } from '../../option/service';
|
|
|
|
|
import { commitSubject, getSubjectInfo, queryListChapterBySubject, saveChapter } from '../service';
|
|
|
|
|
import {queryCourseList, queryCourseListByTag, queryTagList, removeCourse, saveSubject} from '../../option/service';
|
|
|
|
|
import { commitSubject, getSubjectInfo, queryListChapterBySubject, saveChapter,deleteChapter } from '../service';
|
|
|
|
|
import { v4 as uuidv4 } from 'uuid';
|
|
|
|
|
import {DataItem} from "@antv/data-set/lib/transform/tag-cloud";
|
|
|
|
|
import {removeTrain} from "@/pages/training/option/service";
|
|
|
|
|
import {listMyLearningChapterCourse} from "../../../../../../web/src/pages/course/list/service";
|
|
|
|
|
|
|
|
|
|
const { confirm } = Modal;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** 列表项定义 */
|
|
|
|
|
const columns: ProColumns<TableListItem>[] = [
|
|
|
|
|
{
|
|
|
|
|
title: '序号',
|
|
|
|
|
key: 'index',
|
|
|
|
|
valueType: 'indexBorder',
|
|
|
|
|
width: 48,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: '章节名称',
|
|
|
|
|
dataIndex: 'chapter_name',
|
|
|
|
|
valueType: 'text',
|
|
|
|
|
hideInTable: false,
|
|
|
|
|
hideInDescriptions: false,
|
|
|
|
|
hideInForm: false,
|
|
|
|
|
hideInSearch: true,
|
|
|
|
|
formItemProps: {
|
|
|
|
|
rules: [
|
|
|
|
|
{
|
|
|
|
|
required: true,
|
|
|
|
|
message: '请填写章节名称',
|
|
|
|
|
},
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: '简介',
|
|
|
|
|
dataIndex: 'chapter_describe',
|
|
|
|
|
valueType: 'textarea',
|
|
|
|
|
sorter: false,
|
|
|
|
|
hideInTable: false,
|
|
|
|
|
hideInForm: false,
|
|
|
|
|
hideInSearch: true,
|
|
|
|
|
formItemProps: {
|
|
|
|
|
rules: [
|
|
|
|
|
{
|
|
|
|
|
required: true,
|
|
|
|
|
message: '请填写章节简介',
|
|
|
|
|
},
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
renderText: (val: string) => (<div dangerouslySetInnerHTML={{__html: val}} />),
|
|
|
|
|
renderFormItem: (item, { defaultRender, ...rest }, form) => (
|
|
|
|
|
<ProFormRichEdit
|
|
|
|
|
name="chapter_describe"
|
|
|
|
|
label=""
|
|
|
|
|
width="xl"
|
|
|
|
|
// tooltip="最长为 6 位汉字,需要与考生身份证一致"
|
|
|
|
|
placeholder="请输入介绍"
|
|
|
|
|
// rules={[{ required: true }]}
|
|
|
|
|
value="锦书"
|
|
|
|
|
// disabled
|
|
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: '标签',
|
|
|
|
|
valueType: 'select',
|
|
|
|
|
dataIndex: 'tags',
|
|
|
|
|
sorter: false,
|
|
|
|
|
hideInTable: true,
|
|
|
|
|
hideInForm: false,
|
|
|
|
|
hideInSearch: true,
|
|
|
|
|
fieldProps: {
|
|
|
|
|
mode: "multiple"
|
|
|
|
|
},
|
|
|
|
|
renderText: (val: string) => `${val}`,
|
|
|
|
|
request: async () => {
|
|
|
|
|
const { data: Items } = await queryTagList({});
|
|
|
|
|
console.log('queryTagList...')
|
|
|
|
|
const tags = []
|
|
|
|
|
for (let i = 0; i < Items.length; i++) {
|
|
|
|
|
tags.push({ label: Items[i].tag_name, value: Items[i].tag_id })
|
|
|
|
|
}
|
|
|
|
|
console.log(tags, 'tags:::');
|
|
|
|
|
return tags;
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: '课程',
|
|
|
|
|
valueType: 'select',
|
|
|
|
|
dataIndex: 'course_ids',
|
|
|
|
|
sorter: false,
|
|
|
|
|
hideInTable: false,
|
|
|
|
|
hideInForm: false,
|
|
|
|
|
hideInSearch: true,
|
|
|
|
|
fieldProps: {
|
|
|
|
|
mode: "multiple"
|
|
|
|
|
},
|
|
|
|
|
formItemProps: {
|
|
|
|
|
rules: [
|
|
|
|
|
{
|
|
|
|
|
required: true,
|
|
|
|
|
message: '请填选择课程',
|
|
|
|
|
},
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
renderText: (val: string) => `${val}`,
|
|
|
|
|
dependencies: ['tags'],
|
|
|
|
|
request: async (params) => {
|
|
|
|
|
const {tags} = params;
|
|
|
|
|
const { data: Items } = await queryCourseListByTag({tag_ids: tags?.toString()});
|
|
|
|
|
console.log('queryCourseListByTag...')
|
|
|
|
|
const courses = []
|
|
|
|
|
for (let i = 0; i < Items?.length; i++) {
|
|
|
|
|
courses.push({ label: Items[i]?.course_name, value: Items[i]?.course_id })
|
|
|
|
|
}
|
|
|
|
|
console.log(courses, 'courses:::');
|
|
|
|
|
return courses;
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: '学时',
|
|
|
|
|
dataIndex: 'course_minutes',
|
|
|
|
|
valueType: 'text',
|
|
|
|
|
sorter: false,
|
|
|
|
|
hideInTable: false,
|
|
|
|
|
hideInForm: true,
|
|
|
|
|
hideInSearch: true,
|
|
|
|
|
renderText: (val: string) => `${val}`,
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
title: '操作',
|
|
|
|
|
dataIndex: 'option',
|
|
|
|
|
valueType: 'option',
|
|
|
|
|
width: 200,
|
|
|
|
|
render: (_dom: any, record: React.SetStateAction<TableListItem | undefined>) => [
|
|
|
|
|
<a
|
|
|
|
|
key="detail"
|
|
|
|
|
onClick={() => {
|
|
|
|
|
//console.log('entity', entity);
|
|
|
|
|
//setCurrentRow(record);
|
|
|
|
|
//handleDetailModalVisible(true);
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
查看
|
|
|
|
|
</a>,
|
|
|
|
|
<a
|
|
|
|
|
key="update"
|
|
|
|
|
onClick={() => {
|
|
|
|
|
//setCurrentRow(record);
|
|
|
|
|
//handleUpdateModalVisible(true);
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
编辑
|
|
|
|
|
</a>,
|
|
|
|
|
<a key="remove" onClick={() => { }}>
|
|
|
|
|
删除
|
|
|
|
|
</a>,
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 添加章节
|
|
|
|
@ -221,21 +70,215 @@ export default () => {
|
|
|
|
|
const [createModalVisible, handleCreateModalVisible] = useState<boolean>(false);
|
|
|
|
|
const [detailModalVisible, handleDetailModalVisible] = useState<boolean>(false);
|
|
|
|
|
const [updateModalVisible, handleUpdateModalVisible] = useState<boolean>(false);
|
|
|
|
|
|
|
|
|
|
const [selectedRowsState, setSelectedRows] = useState<TableListItem[]>([]);
|
|
|
|
|
const [uploadFileName, SetUploadFileName] = useState<string>();
|
|
|
|
|
const [uploadFileExt, SetUploadFileExt] = useState<string>();
|
|
|
|
|
|
|
|
|
|
const [subjectIntro, setSubjectIntro] = useState({});
|
|
|
|
|
|
|
|
|
|
const [currentRow, setCurrentRow] = useState<TableListItem>();
|
|
|
|
|
const formMapRef = useRef<React.MutableRefObject<ProFormInstance<any> | undefined>[]>([]);
|
|
|
|
|
|
|
|
|
|
/** 列表项定义 */
|
|
|
|
|
const columns: ProColumns<TableListItem>[] = [
|
|
|
|
|
{
|
|
|
|
|
title: '序号',
|
|
|
|
|
key: 'index',
|
|
|
|
|
valueType: 'indexBorder',
|
|
|
|
|
width: 48,
|
|
|
|
|
align:'center'
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: '章节名称',
|
|
|
|
|
dataIndex: 'chapter_name',
|
|
|
|
|
valueType: 'text',
|
|
|
|
|
hideInTable: false,
|
|
|
|
|
hideInDescriptions: false,
|
|
|
|
|
hideInForm: false,
|
|
|
|
|
hideInSearch: true,
|
|
|
|
|
formItemProps: {
|
|
|
|
|
rules: [
|
|
|
|
|
{
|
|
|
|
|
required: true,
|
|
|
|
|
message: '请填写章节名称',
|
|
|
|
|
},
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
align:'center'
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: '简介',
|
|
|
|
|
dataIndex: 'chapter_describe',
|
|
|
|
|
valueType: 'textarea',
|
|
|
|
|
sorter: false,
|
|
|
|
|
hideInTable: false,
|
|
|
|
|
hideInForm: false,
|
|
|
|
|
hideInSearch: true,
|
|
|
|
|
formItemProps: {
|
|
|
|
|
rules: [
|
|
|
|
|
{
|
|
|
|
|
required: true,
|
|
|
|
|
message: '请填写章节简介',
|
|
|
|
|
},
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
renderText: (val: string) => (<div dangerouslySetInnerHTML={{__html: val}} />),
|
|
|
|
|
renderFormItem: (item, { defaultRender, ...rest }, form) => (
|
|
|
|
|
<ProFormRichEdit
|
|
|
|
|
name="chapter_describe"
|
|
|
|
|
label=""
|
|
|
|
|
width="xl"
|
|
|
|
|
// tooltip="最长为 6 位汉字,需要与考生身份证一致"
|
|
|
|
|
placeholder="请输入介绍"
|
|
|
|
|
// rules={[{ required: true }]}
|
|
|
|
|
value="锦书"
|
|
|
|
|
// disabled
|
|
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
),
|
|
|
|
|
align:'center'
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: '标签',
|
|
|
|
|
valueType: 'select',
|
|
|
|
|
dataIndex: 'tags',
|
|
|
|
|
sorter: false,
|
|
|
|
|
hideInTable: true,
|
|
|
|
|
hideInForm: false,
|
|
|
|
|
hideInSearch: true,
|
|
|
|
|
fieldProps: {
|
|
|
|
|
mode: "multiple"
|
|
|
|
|
},
|
|
|
|
|
renderText: (val: string) => `${val}`,
|
|
|
|
|
request: async () => {
|
|
|
|
|
const { data: Items } = await queryTagList({});
|
|
|
|
|
console.log('queryTagList...')
|
|
|
|
|
const tags = []
|
|
|
|
|
for (let i = 0; i < Items.length; i++) {
|
|
|
|
|
tags.push({ label: Items[i].tag_name, value: Items[i].tag_id })
|
|
|
|
|
}
|
|
|
|
|
console.log(tags, 'tags:::');
|
|
|
|
|
return tags;
|
|
|
|
|
},
|
|
|
|
|
align:'center'
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: '课程',
|
|
|
|
|
valueType: 'select',
|
|
|
|
|
dataIndex: 'course_ids',
|
|
|
|
|
sorter: false,
|
|
|
|
|
hideInTable: false,
|
|
|
|
|
hideInForm: false,
|
|
|
|
|
hideInSearch: true,
|
|
|
|
|
fieldProps: {
|
|
|
|
|
mode: "multiple"
|
|
|
|
|
},
|
|
|
|
|
formItemProps: {
|
|
|
|
|
rules: [
|
|
|
|
|
{
|
|
|
|
|
required: true,
|
|
|
|
|
message: '请填选择课程',
|
|
|
|
|
},
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
renderText: (val: string) => `${val}`,
|
|
|
|
|
dependencies: ['tags'],
|
|
|
|
|
request: async (params) => {
|
|
|
|
|
const {tags} = params;
|
|
|
|
|
const { data: Items } = await queryCourseListByTag({tag_ids: tags?.toString()});
|
|
|
|
|
console.log('queryCourseListByTag...')
|
|
|
|
|
const courses = []
|
|
|
|
|
for (let i = 0; i < Items?.length; i++) {
|
|
|
|
|
courses.push({ label: Items[i]?.course_name, value: Items[i]?.course_id })
|
|
|
|
|
}
|
|
|
|
|
console.log(courses, 'courses:::');
|
|
|
|
|
return courses;
|
|
|
|
|
},
|
|
|
|
|
align:'center'
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: '学时',
|
|
|
|
|
dataIndex: 'course_minutes',
|
|
|
|
|
valueType: 'text',
|
|
|
|
|
sorter: false,
|
|
|
|
|
hideInTable: false,
|
|
|
|
|
hideInForm: true,
|
|
|
|
|
hideInSearch: true,
|
|
|
|
|
renderText: (val: string) => `${val}`,
|
|
|
|
|
align:'center'
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
title: '操作',
|
|
|
|
|
dataIndex: 'option',
|
|
|
|
|
valueType: 'option',
|
|
|
|
|
width: 200,
|
|
|
|
|
align:'center',
|
|
|
|
|
render: (_dom: any, record: React.SetStateAction<TableListItem | undefined>) => [
|
|
|
|
|
<a
|
|
|
|
|
key="update"
|
|
|
|
|
style={{marginRight:'1rem'}}
|
|
|
|
|
onClick={() => {
|
|
|
|
|
setCurrentRow(record);
|
|
|
|
|
handleUpdateModalVisible(true);
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
编辑
|
|
|
|
|
</a>,
|
|
|
|
|
<a key="remove" onClick={() => {
|
|
|
|
|
showConfirm(record)
|
|
|
|
|
|
|
|
|
|
}}>
|
|
|
|
|
删除
|
|
|
|
|
</a>,
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const params = useParams();
|
|
|
|
|
//console.log('params', params);
|
|
|
|
|
console.log('params', params);
|
|
|
|
|
|
|
|
|
|
const {data:subjectInfo} = useRequest(() => {
|
|
|
|
|
return getSubjectInfo({subject_id: params?.id});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const showConfirm=async (record)=>{
|
|
|
|
|
confirm({
|
|
|
|
|
title: '确认删除章节吗?',
|
|
|
|
|
centered:true,
|
|
|
|
|
onOk() {
|
|
|
|
|
handleRemove([record]);
|
|
|
|
|
setSelectedRows([]);
|
|
|
|
|
actionRef.current?.reloadAndRest?.();
|
|
|
|
|
},
|
|
|
|
|
onCancel() {
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const handleRemove = async (selectedRows: TableListItem[]) => {
|
|
|
|
|
const hide = message.loading('正在删除');
|
|
|
|
|
if (!selectedRows) return true;
|
|
|
|
|
try {
|
|
|
|
|
const {code, msg} = await deleteChapter({
|
|
|
|
|
key: selectedRows,
|
|
|
|
|
});
|
|
|
|
|
hide();
|
|
|
|
|
if(code === 2000 ){
|
|
|
|
|
message.success('删除成功,即将刷新');
|
|
|
|
|
}else{
|
|
|
|
|
message.warning(msg);
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
} catch (error) {
|
|
|
|
|
// console.log('error', error)
|
|
|
|
|
hide();
|
|
|
|
|
message.error('删除失败,请重试');
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
console.log('getSubjectInfo', subjectInfo);
|
|
|
|
|
console.log('url', subjectInfo?.attachment_json?.url);
|
|
|
|
@ -266,6 +309,19 @@ export default () => {
|
|
|
|
|
|
|
|
|
|
}, [subjectInfo]);
|
|
|
|
|
|
|
|
|
|
/** 获取列数据初始值 */
|
|
|
|
|
const getInitialValues = (cols: any[], vals: any) => {
|
|
|
|
|
console.log('getInitialValues-columns', columns);
|
|
|
|
|
console.log('getInitialValues-values', vals);
|
|
|
|
|
const initialValues: any[] = [];
|
|
|
|
|
cols.forEach((column: { dataIndex: string }) => {
|
|
|
|
|
const key: any = column?.dataIndex || '';
|
|
|
|
|
initialValues.push({ ...column, initialValue: key ? vals[key] : '' });
|
|
|
|
|
});
|
|
|
|
|
console.log('initialValues::', initialValues);
|
|
|
|
|
return initialValues || [];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<PageContainer content={''} extraContent={''}>
|
|
|
|
|
<ProCard className={styles.examinationrules}>
|
|
|
|
@ -504,6 +560,54 @@ export default () => {
|
|
|
|
|
columns={columns}
|
|
|
|
|
/>
|
|
|
|
|
</Modal>
|
|
|
|
|
<Modal
|
|
|
|
|
title="编辑章节"
|
|
|
|
|
//
|
|
|
|
|
width="60%"
|
|
|
|
|
visible={updateModalVisible}
|
|
|
|
|
destroyOnClose
|
|
|
|
|
onCancel={() => {
|
|
|
|
|
handleUpdateModalVisible(false);
|
|
|
|
|
}}
|
|
|
|
|
footer={null}
|
|
|
|
|
>
|
|
|
|
|
{console.log('currentRow',currentRow)}
|
|
|
|
|
{currentRow?.chapter_id && (
|
|
|
|
|
<BetaSchemaForm<DataItem>
|
|
|
|
|
layout="horizontal"
|
|
|
|
|
layoutType="Form"
|
|
|
|
|
labelCol={{ span: 8 }}
|
|
|
|
|
wrapperCol={{ span: 12 }}
|
|
|
|
|
onFinish={async (values) => {
|
|
|
|
|
console.log('values', values)
|
|
|
|
|
console.log('currentRow', currentRow)
|
|
|
|
|
//const url = values?.upload[0]?.url?.replace('/dsideal_yy/html/','') || values?.upload[0]?.response?.url;
|
|
|
|
|
//console.log('url', url)
|
|
|
|
|
// await handleUpdate({
|
|
|
|
|
// ...values,
|
|
|
|
|
// attachment_filesize: attachment_json?.size || 0, // Bit 字节
|
|
|
|
|
// course_id: currentRow?.course_id,
|
|
|
|
|
// attachment_json: `{"img":"", "name": "${values.attachment_json?.name}", "url": "${values.attachment_json?.url}", "size": "${values.attachment_json?.size}"}`
|
|
|
|
|
// });
|
|
|
|
|
handleUpdateModalVisible(false); // 隐藏编辑窗口
|
|
|
|
|
actionRef.current?.reloadAndRest?.();
|
|
|
|
|
console.log(values);
|
|
|
|
|
}}
|
|
|
|
|
submitter={{
|
|
|
|
|
render: (props, doms) => (
|
|
|
|
|
<Row>
|
|
|
|
|
<Col span={12} offset={8}>
|
|
|
|
|
<Space>{doms}</Space>
|
|
|
|
|
</Col>
|
|
|
|
|
</Row>
|
|
|
|
|
),
|
|
|
|
|
}}
|
|
|
|
|
// action = ''
|
|
|
|
|
title="编辑"
|
|
|
|
|
columns={getInitialValues(columns, currentRow)}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
|
|
|
|
</Modal>
|
|
|
|
|
</div>
|
|
|
|
|
</StepsForm.StepForm>
|
|
|
|
|
|
|
|
|
|