Merge pull request 'zouyf_dev' (#178) from zouyf_dev into main
Reviewed-on: #178
This commit is contained in:
commit
4b71008bee
|
@ -0,0 +1,111 @@
|
||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询entpcoursework列表
|
||||||
|
export function listEntpcoursework(query) {
|
||||||
|
return request({
|
||||||
|
url: '/education/entpcoursework/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询entpcoursework详细
|
||||||
|
export function getEntpcoursework(id) {
|
||||||
|
return request({
|
||||||
|
url: '/education/entpcoursework/' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增entpcoursework
|
||||||
|
export function addEntpcoursework(data) {
|
||||||
|
return request({
|
||||||
|
url: '/education/entpcoursework',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改entpcoursework
|
||||||
|
export function updateEntpcoursework(data) {
|
||||||
|
return request({
|
||||||
|
url: '/education/entpcoursework',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除entpcoursework
|
||||||
|
export function delEntpcoursework(id) {
|
||||||
|
return request({
|
||||||
|
url: '/education/entpcoursework/' + id,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// xuekubaoapi
|
||||||
|
export function xuekubaoAPI(data) {
|
||||||
|
return request({
|
||||||
|
url: '/education/entpcoursework/xuekubaoapi',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// PPT文件上传
|
||||||
|
export function uploadEntpcourseworkFile(data) {
|
||||||
|
return request({
|
||||||
|
url: '/education/entpcoursework/uploadWord',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 查询entpcoursework列表
|
||||||
|
export function listEntpcourseworkNew(query) {
|
||||||
|
return request({
|
||||||
|
url: '/education/entpcoursework/new/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @desc: 学科网接口api
|
||||||
|
* @return: {*}
|
||||||
|
* @param {*} path 请求路径 /xopqbm/questions(无需全拼, 后端学科网sdk自动处理)
|
||||||
|
* @param {*} method 请求方式 post/get
|
||||||
|
* @param {*} params 请求参数 {key: value,}
|
||||||
|
*/
|
||||||
|
export function xkwAPI(path, method, isPostBody, params) {
|
||||||
|
return request({
|
||||||
|
url: '/xkw/post',
|
||||||
|
method: 'post',
|
||||||
|
data: {
|
||||||
|
path: path,
|
||||||
|
method: method,
|
||||||
|
isPostBody: isPostBody,
|
||||||
|
params: params,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @desc: 图文识别接口 python_OCR_api
|
||||||
|
* @return: {*}
|
||||||
|
* @param {*} path 请求路径 /ocrApi/data
|
||||||
|
* @param {*} method 请求方式 post
|
||||||
|
* @param {*} params 请求参数 {key: value,}
|
||||||
|
*/
|
||||||
|
export function pyOCRAPI(path) {
|
||||||
|
return request({
|
||||||
|
url: '/ocrApi/data',
|
||||||
|
method: 'post',
|
||||||
|
data: {
|
||||||
|
imageBas64: path,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
|
@ -0,0 +1,99 @@
|
||||||
|
body{font-family: "微软雅黑", Arial,"宋体"; color: #333;}
|
||||||
|
a{ text-decoration: none; color: #2489f6;}
|
||||||
|
dl, ul, ol, ul { list-style: none; padding: 0; margin: 0; }
|
||||||
|
.wrapper{ width: 1200px; margin: 0 auto; }
|
||||||
|
.ques-detail{}
|
||||||
|
.ques-detail ul li{margin-bottom: 20px;border: 1px solid #dadada;background: #fff;border-radius: 10px;}
|
||||||
|
.ques-detail ul li:last-child{ margin-bottom: 0; }
|
||||||
|
|
||||||
|
table.edittable{ border-collapse: collapse; text-align: center; margin: 2px; }
|
||||||
|
table.edittable th, table.edittable td{ line-height: 30px; padding: 5px; white-space: normal; word-break: break-all; border: 1px solid #000; vertical-align: middle; }
|
||||||
|
table.composition{ border-collapse: collapse; text-align: left; margin: 2px; width: 98%; }
|
||||||
|
table.composition th, table.composition td{ line-height: 30px; white-space: normal; word-break: break-all; border-width: 0px; vertical-align: middle; }
|
||||||
|
table.composition2{ border-collapse: collapse;width:auto }
|
||||||
|
table.composition2 th, table.composition2 td{text-align:left;line-height:30px; white-space:normal;word-break:break-all;border:none;border-width: 0px;vertical-align: middle; }
|
||||||
|
.MathJye{ border: 0 none; direction: ltr; line-height: normal; display: inline-block; float: none; font-family: 'Times New Roman','宋体'; font-size: 15px; font-style: normal; font-weight: normal; letter-spacing: 1px; line-height: normal; margin: 0; padding: 0; text-align: left; text-indent: 0; text-transform: none; white-space: nowrap; word-spacing: normal; word-wrap: normal; -webkit-text-size-adjust: none; }
|
||||||
|
.MathJye div, .MathJye span{ border: 0 none; margin: 0; padding: 0; line-height: normal; text-align: left; height: auto; _height: auto; white-space: normal; }
|
||||||
|
.MathJye table{ border-collapse: collapse; margin: 0; padding: 0; text-align: center; vertical-align: middle; line-height: normal; font-size: inherit; *font-size: 100%; _font-size: 100%; font-style: normal; font-weight: normal; border: 0; float: none; display: inline-block; *display: inline; zoom: 0; }
|
||||||
|
.MathJye table td{ padding: 0; font-size: inherit; line-height: normal; white-space: nowrap; border: 0 none; width: auto; _height: auto; }
|
||||||
|
.MathJye_mi{ font-style: italic; }
|
||||||
|
.flipv{-ms-transform: scaleX(-1);-moz-transform: scaleX(-1);-webkit-transform: scaleX(-1);-o-transform: scaleX(-1);transform: scaleX(-1);filter: FlipH;}
|
||||||
|
.fliph{-ms-transform: scaleY(-1);-moz-transform: scaleY(-1);-webkit-transform: scaleY(-1);-o-transform: scaleY(-1);transform: scaleY(-1);filter: FlipV;}
|
||||||
|
.mathjye-bold{font-weight:800}
|
||||||
|
.mathjye-del{text-decoration:line-through}
|
||||||
|
.mathjye-underline{border-bottom:1px solid #000;padding-bottom:2px;}
|
||||||
|
@-moz-document url-prefix() {.mathjye-underline{padding-bottom:0px;}}
|
||||||
|
.mathjye-underpline{border-bottom:2px dotted #000; padding-bottom:3px;}
|
||||||
|
@-moz-document url-prefix() {.mathjye-underpline {padding-bottom:1px;}}
|
||||||
|
.mathjye-underpoint{background: url(http://img.jyeoo.net/images/formula/point.png) no-repeat center bottom; padding-bottom:4px;}
|
||||||
|
.mathjye-underpoint2{border-bottom:2px dotted #000; padding-bottom:3px;}
|
||||||
|
@-moz-document url-prefix() {.mathjye-underpoint{padding-bottom:1px;}}
|
||||||
|
.mathjye-underwave{background: url(http://img.jyeoo.net/images/formula/wave.png) bottom repeat-x; padding-bottom:4px;}
|
||||||
|
@-moz-document url-prefix() {.mathjye-underwave {padding-bottom:1px;}}
|
||||||
|
.mathjye-alignleft{display:block;text-align:left;}
|
||||||
|
.mathjye-aligncenter{display:block;text-align:center;}
|
||||||
|
.mathjye-alignright{display:block;text-align:right;}
|
||||||
|
|
||||||
|
|
||||||
|
/*试题*/
|
||||||
|
.artpreview fieldset { padding-top: 10px; font-size: 14px; clear: both; overflow: hidden; zoom: 1; line-height: 24px; font-family: 'Times New Roman',宋体,sans-serif; position: relative; }
|
||||||
|
.artpreview fieldset legend { padding: 5px 0; display: block; margin: 5px; background: #f1f1f1; color: #000; overflow: hidden; zoom: 1; }
|
||||||
|
.queserror { border: 1px dotted #f00; padding: 2px; }
|
||||||
|
fieldset.quesborder {display: block;padding: 0;line-height: 25px;letter-spacing: 1px;word-break: break-all;margin: 0;}
|
||||||
|
fieldset.queserror { border: 1px solid #f00; font-size: 12px; padding: 2px; margin-bottom: 1px; }
|
||||||
|
fieldset.quesborder td, fieldset.queserror td { line-height: 16px; }
|
||||||
|
fieldset.quesborder em, fieldset.queserror em { font-style: normal; font-weight: bold; position: absolute; left: 20px; }
|
||||||
|
fieldset.thiserror1 { border: 1px solid #f00; }
|
||||||
|
fieldset.thiserror1 legend { border: 4px solid #f00; }
|
||||||
|
fieldset.thiserror2 { border: 1px solid #ADCD3C; }
|
||||||
|
fieldset.thiserror2 legend { border: 4px solid #ADCD3C; }
|
||||||
|
fieldset.thisques { border: 1px solid blue; }
|
||||||
|
fieldset.thison { border: 1px solid #A9C9E2; }
|
||||||
|
fieldset.thison div.border { border: 1px solid #ADCD3C; background-color: #F2FDDB; }
|
||||||
|
fieldset, img { border: 0 none; }
|
||||||
|
table.thison { border: 1px solid #00F; }
|
||||||
|
table.thiserr { border: 1px solid #F00; }
|
||||||
|
fieldset.thisvip1 { border: 1px solid #00F; }
|
||||||
|
fieldset.thisvip1 legend { border: 4px solid #00F; }
|
||||||
|
fieldset.status17 { border: 1px solid #ff00ff; }
|
||||||
|
fieldset.status17 legend { border: 4px solid #ff00ff; }
|
||||||
|
.selectoption { vertical-align: middle; font-size: 14px; padding: 2px; }
|
||||||
|
.selectoption:hover { color: #EA8511; }
|
||||||
|
.selectoption label { padding: 4px; line-height: 24px; }
|
||||||
|
fieldset.quesbordere { border: 2px dotted #f00; }
|
||||||
|
.answer { border: 1px dotted #ffffff; }
|
||||||
|
ol.answer li, ul.answer li { padding: 1px; font-size: 14px; }
|
||||||
|
ol.answer li:hover { background: #f2f2f2; }
|
||||||
|
.collapseContainerPanel { border: 0; }
|
||||||
|
.collapsePanelHeader { height: 30px; font-weight: bold; padding: 6px 0 0 0; }
|
||||||
|
.collapseHeaderContent { float: left; padding-left: 5px; }
|
||||||
|
.collapseContent { margin: 0; padding: 0; border: 1px solid #ccc; border-top: 0; }
|
||||||
|
.pt0 { padding: 2px 0 5px 0; font-size: 14px; font-family: "黑体",sans-serif; font-weight: 700; }
|
||||||
|
.pt1 {overflow: hidden;zoom: 1;clear: both;line-height: 25px;font-size: 14px;padding: 20px;position: relative;word-break: break-word;}
|
||||||
|
fieldset.quesborder .pt1 em { position: static; }
|
||||||
|
.pt1 img { position: relative; }
|
||||||
|
.pt2 {padding: 20px;padding-top: 0;}
|
||||||
|
.pt3, .pt4, .pt5, .pt6, .pt7 { clear: both; zoom: 1; position: relative; padding: 0px 20px 20px 80px; }
|
||||||
|
.pt8 a:link, .pt8 a:visited { margin-right: 10px; padding: 2px 5px; }
|
||||||
|
.pt8 a:hover { background: #fc0; }
|
||||||
|
.pt9 { padding: 20px; border: 0 none; color: #999999; font-size: 12px; }
|
||||||
|
.fieldtip {height: 36px;line-height: 36px;background-color: #f4f4f4;border-top: 1px solid #dadada;padding: 0 20px;color: #666666;position: relative;font-size: 12px;border-radius: 0 0 10px 10px;}
|
||||||
|
.newFieldtip .pt1, .newFieldtip .pt2, .newFieldtip .pt3, .newFieldtip .pt4, .newFieldtip .pt5, .newFieldtip .pt6, .newFieldtip .pt7, .newFieldtip .pt8, .newFieldtip.pt9, .newFieldtip + .fieldtip { padding: 0; }
|
||||||
|
fieldset img { max-width: 100%; }
|
||||||
|
|
||||||
|
.fieldtip-left {float: left;}
|
||||||
|
.fieldtip-left >* {margin-right: 20px;}
|
||||||
|
.fieldtip-right { float: right; }
|
||||||
|
.fieldtip-right>* { margin-left: 20px; display: inline-block; color: #666666; }
|
||||||
|
.fieldtip .btn {display: inline-block;margin-bottom: 0;font-weight: normal;text-align: center;vertical-align: middle;-ms-touch-action: manipulation;touch-action: manipulation;cursor: pointer;background-image: none;border: 1px solid transparent;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;font-size: 14px;border-radius: 4px;color: #ffffff;background-color: #ff8a00;line-height: 18px;min-width: 28px;padding: 0 5px;}
|
||||||
|
.fieldtip .btn:hover, .fieldtip .btn:active, .fieldtip .btn:active:hover, .fieldtip .btn:hover { color: #ffffff; background-color: #faad4a; }
|
||||||
|
|
||||||
|
/*填空题*/
|
||||||
|
div.quizPutTag { display: inline-block; *display: inline; padding: 3px 10px 1px 10px; margin: 0 3px; font-size: 14px; min-width: 1em; min-height: 16px; line-height: 18px; height: auto; border-bottom: 1px solid #0033FF; text-decoration: none; zoom: 1; color: #127176; word-break: break-all; }
|
||||||
|
div.quizPutTag:hover { color: #f60; }
|
||||||
|
div.quizPutTag img { cursor: pointer; width: 200px; margin-left: 10px; }
|
||||||
|
.sanwser { padding: 4px 10px; margin: 0px; border: 1px solid #ADCD3C; background-color: #F2FDDB; color: #000; display: none; }
|
||||||
|
/*答案*/
|
||||||
|
.selectoption label.s, div.s { border: 1px solid #91cbed; background-color: #deeeff; display: inline-block; }
|
||||||
|
.selectoption label.s.sh, div.s.sh { margin: 1px; border: none; background: none; }
|
||||||
|
del { text-decoration: none; color: #f00; font-style: normal; font-weight: normal; }
|
|
@ -72,8 +72,9 @@ const title = reactive([
|
||||||
child1: []
|
child1: []
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: '高考研究',
|
name: '考试分析',
|
||||||
url: '/education/colentrance',
|
url: '/examReport',
|
||||||
|
type: 'hash',
|
||||||
img: 'iconfont icon-icon_kaoshifenxi',
|
img: 'iconfont icon-icon_kaoshifenxi',
|
||||||
child1: []
|
child1: []
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,7 +87,7 @@ const handleOutLink = (path, type, name) => {
|
||||||
fullPath = fullPath.replaceAll('//', '/')
|
fullPath = fullPath.replaceAll('//', '/')
|
||||||
const { levelFirstId, levelSecondId } = JSON.parse(localStorage.getItem('unitId'))
|
const { levelFirstId, levelSecondId } = JSON.parse(localStorage.getItem('unitId'))
|
||||||
let unitId = levelSecondId ? levelSecondId :levelFirstId
|
let unitId = levelSecondId ? levelSecondId :levelFirstId
|
||||||
if(name == '教材分析' || name == '高考研究'){
|
if(name == '教材分析' || name == '考试分析'){
|
||||||
fullPath += `?unitId=${unitId}`
|
fullPath += `?unitId=${unitId}`
|
||||||
}
|
}
|
||||||
// 通知主进程
|
// 通知主进程
|
||||||
|
|
|
@ -8,6 +8,7 @@ import 'element-plus/dist/index.css'
|
||||||
import './assets/iconfont/iconfont.css'
|
import './assets/iconfont/iconfont.css'
|
||||||
import './assets/iconfont/iconfont'
|
import './assets/iconfont/iconfont'
|
||||||
import 'virtual:windi.css'
|
import 'virtual:windi.css'
|
||||||
|
import request from "@/utils/request";
|
||||||
|
|
||||||
import { store } from '@/store'
|
import { store } from '@/store'
|
||||||
import App from './App.vue'
|
import App from './App.vue'
|
||||||
|
@ -20,6 +21,20 @@ if(process.env.NODE_ENV != 'development') { // 非开发环境,将日志打印
|
||||||
|
|
||||||
const app = createApp(App)
|
const app = createApp(App)
|
||||||
|
|
||||||
|
|
||||||
|
//专为菁优网配置的请求转发
|
||||||
|
app.config.globalProperties.$requestGetJYW = (url,config)=>{
|
||||||
|
config.params = config.params?config.params:{}
|
||||||
|
config.params["getjypath"] = url;
|
||||||
|
return request({
|
||||||
|
url: "/jy/proxy",
|
||||||
|
method: config.method||"get",
|
||||||
|
params: config.params
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
app.use(router)
|
app.use(router)
|
||||||
.use(store)
|
.use(store)
|
||||||
.use(ElementPlus, { locale: zhLocale }).mount('#app')
|
.use(ElementPlus, { locale: zhLocale }).mount('#app')
|
|
@ -63,6 +63,12 @@ export const constantRoutes = [
|
||||||
name: 'class',
|
name: 'class',
|
||||||
meta: {title: '班级中心'},
|
meta: {title: '班级中心'},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '/examReport',
|
||||||
|
component: () => import('@/views/examReport/index.vue'),
|
||||||
|
name: 'examReport',
|
||||||
|
meta: {title: '考试分析'}
|
||||||
|
},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
...toolRouters
|
...toolRouters
|
||||||
|
|
|
@ -0,0 +1,262 @@
|
||||||
|
const JY_TOKEN = 'CA82641DA86072DEFD39E287335E035FDA6AEEC0549B58F54F4408734C8683FFAF0585CFA3B25091E588A03A65C66A80F5FF613F539D600954007A35DFFBFDC3C7BB982771C5E13F0918642CFD7596CE3718F06E5579238D92EC809AC6F4C82A9FE4B0E232A67DD3594D4DAC1C219CCBC4A7A093344446107EB11DC317526D0594249DEBBD82B740C794CF5A7065E1982B7779AF16AD25D7';
|
||||||
|
const JY_SUBJECT = [
|
||||||
|
{id: 10, subject: 'math3', name: '小学数学'},
|
||||||
|
{id: 11, subject: 'chinese3', name: '小学语文'},
|
||||||
|
{id: 12, subject: 'english3', name: '小学英语'},
|
||||||
|
{id: 14, subject: 'science3', name: '小学科学'},
|
||||||
|
{id: 15, subject: 'politics3', name: '小学道德与法治'},
|
||||||
|
{id: 20, subject: 'math', name: '初中数学'},
|
||||||
|
{id: 21, subject: 'physics', name: '初中物理'},
|
||||||
|
{id: 22, subject: 'chemistry', name: '初中化学'},
|
||||||
|
{id: 23, subject: 'bio', name: '初中生物'},
|
||||||
|
{id: 24, subject: 'science', name: '初中科学'},
|
||||||
|
{id: 25, subject: 'geography', name: '初中地理'},
|
||||||
|
{id: 26, subject: 'chinese', name: '初中语文'},
|
||||||
|
{id: 27, subject: 'english', name: '初中英语'},
|
||||||
|
{id: 28, subject: 'politics', name: '初中道德与法治'},
|
||||||
|
{id: 29, subject: 'history', name: '初中历史'},
|
||||||
|
{id: 30, subject: 'math2', name: '高中数学'},
|
||||||
|
{id: 31, subject: 'physics2', name: '高中物理'},
|
||||||
|
{id: 32, subject: 'chemistry2', name: '高中化学'},
|
||||||
|
{id: 33, subject: 'bio2', name: '高中生物'},
|
||||||
|
{id: 35, subject: 'geography2', name: '高中地理'},
|
||||||
|
{id: 36, subject: 'chinese2', name: '高中语文'},
|
||||||
|
{id: 37, subject: 'english2', name: '高中英语'},
|
||||||
|
{id: 38, subject: 'politics2', name: '高中政治'},
|
||||||
|
{id: 39, subject: 'history2', name: '高中历史'},
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
export const JYApiListCT = async (_this, name = '高中历史') => {
|
||||||
|
if (name === '初中政治') {
|
||||||
|
name = '初中道德与法治';
|
||||||
|
}
|
||||||
|
const obj = JY_SUBJECT.filter(item => item.name == name);
|
||||||
|
if(obj.length < 1) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
const res = await _this.$requestGetJYW(`/${obj[0].subject}/common`, {
|
||||||
|
headers: {
|
||||||
|
authorization: `Token ${JY_TOKEN}`
|
||||||
|
},
|
||||||
|
params: {
|
||||||
|
tp: 1,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (res.code !== 200) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
let arrCT = [{
|
||||||
|
label: "不限",
|
||||||
|
value: 0
|
||||||
|
}]
|
||||||
|
res.data.forEach(item=> {
|
||||||
|
if (item.Value === '选择题') {
|
||||||
|
item.Value = '单选题';
|
||||||
|
}
|
||||||
|
const tmp = {
|
||||||
|
label: item.Value,
|
||||||
|
value: item.Key,
|
||||||
|
}
|
||||||
|
arrCT.push(tmp);
|
||||||
|
})
|
||||||
|
return arrCT;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const JYApiListOriginYear = () => {
|
||||||
|
const arrYear = [{label: '不限', value: '-1'}];
|
||||||
|
let i = 0;
|
||||||
|
for( ; i < 10; i++) {
|
||||||
|
const year = new Date().getFullYear();
|
||||||
|
const s ={
|
||||||
|
label: `${year - i}`,
|
||||||
|
value: `${year - i}`,
|
||||||
|
}
|
||||||
|
arrYear.push(s);
|
||||||
|
};
|
||||||
|
//arrYear.push({label: '更早', value: '0'})
|
||||||
|
return arrYear;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const JYApiListSO = async (_this, name = '高中历史') => {
|
||||||
|
if (name === '初中政治') {
|
||||||
|
name = '初中道德与法治';
|
||||||
|
}
|
||||||
|
|
||||||
|
const obj = JY_SUBJECT.filter(item => item.name == name);
|
||||||
|
if(obj.length < 1) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
const res = await _this.$requestGetJYW(`/${obj[0].subject}/common`, {
|
||||||
|
headers: {
|
||||||
|
authorization: `Token ${JY_TOKEN}`
|
||||||
|
},
|
||||||
|
params: {
|
||||||
|
tp: 2,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (res.code !== 200) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
const arrSO = [{"Value": "不限", "Key": 0}, ...res.data];
|
||||||
|
return arrSO;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export const JYApiListPoint = async (_this, name = '高中历史') => {
|
||||||
|
if (name === '初中政治') {
|
||||||
|
name = '初中道德与法治';
|
||||||
|
}
|
||||||
|
|
||||||
|
const obj = JY_SUBJECT.filter(item => item.name == name);
|
||||||
|
if(obj.length < 1) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
const res = await _this.$requestGetJYW(`/${obj[0].subject}/point`, {
|
||||||
|
headers: {
|
||||||
|
authorization: `Token ${JY_TOKEN}`
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (res.code !== 200) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
return res.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @desc: 获取菁优网的版本内容
|
||||||
|
* @return: {*}
|
||||||
|
*/
|
||||||
|
export const JYApiListVersion = async (_this, query, hasPoints=true) => {
|
||||||
|
const listVersion = {
|
||||||
|
status: 0,
|
||||||
|
msg: '',
|
||||||
|
data: [],
|
||||||
|
};
|
||||||
|
if (query.stage === '' || query.subject === '') {
|
||||||
|
listVersion.msg = '未选中学段或学科!';
|
||||||
|
return listVersion;
|
||||||
|
}
|
||||||
|
let name = `${query.stage}${query.subject}`;
|
||||||
|
if (name === '初中政治') {
|
||||||
|
name = '初中道德与法治';
|
||||||
|
}
|
||||||
|
const result = JY_SUBJECT.filter( item => item.name===name);
|
||||||
|
if (result.length === 0) {
|
||||||
|
listVersion.msg = `[${name}]未找到对应菁优网教材版本, 请检查学段或学科是否匹配!`;
|
||||||
|
return listVersion;
|
||||||
|
}
|
||||||
|
const JYBook = await _this.$requestGetJYW(`/${result[0].subject}/book2`, {
|
||||||
|
headers: {
|
||||||
|
// JYToken仅占位, 实际后续已未使用该token
|
||||||
|
authorization: `Token ${JY_TOKEN}`
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (JYBook.code !== 200) {
|
||||||
|
listVersion.msg = `[${name}]获取菁优网教材版本失败!`;
|
||||||
|
return listVersion;
|
||||||
|
}
|
||||||
|
query.list.forEach(ele => {
|
||||||
|
if (ele.thirdkey == null) {
|
||||||
|
listVersion.msg = `[${name}-${ele.itemtitle}]菁优网教材字段标识未设置!`;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let nPos = ele.thirdkey.indexOf('-');
|
||||||
|
if (nPos === -1) {
|
||||||
|
listVersion.msg = `[${name}-${ele.itemtitle}-${ele.thirdkey}]菁优网教材字段标识设置有误!`;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let editionName = ele.thirdkey.substring(0, nPos);
|
||||||
|
let typeName = ele.thirdkey.substring(nPos+1);
|
||||||
|
const resVersion = JYBook.data.filter( item => {
|
||||||
|
// 高中以typeName为标识, 而小学/初中以Name为标识
|
||||||
|
const JYTypeName = query.stage=='高中' ? item.TypeName : item.Name;
|
||||||
|
if (item.EditionName.trim() === editionName.trim() && JYTypeName.trim() === typeName.trim()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (resVersion.length === 0) {
|
||||||
|
listVersion.msg = `[${name}-${ele.thirdkey}]菁优网教材字段标识查询不存在!`;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (resVersion[0].Children.length === 0) {
|
||||||
|
listVersion.msg = `[${name}]菁优网教材字段标识查询单元内容为空!`;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const children = JYApiListLession(resVersion[0], hasPoints);
|
||||||
|
// 高中以typeName为标识, 而小学/初中以Name为标识
|
||||||
|
let JYTypeName = query.stage=='高中' ? resVersion[0].TypeName : resVersion[0].Name;
|
||||||
|
JYTypeName = JYTypeName.trim();
|
||||||
|
const reset = {
|
||||||
|
id: resVersion[0].ID,
|
||||||
|
label: resVersion[0].Name.trim(),
|
||||||
|
nodeType: 'version',
|
||||||
|
children: children,
|
||||||
|
editionName: resVersion[0].EditionName.trim(),
|
||||||
|
typeName: JYTypeName,
|
||||||
|
}
|
||||||
|
listVersion.data.push(reset);
|
||||||
|
})
|
||||||
|
|
||||||
|
if(listVersion.data.length > 0){
|
||||||
|
listVersion.status = 1;
|
||||||
|
}
|
||||||
|
return listVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const JYApiListLession = (item, hasPoints) => {
|
||||||
|
const list = [];
|
||||||
|
item.Children.forEach(element => {
|
||||||
|
const tempList = formatCurJYLession(element, hasPoints);
|
||||||
|
list.push(tempList);
|
||||||
|
});
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
const formatCurJYLession = (item, hasPoints) => {
|
||||||
|
const obj = {
|
||||||
|
id: item.ID,
|
||||||
|
label: item.Name.trim(),
|
||||||
|
nodeType: 'unit',
|
||||||
|
children: [],
|
||||||
|
}
|
||||||
|
if(hasPoints) {
|
||||||
|
if (item.Children.length === 0 && !item.hasOwnProperty('Points')) {
|
||||||
|
obj.nodeType = 'points';
|
||||||
|
obj.id = item.No;
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
else if (item.Children.length > 0 ){
|
||||||
|
for(let i=0; i<item.Children.length; i++){
|
||||||
|
const child = formatCurJYLession(item.Children[i], hasPoints);
|
||||||
|
obj.children.push(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (item.Children.length === 0 && item.Points.length > 0){
|
||||||
|
obj.nodeType = 'lession';
|
||||||
|
for(let i=0; i<item.Points.length; i++){
|
||||||
|
const child = formatCurJYLession(item.Points[i], hasPoints);
|
||||||
|
obj.children.push(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if (item.Children.length === 0) {
|
||||||
|
obj.nodeType = 'lession';
|
||||||
|
obj.id = item.ID;
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
else if (item.Children.length > 0 ){
|
||||||
|
for(let i=0; i<item.Children.length; i++){
|
||||||
|
const child = formatCurJYLession(item.Children[i], hasPoints);
|
||||||
|
obj.children.push(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}
|
|
@ -0,0 +1,310 @@
|
||||||
|
export const isJson = (str) =>{
|
||||||
|
if (typeof str == 'string') {
|
||||||
|
try {
|
||||||
|
let obj=JSON.parse(str);
|
||||||
|
if(typeof obj == 'object' && obj ){
|
||||||
|
return true;
|
||||||
|
}else{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} catch(e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description processExamQuestion 格式化试题
|
||||||
|
* @param {*} row
|
||||||
|
*/
|
||||||
|
export const processExamQuestion = (row) => {
|
||||||
|
for (var i=0; i<row.length; i++) {
|
||||||
|
if (isJson(row[i].workanalysis)) {
|
||||||
|
//1、先默认格式化 格式化各项内容(待优化, 后续界面显示的为format的值)
|
||||||
|
row[i].titleFormat = row[i].title; // 题目
|
||||||
|
row[i].examdateFormat = row[i].examdate; // ?考试日期 eg: 2024-07-11 14:39:27"
|
||||||
|
row[i].workdescFormat = row[i].workdesc; // 题目选项
|
||||||
|
row[i].workanswerFormat = row[i].workanswer; // 题目正确答案
|
||||||
|
if (row[i].workanswerFormat == null || row[i].workanswerFormat == '') {
|
||||||
|
row[i].workanswerFormat = '见试题解答内容';
|
||||||
|
}
|
||||||
|
|
||||||
|
// workanalysis 解析内容(analyse:解答; method:分析; discuss:点评; )
|
||||||
|
var jjj = JSON.parse(row[i].workanalysis);
|
||||||
|
row[i].analyse = jjj.analyse;
|
||||||
|
row[i].method = jjj.method;
|
||||||
|
row[i].discuss = jjj.discuss;
|
||||||
|
//row[i].discusscollapse = false;
|
||||||
|
if(row[i].examdate !== null && row[i].examdate !== undefined ){
|
||||||
|
row[i].examdate = row[i].examdate.substring(0, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 具体题型数据结构处理
|
||||||
|
if (row[i].worktype == '复合题') {
|
||||||
|
// 旧类型
|
||||||
|
if(row[i].title.indexOf('!@#$%') !== -1) {
|
||||||
|
// 1.选项解析替换
|
||||||
|
const options = JSON.parse(row[i].workdesc);
|
||||||
|
// 题目(背景材料+复合题目)
|
||||||
|
const bjTitle = row[i].title.split('!@#$%')[0];
|
||||||
|
const tmTitles = row[i].title.split('!@#$%').filter((it,ix)=>ix>0);
|
||||||
|
// console.log(bjTitle,'背景标题');
|
||||||
|
// console.log(tmTitles,'复合题目');
|
||||||
|
let titls = [];
|
||||||
|
options.forEach((element,index1) => {
|
||||||
|
const workDescArr = element.split('#&');
|
||||||
|
let tmp = '';
|
||||||
|
let j=0;
|
||||||
|
for(; j<workDescArr.length; j++){
|
||||||
|
if(j%2 == 0){
|
||||||
|
tmp += `<div style='width:80%;display:flex;'>`;
|
||||||
|
}
|
||||||
|
const char = String.fromCharCode(65+j);
|
||||||
|
tmp += `<div style='display:flex;margin-left:2%;width:35%;overflow:hidden;text-overflow:ellipsis;font-size:0.9em;'>${char}.${workDescArr[j]}</div>`;
|
||||||
|
if(j%2 == 1){
|
||||||
|
tmp += '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
// j此刻已自增1, 故当选项为单数时, 需要补充结束标签
|
||||||
|
if(j%2 == 1){
|
||||||
|
tmp += '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// workDescArr为 [''] 表示为 判断题或者填空题,这里不需要选项
|
||||||
|
if(workDescArr[0] != ''){
|
||||||
|
titls.splice(index1, 1, tmp);
|
||||||
|
}else{
|
||||||
|
titls.splice(index1, 1, '');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const s = [];
|
||||||
|
tmTitles.map((it,ix)=>{
|
||||||
|
s.push(it);
|
||||||
|
titls.map((it2,ix2)=>{
|
||||||
|
if(ix == ix2){
|
||||||
|
s.push(it2);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
// console.log(s,'?????????????????')
|
||||||
|
|
||||||
|
row[i].titleFormat = bjTitle + s.join('');
|
||||||
|
row[i].workdescFormat = '';
|
||||||
|
|
||||||
|
|
||||||
|
//2.答案 - 数字转为ABCD
|
||||||
|
const answerArr = JSON.parse(row[i].workanswer);
|
||||||
|
let indexLabel = 1;
|
||||||
|
let arr = [];
|
||||||
|
answerArr.forEach(item => {
|
||||||
|
const arrTmp = item.answer.split('#&');
|
||||||
|
let value = `(${indexLabel})`;
|
||||||
|
arrTmp.forEach((element,i) => {
|
||||||
|
if(item.type == '单选题' || item.type == '多选题'){
|
||||||
|
value += `${String.fromCharCode(65+Number(element))}`;
|
||||||
|
}
|
||||||
|
if(item.type == '判断题' || item.type == '填空题'){
|
||||||
|
// 去除下 html标签
|
||||||
|
value += `${element.replace(/<[^>]+>/g, '')}`+ (i==arrTmp.length-1?'':'、');
|
||||||
|
}
|
||||||
|
if(item.type == '主观题') {
|
||||||
|
if(element){
|
||||||
|
console.log(element,'element')
|
||||||
|
value += item.answer;
|
||||||
|
}else{
|
||||||
|
value += '答案不唯一,请参考分析解答点评!';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
arr.push(value);
|
||||||
|
indexLabel++;
|
||||||
|
})
|
||||||
|
const answer = arr.join('<br />');
|
||||||
|
|
||||||
|
row[i].workanswerFormat = answer;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// 处理[题干显示] - 不再需要处理
|
||||||
|
// row[i].titleFormat = row[i].title; // 仅占位提示
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理[选项显示] - 特殊结构
|
||||||
|
* [
|
||||||
|
* {type: '单选题', title: '题目1', options: ['ABC123','ABC123']},
|
||||||
|
* {type: '多选题', title: '题目1', options: ['ABC123','ABC123']},
|
||||||
|
* {type: '填空题', title: '题目1', options: []},
|
||||||
|
* {type: '判断题', title: '题目1', options: []},
|
||||||
|
* {type: '主观题', title: '题目1', options: []},
|
||||||
|
* ]
|
||||||
|
*/
|
||||||
|
let workDescArr = JSON.parse(row[i].workdesc);
|
||||||
|
let workDescHtml = `<div style='width:80%;display:flex;>`;
|
||||||
|
workDescArr.map( (item, index) => {
|
||||||
|
if(item.type == '单选题' || item.type == '多选题'){
|
||||||
|
workDescHtml += `<div style='width:80%;display:flex;'>${index+1}. ${item.title}</div>`;
|
||||||
|
let tmp = '';
|
||||||
|
let j=0;
|
||||||
|
let optionsArr = item.options;
|
||||||
|
for(; j<optionsArr.length; j++){
|
||||||
|
if(j%2 == 0){
|
||||||
|
tmp += `<div style='width:80%;display:flex;'>`;
|
||||||
|
}
|
||||||
|
const char = String.fromCharCode(65+j);
|
||||||
|
tmp += `<div style='display:flex;margin-left: 2%; width: 36%'>${char}.${optionsArr[j]}</div>`;
|
||||||
|
if(j%2 == 1){
|
||||||
|
tmp += '</div>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// j此刻已自增1, 故当选项为单数时, 需要补充结束标签
|
||||||
|
if(j%2 == 1){
|
||||||
|
tmp += '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
workDescHtml += tmp;
|
||||||
|
}
|
||||||
|
else if(item.type == '填空题' || item.type == '判断题' || item.type == '主观题'){
|
||||||
|
workDescHtml += `<div style='width:80%;display:flex;'>${index+1}. ${item.title}</div>`;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
workDescHtml += '</div>';
|
||||||
|
row[i].workdescFormat = workDescHtml;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理[答案显示] - 特殊结构
|
||||||
|
* [
|
||||||
|
* {type: '单选题', answer: ['0']},
|
||||||
|
* {type: '多选题', answer: ['0','1']},
|
||||||
|
* {type: '填空题', answer: ['填空1','填空2']},
|
||||||
|
* {type: '判断题', answer: ['0'/'1']},
|
||||||
|
* {type: '主观题', answer: [xxxx]},
|
||||||
|
* ]
|
||||||
|
*/
|
||||||
|
let workAnswerArr = JSON.parse(row[i].workanswer);
|
||||||
|
let workAnswerHtml = ``;
|
||||||
|
workAnswerArr.map( (item, index) => {
|
||||||
|
const answerArr = item.answer; //JSON.parse(item.answer);
|
||||||
|
if(item.type == '单选题' || item.type == '多选题'){
|
||||||
|
const answer = answerArr.map( (item) => {
|
||||||
|
return String.fromCharCode(65+Number(item))
|
||||||
|
}).join('');
|
||||||
|
workAnswerHtml += `<div style='display:flex;'>${index+1}. ${answer}</div>`;
|
||||||
|
}
|
||||||
|
else if(item.type == '填空题' ){
|
||||||
|
const answer = answerArr.join('、');
|
||||||
|
workAnswerHtml += `<div style='display:flex;'>${index+1}. ${answer}</div>`;
|
||||||
|
}
|
||||||
|
else if(item.type == '判断题' ){
|
||||||
|
const answer = answerArr.map( (item) => {
|
||||||
|
return item === '1' ? '正确' : '错误'
|
||||||
|
}).join('、');
|
||||||
|
workAnswerHtml += `<div style='display:flex;'>${index+1}. ${answer}</div>`;
|
||||||
|
}
|
||||||
|
else if(item.type == '主观题' ){
|
||||||
|
// 复合题里面的主观题只有一个答案,或没填
|
||||||
|
const answer = answerArr.join('、');
|
||||||
|
if(answerArr[0]){
|
||||||
|
workAnswerHtml += `<div style='display:flex;'>${index+1}. ${answer}</div>`;
|
||||||
|
}else{
|
||||||
|
workAnswerHtml += `<div style='display:flex;'>${index+1}. ${answer}答案不唯一,请参考分析解答点评!</div>`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
row[i].workanswerFormat = workAnswerHtml;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if(row[i].worktype == '主观题' || (row[i].worktype!=='单选题' && row[i].worktype!=='多选题' && row[i].worktype!=='填空题' && row[i].worktype!=='判断题')) {
|
||||||
|
// 处理[选项显示] - 主观题中无选项, 故置空
|
||||||
|
row[i].workdescFormat = '';
|
||||||
|
row[i].workanswerFormat = '';
|
||||||
|
// 答案处理- eg: "\"不唯一的答案,参考\""
|
||||||
|
if (row[i].workanswer && row[i].workanswer != '') {
|
||||||
|
row[i].workanswerFormat = JSON.parse(row[i].workanswer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// 单选题|多选题|填空题|判断题|主观题?(待确认是否归在这里)
|
||||||
|
// 通用选项结构 ['ABC123','ABC123'] | ['ABC123','ABC123'] | [](填空题无选项) | [](判断题无选项)
|
||||||
|
let workDescArr = [];
|
||||||
|
if (row[i].workdesc.charAt(0) === '[' && row[i].workdesc.charAt(row[i].workdesc.length - 1) === ']') {
|
||||||
|
//123会直接被转换, 且不是数组对象, 故手动判断是否有[和]两个字符
|
||||||
|
workDescArr = JSON.parse(row[i].workdesc);
|
||||||
|
}
|
||||||
|
else if(row[i].workdesc.indexOf('#&') !== -1) {
|
||||||
|
workDescArr = row[i].workdesc.split('#&');
|
||||||
|
}
|
||||||
|
else if(row[i].workdesc.indexOf(',') !== -1){
|
||||||
|
workDescArr = row[i].workdesc.split(',');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// 单字符串直接添加至空数组(待考虑确认)
|
||||||
|
workDescArr.push(row[i].workdesc);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 单选题|多选题|填空题|判断题|主观题?(待确认是否归在这里)
|
||||||
|
// 通用答案结构 ['0'] | ['0','1'] | ['填空1','填空2'] | ['0'/'1']
|
||||||
|
let workAnswerArr = [];
|
||||||
|
if (row[i].workanswer.charAt(0) === '[' && row[i].workanswer.charAt(row[i].workanswer.length - 1) === ']') {
|
||||||
|
// 123会直接被转换, 且不是数组对象, 故手动判断是否有[和]两个字符
|
||||||
|
workAnswerArr = JSON.parse(row[i].workanswer);
|
||||||
|
}
|
||||||
|
else if(row[i].workanswer.indexOf('#&') !== -1) {
|
||||||
|
workAnswerArr = row[i].workanswer.split('#&');
|
||||||
|
}
|
||||||
|
else if(row[i].workanswer.indexOf(',') !== -1){
|
||||||
|
workAnswerArr = row[i].workanswer.split(',');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// 单字符串直接添加至空数组(待考虑确认)
|
||||||
|
workAnswerArr.push(row[i].workanswer);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 具体题型处理
|
||||||
|
if(row[i].worktype == '单选题' || row[i].worktype == '多选题' ){
|
||||||
|
// 处理[选项显示] - 拼接ABCD首序号
|
||||||
|
let tmp = '';
|
||||||
|
let j=0;
|
||||||
|
for(; j<workDescArr.length; j++){
|
||||||
|
if(j%2 == 0){
|
||||||
|
tmp += `<div style='width:80%;display:flex;'>`;
|
||||||
|
}
|
||||||
|
const char = String.fromCharCode(65+j);
|
||||||
|
tmp += `<div style='display:flex;margin-left: 2%; width: 36%'>${char}.${workDescArr[j]}</div>`;
|
||||||
|
if(j%2 == 1){
|
||||||
|
tmp += '</div>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(j%2== 0){
|
||||||
|
tmp += '</div>';
|
||||||
|
}
|
||||||
|
row[i].workdescFormat = tmp;
|
||||||
|
|
||||||
|
// 处理[答案显示] - 转换ABCD
|
||||||
|
let arr2Char = workAnswerArr.map( (item) => {
|
||||||
|
return String.fromCharCode(65+Number(item))
|
||||||
|
}).join('');
|
||||||
|
row[i].workanswerFormat = arr2Char;
|
||||||
|
}
|
||||||
|
else if(row[i].worktype == '填空题'){
|
||||||
|
// 处理[选项显示] - 填空题中无选项, 故置空
|
||||||
|
row[i].workdescFormat = '';
|
||||||
|
|
||||||
|
// 处理[答案显示] - 逗号连接
|
||||||
|
row[i].workanswerFormat = workAnswerArr.join('、');
|
||||||
|
}
|
||||||
|
else if(row[i].worktype == '判断题'){
|
||||||
|
// 处理[选项显示] - 判断题中无选项, 故置空
|
||||||
|
row[i].workdescFormat = '';
|
||||||
|
|
||||||
|
// 处理[答案显示] - 1-正常 0-错误
|
||||||
|
const answer = workAnswerArr.map( (item) => {
|
||||||
|
return item === '1' ? '正确' : '错误'
|
||||||
|
}).join('、');
|
||||||
|
row[i].workanswerFormat = answer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
<template>
|
||||||
|
<div>模拟命题</div>
|
||||||
|
</template>
|
|
@ -0,0 +1,101 @@
|
||||||
|
<template>
|
||||||
|
<el-table ref="table" v-loading="loading" :data="listExamQuestion" class="table-main">
|
||||||
|
<el-table-column type="index" fixed="left" width="60" />
|
||||||
|
<el-table-column align="left" fixed="left" min-width="60%">
|
||||||
|
<template #default="scope">
|
||||||
|
<div @click="showExamAnalyseDrawer(scope.row)">
|
||||||
|
<div v-html="scope.row.titleFormat" class="main-title" ></div>
|
||||||
|
<div v-html="scope.row.workdescFormat" class="main-work-desc" ></div>
|
||||||
|
<el-col :span="24" style="display: flex">
|
||||||
|
<div class="main-user-info" style="">{{ scope.row.entpname }} {{ scope.row.editusername }}</div>
|
||||||
|
<div class="main-upl-time" style="">{{ scope.row.timestamp }}</div>
|
||||||
|
</el-col>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" prop="worktype" width="100"></el-table-column>
|
||||||
|
<el-table-column align="center" prop="worktag" width="120"></el-table-column>
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<!-- 试题详情 -->
|
||||||
|
<el-drawer v-model="activeExamInfoDrawer" title="题目详情" :with-header="false" direction="rtl" size="60%">
|
||||||
|
<el-row class="drawer-main">
|
||||||
|
<el-col :span="24">
|
||||||
|
<span>{{activeExam.worktag}}</span>
|
||||||
|
<span style="margin-left: 4px" v-html="activeExam.titleFormat" ></span>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="24" style="padding: 4px" v-html="activeExam.workdescFormat">
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="3" class="drawer-main-col"><em>【答案】</em></el-col>
|
||||||
|
<el-col :span="20" class="drawer-main-col" v-html="activeExam.workanswerFormat"></el-col>
|
||||||
|
<el-col :span="3" class="drawer-main-col"><em>【分析】</em></el-col>
|
||||||
|
<el-col :span="20" class="drawer-main-col" v-html="activeExam.method"></el-col>
|
||||||
|
<el-col :span="3" class="drawer-main-col"><em>【解答】</em></el-col>
|
||||||
|
<el-col :span="20" class="drawer-main-col" v-html="activeExam.analyse"></el-col>
|
||||||
|
<el-col :span="3" class="drawer-main-col" ><em>【点评】</em></el-col>
|
||||||
|
<el-col :span="20" class="drawer-main-col" v-html="activeExam.discuss"></el-col>
|
||||||
|
</el-row>
|
||||||
|
</el-drawer>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import {ref, reactive} from 'vue'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
listExamQuestion: {type: Array},
|
||||||
|
loading: {type: Boolean}
|
||||||
|
})
|
||||||
|
|
||||||
|
const activeExamInfoDrawer = ref(false);
|
||||||
|
const activeExam = ref({});
|
||||||
|
|
||||||
|
const showExamAnalyseDrawer = (row) => {
|
||||||
|
activeExam.value = row;
|
||||||
|
activeExamInfoDrawer.value = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.table-main {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
text-align: left;
|
||||||
|
|
||||||
|
.main-title {
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
font-weight:700
|
||||||
|
}
|
||||||
|
.main-work-desc{
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
font-size: 0.9em;
|
||||||
|
margin-top: 6px;
|
||||||
|
}
|
||||||
|
.main-user-info{
|
||||||
|
font-size: 0.8em;
|
||||||
|
color: silver;
|
||||||
|
padding-top: 5px
|
||||||
|
}
|
||||||
|
.main-upl-time{
|
||||||
|
margin-left: 30px;
|
||||||
|
font-size: 0.8em;
|
||||||
|
color: silver;
|
||||||
|
padding-top: 7px
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.drawer-main{
|
||||||
|
margin: 1%;
|
||||||
|
padding: 1% 2%;
|
||||||
|
border: 2px dotted;
|
||||||
|
display: flex;
|
||||||
|
text-align: left;
|
||||||
|
|
||||||
|
.drawer-main-col{
|
||||||
|
padding: 10px 0px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,3 @@
|
||||||
|
<template>
|
||||||
|
<div>考点分析</div>
|
||||||
|
</template>
|
|
@ -0,0 +1,292 @@
|
||||||
|
<template>
|
||||||
|
<div class="page-resource flex">
|
||||||
|
<!--左侧 教材 目录-->
|
||||||
|
<ChooseTextbook @change-book="getData" @node-click="getData" />
|
||||||
|
<!--右侧 习题 列表 -->
|
||||||
|
<div class="page-right">
|
||||||
|
<div class="page-right-top">
|
||||||
|
<el-popover placement="top-start" title="真题回顾" trigger="hover" content="勾画、圈点,添加标记等,整理出本课的重点与难点,用于老师讲解和学生自主预习">
|
||||||
|
<template #reference>
|
||||||
|
<el-button-group>
|
||||||
|
<el-button @click="changeTaskView('真题回顾', index)" :type="curTask.viewkey=='真题回顾'?'primary':'default'" round>真题回顾</el-button>
|
||||||
|
<el-button disabled :type="'default'" plain round ></el-button>
|
||||||
|
</el-button-group>
|
||||||
|
</template>
|
||||||
|
</el-popover>
|
||||||
|
<div style="margin-top: 7px"> <el-icon><ArrowRight /></el-icon> </div>
|
||||||
|
|
||||||
|
<el-popover disabled placement="top-start" title="考点分析" trigger="hover" content="勾画、圈点,添加标记等,整理出本课的重点与难点,用于老师讲解和学生自主预习">
|
||||||
|
<template #reference>
|
||||||
|
<el-button-group>
|
||||||
|
<el-button disabled @click="changeTaskView('考点分析', index)" :type="curTask.viewkey=='考点分析'?'primary':'default'" round>考点分析</el-button>
|
||||||
|
<el-button disabled :type="'default'" plain round ></el-button>
|
||||||
|
</el-button-group>
|
||||||
|
</template>
|
||||||
|
</el-popover>
|
||||||
|
<div style="margin-top: 7px"> <el-icon><ArrowRight /></el-icon> </div>
|
||||||
|
|
||||||
|
<el-popover disabled placement="top-start" title="模拟命题" trigger="hover" content="勾画、圈点,添加标记等,整理出本课的重点与难点,用于老师讲解和学生自主预习">
|
||||||
|
<template #reference>
|
||||||
|
<el-button-group>
|
||||||
|
<el-button disabled @click="changeTaskView('模拟命题', index)" :type="curTask.viewkey=='模拟命题'?'primary':'default'" round>模拟命题</el-button>
|
||||||
|
<el-button disabled :type="'default'" plain round ></el-button>
|
||||||
|
</el-button-group>
|
||||||
|
</template>
|
||||||
|
</el-popover>
|
||||||
|
|
||||||
|
<el-select
|
||||||
|
v-model="queryParams.workType"
|
||||||
|
placeholder="题型"
|
||||||
|
size="small"
|
||||||
|
class="work-type"
|
||||||
|
@change="queryExamQuestionByParams"
|
||||||
|
>
|
||||||
|
<template v-for="(item, index) in listWorkType" :key="index">
|
||||||
|
<el-option :label="item.label" :value="item" />
|
||||||
|
</template>
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div :style="{'width': (viewportWidth - 400) + 'px','height': (viewportHeight-38) + 'px','overflow-y': 'auto'}">
|
||||||
|
<examReview
|
||||||
|
:loading="loading"
|
||||||
|
:listExamQuestion="listExamQuestion"
|
||||||
|
v-if="curTask.viewkey=='真题回顾'"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<pointAnalysis
|
||||||
|
v-else-if="curTask.viewkey=='考点分析'"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<examMocks v-else
|
||||||
|
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import {ref, onMounted, reactive, watch, nextTick, getCurrentInstance} from 'vue'
|
||||||
|
import { ArrowRight } from '@element-plus/icons-vue'
|
||||||
|
|
||||||
|
import useResoureStore from '@/views/resource/store'
|
||||||
|
import ChooseTextbook from '@/components/choose-textbook/index.vue'
|
||||||
|
import {listEntpcoursework, listEntpcourseworkNew} from '@/api/education/entpCourseWork'
|
||||||
|
import {processExamQuestion} from '@/utils/examQuestion/tool'
|
||||||
|
import { JYApiListCT} from "@/utils/examQuestion/jyeoo"
|
||||||
|
|
||||||
|
import examReview from './container/examReview.vue'
|
||||||
|
import pointAnalysis from './container/pointAnalysis.vue'
|
||||||
|
import examMocks from './container/examMocks.vue'
|
||||||
|
|
||||||
|
const {proxy} = getCurrentInstance();
|
||||||
|
const sourceStore = useResoureStore();
|
||||||
|
const viewportHeight = ref(0);
|
||||||
|
const viewportWidth = ref(0);
|
||||||
|
// 当前选中的章节或单元
|
||||||
|
const curNode = ref({});
|
||||||
|
// 试题集合
|
||||||
|
const listExamQuestion = ref([]);
|
||||||
|
const loading = ref(false);
|
||||||
|
const curTask = reactive({
|
||||||
|
viewkey: '真题回顾',
|
||||||
|
});
|
||||||
|
const queryParams = reactive({
|
||||||
|
workType: {
|
||||||
|
label: '不限',
|
||||||
|
value: 0,
|
||||||
|
},
|
||||||
|
total: 0,
|
||||||
|
});
|
||||||
|
const listWorkType = ref([{
|
||||||
|
label: '不限',
|
||||||
|
value: 0,
|
||||||
|
}]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @desc: 选中单元章节后的回调, 获取单元章节信息
|
||||||
|
* @return: {*}
|
||||||
|
* @param {*} data
|
||||||
|
*/
|
||||||
|
const getData = async (data) => {
|
||||||
|
if (curNode.value.id == data.node.id) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
loading.value = true;
|
||||||
|
|
||||||
|
// 1.获取题型
|
||||||
|
getWorkType(data.node);
|
||||||
|
|
||||||
|
// 2.获取试题集合
|
||||||
|
curNode.value = data.node;
|
||||||
|
// 查询本地
|
||||||
|
// const params = {
|
||||||
|
// pageNum: 1,
|
||||||
|
// pageSize: 100,
|
||||||
|
// workgroup: '1',
|
||||||
|
// edusubject: curNode.value.edusubject,
|
||||||
|
// evalid: curNode.value.id,
|
||||||
|
// orderby: 'concat(worktype,worktag) DESC',
|
||||||
|
// }
|
||||||
|
// const res = await listEntpcoursework(params);
|
||||||
|
// listExamQuestion.value = res.rows;
|
||||||
|
|
||||||
|
// 查询本地+菁优网(后端处理)
|
||||||
|
const params = {
|
||||||
|
eid: curNode.value.id,
|
||||||
|
workgroup: '1',
|
||||||
|
worktype: '不限',
|
||||||
|
workTypeId: '0',
|
||||||
|
edusubject: curNode.value.edusubject,
|
||||||
|
edustage: curNode.value.edustage,
|
||||||
|
sectionName: curNode.value.itemtitle,
|
||||||
|
}
|
||||||
|
const res = await listEntpcourseworkNew(params);
|
||||||
|
if(res.data == null) {
|
||||||
|
listExamQuestion.value = [];
|
||||||
|
// queryParams.total = 0
|
||||||
|
loading.value = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
listExamQuestion.value = res.data;
|
||||||
|
// queryParams.total = res.total;
|
||||||
|
// 格式化试题
|
||||||
|
processExamQuestion(listExamQuestion.value);
|
||||||
|
loading.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @desc: 切换节点
|
||||||
|
* @return: {*}
|
||||||
|
* @param {*} item
|
||||||
|
* @param {*} key
|
||||||
|
*/
|
||||||
|
const changeTaskView = (item, key) => {
|
||||||
|
curTask.viewkey = item;
|
||||||
|
}
|
||||||
|
|
||||||
|
const getWorkType = async (data) => {
|
||||||
|
const selName = `${data.edustage}${data.edusubject}`
|
||||||
|
const curName = `${curNode.value.edustage}${curNode.value.edusubject}`
|
||||||
|
if (selName === curName) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const jyCT = await JYApiListCT(proxy, selName);
|
||||||
|
if (jyCT.length == 0) {
|
||||||
|
ElMessage.error('获取题型失败!');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
listWorkType.value = jyCT;
|
||||||
|
}
|
||||||
|
|
||||||
|
const queryExamQuestionByParams = async () => {
|
||||||
|
loading.value = true;
|
||||||
|
|
||||||
|
// 查询本地
|
||||||
|
// const params = {
|
||||||
|
// pageNum: 1,
|
||||||
|
// pageSize: 100,
|
||||||
|
// workgroup: '1',
|
||||||
|
// edusubject: curNode.value.edusubject,
|
||||||
|
// evalid: curNode.value.id,
|
||||||
|
// worktype: queryParams.workType.Value,
|
||||||
|
// orderby: 'concat(worktype,worktag) DESC',
|
||||||
|
// }
|
||||||
|
// if (queryParams.workType == '不限') {
|
||||||
|
// delete params.worktype;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// const res = await listEntpcoursework(params);
|
||||||
|
// listExamQuestion.value = res.rows;
|
||||||
|
|
||||||
|
// 查询本地+菁优网(后端处理)
|
||||||
|
const params = {
|
||||||
|
eid: curNode.value.id,
|
||||||
|
workgroup: '1',
|
||||||
|
worktype: queryParams.workType.label,
|
||||||
|
workTypeId: queryParams.workType.value,
|
||||||
|
edusubject: curNode.value.edusubject,
|
||||||
|
edustage: curNode.value.edustage,
|
||||||
|
sectionName: curNode.value.itemtitle,
|
||||||
|
}
|
||||||
|
const res = await listEntpcourseworkNew(params);
|
||||||
|
if(res.data == null) {
|
||||||
|
listExamQuestion.value = [];
|
||||||
|
// queryParams.total = 0
|
||||||
|
loading.value = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
listExamQuestion.value = res.data;
|
||||||
|
// queryParams.total = res.total;
|
||||||
|
// 格式化试题
|
||||||
|
processExamQuestion(listExamQuestion.value);
|
||||||
|
loading.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取视口高度
|
||||||
|
const getViewportHeight = () => {
|
||||||
|
return Math.max(
|
||||||
|
document.documentElement.clientHeight,
|
||||||
|
window.innerHeight || 0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const getViewportWidth = () => {
|
||||||
|
return Math.max(
|
||||||
|
document.documentElement.clientWidth,
|
||||||
|
window.innerWidth || 0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
nextTick(() => {
|
||||||
|
viewportHeight.value = getViewportHeight();
|
||||||
|
viewportWidth.value = getViewportWidth();
|
||||||
|
})
|
||||||
|
window.addEventListener('resize', () => {
|
||||||
|
viewportHeight.value = getViewportHeight();
|
||||||
|
viewportWidth.value = getViewportWidth();
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.page-resource {
|
||||||
|
padding-top: 20px;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
//右侧栏
|
||||||
|
.page-right {
|
||||||
|
min-width: 0;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
flex: 1;
|
||||||
|
margin-left: 20px;
|
||||||
|
height: 100%;
|
||||||
|
background: #ffffff;
|
||||||
|
border-radius: 10px;
|
||||||
|
box-shadow: 0px 0px 20px 0px rgba(99, 99, 99, 0.06);
|
||||||
|
|
||||||
|
.page-right-top {
|
||||||
|
display: flex;
|
||||||
|
margin-top: 6px;
|
||||||
|
margin-left: 6px;
|
||||||
|
|
||||||
|
.work-type {
|
||||||
|
width: 100px;
|
||||||
|
margin: 0 6px 0 auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style src="@/assets/styles/JYStyle.css"></style>
|
|
@ -112,7 +112,7 @@ const title = reactive([
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: '高考研究',
|
name: '考试分析',
|
||||||
url: '/education/colentrance',
|
url: '/education/colentrance',
|
||||||
img: 'iconfont icon-icon_kaoshifenxi',
|
img: 'iconfont icon-icon_kaoshifenxi',
|
||||||
child1: []
|
child1: []
|
||||||
|
|
Loading…
Reference in New Issue