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 签名
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列表 课程作业列表
export function listEntpcoursework(query) {
return request({

View File

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

View File

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

View File

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

View File

@ -4,7 +4,7 @@
<el-descriptions-item label="班级名称">{{ classInfo.caption }}</el-descriptions-item>
<el-descriptions-item label="教师">
<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 v-else>{{ classInfo.teachername }}</template>
</el-descriptions-item>

View File

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

View File

@ -349,7 +349,7 @@ const getClassWorkStudentList = (rowId) => {
// .replace(/"(\[.*\])"/g, '$1'); eg: "feedcontent\":\"[{\"name\":\"Bliss.jpg\",\"url\":\"https://wzyzoss.3b8daa474.jpg\"}]\",
// json .replace(/""/g, '"') eg: """"
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 + ']')
var scoingCount = 0
var feedcount = 0
@ -362,7 +362,7 @@ const getClassWorkStudentList = (rowId) => {
}
}
}
console.log(evalarray, 'evalarray------------------------------------')
//console.log(evalarray, 'evalarray------------------------------------')
if (feedcount > 0) {
// : /*100
response.rows[i].scoingRate = ((scoingCount / feedcount) * 100).toFixed(0) + '%'

View File

@ -345,6 +345,7 @@ watchEffect(() => { initData() })
}
.t-left{width: 160px;text-align: left;}
.c-respond{
text-align: left;
.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\"}]\",
// json .replace(/""/g, '"') eg: """"
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 + ']')
var scoingCount = 0
var feedcount = 0
@ -354,7 +354,7 @@ const getClassWorkStudentList = (rowId) => {
}
}
}
console.log(evalarray, 'evalarray------------------------------------')
//console.log(evalarray, 'evalarray------------------------------------')
if (feedcount > 0) {
// : /*100
response.rows[i].scoingRate = ((scoingCount / feedcount) * 100).toFixed(0) + '%'
@ -531,6 +531,7 @@ const workHandle = (type) => {
classWorkAnalysis.view = type
const isClose = type != 'quizStats' && !! classWorkActiveData.timerId
const isOpen = type == 'quizStats' && !classWorkActiveData.timerId
//
if(type == 'quizStats') {
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 MsgEnum from '@/plugins/imChat/msgEnum' // -(nuem)
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_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 CryptoJS from 'crypto-js'
const baseUrl = import.meta.env.VITE_APP_BUILD_BASE_PATH
const userStore = useUserStore()
@ -189,9 +191,9 @@ const getClassList = async () => {
})
if (res.code == 200) {
listData.classList = (res.rows || []).map(o => {
if(!!o.classstudentlist) { //
o.classstudentlist = JSON.parse('[' + o.classstudentlist + ']')
}
// if(!!o.classstudentlist) { //
// o.classstudentlist = JSON.parse('[' + o.classstudentlist + ']')
// }
return o
});
//
@ -277,11 +279,34 @@ const classTeachingStart = async () => {
}
}
//
const getQrUrl = () => {
const getQrUrl = async() => {
const { classcourseid:id } = teacherForm.form
const { userName } = userStore.user
const { userName, userId } = userStore.user
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
}

View File

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