diff --git a/.env.development b/.env.development
index d4989df..df0b713 100644
--- a/.env.development
+++ b/.env.development
@@ -10,6 +10,7 @@ VITE_APP_BASE_API = '/dev-api'
VITE_APP_DOMAIN = 'file.ysaix.com'
VITE_APP_UPLOAD_API = 'https://file.ysaix.com:7868/prod-api'
+#VITE_APP_UPLOAD_API = 'http://192.168.2.52:7863'
VITE_APP_RES_FILE_PATH = 'https://file.ysaix.com:7868/src/assets/textbook/booktxt/'
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
index 55db58d..517a19c 100644
--- a/.eslintrc.cjs
+++ b/.eslintrc.cjs
@@ -10,6 +10,7 @@ module.exports = {
],
rules: {
'vue/require-default-prop': 'off',
- 'vue/multi-word-component-names': 'off'
+ 'vue/multi-word-component-names': 'off',
+ 'prettier/prettier': 'off'
}
}
diff --git a/electron.vite.config.mjs b/electron.vite.config.mjs
index 74db0cc..18b8cea 100644
--- a/electron.vite.config.mjs
+++ b/electron.vite.config.mjs
@@ -25,6 +25,7 @@ export default defineConfig({
proxy: {
'/dev-api': {
target: 'http://27.128.240.72:7865',
+ // target: 'http://36.134.181.164:7863',
// target: 'http://192.168.2.52:7863',
changeOrigin: true,
rewrite: (p) => p.replace(/^\/dev-api/, '')
diff --git a/package.json b/package.json
index f070ac6..bc6282a 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "aix-win",
- "version": "1.1.6",
+ "version": "2.0.2",
"description": "An Electron application with Vue",
"main": "./out/main/index.js",
"author": "example.com",
@@ -25,24 +25,31 @@
"@electron/remote": "^2.1.2",
"@element-plus/icons-vue": "^2.3.1",
"@vitejs/plugin-vue-jsx": "^4.0.0",
+ "@vue-office/docx": "^1.6.2",
+ "@vue-office/excel": "^1.7.11",
+ "@vue-office/pdf": "^2.0.2",
"@vueuse/core": "^10.11.0",
+ "circular-json": "^0.5.9",
"cropperjs": "^1.6.2",
"crypto-js": "^4.2.0",
+ "echarts": "^5.5.1",
"electron-dl-manager": "^3.0.0",
"electron-log": "^5.1.7",
"electron-store": "8.0.0",
"electron-updater": "^6.1.7",
+ "element-china-area-data": "^6.1.0",
"element-plus": "^2.7.6",
"fabric": "^5.3.0",
+ "im_electron_sdk": "^8.0.5904",
"js-cookie": "^3.0.5",
"jsencrypt": "^3.3.2",
"jsondiffpatch": "0.6.0",
- "im_electron_sdk": "^8.0.5904",
"lodash": "^4.17.21",
"pdfjs-dist": "4.4.168",
"pinia": "^2.1.7",
"pinia-plugin-persistedstate": "^3.2.1",
"spark-md5": "^3.0.2",
+ "vue-qr": "^4.0.9",
"vue-router": "^4.4.0",
"xgplayer": "^3.0.19",
"xlsx": "^0.18.5"
diff --git a/src/main/file.js b/src/main/file.js
index ddabb2c..58ee5ec 100644
--- a/src/main/file.js
+++ b/src/main/file.js
@@ -224,7 +224,7 @@ export default async function ({ app, shell, BrowserWindow, ipcMain }) {
formData.append(key, uploadData[key])
}
}
- formData.append('fileFlag', '教案')
+ formData.append('fileFlag', '课件')
uploadFileByFS({
url: uploadUrl,
path,
diff --git a/src/main/index.js b/src/main/index.js
index e4559b2..ac96916 100644
--- a/src/main/index.js
+++ b/src/main/index.js
@@ -53,7 +53,7 @@ function createLoginWindow() {
updateInit(loginWindow)
}
- // loginWindow.webContents.openDevTools()
+ loginWindow.webContents.openDevTools()
loginWindow.once('ready-to-show', () => {
loginWindow.show()
})
@@ -68,7 +68,7 @@ function createLoginWindow() {
function createMainWindow() {
mainWindow = new BrowserWindow({
width: 1200,
- minWidth: 1200,
+ minWidth: 1350,
height: 700,
show: false,
frame: false, // 无边框
@@ -133,7 +133,7 @@ async function createLinkWin(data) {
contextIsolation: true
}
})
- linkWin[data.key].type = 'link' // 唯一标识
+ linkWin[data.key].type = 'link'+data.key // 唯一标识
let cookieDetails = { ...data.cookieData }
await linkWin[data.key].webContents.session.cookies
@@ -142,9 +142,9 @@ async function createLinkWin(data) {
.catch((error) => {})
data.fullPath = data.fullPath.replaceAll('//', '/')
if (data.fullPath.indexOf('?') !== -1) {
- data.fullPath += '&urlSource=smarttalk'
+ data.fullPath += '&urlSource=smarttalk&t' + Date.now()
}else {
- data.fullPath += '?urlSource=smarttalk'
+ data.fullPath += '?urlSource=smarttalk&t' + Date.now()
}
linkWin[data.key].loadURL(data.fullPath)
@@ -297,4 +297,4 @@ function appWatchError() {
app.on('child-process-gone', async (event, details) => {
console.error(`APP-ERROR:child-process-gone; event: ${JSON.stringify(event)}; details:${JSON.stringify(details)}`)
})
-}
\ No newline at end of file
+}
diff --git a/src/renderer/public/img/logo.png b/src/renderer/public/img/logo.png
new file mode 100644
index 0000000..45f6e65
Binary files /dev/null and b/src/renderer/public/img/logo.png differ
diff --git a/src/renderer/src/api/ai/index.js b/src/renderer/src/api/ai/index.js
new file mode 100644
index 0000000..ef5cfd6
--- /dev/null
+++ b/src/renderer/src/api/ai/index.js
@@ -0,0 +1,20 @@
+import request from '@/utils/request'
+
+// 创建对话
+export const createChart = ({ headers, data }) => {
+ return request({
+ url: '/qf/createChart',
+ method: 'post',
+ headers,
+ data,
+ })
+}
+// 大模型对话
+export const sendChart = ({ headers, data }) => {
+ return request({
+ url: '/qf/sendTalk',
+ method: 'post',
+ headers,
+ data,
+ })
+}
\ No newline at end of file
diff --git a/src/renderer/src/api/classManage/index.js b/src/renderer/src/api/classManage/index.js
index 14471ee..6b82a81 100644
--- a/src/renderer/src/api/classManage/index.js
+++ b/src/renderer/src/api/classManage/index.js
@@ -187,3 +187,14 @@ export function getClassInfo(id) {
params: {id}
})
}
+//加入班级
+export function addClasses(data) {
+ return request({
+ url: '/smarttalk/audit/applyAddClass',
+ method: 'post',
+ data: data,
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ }
+ })
+}
diff --git a/src/renderer/src/api/classTask/index.js b/src/renderer/src/api/classTask/index.js
new file mode 100644
index 0000000..61154ff
--- /dev/null
+++ b/src/renderer/src/api/classTask/index.js
@@ -0,0 +1,64 @@
+// 查询evaluation列表
+import request from '@/utils/request'
+
+// 查询作业列表
+export function listByDeadDate(query) {
+ return request({
+ url: '/education/classwork/listByDeadDate',
+ method: 'get',
+ params: query
+ })
+}
+//多个班级学生作业数据
+export function listClassworkdataByDeadDate(query) {
+ return request({
+ url: '/education/classworkdata/listByDeadDate',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询classworkdata列表 班级作业列表
+export function listClassworkdata(query) {
+ return request({
+ url: '/education/classworkdata/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询entpcoursework列表 课程作业列表
+export function listEntpcoursework(query) {
+ return request({
+ url: '/education/entpcoursework/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询classworkeval列表 课堂作业列表
+export function listClassworkeval(query) {
+ return request({
+ url: '/education/classworkeval/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 修改classworkeval
+export function updateClassworkeval(data) {
+ return request({
+ url: '/education/classworkeval',
+ method: 'put',
+ data: data
+ })
+}
+
+// 修改classworkdata
+export function updateClassworkdata(data) {
+ return request({
+ url: '/education/classworkdata',
+ method: 'put',
+ data: data
+ })
+}
diff --git a/src/renderer/src/api/education/entpCourseWork.js b/src/renderer/src/api/education/entpCourseWork.js
new file mode 100644
index 0000000..0ba694c
--- /dev/null
+++ b/src/renderer/src/api/education/entpCourseWork.js
@@ -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,
+ }
+ })
+}
\ No newline at end of file
diff --git a/src/renderer/src/api/education/entpcoursefile.js b/src/renderer/src/api/education/entpcoursefile.js
new file mode 100644
index 0000000..c6c26c5
--- /dev/null
+++ b/src/renderer/src/api/education/entpcoursefile.js
@@ -0,0 +1,162 @@
+import request from '@/utils/request'
+
+// 查询entpcoursefile列表
+export function listEntpcoursefile(query) {
+ return request({
+ url: '/education/entpcoursefile/list',
+ method: 'get',
+ params: query
+ })
+}
+// zdg:查询entpcoursefile列表-新
+export function listEntpcoursefileNew(query) {
+ return request({
+ url: '/education/entpcoursefile/new/list',
+ method: 'get',
+ params: query
+ })
+}
+// 查询entpcoursefile详细
+export function getEntpcoursefile(id) {
+ return request({
+ url: '/education/entpcoursefile/' + id,
+ method: 'get'
+ })
+}
+
+// 新增entpcoursefile
+export function addEntpcoursefile(data) {
+ return request({
+ url: '/education/entpcoursefile',
+ method: 'post',
+ data: data
+ })
+}
+
+// 新增entpcoursefile
+export function addEntpcoursefileReturnId(data) {
+ return request({
+ url: '/education/entpcoursefile/addReturnId',
+ method: 'post',
+ data: data
+ })
+}
+
+
+// addFromId
+export function addFromId(fromid, toid, entpid, entpcourseid, edituserid) {
+ return request({
+ url: '/education/entpcoursefile/addFromId/'+fromid+'/'+toid+'/'+entpid+'/'+entpcourseid+'/'+edituserid,
+ method: 'post'
+ })
+}
+
+// 修改entpcoursefile
+export function updateEntpcoursefile(data) {
+ return request({
+ url: '/education/entpcoursefile',
+ method: 'put',
+ data: data
+ })
+}
+// 新增 修改接口
+export function updateEntpcoursefileNew(data) {
+ return request({
+ url: '/education/entpcoursefile/newUpdateFile',
+ method: 'post',
+ data: data
+ })
+}
+
+// updateFileByIds
+export function updateFileByIds(data) {
+ return request({
+ url: '/education/entpcoursefile/updateFileByIds',
+ method: 'post',
+ data: data
+ })
+}
+
+// updateFileByArray
+export function updateFileByArray(data) {
+ return request({
+ url: '/education/entpcoursefile/updateFileByArray',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改entpcoursefile
+export function updateFile2Redis(data) {
+ return request({
+ url: '/education/entpcoursefile/updateFile2Redis',
+ method: 'post',
+ data: data
+ })
+}
+
+// 删除entpcoursefile
+export function delEntpcoursefile(id) {
+ return request({
+ url: '/education/entpcoursefile/' + id,
+ method: 'delete'
+ })
+}
+
+// 保存base64图片,返回url
+export function saveEntpCourseBase64File(data) {
+ return request({
+ url: '/education/entpcoursefile/saveBase64File',
+ method: 'post',
+ data: data
+ })
+}
+
+
+// 文件上传
+export function saveEntpCourseBase64File2(data) {
+ return request({
+ url: '/education/entpcoursefile/saveBase64File2',
+ method: 'post',
+ data: data
+ })
+}
+
+// 保存PPT页面预览base64图片,返回url
+export function savePPTPreviewBase64File(data) {
+ return request({
+ url: '/education/entpcoursefile/savePreviewBase64',
+ method: 'post',
+ data: data
+ })
+}
+
+
+// PPT文件上传
+export function saveEntpCoursePPT(data) {
+ return request({
+ url: '/education/entpcoursefile/importPPT',
+ method: 'post',
+ data: data
+ })
+}
+
+// PPT文件解析
+export function parsePPT(data) {
+ return request({
+ url: '/education/entpcoursefile/parsePPT',
+ method: 'post',
+ data: data
+ })
+}
+
+
+// 修改ppt.slide.index
+export function updateSlideIndex(data) {
+ return request({
+ url: '/education/entpcoursefile/saveSlideOrder',
+ method: 'post',
+ data: data
+ })
+}
+
diff --git a/src/renderer/src/api/file/index.js b/src/renderer/src/api/file/index.js
index 5bfe721..e655614 100644
--- a/src/renderer/src/api/file/index.js
+++ b/src/renderer/src/api/file/index.js
@@ -9,6 +9,14 @@ export const getSmarttalkPage = (params) => {
})
}
+export const creatAPT = (params) => {
+ return request({
+ url: '/smarttalk/file/createApt',
+ method: 'post',
+ params
+ })
+}
+
export const getPrepareById = (id) => {
return request({
url: '/smarttalk/file/' + id,
diff --git a/src/renderer/src/api/login.js b/src/renderer/src/api/login.js
index 649f59c..16c03cf 100644
--- a/src/renderer/src/api/login.js
+++ b/src/renderer/src/api/login.js
@@ -56,4 +56,77 @@ export function getCodeImg() {
method: 'get',
timeout: 20000
})
+}
+
+// 注册模块-生成人机验证
+export function captchaImg(data) {
+ return request({
+ url: '/captchaImg',
+ headers: {
+ isToken: false
+ },
+ method: 'get',
+ params: data
+ })
+}
+
+//注册模块-发送验证码
+export function sendCode(data) {
+ return request({
+ url: '/smarttalk/register/authSendCode',
+ method: 'post',
+ data:data
+ })
+}
+
+//注册模块-申请注册
+export function signIn(data) {
+ return request({
+ url: '/smarttalk/register/authSignIn',
+ method: 'post',
+ data:data
+ })
+}
+
+//登录模块-找回密码
+export function retrievePwd(data) {
+ return request({
+ url: '/smarttalk/register/authRetrievePwd',
+ method: 'post',
+ data
+ })
+}
+
+//注册模块-获取学校
+export function deptTree(data) {
+ return request({
+ url: '/smarttalk/register/authDeptTree',
+ method: 'get',
+ params:data
+ })
+}
+// 查询部门详细
+export function getDept(query) {
+ return request({
+ url: '/system/dept/detail',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询classmain列表
+export function listClassmain(query) {
+ return request({
+ url: '/education/classmain/list',
+ method: 'get',
+ params: query
+ })
+}
+// 查询evaluation列表
+export function listEvaluation(query) {
+ return request({
+ url: '/smarttalk/register/authEvaluationList',
+ method: 'get',
+ params: query
+ })
}
\ No newline at end of file
diff --git a/src/renderer/src/api/teaching/classcourse.js b/src/renderer/src/api/teaching/classcourse.js
new file mode 100644
index 0000000..665489c
--- /dev/null
+++ b/src/renderer/src/api/teaching/classcourse.js
@@ -0,0 +1,89 @@
+import request from '@/utils/request'
+
+// 查询classcourse列表
+export function listClasscourse(query) {
+ return request({
+ url: '/education/classcourse/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询classcourse详细
+export function getClasscourse(id) {
+ return request({
+ url: '/education/classcourse/' + id,
+ method: 'get'
+ })
+}
+
+// 新增classcourse
+export function addClasscourse(data) {
+ return request({
+ url: '/education/classcourse',
+ method: 'post',
+ data: data
+ })
+}
+
+// 新增classcourse
+export function addClasscourseReturnId(data) {
+ return request({
+ url: '/education/classcourse/saveReturnId',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改classcourse
+export function updateClasscourse(data) {
+ return request({
+ url: '/education/classcourse',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除classcourse
+export function delClasscourse(id) {
+ return request({
+ url: '/education/classcourse/' + id,
+ method: 'delete'
+ })
+}
+
+
+// 删除classcourse
+export function delClasscourseWithData(id) {
+ return request({
+ url: '/education/classcourse/removeData/' + id,
+ method: 'delete'
+ })
+}
+
+
+// classcourse开始上课
+export function startCourseTeaching(id) {
+ return request({
+ url: '/education/classcourse/startCourseTeaching/'+id,
+ method: 'post',
+ })
+}
+
+// 老师学生发送新的消息
+export function sendCourseTeachingMsg(data) {
+ return request({
+ url: '/education/classcourse/sendCourseTeachingMsg',
+ method: 'post',
+ data: data
+ })
+}
+
+// 老师学生获取新的交互消息
+export function getCourseTeachingMsg(id) {
+ return request({
+ url: '/education/classcourse/getCourseTeachingMsg/'+id,
+ method: 'post',
+ })
+}
+
diff --git a/src/renderer/src/assets/iconfont/iconfont.css b/src/renderer/src/assets/iconfont/iconfont.css
index c1fab69..da8460e 100644
--- a/src/renderer/src/assets/iconfont/iconfont.css
+++ b/src/renderer/src/assets/iconfont/iconfont.css
@@ -1,9 +1,9 @@
@font-face {
font-family: "iconfont"; /* Project id 2794390 */
- src: url('iconfont.woff2?t=1724212790213') format('woff2'),
- url('iconfont.woff?t=1724212790213') format('woff'),
- url('iconfont.ttf?t=1724212790213') format('truetype'),
- url('iconfont.svg?t=1724212790213#iconfont') format('svg');
+ src: url('iconfont.woff2?t=1725847033097') format('woff2'),
+ url('iconfont.woff?t=1725847033097') format('woff'),
+ url('iconfont.ttf?t=1725847033097') format('truetype'),
+ url('iconfont.svg?t=1725847033097#iconfont') format('svg');
}
.iconfont {
@@ -14,6 +14,38 @@
-moz-osx-font-smoothing: grayscale;
}
+.icon-aijiqiren:before {
+ content: "\e73c";
+}
+
+.icon-saoyisao:before {
+ content: "\e691";
+}
+
+.icon-jiaoxuezhiliangfenxi:before {
+ content: "\e690";
+}
+
+.icon-jiaoxuejihua:before {
+ content: "\e7e9";
+}
+
+.icon-tongji:before {
+ content: "\e68f";
+}
+
+.icon-pigai:before {
+ content: "\e68d";
+}
+
+.icon-jiaoxuefansi:before {
+ content: "\e6b2";
+}
+
+.icon-kaoshi:before {
+ content: "\e68a";
+}
+
.icon-yiwen:before {
content: "\e687";
}
diff --git a/src/renderer/src/assets/iconfont/iconfont.js b/src/renderer/src/assets/iconfont/iconfont.js
index 2ad9df4..acf827f 100644
--- a/src/renderer/src/assets/iconfont/iconfont.js
+++ b/src/renderer/src/assets/iconfont/iconfont.js
@@ -1 +1 @@
-window._iconfont_svg_string_2794390=' ',(c=>{var h=(l=(l=document.getElementsByTagName("script"))[l.length-1]).getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var a,t,z,p,i,v=function(h,l){l.parentNode.insertBefore(h,l)};if(h&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(h){console&&console.log(h)}}a=function(){var h,l=document.createElement("div");l.innerHTML=c._iconfont_svg_string_2794390,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(h=document.body).firstChild?v(l,h.firstChild):h.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(a,0):(t=function(){document.removeEventListener("DOMContentLoaded",t,!1),a()},document.addEventListener("DOMContentLoaded",t,!1)):document.attachEvent&&(z=a,p=c.document,i=!1,d(),p.onreadystatechange=function(){"complete"==p.readyState&&(p.onreadystatechange=null,M())})}function M(){i||(i=!0,z())}function d(){try{p.documentElement.doScroll("left")}catch(h){return void setTimeout(d,50)}M()}})(window);
\ No newline at end of file
+window._iconfont_svg_string_2794390=' ',(l=>{var c=(h=(h=document.getElementsByTagName("script"))[h.length-1]).getAttribute("data-injectcss"),h=h.getAttribute("data-disable-injectsvg");if(!h){var a,t,z,i,p,v=function(c,h){h.parentNode.insertBefore(c,h)};if(c&&!l.__iconfont__svg__cssinject__){l.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}a=function(){var c,h=document.createElement("div");h.innerHTML=l._iconfont_svg_string_2794390,(h=h.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",h=h,(c=document.body).firstChild?v(h,c.firstChild):c.appendChild(h))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(a,0):(t=function(){document.removeEventListener("DOMContentLoaded",t,!1),a()},document.addEventListener("DOMContentLoaded",t,!1)):document.attachEvent&&(z=a,i=l.document,p=!1,d(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,M())})}function M(){p||(p=!0,z())}function d(){try{i.documentElement.doScroll("left")}catch(c){return void setTimeout(d,50)}M()}})(window);
\ No newline at end of file
diff --git a/src/renderer/src/assets/iconfont/iconfont.json b/src/renderer/src/assets/iconfont/iconfont.json
index 30d5f43..1536757 100644
--- a/src/renderer/src/assets/iconfont/iconfont.json
+++ b/src/renderer/src/assets/iconfont/iconfont.json
@@ -5,6 +5,62 @@
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
+ {
+ "icon_id": "34666608",
+ "name": "ai机器人",
+ "font_class": "aijiqiren",
+ "unicode": "e73c",
+ "unicode_decimal": 59196
+ },
+ {
+ "icon_id": "12657402",
+ "name": "资源库",
+ "font_class": "saoyisao",
+ "unicode": "e691",
+ "unicode_decimal": 59025
+ },
+ {
+ "icon_id": "6513175",
+ "name": "教学质量分析",
+ "font_class": "jiaoxuezhiliangfenxi",
+ "unicode": "e690",
+ "unicode_decimal": 59024
+ },
+ {
+ "icon_id": "38447338",
+ "name": "教学计划",
+ "font_class": "jiaoxuejihua",
+ "unicode": "e7e9",
+ "unicode_decimal": 59369
+ },
+ {
+ "icon_id": "8455509",
+ "name": "统计",
+ "font_class": "tongji",
+ "unicode": "e68f",
+ "unicode_decimal": 59023
+ },
+ {
+ "icon_id": "5969226",
+ "name": "批改",
+ "font_class": "pigai",
+ "unicode": "e68d",
+ "unicode_decimal": 59021
+ },
+ {
+ "icon_id": "36295514",
+ "name": "教学反思",
+ "font_class": "jiaoxuefansi",
+ "unicode": "e6b2",
+ "unicode_decimal": 59058
+ },
+ {
+ "icon_id": "21088705",
+ "name": "考试",
+ "font_class": "kaoshi",
+ "unicode": "e68a",
+ "unicode_decimal": 59018
+ },
{
"icon_id": "20574719",
"name": "疑问",
diff --git a/src/renderer/src/assets/iconfont/iconfont.svg b/src/renderer/src/assets/iconfont/iconfont.svg
index 8201a34..4949c8e 100644
--- a/src/renderer/src/assets/iconfont/iconfont.svg
+++ b/src/renderer/src/assets/iconfont/iconfont.svg
@@ -14,6 +14,22 @@
/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/renderer/src/assets/iconfont/iconfont.ttf b/src/renderer/src/assets/iconfont/iconfont.ttf
index 43f8dc3..43ac2dc 100644
Binary files a/src/renderer/src/assets/iconfont/iconfont.ttf and b/src/renderer/src/assets/iconfont/iconfont.ttf differ
diff --git a/src/renderer/src/assets/iconfont/iconfont.woff b/src/renderer/src/assets/iconfont/iconfont.woff
index 9fc1445..10961b9 100644
Binary files a/src/renderer/src/assets/iconfont/iconfont.woff and b/src/renderer/src/assets/iconfont/iconfont.woff differ
diff --git a/src/renderer/src/assets/iconfont/iconfont.woff2 b/src/renderer/src/assets/iconfont/iconfont.woff2
index e1759ea..e8cb594 100644
Binary files a/src/renderer/src/assets/iconfont/iconfont.woff2 and b/src/renderer/src/assets/iconfont/iconfont.woff2 differ
diff --git a/src/renderer/src/assets/images/ai-01.png b/src/renderer/src/assets/images/ai-01.png
new file mode 100644
index 0000000..f2c02f2
Binary files /dev/null and b/src/renderer/src/assets/images/ai-01.png differ
diff --git a/src/renderer/src/assets/images/ai-02.png b/src/renderer/src/assets/images/ai-02.png
new file mode 100644
index 0000000..f330465
Binary files /dev/null and b/src/renderer/src/assets/images/ai-02.png differ
diff --git a/src/renderer/src/assets/images/ai-03.png b/src/renderer/src/assets/images/ai-03.png
new file mode 100644
index 0000000..c7e3c98
Binary files /dev/null and b/src/renderer/src/assets/images/ai-03.png differ
diff --git a/src/renderer/src/assets/images/ai-04.png b/src/renderer/src/assets/images/ai-04.png
new file mode 100644
index 0000000..09cd45a
Binary files /dev/null and b/src/renderer/src/assets/images/ai-04.png differ
diff --git a/src/renderer/src/assets/images/logo.png b/src/renderer/src/assets/images/logo.png
new file mode 100644
index 0000000..45f6e65
Binary files /dev/null and b/src/renderer/src/assets/images/logo.png differ
diff --git a/src/renderer/src/assets/styles/JYStyle.css b/src/renderer/src/assets/styles/JYStyle.css
new file mode 100644
index 0000000..f44e280
--- /dev/null
+++ b/src/renderer/src/assets/styles/JYStyle.css
@@ -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; }
\ No newline at end of file
diff --git a/src/renderer/src/components/ai-chart/container/text.vue b/src/renderer/src/components/ai-chart/container/text.vue
new file mode 100644
index 0000000..3372051
--- /dev/null
+++ b/src/renderer/src/components/ai-chart/container/text.vue
@@ -0,0 +1,47 @@
+
+
+ {{ displayedText }}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/renderer/src/components/ai-chart/index.vue b/src/renderer/src/components/ai-chart/index.vue
new file mode 100644
index 0000000..8d95703
--- /dev/null
+++ b/src/renderer/src/components/ai-chart/index.vue
@@ -0,0 +1,453 @@
+
+
+
+
+
+
+
+
+
+
+
+
你好,{{ userStore.nickName }}
+
我是AIx教学助手,我可以帮助你:
+
+
+
+
+
+
+
+ {{ item.content }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/renderer/src/components/choose-textbook/index.vue b/src/renderer/src/components/choose-textbook/index.vue
index 3c2a18c..2436521 100644
--- a/src/renderer/src/components/choose-textbook/index.vue
+++ b/src/renderer/src/components/choose-textbook/index.vue
@@ -2,12 +2,12 @@
- {{ curBookName }}
+ {{ curBook.data.itemtitle }}
-
{{ node.label }}
@@ -28,9 +28,9 @@
-
-
+
@@ -43,139 +43,71 @@
diff --git a/src/renderer/src/components/choose-textbook/third.vue b/src/renderer/src/components/choose-textbook/third.vue
index 554a6f5..ca8f65d 100644
--- a/src/renderer/src/components/choose-textbook/third.vue
+++ b/src/renderer/src/components/choose-textbook/third.vue
@@ -64,6 +64,8 @@ const getVertion = (data) => {
childs: []
}
})
+ //判断是否存在该教材,有则展示第一项
+ if(treeData.value.length === 0) return
nextTick(() => {
defaultExpandedKeys.value = [treeData.value[0].id]
node.currentNode.data = treeData.value[0]
diff --git a/src/renderer/src/components/choose-textbook/third/index.vue b/src/renderer/src/components/choose-textbook/third/index.vue
index 2b7a6a2..dc5fd9e 100644
--- a/src/renderer/src/components/choose-textbook/third/index.vue
+++ b/src/renderer/src/components/choose-textbook/third/index.vue
@@ -41,7 +41,9 @@ const getSubject = (value) => {
gradeName:gradeList[currentIndex].label
}
})
- const nameIndex = subjectList.value.findIndex(item => item.subjectName === useStore.user.edusubject)
+ //判断是否有名称或者包括名称就对应哪个学科
+ const nameIndex = subjectList.value.findIndex(item => item.subjectName === useStore.user.edusubject || item.subjectName.includes(useStore.user.edusubject))
+ if(nameIndex === -1) return;
getTagId({subjectId:subjectList.value[nameIndex].subjectId,subjectName:subjectList.value[nameIndex].subjectName})
if(textbookVersionId.value === 0){
getTagId(subjectList.value[0])
diff --git a/src/renderer/src/components/common/cForm.vue b/src/renderer/src/components/common/cForm.vue
new file mode 100644
index 0000000..c84dbcb
--- /dev/null
+++ b/src/renderer/src/components/common/cForm.vue
@@ -0,0 +1,209 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{btnText}}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/renderer/src/components/common/index.js b/src/renderer/src/components/common/index.js
new file mode 100644
index 0000000..d31d868
--- /dev/null
+++ b/src/renderer/src/components/common/index.js
@@ -0,0 +1,64 @@
+
+/**
+ * 使用-批量导入--方式
+ */
+
+// 导入 import.meta.glob 用于获取所有符合要求的 .vue 文件
+const files = import.meta.glob('./!(index).vue', { eager: true });
+
+export default {
+ install(Vue, options) {
+ Object.entries(files).forEach(([path, file]) => {
+ const fileName = path.split('/').pop().replace(/\.\w+$/, '')
+ // fileName == 'cDialog' && initDialog(Vue, file) // 弹窗--组件化
+ Vue.component(fileName, file.default)
+ });
+ }
+}
+
+// 弹窗--函数化
+function initDialog(Vue, dialog) {
+ // 全局绑定
+ Vue.prototype.$cDialog = (props) => {
+ // props.dialog = Object.assign({ isOpen: true }, props.dialog) // 默认配置 propsData: option
+ props.dialog.isOpen == null && (props.dialog.isOpen = true) // 默认打开
+ props.isRemove == null && (props.isRemove = true) // 默认关闭后移除
+ const Constructor = Vue.extend(dialog)
+ const Instance = new Constructor({ propsData: props })
+ props.slots && (Instance.$slots = props.slots) // 插槽内容
+ props.scopedSlots && (Instance.$scopedSlots = props.scopedSlots) // 作用域插槽内容
+ props.content && (Instance.$slots.default = props.content) // 插槽内容
+ document.body.appendChild(Instance.$mount().$el)
+ return Instance.showBox().then(v => {
+ props.callback && props.callback(v)
+ return Promise.resolve(v)
+ }).catch(v => {
+ props.callback && props.callback(v)
+ // 移除弹窗
+ props.isRemove && document.body.removeChild(Instance.$mount().$el)
+ return Promise.reject(v)
+ })
+ }
+ // 全局绑定2
+ Vue.prototype.$cDialog2 = (props) => {
+ // props.dialog = Object.assign({ isOpen: true }, props.dialog) // 默认配置 propsData: option
+ props.dialog.isOpen == null && (props.dialog.isOpen = true) // 默认打开
+ props.isRemove == null && (props.isRemove = true) // 默认关闭后移除
+ const Constructor = Vue.extend(dialog)
+ const Instance = new Constructor({ propsData: props })
+ props.slots && (Instance.$slots = props.slots) // 插槽内容
+ props.scopedSlots && (Instance.$scopedSlots = props.scopedSlots) // 作用域插槽内容
+ props.content && (Instance.$slots.default = props.content) // 插槽内容
+ document.body.appendChild(Instance.$mount().$el)
+ Instance.showBox().then(v => {
+ props.callback && props.callback(v)
+ return Promise.resolve(v)
+ }).catch(v => {
+ props.callback && props.callback(v)
+ // 移除弹窗
+ props.isRemove && document.body.removeChild(Instance.$mount().$el)
+ return Promise.reject(v)
+ })
+ return Instance
+ }
+}
diff --git a/src/renderer/src/components/file-image/index.vue b/src/renderer/src/components/file-image/index.vue
index efe374e..4cc856a 100644
--- a/src/renderer/src/components/file-image/index.vue
+++ b/src/renderer/src/components/file-image/index.vue
@@ -34,7 +34,7 @@ const getFileTypeIcon = () => {
gif: 'icon-gif',
txt: 'icon-txt',
rar: 'icon-rar',
-
+ apt: 'icon-lunwen'
}
if (iconObj[name]) {
return '#' + iconObj[name]
@@ -47,4 +47,4 @@ const getFileTypeIcon = () => {
-
\ No newline at end of file
+
diff --git a/src/renderer/src/components/file-preview/index.vue b/src/renderer/src/components/file-preview/index.vue
index 350695b..9b2326d 100644
--- a/src/renderer/src/components/file-preview/index.vue
+++ b/src/renderer/src/components/file-preview/index.vue
@@ -1,5 +1,5 @@
-
';
+ }
+
+ // 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(' ');
+
+ 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 = `${index+1}. ${item.title}
`;
+ let tmp = '';
+ let j=0;
+ let optionsArr = item.options;
+ for(; j`;
+ }
+ const char = String.fromCharCode(65+j);
+ tmp += `${char}.${optionsArr[j]}
`;
+ if(j%2 == 1){
+ tmp += ' ';
+ }
+ }
+ // j此刻已自增1, 故当选项为单数时, 需要补充结束标签
+ if(j%2 == 1){
+ tmp += ' ';
+ }
+
+ workDescHtml += tmp;
+ }
+ else if(item.type == '填空题' || item.type == '判断题' || item.type == '主观题'){
+ workDescHtml += `${index+1}. ${item.title}
`;
+ }
+ })
+ workDescHtml += ' ';
+ 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 += `${index+1}. ${answer}
`;
+ }
+ else if(item.type == '填空题' ){
+ const answer = answerArr.join('、');
+ workAnswerHtml += `${index+1}. ${answer}
`;
+ }
+ else if(item.type == '判断题' ){
+ const answer = answerArr.map( (item) => {
+ return item === '1' ? '正确' : '错误'
+ }).join('、');
+ workAnswerHtml += `${index+1}. ${answer}
`;
+ }
+ else if(item.type == '主观题' ){
+ // 复合题里面的主观题只有一个答案,或没填
+ const answer = answerArr.join('、');
+ if(answerArr[0]){
+ workAnswerHtml += `${index+1}. ${answer}
`;
+ }else{
+ workAnswerHtml += `${index+1}. ${answer}答案不唯一,请参考分析解答点评!
`;
+ }
+ }
+ })
+ 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`;
+ }
+ const char = String.fromCharCode(65+j);
+ tmp += `${char}.${workDescArr[j]}
`;
+ if(j%2 == 1){
+ tmp += ' ';
+ }
+ }
+ if(j%2== 0){
+ tmp += '';
+ }
+ 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;
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/renderer/src/utils/linkConfig.js b/src/renderer/src/utils/linkConfig.js
index f03f3e9..e5da707 100644
--- a/src/renderer/src/utils/linkConfig.js
+++ b/src/renderer/src/utils/linkConfig.js
@@ -1,6 +1,6 @@
import useUserStore from '@/store/modules/user'
-const baseConfig = () => {
- const userStore = useUserStore()
+export const baseConfig = (token) => {
+ const userStore = token ? {} : useUserStore()
return {
// Electron 设置cookie
url: import.meta.env.VITE_APP_BUILD_BASE_PATH,
@@ -8,7 +8,7 @@ const baseConfig = () => {
//cookie 名称 这里为 token
name: 'Admin-Token',
//cookie 值
- value: userStore.token,
+ value: token ? '' : userStore.token,
// 域名
domain: import.meta.env.VITE_APP_DOMAIN
}
diff --git a/src/renderer/src/utils/resourceDict.js b/src/renderer/src/utils/resourceDict.js
index 9a26a2b..c86aaf8 100644
--- a/src/renderer/src/utils/resourceDict.js
+++ b/src/renderer/src/utils/resourceDict.js
@@ -1,14 +1,14 @@
export const tabs = [
{
- label: '平台资源',
+ label: '平台',
value: '平台'
},
{
- label: '校本资源',
+ label: '校本',
value: '校本'
},
{
- label: '第三方资源',
+ label: '第三方',
value: '第三方'
},
]
@@ -57,18 +57,23 @@ export const resourceFormat = [
// 资源类型
export const resourceType = [
{
- label: '素材',
- value: '素材'
+ label: '课例库',
+ value: "'apt','课件','教案'"
+ },
+ {
+ label: '作业库',
+ value: '作业',
+ disabled: true
},
{
- label: '课件',
- value: '课件'
+ label: '素材库',
+ value: "'素材'"
},
-
{
- label: '教案',
- value: '教案'
+ label: '习题库',
+ value: '习题',
+ disabled: true
}
]
// 年级划分
diff --git a/src/renderer/src/utils/ruoyi.js b/src/renderer/src/utils/ruoyi.js
index e51b433..8d7971e 100644
--- a/src/renderer/src/utils/ruoyi.js
+++ b/src/renderer/src/utils/ruoyi.js
@@ -257,3 +257,17 @@ export const getFileName = (filename) => {
if(!filename) return
return filename.replace(/\.[^/.]+$/, "");
}
+
+// 清除当前选中的教材 章节 相关信息
+export const clearBookInfo = () =>{
+ //当前选中的教材
+ localStorage.removeItem('curBook')
+ // 当前选中的节点
+ localStorage.removeItem('curNode')
+ // 所有章节单元数据
+ localStorage.removeItem('unitList')
+ // 所有教材数据
+ localStorage.removeItem('subjectList')
+ // 展开的节点
+ localStorage.removeItem('defaultExpandedKeys')
+}
\ No newline at end of file
diff --git a/src/renderer/src/utils/tool.js b/src/renderer/src/utils/tool.js
index e7fcf86..608ae32 100644
--- a/src/renderer/src/utils/tool.js
+++ b/src/renderer/src/utils/tool.js
@@ -12,8 +12,8 @@ const Remote = isNode?require('@electron/remote'):{}
const { ipcRenderer } = isNode?require('electron'):window.electron || {}
const API = isNode?window.api:{} // preload-api
import { useToolState } from '@/store/modules/tool' // 获取store状态
-// const Store = isNode?require('electron-store'):null // 持久化存储
import store from './store'
+import { baseConfig } from './linkConfig' // 外部连接-配置
// 常用变量
const BaseUrl = isNode?process.env['ELECTRON_RENDERER_URL']+'/#':''
const isDev = isNode?process.env.NODE_ENV !== 'production':''
@@ -297,6 +297,23 @@ const eventHandles = (type, win) => {
}
}
+/**
+ * @description 外部跳转-web网页
+ * @param {*} path
+ * @param {*} params
+ */
+export const toLinkWeb = (path) => {
+ const config = baseConfig()
+ // console.log(config)
+ const fullPath = config.url + path
+ // 通知主进程
+ ipcRenderer.send('openWindow', {
+ key: `win-${Date.now()}`,
+ fullPath: fullPath,
+ cookieData: { ...config }
+ })
+}
+
// const taskHandles = () => {
// // 设置任务栏上下文菜单
// const contextMenu = new Remote.Menu()
diff --git a/src/renderer/src/views/classBegins/index.vue b/src/renderer/src/views/classBegins/index.vue
index ccc2af4..9e9c83d 100644
--- a/src/renderer/src/views/classBegins/index.vue
+++ b/src/renderer/src/views/classBegins/index.vue
@@ -104,6 +104,9 @@ const switchPageMode = () => {
}
}
onMounted(async () => {
+ window.addEventListener('focus', () => {
+ console.log(11111111111111)
+ })
const isDev = process.env.NODE_ENV == 'development'
// toolState.showBoardAll = false // 隐藏画板
toolState.isPdfWin=true //设置打开pdf窗口
diff --git a/src/renderer/src/views/classManage/aside.vue b/src/renderer/src/views/classManage/aside.vue
index 941134f..f7ee23f 100644
--- a/src/renderer/src/views/classManage/aside.vue
+++ b/src/renderer/src/views/classManage/aside.vue
@@ -4,11 +4,12 @@
class="el-menu-vertical-demo"
:default-active="activeIndex"
@select="handleSelect"
+ unique-opened
>
- {{item.caption}}
+ {{item.caption}}
{{items.title}}
@@ -43,6 +44,18 @@ const handleSelect = (itemDom,pathKey) => {
// })
emits('handleSelect',{index,id})
}
+const menuClick = (item,index) => {
+ // 获取当前点击的 el-sub-menu 元素
+ const currentSubMenu = document.getElementsByClassName('el-sub-menu');
+
+ // 检查是否有 is-open 类
+ if (!currentSubMenu[index].classList.contains('is-opened')) {
+ //点击以及菜单初始化跳转当前班级
+ const str = `1-1-${item.id}`
+ const arr = [String(index),str]
+ handleSelect(str,arr)
+ }
+}
diff --git a/src/renderer/src/views/classManage/basicGroup.vue b/src/renderer/src/views/classManage/basicGroup.vue
index 9e59f66..148553a 100644
--- a/src/renderer/src/views/classManage/basicGroup.vue
+++ b/src/renderer/src/views/classManage/basicGroup.vue
@@ -1,5 +1,5 @@
-
+
diff --git a/src/renderer/src/views/classManage/index.vue b/src/renderer/src/views/classManage/index.vue
index edb48b9..8ef42c2 100644
--- a/src/renderer/src/views/classManage/index.vue
+++ b/src/renderer/src/views/classManage/index.vue
@@ -2,8 +2,8 @@
-
-
+
+
@@ -12,11 +12,16 @@
+
+
+ 加入班级
+
+
-
+
-
+
@@ -28,7 +33,7 @@
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{userStore.nickName}}
+
-
-
-
- {{ item.itemtitle }}
-
-
-
-
-
-
- {{ item.label }}
-
-
-
-
- {{ userStore.nickName }}
-
-
-
+
+
+
取 消
确 定
@@ -69,7 +89,7 @@
+
+
diff --git a/src/renderer/src/views/classTask/container/classOverview.vue b/src/renderer/src/views/classTask/container/classOverview.vue
new file mode 100644
index 0000000..6b6687a
--- /dev/null
+++ b/src/renderer/src/views/classTask/container/classOverview.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+ 学情分布
+
+
+
+
+
+
+
+
+
+
+ 时长分析
+
+
+
+
+
+
+
+
+
+
+ 知识点概览
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/renderer/src/views/classTask/container/classOverview/distribution.vue b/src/renderer/src/views/classTask/container/classOverview/distribution.vue
new file mode 100644
index 0000000..5ff15c1
--- /dev/null
+++ b/src/renderer/src/views/classTask/container/classOverview/distribution.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/renderer/src/views/classTask/container/classOverview/distribution/echarts.vue b/src/renderer/src/views/classTask/container/classOverview/distribution/echarts.vue
new file mode 100644
index 0000000..9f6ae08
--- /dev/null
+++ b/src/renderer/src/views/classTask/container/classOverview/distribution/echarts.vue
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
diff --git a/src/renderer/src/views/classTask/container/classOverview/distribution/stuList.vue b/src/renderer/src/views/classTask/container/classOverview/distribution/stuList.vue
new file mode 100644
index 0000000..df21f66
--- /dev/null
+++ b/src/renderer/src/views/classTask/container/classOverview/distribution/stuList.vue
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+ {{stuItem.studentname}}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/renderer/src/views/classTask/container/classOverview/knowledge.vue b/src/renderer/src/views/classTask/container/classOverview/knowledge.vue
new file mode 100644
index 0000000..851f587
--- /dev/null
+++ b/src/renderer/src/views/classTask/container/classOverview/knowledge.vue
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
+ {{scope.row.scoingRate + '%'}}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/renderer/src/views/classTask/container/classOverview/timeAnalyse.vue b/src/renderer/src/views/classTask/container/classOverview/timeAnalyse.vue
new file mode 100644
index 0000000..c65e5ae
--- /dev/null
+++ b/src/renderer/src/views/classTask/container/classOverview/timeAnalyse.vue
@@ -0,0 +1,184 @@
+
+
+
+
+
+
+
diff --git a/src/renderer/src/views/classTask/container/item-dialog-score.vue b/src/renderer/src/views/classTask/container/item-dialog-score.vue
new file mode 100644
index 0000000..df31dd6
--- /dev/null
+++ b/src/renderer/src/views/classTask/container/item-dialog-score.vue
@@ -0,0 +1,985 @@
+
+
+
+
+
+ {{ classWorkFormScore.name }} 答题详情
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ quItem.worktag }}
+
+
+
+
+
+
+
+
+ 【答案】
+
+ 【分析】
+
+ 【解答】
+
+ 【点评】
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 参考答案:
+
+ {{ formatWorkAnswer(quItem) }}
+
+
+
+
+
+ 学生答案:
+
+ {{ formatFeedContent(stuItem, quItem) }}
+
+
+
+
+
+
+
+
+
+ 分
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 温馨提示:点击图片可放大预览
+
+
+
+
+
+
+
+
+ 温馨提示:点击此处 可预览其他类型附件!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
学生答复内容
+
{{stuItem.rightanswer}}
+
+
学生答题附件内容
+
+
+
+ 温馨提示:点击图片可放大预览
+
+
+
+
+
+
+
+
+ 温馨提示:点击此处 可预览其他类型附件!
+
+
+
+
+
+
未提交附件内容
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+ 预览
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+ 预览
+
+
+
+
+
+
+ 预览展示区域
+ 温馨提示:若预览失败,{{ props.name }} 可点击此处下载!
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/renderer/src/views/classTask/container/item-dialog.vue b/src/renderer/src/views/classTask/container/item-dialog.vue
new file mode 100644
index 0000000..c5691ab
--- /dev/null
+++ b/src/renderer/src/views/classTask/container/item-dialog.vue
@@ -0,0 +1,752 @@
+
+
+
+
+
+ {{ classWorkAnalysis.title }}答题情况
+ {{
+ classWorkAnalysis.worktype
+ }}
+
+
+
+
+ 作业批阅
+ 作业概况
+ 作业报告
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 待批阅
+
+ 优
+ 优-
+ 良
+ 良-
+ 差
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/renderer/src/views/classTask/container/newTask/taskTypeView.vue b/src/renderer/src/views/classTask/container/newTask/taskTypeView.vue
new file mode 100644
index 0000000..f1ea7e5
--- /dev/null
+++ b/src/renderer/src/views/classTask/container/newTask/taskTypeView.vue
@@ -0,0 +1,452 @@
+
+
+
+
+
+
+
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 查找
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.entpname }} {{ scope.row.editusername }}
+ {{ scope.row.worktag }}
+
+
+
+
+
+
+ 添加
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ item.worktype }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/renderer/src/views/classTask/container/quizStats.vue b/src/renderer/src/views/classTask/container/quizStats.vue
new file mode 100644
index 0000000..d04f275
--- /dev/null
+++ b/src/renderer/src/views/classTask/container/quizStats.vue
@@ -0,0 +1,279 @@
+
+
+
+
+
+
+
+
+ {{item.def?.titletext}}
+
+ {{index+1}}
+
+
+ {{item.type}} {{getRatioTxt(item)}}
+ {{item.points}}%
+
+
+
+ 作答情况
+ (已经完成 {{item.accSum}} 人)
+
+
+
+
+
+
+
+
+
+
+ {{it.studentIds.length}} 人/占 {{ratio_1(it, item.accSum)}}%
+
+
+
+
+
+
+
+ {{getStudentName(sid)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
答题情况
+
+
+
+
+
+
+
+ {{index+1}}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/renderer/src/views/classTask/container/task-item.vue b/src/renderer/src/views/classTask/container/task-item.vue
new file mode 100644
index 0000000..8eb564b
--- /dev/null
+++ b/src/renderer/src/views/classTask/container/task-item.vue
@@ -0,0 +1,159 @@
+
+
+
+
+ {{ item.worktype }}
+ {{ item.uniquekey }}
+
+
+
+
+ {{ item.classcaption }}
+ | 截止时间:{{ item.deaddate }} | {{ tabactive }}
+
+
+
+
+
+ {{ item.workdataresultcount }}
+ {{ item.workdataresultcount }}
+ /{{ item.workdatacount }}
+ 已交
+
+
+
+ {{ item.teacherrationgcount?item.workdatacount - item.teacherrationgcount:item.workdatacount }}
+ 待批阅
+
+
+
+
+
+ {{ item.averagetime }} 分钟
+
+
+ 1 小时
+
+
+ {{ Math.floor(item.averagetime / 60)}} 小时
+ {{ Math.floor(item.averagetime % 60)}} 分钟
+
+
+ 平均用时
+
+
+ {{ item.scoingRate }}
+ 得分率
+
+
+
+
+
diff --git a/src/renderer/src/views/classTask/newClassTask.vue b/src/renderer/src/views/classTask/newClassTask.vue
new file mode 100644
index 0000000..3bf6214
--- /dev/null
+++ b/src/renderer/src/views/classTask/newClassTask.vue
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+
+
+
+ 作业范围
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/renderer/src/views/classTaskAssign/index.vue b/src/renderer/src/views/classTaskAssign/index.vue
new file mode 100644
index 0000000..4c28672
--- /dev/null
+++ b/src/renderer/src/views/classTaskAssign/index.vue
@@ -0,0 +1,242 @@
+
+
+
+
+
+
+
+ 作业设计
+ 作业布置
+ 共{{ listClassWork.length }}个作业
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/renderer/src/views/desktop/container/work-trend.vue b/src/renderer/src/views/desktop/container/work-trend.vue
new file mode 100644
index 0000000..2a0e70a
--- /dev/null
+++ b/src/renderer/src/views/desktop/container/work-trend.vue
@@ -0,0 +1,194 @@
+
+
+
+ 工作动态
+
+
+
+
+
+
+
+
+
+ {{ item.uniquekey }}
+ {{
+ getCurrentTime('YYYY-MM-DD HH:mm') > item.deaddate ? '已结束' : '进行中' }}
+
+
{{ item.classcaption }} | 截止时间:{{ item.deaddate }}
+
+
+
{{ item.workdataresultcount }} / {{ item.workdatacount }}
+
已交
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/renderer/src/views/desktop/index.vue b/src/renderer/src/views/desktop/index.vue
new file mode 100644
index 0000000..e99bd75
--- /dev/null
+++ b/src/renderer/src/views/desktop/index.vue
@@ -0,0 +1,314 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/renderer/src/views/examReport/container/examMocks.vue b/src/renderer/src/views/examReport/container/examMocks.vue
new file mode 100644
index 0000000..e93cf4f
--- /dev/null
+++ b/src/renderer/src/views/examReport/container/examMocks.vue
@@ -0,0 +1,3 @@
+
+ 模拟命题
+
\ No newline at end of file
diff --git a/src/renderer/src/views/examReport/container/examReview.vue b/src/renderer/src/views/examReport/container/examReview.vue
new file mode 100644
index 0000000..3f964c3
--- /dev/null
+++ b/src/renderer/src/views/examReport/container/examReview.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+ {{ scope.row.entpname }} {{ scope.row.editusername }}
+ {{ scope.row.timestamp }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{activeExam.worktag}}
+
+
+
+
+ 【答案】
+
+ 【分析】
+
+ 【解答】
+
+ 【点评】
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/renderer/src/views/examReport/container/pointAnalysis.vue b/src/renderer/src/views/examReport/container/pointAnalysis.vue
new file mode 100644
index 0000000..5acb979
--- /dev/null
+++ b/src/renderer/src/views/examReport/container/pointAnalysis.vue
@@ -0,0 +1,3 @@
+
+ 考点分析
+
\ No newline at end of file
diff --git a/src/renderer/src/views/examReport/index.vue b/src/renderer/src/views/examReport/index.vue
new file mode 100644
index 0000000..8548fa9
--- /dev/null
+++ b/src/renderer/src/views/examReport/index.vue
@@ -0,0 +1,292 @@
+
+
+
+
+
+
+
+
+
+
+ 真题回顾
+
+
+
+
+
+
+
+
+
+ 考点分析
+
+
+
+
+
+
+
+
+
+ 模拟命题
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/renderer/src/views/homePage/index.vue b/src/renderer/src/views/homePage/index.vue
index 4471853..21beed9 100644
--- a/src/renderer/src/views/homePage/index.vue
+++ b/src/renderer/src/views/homePage/index.vue
@@ -1,5 +1,5 @@
-
+
@@ -112,8 +112,8 @@ const title = reactive([
]
},
{
- name: '高考研究',
- url: '/education/colentrance',
+ name: '考试分析',
+ url: '/examReport',
img: 'iconfont icon-icon_kaoshifenxi',
child1: []
},
diff --git a/src/renderer/src/views/login/components/Register.vue b/src/renderer/src/views/login/components/Register.vue
new file mode 100644
index 0000000..f61a870
--- /dev/null
+++ b/src/renderer/src/views/login/components/Register.vue
@@ -0,0 +1,507 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 发送验证码
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}:
+
+
+
+
+
+
+
+ {{ ['下一步','重置密码'][type-1]||'未知异常' }}
+
+
+
+
+ 立即注册
+
+
+
+
+
+ 根据图片回答相关问题
+
+
+
+
+
+ 确定
+
+
+
+
+
+
+
+
+
diff --git a/src/renderer/src/views/login/index.vue b/src/renderer/src/views/login/index.vue
index b11d241..3175fc5 100644
--- a/src/renderer/src/views/login/index.vue
+++ b/src/renderer/src/views/login/index.vue
@@ -21,12 +21,21 @@
placeholder="请输入密码"
/>
- 记住密码
+
+ 记住密码
+
+
+
登录
+
@@ -48,6 +57,8 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/renderer/src/views/prepare/container/file-list-item.vue b/src/renderer/src/views/prepare/container/file-list-item.vue
index 8c4f2dc..c880492 100644
--- a/src/renderer/src/views/prepare/container/file-list-item.vue
+++ b/src/renderer/src/views/prepare/container/file-list-item.vue
@@ -230,6 +230,20 @@ export default {
}
},
openFileWin(items) {
+ if (items.fileFlag === 'apt') {
+ console.log(items);
+ const path="/teaching/aptindex?id="+items.fileId
+ let configObj = outLink().getBaseData()
+ let fullPath = configObj.fullPath + path
+ fullPath = fullPath.replaceAll('//', '/')
+ // 通知主进程
+ ipcRenderer.send('openWindow', {
+ key: path,
+ fullPath: fullPath,
+ cookieData: { ...configObj.data }
+ })
+ return
+ }
if (!items||!items.fileSuffix) return;
getPrepareById(items.id).then((item) => {
Object.assign(items, item)
diff --git a/src/renderer/src/views/prepare/container/file-oper-batch.vue b/src/renderer/src/views/prepare/container/file-oper-batch.vue
index 41f8357..3747f92 100644
--- a/src/renderer/src/views/prepare/container/file-oper-batch.vue
+++ b/src/renderer/src/views/prepare/container/file-oper-batch.vue
@@ -1,6 +1,6 @@
-
+
+
+
+
diff --git a/src/renderer/src/views/prepare/container/reserv.vue b/src/renderer/src/views/prepare/container/reserv.vue
index ed2ee39..eaaf74e 100644
--- a/src/renderer/src/views/prepare/container/reserv.vue
+++ b/src/renderer/src/views/prepare/container/reserv.vue
@@ -2,7 +2,7 @@
@@ -86,7 +86,7 @@ import useUserStore from '@/store/modules/user'
import { ElMessage } from 'element-plus'
import { getCurrentTime, getAfterMinutes } from '@/utils/date'
-const emit = defineEmits(['addSuccess'])
+const emit = defineEmits(['addSuccess','close'])
const props = defineProps({
bookId: {
type: Number,
@@ -105,7 +105,7 @@ const userStore = useUserStore().user
const centerDialogVisible = ref(false)
const form = reactive({
name: '',
- type: '常规课',
+ type: '互动课',
day: '',
time: [],
resource: [],
@@ -115,7 +115,7 @@ const updateForm = ref({})
watch(
() => props.currentNode,
(newValue, oldValue) => {
- form.name = newValue.label
+ form.name = newValue.itemtitle
}
)
const ruleForm = reactive({
@@ -126,12 +126,6 @@ const ruleForm = reactive({
resource: [{ required: true, message: '请选择授课对象', trigger: 'change' }]
})
const locationOptions = [
- {
- label: '常规课',
- value: '常规课',
- disabled: false,
- message: '现场公屏授课,学生无需长时间打开平板上。'
- },
{
label: '互动课',
value: '互动课',
@@ -178,16 +172,23 @@ const disabledHours = ()=>{
}
// 限制分-返回被禁选的
const disabledMinute = (hour,role) => {
+ if(form.time == null) return
if(getCurrentTime('YYYY-MM-DD') == form.day){
const arrs = []
if(role == 'start'){
- for (let i = 0; i < 60; i++) {
- if (new Date().getMinutes() <= i) continue;
- arrs.push(i)
+ let nowHour = new Date().getHours().toString().padStart(2, '0');
+ if(nowHour < hour){
+ return []
+ }
+ else{
+ for (let i = 0; i < 60; i++) {
+ if (new Date().getMinutes() <= i) continue;
+ arrs.push(i)
+ }
+ return arrs;
}
- return arrs;
}
- else{
+ if(role == 'end'){
if(form.time[0]) return []
}
}
@@ -215,7 +216,9 @@ const openDialog = (data) => {
const closeDialog = () => {
ruleFormDialog.value.resetFields()
centerDialogVisible.value = false
- form.name = props.currentNode.label
+ form.name = props.currentNode.itemtitle
+ emit('close')
+
}
const classList = ref([])
onMounted(() => {
@@ -270,6 +273,11 @@ const updateClassReserv = (formData) => {
}
const addClassReserv = (formData) => {
let ids = formData.resource.join(',')
+ // 判断是否添加教材
+ if(!props.bookId){
+ ElMessage.warning('请选择教材')
+ return
+ }
let param = {
className: formData.name,
classType: formData.type,
@@ -283,13 +291,13 @@ const addClassReserv = (formData) => {
ex2: props.currentNode.id
}
addSmartClassReserv(param).then((res) => {
- if (res.data === true) {
+ if (res.msg) {
closeDialog()
ElMessage({
type: 'success',
message: '预约成功!'
})
- emit('addSuccess')
+ emit('addSuccess',res.msg)
} else {
ElMessage({
type: 'error',
diff --git a/src/renderer/src/views/prepare/index.vue b/src/renderer/src/views/prepare/index.vue
index 0cb65bc..09e9abd 100644
--- a/src/renderer/src/views/prepare/index.vue
+++ b/src/renderer/src/views/prepare/index.vue
@@ -1,8 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
-
+
+
diff --git a/src/renderer/src/views/resource/container/resoure-list.vue b/src/renderer/src/views/resource/container/resoure-list.vue
index 94c9df6..162d6bd 100644
--- a/src/renderer/src/views/resource/container/resoure-list.vue
+++ b/src/renderer/src/views/resource/container/resoure-list.vue
@@ -1,5 +1,5 @@
-
+
@@ -7,7 +7,7 @@
v-for="item in sourceStore.result.list"
:key="item.id"
class="list-item"
- @click="handleRow"
+ @click="handleRow(item)"
>
@@ -91,10 +91,11 @@
/>
+
diff --git a/src/renderer/src/views/resource/container/resoure-search.vue b/src/renderer/src/views/resource/container/resoure-search.vue
index 6f94391..9d3344e 100644
--- a/src/renderer/src/views/resource/container/resoure-search.vue
+++ b/src/renderer/src/views/resource/container/resoure-search.vue
@@ -2,9 +2,9 @@
- {{ item.label
+ {{ item.label
}}
@@ -19,7 +19,7 @@
-
+
+
@@ -38,9 +38,9 @@
:value="item.value" />
-
{{
+ {{
item.label }}
@@ -81,12 +81,12 @@ watch(() => sourceStore.query.fileSource,() => {