对接接口

master
zhengpengju 3 years ago
parent 2d0eaed165
commit 70064bbd85

@ -149,6 +149,7 @@ const CourseList: React.FC = () => {
hideInTable: false,
hideInForm: false,
hideInSearch: true,
width: 100,
renderText: (val: string) => `${val}`,
formItemProps: {
// 参照 https://ant.design/components/form-cn/#Rule
@ -284,6 +285,7 @@ const CourseList: React.FC = () => {
sorter: false,
hideInForm: true,
hideInSearch: true,
width: 100,
renderText: (val: string) => `${val}M`,
formItemProps: {
// 参照 https://ant.design/components/form-cn/#Rule
@ -309,6 +311,7 @@ const CourseList: React.FC = () => {
title: '操作',
dataIndex: 'option',
valueType: 'option',
width: 150,
render: (_dom: any, record: React.SetStateAction<TableListItem | undefined>) => [
<a
key="detail"

@ -92,19 +92,17 @@ export async function removeCourse(data: { key: number[] }, options?: Record<str
}
/** 查看课程仅仅获取课程详情不标记浏览量GET /dsideal_yy/ypt/careerTraining/course/view */
export async function queryCourseView(data: Record<string, any>, options?: Record<string, any>) {
return request<TableListItem>('/dsideal_yy/ypt/careerTraining/course/view', {
data,
method: 'POST',
requestType: 'form',
...(options || {}),
export async function queryCourseView(params: {
course_id: number;
//count: number;
}): Promise<{ data: { list: any } }> {
return request('/dsideal_yy/ypt/careerTraining/course/view', {
params,
});
}
/** 新建/修改主题 POST /dsideal_yy/ypt/careerTraining/subject/saveSubject */
export async function saveSubject(data: Record<string, any>, options?: Record<string, any>) {
return request<TableListItem>('/dsideal_yy/ypt/careerTraining/subject/saveSubject', {

@ -6,6 +6,7 @@
}
.edit-tag {
user-select: none;
margin: 2px;
}
.tag-input {
width: 78px;

@ -3,7 +3,7 @@ import React from 'react';
import ReactQuill from 'react-quill';
import 'react-quill/dist/quill.snow.css'
const ProFormRichEdit = (props) => {
const ProFormRichEdit = (props: any) => {
return (
<ProForm.Item {...props}>
<ReactQuill placeholder={props.placeholder} {...props.fieldProps} />

@ -1,5 +1,5 @@
import { PlusOutlined } from '@ant-design/icons';
import { Button, message, Input, Drawer } from 'antd';
import { Button, message, Image, Modal, } from 'antd';
import React, { useState, useRef } from 'react';
import { history } from 'umi';
import { PageContainer, FooterToolbar } from '@ant-design/pro-layout';
@ -10,14 +10,79 @@ import type { ProDescriptionsItemProps } from '@ant-design/pro-descriptions';
import ProDescriptions from '@ant-design/pro-descriptions';
import type { FormValueType } from './components/UpdateForm';
import UpdateForm from './components/UpdateForm';
import { copySubject, addSubject, updateSubject, removeSubject, querySubjectList } from './service';
import { copySubject, addSubject, updateSubject, removeSubject, querySubjectList, queryListChapterBySubject } from './service';
import type { TableListItem, TableListPagination } from './data';
import { queryCourseListByTag } from '../option/service';
/** 章节列表项定义 */
const chapterColumns: ProColumns<TableListItem>[] = [
{
title: '序号',
key: 'index',
valueType: 'indexBorder',
width: 48,
},
{
title: '章节名称',
dataIndex: 'chapter_name',
valueType: 'text',
hideInTable: false,
hideInDescriptions: false,
hideInForm: false,
hideInSearch: true,
},
{
title: '简介',
dataIndex: 'chapter_describe',
valueType: 'textarea',
sorter: false,
hideInTable: false,
hideInForm: false,
hideInSearch: true,
renderText: (val: string) => (<div dangerouslySetInnerHTML={{__html: val}} />),
},
{
title: '课程',
valueType: 'select',
dataIndex: 'course_ids',
sorter: false,
hideInTable: false,
hideInForm: false,
hideInSearch: true,
fieldProps: {
mode: "multiple"
},
renderText: (val: string) => `${val}`,
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}`,
},
];
/**
*
*
* @param fields
*/
const handleAdd = async (fields: TableListItem) => {
const hide = message.loading('正在添加');
@ -81,14 +146,14 @@ const handleRemove = async (selectedRows: TableListItem[]) => {
const TableList: React.FC = () => {
/** 新建窗口的弹窗 */
const [createModalVisible, handleModalVisible] = useState<boolean>(false);
/** 分布更新窗口的弹窗 */
const [updateModalVisible, handleUpdateModalVisible] = useState<boolean>(false);
const [showDetail, setShowDetail] = useState<boolean>(false);
const [detailModalVisible, handleDetailModalVisible] = useState<boolean>(false);
const actionRef = useRef<ActionType>();
const actionChapterRef = useRef<ActionType>();
const [currentRow, setCurrentRow] = useState<TableListItem>();
const [selectedRowsState, setSelectedRows] = useState<TableListItem[]>([]);
/** 国际化配置 */
const columns: ProColumns<TableListItem>[] = [
{
@ -108,7 +173,12 @@ const TableList: React.FC = () => {
render: (dom, entity) => {
// console.log(entity, 'entity')
return (
<img src={`/dsideal_yy/html/${entity.attachment_json.url}`} style={{ width: '150px', height: 'auto', border: '1px solid #f0f0f0' }} />
<Image
src={`/dsideal_yy/html/${entity.attachment_json.url}`}
width={300}
height={200}
fallback="data:image/png;base64,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"
style={{ border: '1px solid #f0f0f0', overflowY: 'hidden' }} />
);
},
},
@ -126,7 +196,7 @@ const TableList: React.FC = () => {
dataIndex: 'subject_describe',
valueType: 'textarea',
hideInSearch: true,
width: "60%",
width: "*",
render: (dom, entity) => {
return (
@ -142,9 +212,13 @@ const TableList: React.FC = () => {
{
title: '信息',
dataIndex: 'total_course_minutes',
sorter: true,
sorter: false,
hideInSearch: true,
width: 200,
render: (dom, entity) => {
if(entity.b_use === 0){
return '待发布'
}
return (
@ -168,9 +242,22 @@ const TableList: React.FC = () => {
title: '操作',
dataIndex: 'option',
valueType: 'option',
width: 200,
render: (_, record) => [
<a
key="config"
key="detail"
onClick={() => {
setCurrentRow(record);
if (actionChapterRef.current) {
actionChapterRef.current.reload();
}
handleDetailModalVisible(true);
}}
>
</a>,
<a
key="edit"
onClick={() => {
history.push(`/course/subject/step/update/${record.subject_id}`)
}}
@ -180,9 +267,11 @@ const TableList: React.FC = () => {
<a
key="copyAlert"
onClick={async () => {
const hide = message.loading('正在复制');
// console.log(e, record, 'copy')
const success = await copySubject({ subject_id: record.subject_id });
if (success) {
hide();
// handleModalVisible(false);
if (actionRef.current) {
actionRef.current.reload();
@ -307,6 +396,69 @@ const TableList: React.FC = () => {
/>
<ProFormTextArea width="md" name="desc" />
</ModalForm>
<Modal
title={'主题信息'}
width="50%"
visible={detailModalVisible}
onCancel={() => {
setCurrentRow(undefined); // 设置当前行
handleDetailModalVisible(false);
}}
footer={null}
centered
>
{currentRow?.subject_id && (
<>
<ProDescriptions
layout='horizontal'
column={1}
//actionRef={actionRef}
title={false}
/*
request={async () => {
console.log('step2 主题信息')
return Promise.resolve({
success: true,
data: { id: '这是一段文本', object: '', date: '2020-07-30 08:00', duration: '', grade: 100, through: '>60', learn: '>20 min', times: 2 },
});
}}*/
extra={false}
>
<ProDescriptions.Item dataIndex="id" hideInDescriptions />
<ProDescriptions.Item dataIndex="subject_name" label="主题名称" valueType="text">{currentRow?.subject_name}</ProDescriptions.Item>
<ProDescriptions.Item dataIndex="subject_describe" label="主题介绍" valueType="text">
<div dangerouslySetInnerHTML={{__html: currentRow?.subject_describe}} />
</ProDescriptions.Item>
</ProDescriptions>
<ProTable<TableListItem, TableListPagination>
headerTitle={false}
actionRef={actionChapterRef}
rowKey="chapter_id"
options={false}
search={false}
toolBarRender={false}
request={async (value) => {
const { data } = await queryListChapterBySubject({
subject_id: currentRow?.subject_id,
page_number: value?.current || 1,
page_size: value?.pageSize,
});
return {
current: data?.page_number,
data: data?.list,
pageSize: data?.page_size,
success: true,
total: data?.total_row || 0,
};
}}
// dataSource={list}
columns={chapterColumns}
rowSelection={false}
/>
</>
)}
</Modal>
<UpdateForm
onSubmit={async (value) => {
const success = await handleUpdate(value, currentRow);

@ -123,7 +123,9 @@ export async function querySubjectList(params: {
}
/**
* / POST /dsideal_yy/ypt/careerTraining/course/save */
* / POST /dsideal_yy/ypt/careerTraining/course/save
*
*/
export async function saveChapter(data: Record<string, any>, options?: Record<string, any>) {
return request<TableListItem>('/dsideal_yy/ypt/careerTraining/subject/saveChapter', {
data,
@ -132,3 +134,16 @@ export async function saveChapter(data: Record<string, any>, options?: Record<st
...(options || {}),
});
}
/**
*
*
*/
export async function commitSubject(data: Record<string, any>, options?: Record<string, any>) {
return request<TableListItem>('/dsideal_yy/ypt/careerTraining/subject/commitSubject', {
data,
method: 'POST',
requestType: 'form',
...(options || {}),
});
}

@ -24,7 +24,7 @@ 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 { getSubjectInfo, queryListChapterBySubject, saveChapter } from '../service';
import { commitSubject, getSubjectInfo, queryListChapterBySubject, saveChapter } from '../service';
import { v4 as uuidv4 } from 'uuid';
@ -241,9 +241,14 @@ export default () => {
console.log('url', subjectInfo?.attachment_json?.url);
// 编辑场景下需要使用formMapRef循环设置formData
formMapRef.current.forEach((formInstanceRef) => {
formInstanceRef.current?.setFieldsValue({
let fieldsValue;
const subjectValue = {
subject_name:subjectInfo?.subject_name,
subject_describe:subjectInfo?.subject_describe,
}
if(params?.id && subjectInfo?.attachment_json?.url){
fieldsValue = {
...subjectValue,
upload:[
{
name: subjectInfo?.attachment_json?.name,
@ -251,7 +256,12 @@ export default () => {
url: `/dsideal_yy/html/${subjectInfo?.attachment_json?.url}`
}
]
});
}
}else{
// 无附件
fieldsValue = subjectValue;
}
formInstanceRef.current?.setFieldsValue(fieldsValue);
});
}, [subjectInfo]);
@ -264,8 +274,8 @@ export default () => {
}>
formMapRef={formMapRef}
formRef={formRef}
onFinish={async () => {
onFinish={async (values) => {
console.log('values::', values)
message.success('提交成功');
}}
formProps={{
@ -298,18 +308,14 @@ export default () => {
console.log(value, "vvvvv");
const url = value?.upload[0]?.url?.replace('/dsideal_yy/html/','') || value?.upload[0]?.response?.url;
const _data = await saveSubject({
const { data } = await saveSubject({
...value,
subject_id: params?.id,
attachment_json: `{ "url": "${url}"}`
});
setSubjectIntro({subject_name:value?.subject_name, subject_describe:value?.subject_describe});
return {
current: _data?.page_number,
data: _data?.data?.list,
pageSize: _data?.page_size,
total: _data?.total_row || 0,
};
setSubjectIntro({subject_id:data?.subject_id, subject_name: value?.subject_name, subject_describe:value?.subject_describe});
return true;
}}
>
<Row gutter={24}>
@ -320,7 +326,7 @@ export default () => {
width="xl"
// tooltip="最长为 6 位汉字,需要与考生身份证一致"
placeholder="请输入名称"
// rules={[{ required: true }]}
rules={[{ required: true }]}
// value="锦书"
// disabled
/>
@ -330,7 +336,7 @@ export default () => {
width="xl"
// tooltip="最长为 6 位汉字,需要与考生身份证一致"
placeholder="请输入介绍"
// rules={[{ required: true }]}
rules={[{ required: true }]}
// value="锦书"
// disabled
@ -359,6 +365,7 @@ export default () => {
key: `down/Syzx/${uuid?.substr(0, 2)}/${uuid}.${uploadFileExt}`
}
}}
rules={[{ required: true }]}
action="/dsideal_yy/res/plupload/"
extra=""
/>
@ -412,7 +419,7 @@ export default () => {
}}*/
extra={false}
>
<ProDescriptions.Item dataIndex="id" hideInDescriptions />
<ProDescriptions.Item dataIndex="subject_id" hideInDescriptions />
<ProDescriptions.Item dataIndex="subject_name" label="主题名称" valueType="text">{subjectIntro?.subject_name}</ProDescriptions.Item>
<ProDescriptions.Item dataIndex="subject_describe" label="主题介绍" valueType="text">
<div dangerouslySetInnerHTML={{__html: subjectIntro?.subject_describe}} />
@ -422,7 +429,7 @@ export default () => {
<ProTable<TableListItem, TableListPagination>
headerTitle={false}
actionRef={actionRef}
rowKey="course_id"
rowKey="chapter_id"
options={false}
search={false}
toolBarRender={() => [
@ -506,7 +513,9 @@ export default () => {
stepProps={{
description: false,
}}
onFinish={async () => {
onFinish={async (values) => {
console.log('subject_id:', subjectIntro?.subject_id);
await commitSubject({subject_id: subjectIntro?.subject_id});
console.log(formRef.current?.getFieldsValue());
// 跳转到指定路由
history.push('/course/subject');
@ -521,7 +530,7 @@ export default () => {
status="success"
title={
<div className={styles.title}>
<span> {subjectIntro?.subject_name} /</span>
<span style={{color: '#1890ff'}}>{subjectIntro?.subject_name} </span>/
</div>
}
subTitle="点击提交将设置为发布状态。"

@ -213,7 +213,7 @@ const CourseList: React.FC = () => {
render: (_dom: any, record: React.SetStateAction<TableListItem | undefined>) => [
<a
key="update"
key="detail"
onClick={() => {
handleUpdateModalVisible(true);
setCurrentRow(record);

@ -1,6 +1,6 @@
/** 资质考试 */
//import { AlignLeftOutlined, PlusOutlined } from '@ant-design/icons';
import { Switch, Button, Card, Col, List, Menu, Progress, Row, Typography, Space, Divider, Radio, Checkbox, Tag, Dropdown } from 'antd';
import { Switch, Button, Card, Col, List, Menu, Progress, Row, Typography, Space, Divider, Radio, Checkbox, Tag, Dropdown, Upload } from 'antd';
import { PageContainer } from '@ant-design/pro-layout';
//import { useRequest } from 'umi';
//import { queryFakeList } from './service';
@ -9,62 +9,38 @@ import styles from './style.less';
//import SubMenu from 'antd/lib/menu/SubMenu';
//import ProCard from '@ant-design/pro-card';
import ProList from '@ant-design/pro-list';
import { ReactText, useState } from 'react';
import { ReactText, useEffect, useState } from 'react';
import { PlusOutlined, DeleteOutlined, DownloadOutlined, UploadOutlined, EditOutlined, EyeOutlined, EyeInvisibleOutlined, DownOutlined } from '@ant-design/icons';
import { exportQuestionTemplate, queryQuestionList, queryQuestionType } from './service';
import { useRequest } from 'umi';
import { queryCourseView } from '@/pages/course/option/service';
//const { Paragraph } = Typography;
const QuestionBank = () => {
const [questionType, setQuestionType] = useState([]);
const [selectedRowsState, setSelectedRows] = useState<API.RuleListItem[]>([]);
const [expandedDescRowKeys, setExpandedDescRowKeys] = useState<readonly ReactText[]>([]); // 展开解析设置
const [addType, setAddType] = useState(0);
const numbers = [];
for(let i=0;i<50;i++){
numbers.push({id: `${i}`})
}
const dataSource = [
{
id: 1,
name: '下面哪个词语能体现未来思维?',
type: '单选',
options: [
{label: '井底之蛙', value: 'A'},
{label: '鼠目寸光', value: 'B'},
{label: '未雨绸缪', value: 'C'},
{label: '即时行乐', value: 'D'},
],
const labels = ['A','B','C','D','E']
time: '2022/12/12',
tag: '生涯理论',
course: '特质因素理论',
/** 获取题型 */
const { data } = useRequest(() => {
return queryQuestionType();
},{
formatResult: (result) => {
return result.list;
}
});
/*
const { data: template } = useRequest(() => {
return exportQuestionTemplate();
});
*/
useEffect(() => {
setQuestionType(data || []);
}, [data]);
answer:'C',
desc: '该成语意思是天还没有下雨,先把门窗绑牢。比喻事先做好准备工作。该成语意思是天还没有下雨,先把门窗绑牢。比喻事先做好准备工作。该成语意思是天还没有下雨,先把门窗绑牢。比喻事先做好准备工作。该成语意思是天还没有下雨,先把门窗绑牢。比喻事先做好准备工作。',
},
{
id: 2,
name: 'Ant Design',
type: '多选',
image:
'https://gw.alipayobjects.com/zos/antfincdn/efFD%24IOql2/weixintupian_20170331104822.jpg',
desc: '我是一条测试的描述',
},
{
id: 3,
name: '蚂蚁金服体验科技',
type: '判断',
image:
'https://gw.alipayobjects.com/zos/antfincdn/efFD%24IOql2/weixintupian_20170331104822.jpg',
desc: '我是一条测试的描述',
},
{
id: 4,
name: 'TechUI',
type: '单选',
image:
'https://gw.alipayobjects.com/zos/antfincdn/efFD%24IOql2/weixintupian_20170331104822.jpg',
desc: '我是一条测试的描述',
},
];
return (
<PageContainer content={false} extraContent={false} className={styles.questionbank}>
@ -76,11 +52,17 @@ const QuestionBank = () => {
showSizeChanger: false,
}}
toolBarRender={() => {
const menuItems = [];
console.log('toolBarRender', questionType);
if(questionType?.length > 0){
console.log('push');
questionType.forEach((item: {code: number, name: string})=>{
menuItems.push(<Menu.Item key={item?.code}>{item?.name}</Menu.Item>)
})
}
const menu = (
<Menu onClick={(value)=>setAddType(value)}>
<Menu.Item key="1"></Menu.Item>
<Menu.Item key="2"></Menu.Item>
<Menu.Item key="3"></Menu.Item>
{menuItems}
</Menu>
);
return [
@ -92,15 +74,27 @@ const QuestionBank = () => {
<Button key="remove" type="default" danger>
<DeleteOutlined />
</Button>,
<Button key="download" >
<Button key="download" onClick={()=>{window.location.href='/dsideal_yy/zygh/training/exportQuestionTemplate'}} >
<DownloadOutlined />
</Button>,
<Upload
accept='.xlsx'
showUploadList={false}
action="/dsideal_yy/res/plupload/"
data={
{
type: 0,
}
}
>
<Button key="upload" >
<UploadOutlined />
</Button>,
</Button>
</Upload>,
];
}}
onRow={(record: any) => {
/*
return {
onMouseEnter: () => {
console.log(record);
@ -108,12 +102,45 @@ const QuestionBank = () => {
onClick: () => {
console.log(record);
},
};
};*/
}}
rowKey="id"
headerTitle={false}
tooltip={false}
dataSource={dataSource}
request={async (value) => {
console.log('value', value)
/*
const { create_time } = value;
if (create_time) {
value.begin_time = create_time[0]
value.end_time = create_time[1]
}*/
const questions = await queryQuestionList({
...value,
type: 0,
page_number: value?.current || 1,
page_size: value?.pageSize,
});
// 课程名称及课程标签
console.log('data',questions);
const data = []
for(let i=0; i<questions?.table_List.length; i++){
const { data: course } = await queryCourseView({
course_id: questions?.table_List[i]?.course_id
});
data[i] = {...questions?.table_List[i], course_name:course?.course_name, tag_name:course?.tag_name, };
}
return {
current: questions?.pageNumber,
data: data,
pageSize: questions?.pageSize,
success: true,
total: questions?.totalRow || 0,
};
}}
//dataSource={dataSource}
rowSelection={{
onChange: (_, selectedRows) => {
setSelectedRows(selectedRows);
@ -124,29 +151,42 @@ const QuestionBank = () => {
showExtra="always"
metas={{
title: {
dataIndex: 'name',
dataIndex: 'question_stem',
render: (text: React.ReactNode, record: T, index: number) => `1. ${text}`,
},
avatar: {
dataIndex: 'type',
dataIndex: 'question_type',
valueType: 'text',
render: (text: React.ReactNode, record: T, index: number) => `[${record.type}]`,
render: (text: React.ReactNode, record: T, index: number) => {
const type = questionType?.filter((item, idx, self)=>{
console.log('FFFF', item, idx, self);
return item?.code === record.question_type
});
console.log('type', type?.name);
console.log('type', type?.name);
console.log('questionType::::',questionType);
return `[${type[0]?.name}]`
},
},
description: {
dataIndex: 'options',
dataIndex: 'answers',
valueType: 'checkbox',
render: (text: React.ReactNode, record: T, index: number) => {
console.log('description answers', record)
return (
<List
header={false}
footer={false}
bordered={false}
dataSource={record.options || []}
renderItem={item => (
dataSource={record.answers || []}
rowKey='id'
renderItem={ (item, key) => {
console.log('item', item);
return (
<List.Item>
<Typography.Text mark={false}>{`${item?.value}. ${item?.label}`}</Typography.Text>
</List.Item>
)}
<Typography.Text mark={false}>{`${(record?.question_type === 2) ? ['T','F'][key] : labels[key]}. ${item?.answer}`}</Typography.Text>
</List.Item>)
}}
/>
);
},
@ -154,24 +194,57 @@ const QuestionBank = () => {
subTitle: { },
content: {
render: (text: React.ReactNode, record: T, index: number) => {
let answer = '';
const answertrue = record?.answertrue?.split(',');
console.log('answertrue', answertrue)
/** 题型 */
switch(record?.question_type){
case 0: // 单选
case 1: // 多选
answer = labels?.filter((x, idx, self)=>answertrue[idx] === `${idx}`).toString()
break;
case 2: // 判断
answer = ['T', 'F']?.filter((x, idx, self)=>answertrue[idx] === `${idx}`).toString()
break;
}
console.log('expandedDescRowKeys', expandedDescRowKeys)
if(expandedDescRowKeys?.indexOf(record.id) > -1){
return (
<Space direction="vertical" style={{border:'solid 1px #f0f0f0;',padding:10}}>
<Typography>{record.answer}</Typography>
<Space direction="vertical" style={{borderTop:'solid 1px #f0f0f0', padding:10, margin: '5px -18px 0 -24px', background: '#fdfdfd'}}>
<Typography>
{answer}
</Typography>
<Typography>{record.desc}</Typography>
</Space>
);
}else{
return (
<Space direction="vertical" style={{borderTop:'solid 1px #f0f0f0', padding:10, margin: '5px -18px 0 -24px', background: '#fdfdfd'}}>
<Typography>
{answer}
</Typography>
</Space>
)
}
},
},
actions: {
cardActionProps: 'extra',
render: (text: React.ReactNode, record: T, _index: number) => {
let eye
if(expandedDescRowKeys?.indexOf(record.id) > -1){
eye = <><EyeInvisibleOutlined /> </>
}else{
eye = <><EyeOutlined /> </>
}
return(
<Row style={{padding:'10px 24px'}}>
<Col flex={1} style={{textAlign:'left'}}>
<Space direction="horizontal" size="large">
<Typography>{record.time}</Typography>
<Typography>{record.tag}</Typography>
<Typography>{record.course}</Typography>
<Typography>{record?.create_time}</Typography>
<Typography>{record?.tag_name}</Typography>
<Typography>{record?.course_name}</Typography>
</Space>
</Col>
<Col flex={1} style={{textAlign:'right'}}>
@ -185,12 +258,21 @@ const QuestionBank = () => {
<a
key="view"
onClick={()=>{
if(expandedDescRowKeys?.indexOf(record.id) > -1){
const descRowKeys = expandedDescRowKeys?.filter((item, idx, self)=>{
console.log('FFFF', item, idx, self);
return item !== record.id
});
setExpandedDescRowKeys([...descRowKeys]);
}else{
setExpandedDescRowKeys([...expandedDescRowKeys, record.id]);
}
console.log('record id:', record.id);
console.log('expandedDescRowKeys', expandedDescRowKeys)
console.log('expandedDescRowKeys......', expandedDescRowKeys)
}}
>
<EyeOutlined /> <EyeInvisibleOutlined />
{eye}
</a>
</Space>
</Col>

@ -8,3 +8,68 @@ export async function queryFakeList(params: {
params,
});
}
/**
*
* @param params
* @returns
*/
export async function queryQuestionType(): Promise<{ list: any } > {
return request('/dsideal_yy/newUniversityExamination/base/getDicItem', {
method: 'GET',
params: {
kind: 'ZYGH_TRAINING_QUESTION_TYPE'
},
});
}
/**
*
* @param params
* @returns
*/
export async function exportQuestionTemplate(): Promise<{ list: any } > {
return request('/dsideal_yy/zygh/training/exportQuestionTemplate', {
method: 'GET',
params: {
},
});
}
/** 新建/修改试题 */
export async function saveQuestion(data: Record<string, any>, options?: Record<string, any>) {
return request<TableListItem>('/dsideal_yy/zygh/training/updateQuestion', {
data,
method: 'POST',
requestType: 'form',
...(options || {}),
});
}
/**
*
* @param params
* @returns
*/
export async function queryQuestionList(params: {
count: number;
}): Promise<{ data: { list: CardListItemDataType[] } }> {
return request('/dsideal_yy/zygh/training/getQuestionList', {
params,
});
}
/**
*
* @param params
* @returns
*/
export async function queryQuestionById(params: {
count: number;
}): Promise<{ data: { list: CardListItemDataType[] } }> {
return request('/dsideal_yy/zygh/training/getQuestionById', {
params,
});
}

@ -211,7 +211,7 @@ const TableList: React.FC = () => {
valueType: 'option',
render: (_, record) => [
<a
key="config"
key="detail"
onClick={() => {
handleUpdateModalVisible(true);
setCurrentRow(record);
@ -241,6 +241,7 @@ const TableList: React.FC = () => {
headerTitle={false}
actionRef={actionRef}
rowKey="train_id"
options={false}
search={{
labelWidth: 120,
}}

Loading…
Cancel
Save