Compare commits

...

20 Commits

Author SHA1 Message Date
“zouyf” eab46ec7f4 Merge branch 'main' into zouyf_dev 2024-09-27 16:17:08 +08:00
“zouyf” 81dd59f564 [作业批改] - 由原来班级查询变更为用户id查询作业 2024-09-27 16:16:55 +08:00
lyc 7c36255508 Merge pull request '教学大模型' (#287) from lyc-dev into main 2024-09-27 15:55:45 +08:00
lyc 310d1aee59 教学大模型 2024-09-27 15:55:50 +08:00
zhengdegang 3caa561610 Merge pull request 'zdg' (#286) from zdg into main
Reviewed-on: #286
2024-09-27 15:54:54 +08:00
zdg ada2e63060 Merge branch 'main' of http://27.128.240.72:3000/zhuhao/AIx_Smarttalk into zdg
# Conflicts:
#	src/main/index.js
2024-09-27 15:53:42 +08:00
zdg eaf9d508d4 apt上课-无需登录 2024-09-27 15:52:07 +08:00
朱浩 716c1dd0a9 Merge pull request 'zhuhao_dev' (#285) from zhuhao_dev into main
Reviewed-on: #285
2024-09-27 15:15:28 +08:00
“zouyf” cb15855fc1 Merge branch 'main' into zouyf_dev 2024-09-27 15:11:57 +08:00
朱浩 76f053d8c8 Merge branch 'main' into zhuhao_dev 2024-09-27 15:11:45 +08:00
yangws 988c6160bb Merge pull request 'fix : 样式问题;' (#284) from yangws into main
Reviewed-on: #284
2024-09-27 15:08:23 +08:00
小杨 0119a92501 fix : 样式问题; 2024-09-27 15:07:58 +08:00
yangws e1dfc0f8b4 Merge pull request 'fix:新建分组前清空操作;' (#283) from yangws into main
Reviewed-on: #283
2024-09-27 15:06:30 +08:00
小杨 31f9ec61ea fix:新建分组前清空操作; 2024-09-27 15:05:49 +08:00
“zouyf” 7b3f00ba67 Merge branch 'main' into zouyf_dev
# Conflicts:
#	src/renderer/src/views/classTask/teachClassTask.vue
2024-09-27 14:52:51 +08:00
baigl 042f8e5907 Merge pull request 'baigl' (#282) from baigl into main
Reviewed-on: #282
2024-09-27 14:50:22 +08:00
“zouyf” 2ca4117561 1 2024-09-27 14:50:18 +08:00
朱浩 0511256094 Merge branch 'main' into zhuhao_dev 2024-09-27 11:01:16 +08:00
朱浩 e2e8cae690 背景色 2024-09-27 11:00:03 +08:00
zdg 68cf2bae1f 屏蔽注释打印 2024-09-27 09:27:51 +08:00
12 changed files with 91 additions and 23 deletions

View File

@ -26,3 +26,13 @@ export class imChat {
// 获取腾讯im-chat appid 签名 // 获取腾讯im-chat appid 签名
static getTxCloudSign = data => ApiService.publicHttp('/system/user/txCloudSign', data) static getTxCloudSign = data => ApiService.publicHttp('/system/user/txCloudSign', data)
} }
// zdg: url跳转-后端存储
export class toLink {
// 设置链接-返回key(默认15分钟有效时间)
static setLink = url => ApiService.publicHttp(`/smarttalk/toLink`, {url}, 'post', null, 'form')
// 获取链接
static getLink = key => ApiService.publicHttp(`/smarttalk/toLink/${key}`)
// 删除链接-缓存
static delLink = key => ApiService.publicHttp(`/smarttalk/toLink/${key}`, null, 'delete')
}

View File

@ -27,6 +27,15 @@ export function listClassworkdata(query) {
}) })
} }
// 新接口---查询classworkdata列表 班级作业列表
export function listClassworkdataNew(query) {
return request({
url: '/education/classworkdata/new/list',
method: 'get',
params: query
})
}
// 查询entpcoursework列表 课程作业列表 // 查询entpcoursework列表 课程作业列表
export function listEntpcoursework(query) { export function listEntpcoursework(query) {
return request({ return request({

View File

@ -122,7 +122,8 @@ const outerAi = [
title: '教学大模型', title: '教学大模型',
secondTit: '中小学基础教学大模型', secondTit: '中小学基础教学大模型',
img: new URL('../../../src/assets/images/ai-02.png', import.meta.url).href, img: new URL('../../../src/assets/images/ai-02.png', import.meta.url).href,
disabled: true, path: '/ais/aimoss'
}, },
{ {
id: 3, id: 3,

View File

@ -57,7 +57,7 @@ function stateSyncWatch(storeName, newState) {
const diffData = findDifferences(oldState, newState) const diffData = findDifferences(oldState, newState)
if(!_.keys(diffData).length) return // 没有变化就终止执行 if(!_.keys(diffData).length) return // 没有变化就终止执行
// 数据处理: 找出差异 // 数据处理: 找出差异
console.log('state-change-diffData', diffData) // console.log('state-change-diffData', diffData)
try { try {
let pinaValue = {} // store pina状态管理需要的数据格式 let pinaValue = {} // store pina状态管理需要的数据格式
// 数据转换处理 // 数据转换处理
@ -116,7 +116,7 @@ function stateSyncInit(wid, store) {
function sessionWatch(store) { function sessionWatch(store) {
const unsubscribe = sessionStore.onDidAnyChange((newV, oldV) => { const unsubscribe = sessionStore.onDidAnyChange((newV, oldV) => {
if (newV !== oldV) { if (newV !== oldV) {
console.log('session-change', newV, oldV) // console.log('session-change', newV, oldV)
// 通知主线程更新 // 通知主线程更新
// ipcRenderer?.invoke('pinia-state-change', storeName, jsonStr) // ipcRenderer?.invoke('pinia-state-change', storeName, jsonStr)
} }
@ -129,7 +129,7 @@ function stateChange(store) {
const storeName = store.$id const storeName = store.$id
ipcRenderer?.on('pinia-state-set', (e, sName, jsonStr) => { ipcRenderer?.on('pinia-state-set', (e, sName, jsonStr) => {
if (sName == storeName) { // 更新对应数据 if (sName == storeName) { // 更新对应数据
console.log('state-set', jsonStr, sName) // console.log('state-set', jsonStr, sName)
const curJson = circularSafeStringify(store.$state) // 当前数据 const curJson = circularSafeStringify(store.$state) // 当前数据
const isUp = curJson != jsonStr // 不同的时候才写入,不然会导致触发数据变化监听,导致死循环 const isUp = curJson != jsonStr // 不同的时候才写入,不然会导致触发数据变化监听,导致死循环
if (!isUp) return if (!isUp) return

View File

@ -266,6 +266,9 @@ const btnSave = () => {
} }
// //
const addGroup = () => { const addGroup = () => {
//
groupForm.groupname = ''
groupForm.orderidx = 0
groupVisible.value = true groupVisible.value = true
} }
const btnGroupSave = () => { const btnGroupSave = () => {

View File

@ -4,7 +4,7 @@
<el-descriptions-item label="班级名称">{{ classInfo.caption }}</el-descriptions-item> <el-descriptions-item label="班级名称">{{ classInfo.caption }}</el-descriptions-item>
<el-descriptions-item label="教师"> <el-descriptions-item label="教师">
<template v-if="classInfo.teacher.length > 0"> <template v-if="classInfo.teacher.length > 0">
<el-tag type="primary" v-for="(item, index) in classInfo.teacher" :key="index">{{item.name}}</el-tag> <el-tag style="margin-right: 5px;margin-bottom: 5px;" type="primary" v-for="(item, index) in classInfo.teacher" :key="index">{{item.name}}</el-tag>
</template> </template>
<template v-else>{{ classInfo.teachername }}</template> <template v-else>{{ classInfo.teachername }}</template>
</el-descriptions-item> </el-descriptions-item>

View File

@ -63,7 +63,7 @@
<script setup> <script setup>
import { ref, onMounted, onUnmounted, computed, watch } from 'vue' import { ref, onMounted, onUnmounted, computed, watch } from 'vue'
import { listByDeadDate, listClassworkdata } from '@/api/classTask' import { listByDeadDate, listClassworkdata, listClassworkdataNew } from '@/api/classTask'
import TaskItem from '@/views/classTask/container/task-item.vue' import TaskItem from '@/views/classTask/container/task-item.vue'
// import ItemDialog from '@/views/classTask/container/item-dialog.vue' // import ItemDialog from '@/views/classTask/container/item-dialog.vue'
@ -119,7 +119,7 @@ const getData = async () => {
classWorkList.value = [] classWorkList.value = []
loading.value = true loading.value = true
// 1 // 1
getClassList() //getClassList()
// 2 // 2
await getClassWorkList() await getClassWorkList()
// 3 // 3
@ -140,10 +140,11 @@ const getClassList = () => {
* 2获取班级作业 * 2获取班级作业
*/ */
const getClassWorkList = async () => { const getClassWorkList = async () => {
if(classTaskStore.classListIds.length>0){ //if(classTaskStore.classListIds.length>0){
{
// homeworklist // homeworklist
const response = await listByDeadDate({ const response = await listByDeadDate({
classidarray: classTaskStore.classListIds.join(','), //classidarray: classTaskStore.classListIds.join(','),
edituserid: userStore.userId, // id edituserid: userStore.userId, // id
edustage: userStore.edustage, // edustage: userStore.edustage, //
edusubject: userStore.edusubject,// edusubject: userStore.edusubject,//
@ -218,7 +219,7 @@ const getClassWorkList = async () => {
const getStudentClassWorkData = async() => { const getStudentClassWorkData = async() => {
// const { chapterId } = await useGetHomework(props.bookobj.node) // const { chapterId } = await useGetHomework(props.bookobj.node)
// this.entpcourseid = chapterId // this.entpcourseid = chapterId
if(classTaskStore.classListIds.length>0){ //if(classTaskStore.classListIds.length>0){
// listClassworkdataByDeadDate({ // listClassworkdataByDeadDate({
// edituserid: userStore.userId, // id // edituserid: userStore.userId, // id
// classids: classTaskStore.classListIds.join(','), // classids: classTaskStore.classListIds.join(','),
@ -228,7 +229,21 @@ const getStudentClassWorkData = async() => {
// orderby: "deaddate DESC",// TODO deaddate // orderby: "deaddate DESC",// TODO deaddate
// pageSize: 1000, // pageSize: 1000,
// }) // })
// listClassworkdataNew({
// classworkids: ids, // id
// edituserid: userStore.userId, // id
// edusubject: userStore.edusubject,//
// evalStatus: 1,
// pageSize: 1000,
// })
{
const ids = classWorkList.value.map((item) => item.id).join(','); const ids = classWorkList.value.map((item) => item.id).join(',');
if (ids == '') {
return;
}
listClassworkdata({ listClassworkdata({
classworkids: ids, classworkids: ids,
pageSize: 1000, pageSize: 1000,

View File

@ -349,7 +349,7 @@ const getClassWorkStudentList = (rowId) => {
// .replace(/"(\[.*\])"/g, '$1'); eg: "feedcontent\":\"[{\"name\":\"Bliss.jpg\",\"url\":\"https://wzyzoss.3b8daa474.jpg\"}]\", // .replace(/"(\[.*\])"/g, '$1'); eg: "feedcontent\":\"[{\"name\":\"Bliss.jpg\",\"url\":\"https://wzyzoss.3b8daa474.jpg\"}]\",
// json .replace(/""/g, '"') eg: """" // json .replace(/""/g, '"') eg: """"
response.rows[i].classworkevallist = escapeHtmlQuotes(response.rows[i].classworkevallist) response.rows[i].classworkevallist = escapeHtmlQuotes(response.rows[i].classworkevallist)
console.log('学生完成情况分析classworkevallist', response.rows[i].classworkevallist) //console.log('classworkevallist', response.rows[i].classworkevallist)
const evalarray = JSON.parse('[' + response.rows[i].classworkevallist + ']') const evalarray = JSON.parse('[' + response.rows[i].classworkevallist + ']')
var scoingCount = 0 var scoingCount = 0
var feedcount = 0 var feedcount = 0
@ -362,7 +362,7 @@ const getClassWorkStudentList = (rowId) => {
} }
} }
} }
console.log(evalarray, 'evalarray------------------------------------') //console.log(evalarray, 'evalarray------------------------------------')
if (feedcount > 0) { if (feedcount > 0) {
// : /*100 // : /*100
response.rows[i].scoingRate = ((scoingCount / feedcount) * 100).toFixed(0) + '%' response.rows[i].scoingRate = ((scoingCount / feedcount) * 100).toFixed(0) + '%'

View File

@ -345,6 +345,7 @@ watchEffect(() => { initData() })
} }
.t-left{width: 160px;text-align: left;} .t-left{width: 160px;text-align: left;}
.c-respond{ .c-respond{
text-align: left;
.el-tag{margin: 0 5px;} .el-tag{margin: 0 5px;}
} }
} }

View File

@ -341,7 +341,7 @@ const getClassWorkStudentList = (rowId) => {
// .replace(/"(\[.*\])"/g, '$1'); eg: "feedcontent\":\"[{\"name\":\"Bliss.jpg\",\"url\":\"https://wzyzoss.3b8daa474.jpg\"}]\", // .replace(/"(\[.*\])"/g, '$1'); eg: "feedcontent\":\"[{\"name\":\"Bliss.jpg\",\"url\":\"https://wzyzoss.3b8daa474.jpg\"}]\",
// json .replace(/""/g, '"') eg: """" // json .replace(/""/g, '"') eg: """"
response.rows[i].classworkevallist = escapeHtmlQuotes(response.rows[i].classworkevallist) response.rows[i].classworkevallist = escapeHtmlQuotes(response.rows[i].classworkevallist)
console.log('学生完成情况分析classworkevallist', response.rows[i].classworkevallist) //console.log('classworkevallist', response.rows[i].classworkevallist)
const evalarray = JSON.parse('[' + response.rows[i].classworkevallist + ']') const evalarray = JSON.parse('[' + response.rows[i].classworkevallist + ']')
var scoingCount = 0 var scoingCount = 0
var feedcount = 0 var feedcount = 0
@ -354,7 +354,7 @@ const getClassWorkStudentList = (rowId) => {
} }
} }
} }
console.log(evalarray, 'evalarray------------------------------------') //console.log(evalarray, 'evalarray------------------------------------')
if (feedcount > 0) { if (feedcount > 0) {
// : /*100 // : /*100
response.rows[i].scoingRate = ((scoingCount / feedcount) * 100).toFixed(0) + '%' response.rows[i].scoingRate = ((scoingCount / feedcount) * 100).toFixed(0) + '%'
@ -531,6 +531,7 @@ const workHandle = (type) => {
classWorkAnalysis.view = type classWorkAnalysis.view = type
const isClose = type != 'quizStats' && !! classWorkActiveData.timerId const isClose = type != 'quizStats' && !! classWorkActiveData.timerId
const isOpen = type == 'quizStats' && !classWorkActiveData.timerId const isOpen = type == 'quizStats' && !classWorkActiveData.timerId
//
if(type == 'quizStats') { if(type == 'quizStats') {
getWorkFeedList(); getWorkFeedList();
} }

View File

@ -85,12 +85,14 @@ import vueQr from 'vue-qr/src/packages/vue-qr.vue' // 插件: 二维码
import imChat from '@/views/tool/components/imChat.vue' // im-chat- import imChat from '@/views/tool/components/imChat.vue' // im-chat-
import MsgEnum from '@/plugins/imChat/msgEnum' // -(nuem) import MsgEnum from '@/plugins/imChat/msgEnum' // -(nuem)
import * as commUtil from '@/utils/comm' // - import * as commUtil from '@/utils/comm' // -
import { toLinkWeb, getStaticUrl } from '@/utils/tool' import { toLinkWeb, getStaticUrl } from '@/utils/tool' // -
import * as Http_ClassManage from '@/api/classManage' // api import * as Http_ClassManage from '@/api/classManage' // api
import * as Http_Classcourse from '@/api/teaching/classcourse' // api import * as Http_Classcourse from '@/api/teaching/classcourse' // api
import * as Http_Entpcoursefile from '@/api/education/entpcoursefile' // api import * as Http_Entpcoursefile from '@/api/education/entpcoursefile' // api
import * as Http_api from '@/api/apiService' // api
import useUserStore from "@/store/modules/user" // user import useUserStore from "@/store/modules/user" // user
import CryptoJS from 'crypto-js'
const baseUrl = import.meta.env.VITE_APP_BUILD_BASE_PATH const baseUrl = import.meta.env.VITE_APP_BUILD_BASE_PATH
const userStore = useUserStore() const userStore = useUserStore()
@ -189,9 +191,9 @@ const getClassList = async () => {
}) })
if (res.code == 200) { if (res.code == 200) {
listData.classList = (res.rows || []).map(o => { listData.classList = (res.rows || []).map(o => {
if(!!o.classstudentlist) { // // if(!!o.classstudentlist) { //
o.classstudentlist = JSON.parse('[' + o.classstudentlist + ']') // o.classstudentlist = JSON.parse('[' + o.classstudentlist + ']')
} // }
return o return o
}); });
// //
@ -277,11 +279,34 @@ const classTeachingStart = async () => {
} }
} }
// //
const getQrUrl = () => { const getQrUrl = async() => {
const { classcourseid:id } = teacherForm.form const { classcourseid:id } = teacherForm.form
const { userName } = userStore.user const { userName, userId } = userStore.user
if (!id||!userName) return if (!id||!userName) return
const qrCodeUrl = `wxlogin?username=${userName}&nextaction=classteaching&id=${id}` // (wx)
// const qrCodeUrl = `wxlogin?username=${userName}&nextaction=classteaching&id=${id}`
// teacherForm.form.qrUrl = baseUrl + qrCodeUrl
// const baseUrl = 'https://localhost:7860'
// token
const url = `/teaching/classteachingonmobile?classcourseid=${id}` // -
let qrCodeUrl = '' // -
try {
// url
const res = await Http_api.toLink.setLink(url) // -
if (res.code == 200) {
const redisKey = res.data
const base64Key = CryptoJS.enc.Utf8.parse(redisKey).toString(CryptoJS.enc.Base64) // base64
const enStrUrl = encodeURIComponent(base64Key) // url
qrCodeUrl = `?_server=${enStrUrl}`
teacherForm.form.qrUrl = baseUrl + qrCodeUrl
}
} catch (error) { // , token
const jsonStr = JSON.stringify({ url, token: userStore.token }) // json{url, token}
const key = `Ax19i14Ga6qEDOkGTo` // AES-key
const enStr = CryptoJS.AES.encrypt(jsonStr, key).toString() // AES-
const enStrUrl = encodeURIComponent(enStr) // url
qrCodeUrl = `?_web=${enStrUrl}`
}
teacherForm.form.qrUrl = baseUrl + qrCodeUrl teacherForm.form.qrUrl = baseUrl + qrCodeUrl
} }

View File

@ -711,7 +711,10 @@ export default {
.page-center-wrap{ .page-center-wrap{
flex: 1; flex: 1;
height: 100%; height: 100%;
padding: 0 10px; padding: 0 5px;
margin: 0 5px;
border-radius: 10px;
background-color: white;
.prepare-center-jxkj{ .prepare-center-jxkj{
height: 100%; height: 100%;
display: flex; display: flex;