添加思政课程评价表功能

This commit is contained in:
yangjun 2024-09-26 08:59:02 +08:00
parent 88fdde0cd4
commit b4d466a87e
12 changed files with 1682 additions and 47 deletions

View File

@ -159,6 +159,15 @@ const site: AppRouteModule = {
title: '东北师范大学本科课堂教学质量评价表',
},
},
{
path: 'qaAddPageSzpjb',
name: 'qaAddPageSzpjb',
component: () => import('/@/views/site/tingKeZuJi/page/qaAddPage.vue'),
meta: {
// affix: true,
title: '东北师范大学本科课堂思政课程评价表',
},
},
{
path: 'qaShoudongAddXsktpjb',

View File

@ -0,0 +1,72 @@
import { defHttp } from '/@/utils/http/axios';
import { useMessage } from "/@/hooks/web/useMessage";
const { createConfirm } = useMessage();
enum Api {
list = '/kcZzSzkc/kcZzSzkc/list',
save='/kcZzSzkc/kcZzSzkc/add',
edit='/kcZzSzkc/kcZzSzkc/edit',
deleteOne = '/kcZzSzkc/kcZzSzkc/delete',
deleteBatch = '/kcZzSzkc/kcZzSzkc/deleteBatch',
importExcel = '/kcZzSzkc/kcZzSzkc/importExcel',
exportXls = '/kcZzSzkc/kcZzSzkc/exportXls',
}
/**
* api
* @param params
*/
export const getExportUrl = Api.exportXls;
/**
* api
*/
export const getImportUrl = Api.importExcel;
/**
*
* @param params
*/
export const list = (params) => defHttp.get({ url: Api.list, params });
/**
*
* @param params
* @param handleSuccess
*/
export const deleteOne = (params,handleSuccess) => {
return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {
handleSuccess();
});
}
/**
*
* @param params
* @param handleSuccess
*/
export const batchDelete = (params, handleSuccess) => {
createConfirm({
iconType: 'warning',
title: '确认删除',
content: '是否删除选中数据',
okText: '确认',
cancelText: '取消',
onOk: () => {
return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {
handleSuccess();
});
}
});
}
/**
*
* @param params
* @param isUpdate
*/
export const saveOrUpdate = (params, isUpdate) => {
let url = isUpdate ? Api.edit : Api.save;
return defHttp.post({ url: url, params }, { isTransformResponse: false });
}

View File

@ -0,0 +1,223 @@
import {BasicColumn} from '/@/components/Table';
import {FormSchema} from '/@/components/Table';
import { rules} from '/@/utils/helper/validator';
import { render } from '/@/utils/common/renderUtils';
//列表数据
export const columns: BasicColumn[] = [
{
title: '课程编号',
align: "center",
dataIndex: 'kcbh'
},
{
title: '课程名称',
align: "center",
dataIndex: 'kcmc'
},
{
title: '授课教师',
align: "center",
dataIndex: 'skjs'
},
{
title: '授课时间',
align: "center",
dataIndex: 'skrq',
customRender:({text}) =>{
return !text?"":(text.length>10?text.substr(0,10):text);
},
},
{
title: '上课地点',
align: "center",
dataIndex: 'skdd'
},
{
title: '听课教师编号',
align: "center",
dataIndex: 'tkjsbh'
},
{
title: '听课教师姓名',
align: "center",
dataIndex: 'tkjsxm'
},
{
title: '评课时间',
align: "center",
dataIndex: 'pksj',
customRender:({text}) =>{
return !text?"":(text.length>10?text.substr(0,10):text);
},
},
{
title: '仪表整洁、举止得体、精神饱满',
align: "center",
dataIndex: 'ans1_dictText'
},
{
title: '遵守教学纪律,严格课堂管理',
align: "center",
dataIndex: 'ans2_dictText'
},
{
title: '备课充分,精心设计教学(有课件、教案等教学素材),教学投入',
align: "center",
dataIndex: 'ans3_dictText'
},
{
title: '坚持马克思主义立场观点方法,具有较为扎实的马克思主义理论功底,教学目标明确',
align: "center",
dataIndex: 'ans4_dictText'
},
{
title: '有效使用统编教材配套课件、参考讲义、辅导用书,教学内容科学完整,基本理论阐释清楚,基本事实讲述准确,重点、难点比较突出',
align: "center",
dataIndex: 'ans5_dictText'
},
{
title: '理论联系实际,熟悉党史、新中国史、改革开放史、社会主义发展史、中华民族发展史,注重史论结合,教学素材多样,案例鲜活生动,及时将新时代中国特色社会主义的生动实践转化为课堂教学资源',
align: "center",
dataIndex: 'ans6_dictText'
},
{
title: '贴近学生实际,善于发掘身边人身边事蕴含的育人元素,有效回应学生关心问题和思想困惑',
align: "center",
dataIndex: 'ans7_dictText'
},
{
title: '熟悉教学法基本原理,注重教学逻辑与学术逻辑的辩证统一,教学设计符合学生认知规律、关注学生差异性',
align: "center",
dataIndex: 'ans8_dictText'
},
{
title: '熟练运用启发式、案例式等教学法,注重课堂互动,不照本宣科,善于调动学生积极性,启发学生思考',
align: "center",
dataIndex: 'ans9_dictText'
},
{
title: '综合运用现代信息技术手段,增强课堂教学的生动性、吸引力,帮助学生理解领会教学内容',
align: "center",
dataIndex: 'ans10_dictText'
},
{
title: '注重思想性和理论性,具有亲和力和感染力,能够把道理讲深、讲透、讲活,学生学习积极性高,愿意与教师交流反馈',
align: "center",
dataIndex: 'ans11_dictText'
},
{
title: '注重价值引领,增进对党的创新理论的政治认同、思想认同、理论认同、情感认同,坚定“四个自信”',
align: "center",
dataIndex: 'ans12_dictText'
},
{
title: '完成教学计划,课堂秩序良好',
align: "center",
dataIndex: 'ans13_dictText'
},
{
title: '课堂诊断',
align: "center",
dataIndex: 'ans14'
},
{
title: '总体评价',
align: "center",
dataIndex: 'ans15'
},
{
title: '指导建议',
align: "center",
dataIndex: 'ans16'
},
];
//查询数据
export const searchFormSchema: FormSchema[] = [
];
//表单数据
export const formSchema: FormSchema[] = [
{
label: '课程编号',
field: 'kcbh',
component: 'Input',
},
{
label: '课程名称',
field: 'kcmc',
component: 'Input',
},
{
label: '授课教师',
field: 'skjs',
component: 'Input',
},
{
label: '授课时间',
field: 'skrq',
component: 'DatePicker',
},
{
label: '上课地点',
field: 'skdd',
component: 'Input',
},
{
label: '听课教师编号',
field: 'tkjsbh',
component: 'Input',
},
{
label: '听课教师姓名',
field: 'tkjsxm',
component: 'Input',
},
{
label: '评课时间',
field: 'pksj',
component: 'DatePicker',
},
{
label: '教学态度',
field: 'ans1',
component: 'Input',
},
{
label: '教学内容',
field: 'ans2',
component: 'Input',
},
{
label: '教学方法',
field: 'ans3',
component: 'Input',
},
{
label: '教学效果',
field: 'ans4',
component: 'Input',
},
{
label: '课堂诊断',
field: 'ans5',
component: 'Input',
},
{
label: '总体评价',
field: 'ans6',
component: 'Input',
},
{
label: '指导建议',
field: 'ans7',
component: 'Input',
},
// TODO 主键隐藏字段目前写死为ID
{
label: '',
field: 'id',
component: 'Input',
show: false,
},
];

View File

@ -0,0 +1,250 @@
<template>
<div>
<!--查询区域-->
<div class="jeecg-basic-table-form-container">
<a-form @keyup.enter.native="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
<a-row :gutter="24">
<a-col :span="8">
<a-form-item label="学年学期">
<j-dict-select-tag ref="xqDictTag" placeholder="请选择学年学期" v-model:value="queryParam.xqxn" dictCode="kc_xqxn_history,title,title,true order by start_time desc"/>
</a-form-item>
</a-col>
<a-col :lg="8">
<a-form-item label="课程名称">
<j-input placeholder="请输入课程名称" v-model:value="queryParam.kcmc"></j-input>
</a-form-item>
</a-col>
<a-col :lg="8">
<a-form-item label="授课教师">
<j-input placeholder="请输入授课教师" v-model:value="queryParam.skjs"></j-input>
</a-form-item>
</a-col>
<a-col :lg="8">
<a-form-item label="听课教师工号">
<j-input placeholder="请输入听课教师工号" v-model:value="queryParam.tkjsbh"></j-input>
</a-form-item>
</a-col>
<a-col :lg="8">
<a-form-item label="听课教师姓名">
<j-input placeholder="请输入听课教师姓名" v-model:value="queryParam.tkjsxm"></j-input>
</a-form-item>
</a-col>
<!--</template>-->
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
<a-col :lg="6">
<a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
<a-button type="primary" preIcon="ant-design:reload-outlined" @click="searchReset" style="margin-left: 8px">重置</a-button>
<!--<a @click="toggleSearchStatus = !toggleSearchStatus" style="margin-left: 8px">
{{ toggleSearchStatus ? '收起' : '展开' }}
<Icon :icon="toggleSearchStatus ? 'ant-design:up-outlined' : 'ant-design:down-outlined'" />
</a>-->
</a-col>
</span>
</a-col>
</a-row>
</a-form>
</div>
<!--引用表格-->
<BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题-->
<template #tableTitle>
<a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
<!-- <j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button> -->
</template>
<!--操作栏-->
<template #action="{ record }">
<TableAction :actions="getTableAction(record)"/>
</template>
<!--字段回显插槽-->
<template #htmlSlot="{text}">
<div v-html="text"></div>
</template>
<!--省市区字段回显插槽-->
<!--<template #pcaSlot="{text}">
{{ getAreaTextByCode(text) }}
</template>-->
<template #fileSlot="{text}">
<span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
<a-button v-else :ghost="true" type="primary" preIcon="ant-design:download-outlined" size="small" @click="downloadFile(text)">下载</a-button>
</template>
</BasicTable>
<!-- 表单区域 -->
<KcZzYbtkbModal ref="registerModal" @success="handleSuccess"></KcZzYbtkbModal>
</div>
</template>
<script lang="ts" name="kcZzYbtkb-kcZzYbtkb" setup>
import { ref, reactive } from 'vue';
import { BasicTable, useTable, TableAction } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
import { columns } from './KcZzSzkc.data';
import { list, deleteOne, batchDelete, getImportUrl, getExportUrl } from './KcZzSzkc.api';
import { downloadFile } from '/@/utils/common/renderUtils';
import KcZzYbtkbModal from './components/KcZzSzkcModal.vue'
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
import { JInput } from '/@/components/Form';
import { usePermission } from '/@/hooks/web/usePermission';
const { hasPermission } = usePermission();
const queryParam = ref<any>({});
const toggleSearchStatus = ref<boolean>(false);
const registerModal = ref();
//table
const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
tableProps: {
title: '纸质一般听课表',
api: list,
columns,
canResize:false,
useSearchForm: false,
actionColumn: {
width: 120,
fixed: 'right',
},
beforeFetch: (params) => {
params.column = 'createTime',params.order = 'desc';//
return Object.assign(params, queryParam.value);
},
},
exportConfig: {
name: "纸质一般听课表",
url: getExportUrl,
},
importConfig: {
url: getImportUrl,
success: handleSuccess
},
});
const [registerTable, { reload, collapseAll, updateTableDataRecord, findTableDataRecord, getDataSource }, { rowSelection, selectedRowKeys }] = tableContext;
const labelCol = reactive({
xs: { span: 24 },
sm: { span: 7 },
});
const wrapperCol = reactive({
xs: { span: 24 },
sm: { span: 16 },
});
/**
* 新增事件
*/
function handleAdd() {
registerModal.value.disableSubmit = false;
registerModal.value.add();
}
/**
* 编辑事件
*/
function handleEdit(record: Recordable) {
registerModal.value.disableSubmit = false;
registerModal.value.edit(record);
}
/**
* 详情
*/
function handleDetail(record: Recordable) {
registerModal.value.disableSubmit = true;
registerModal.value.edit(record);
}
/**
* 删除事件
*/
async function handleDelete(record) {
await deleteOne({ id: record.id }, handleSuccess);
}
/**
* 批量删除事件
*/
async function batchHandleDelete() {
await batchDelete({ ids: selectedRowKeys.value }, handleSuccess);
}
/**
* 成功回调
*/
function handleSuccess() {
(selectedRowKeys.value = []) && reload();
}
/**
* 操作栏
*/
function getTableAction(record) {
return [
{
label: '删除',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, record),
},
auth: 'ybtkb:del'
},
];
}
/**
* 下拉操作栏
*/
function getDropDownAction(record) {
return [
// {
// label: '',
// onClick: handleDetail.bind(null, record),
// },
{
label: '删除',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, record),
},
auth: 'ybtkb:del'
}
]
}
/**
* 查询
*/
function searchQuery() {
reload();
}
/**
* 重置
*/
function searchReset() {
queryParam.value = {};
selectedRowKeys.value = [];
//
reload();
}
</script>
<style lang="less" scoped>
.jeecg-basic-table-form-container {
.table-page-search-submitButtons {
display: block;
margin-bottom: 24px;
white-space: nowrap;
}
.query-group-cust{
width: calc(50% - 15px);
min-width: 100px !important;
}
.query-group-split-cust{
width: 30px;
display: inline-block;
text-align: center
}
}
</style>

View File

@ -0,0 +1,348 @@
<template>
<a-spin :spinning="confirmLoading">
<a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol" :model="formData" :rules="validatorRules">
<a-row>
<a-col :span="4" style="height: 80px;line-height: 80px;text-align: center;">
<a-button type="primary" @click="checkTeacher" style="font-size:20px;height: 50px;">匹配教师数据</a-button>
</a-col>
<a-col :span="20">
<a-row>
<a-col :span="8" style="margin-top: 20px;">
<a-form-item label="评课教师姓名" v-bind="validateInfos.tkjsxm">
<a-input v-model:value="formData.tkjsxm" placeholder="请输入评课教师姓名" disabled></a-input>
</a-form-item>
</a-col>
<a-col :span="8" style="margin-top: 20px;">
<a-form-item label="工号" v-bind="validateInfos.tkjsbh">
<a-input v-model:value="formData.tkjsbh" placeholder="请输入工号" disabled="true"></a-input>
</a-form-item>
</a-col>
<a-col :span="8" style="margin-top: 20px;height: 32px;">
<a-form-item label="评课时间" v-bind="validateInfos.pksj">
<a-date-picker placeholder="请选择评课时间" v-model:value="formData.pksj" value-format="YYYY-MM-DD" style="width: 100%" :disabled="disabled"/>
</a-form-item>
</a-col>
</a-row>
</a-col>
<a-col :span="4" style="height: 80px;line-height: 80px;text-align: center;">
<a-button type="primary" @click="handleJyktsj" style="font-size:20px;height: 50px;">匹配课堂数据</a-button>
</a-col>
<a-col :span="20">
<a-row>
<a-col :span="8">
<a-form-item label="课程名称" v-bind="validateInfos.kcmc">
<a-input v-model:value="formData.kcmc" placeholder="请输入课程名称" disabled="true"></a-input>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="课程编号" v-bind="validateInfos.kcbh">
<a-input v-model:value="formData.kcbh" placeholder="校验课堂数据后自动带值" disabled="true"></a-input>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="授课教师" v-bind="validateInfos.skjs">
<a-input v-model:value="formData.skjs" placeholder="请输入授课教师" disabled="true"></a-input>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="授课时间" v-bind="validateInfos.skrq">
<a-date-picker placeholder="请选择授课时间" v-model:value="formData.skrq" value-format="YYYY-MM-DD" style="width: 100%" disabled="true"/>
</a-form-item>
</a-col>
<a-col :span="16">
<a-form-item label="上课地点" v-bind="validateInfos.skdd" :labelCol="labelCol3" :wrapperCol="wrapperCol3">
<a-input v-model:value="formData.skdd" placeholder="请输入上课地点" disabled="true"></a-input>
</a-form-item>
</a-col>
</a-row>
</a-col>
<a-col :span="24">
<a-form-item label="仪表整洁、举止得体、精神饱满" v-bind="validateInfos.ans1" :labelCol="labelCol2" :wrapperCol="wrapperCol2">
<j-dict-select-tag type='radio' v-model:value="formData.ans1" :dictCode="`kc_evaluationans,content,ordernum,queid = '61' order by ordernum asc`" placeholder="请选择仪表整洁、举止得体、精神饱满" :disabled="disabled"/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="遵守教学纪律,严格课堂管理" v-bind="validateInfos.ans2" :labelCol="labelCol2" :wrapperCol="wrapperCol2">
<j-dict-select-tag type='radio' v-model:value="formData.ans2" :dictCode="`kc_evaluationans,content,ordernum,queid = '62' order by ordernum asc`" placeholder="请选择遵守教学纪律,严格课堂管理" :disabled="disabled"/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="备课充分,精心设计教学(有课件、教案等教学素材),教学投入" v-bind="validateInfos.ans3" :labelCol="labelCol2" :wrapperCol="wrapperCol2">
<j-dict-select-tag type='radio' v-model:value="formData.ans3" :dictCode="`kc_evaluationans,content,ordernum,queid = '63' order by ordernum asc`" placeholder="请选择备课充分,精心设计教学(有课件、教案等教学素材),教学投入" :disabled="disabled"/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="坚持马克思主义立场观点方法,具有较为扎实的马克思主义理论功底,教学目标明确" v-bind="validateInfos.ans4" :labelCol="labelCol2" :wrapperCol="wrapperCol2">
<j-dict-select-tag type='radio' v-model:value="formData.ans4" :dictCode="`kc_evaluationans,content,ordernum,queid = '64' order by ordernum asc`" placeholder="请选择坚持马克思主义立场观点方法,具有较为扎实的马克思主义理论功底,教学目标明确" :disabled="disabled"/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="有效使用统编教材配套课件、参考讲义、辅导用书,教学内容科学完整,基本理论阐释清楚,基本事实讲述准确,重点、难点比较突出" v-bind="validateInfos.ans5" :labelCol="labelCol2" :wrapperCol="wrapperCol2">
<j-dict-select-tag type='radio' v-model:value="formData.ans5" :dictCode="`kc_evaluationans,content,ordernum,queid = '65' order by ordernum asc`" placeholder="请选择有效使用统编教材配套课件、参考讲义、辅导用书,教学内容科学完整,基本理论阐释清楚,基本事实讲述准确,重点、难点比较突出" :disabled="disabled"/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="理论联系实际,熟悉党史、新中国史、改革开放史、社会主义发展史、中华民族发展史,注重史论结合,教学素材多样,案例鲜活生动,及时将新时代中国特色社会主义的生动实践转化为课堂教学资源" v-bind="validateInfos.ans6" :labelCol="labelCol2" :wrapperCol="wrapperCol2">
<j-dict-select-tag type='radio' v-model:value="formData.ans6" :dictCode="`kc_evaluationans,content,ordernum,queid = '66' order by ordernum asc`" placeholder="请选择理论联系实际,熟悉党史、新中国史、改革开放史、社会主义发展史、中华民族发展史,注重史论结合,教学素材多样,案例鲜活生动,及时将新时代中国特色社会主义的生动实践转化为课堂教学资源" :disabled="disabled"/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="贴近学生实际,善于发掘身边人身边事蕴含的育人元素,有效回应学生关心问题和思想困惑" v-bind="validateInfos.ans7" :labelCol="labelCol2" :wrapperCol="wrapperCol2">
<j-dict-select-tag type='radio' v-model:value="formData.ans7" :dictCode="`kc_evaluationans,content,ordernum,queid = '67' order by ordernum asc`" placeholder="请选择贴近学生实际,善于发掘身边人身边事蕴含的育人元素,有效回应学生关心问题和思想困惑" :disabled="disabled"/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="熟悉教学法基本原理,注重教学逻辑与学术逻辑的辩证统一,教学设计符合学生认知规律、关注学生差异性" v-bind="validateInfos.ans8" :labelCol="labelCol2" :wrapperCol="wrapperCol2">
<j-dict-select-tag type='radio' v-model:value="formData.ans8" :dictCode="`kc_evaluationans,content,ordernum,queid = '68' order by ordernum asc`" placeholder="请选择熟悉教学法基本原理,注重教学逻辑与学术逻辑的辩证统一,教学设计符合学生认知规律、关注学生差异性" :disabled="disabled"/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="熟练运用启发式、案例式等教学法,注重课堂互动,不照本宣科,善于调动学生积极性,启发学生思考" v-bind="validateInfos.ans9" :labelCol="labelCol2" :wrapperCol="wrapperCol2">
<j-dict-select-tag type='radio' v-model:value="formData.ans9" :dictCode="`kc_evaluationans,content,ordernum,queid = '69' order by ordernum asc`" placeholder="请选择熟练运用启发式、案例式等教学法,注重课堂互动,不照本宣科,善于调动学生积极性,启发学生思考" :disabled="disabled"/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="综合运用现代信息技术手段,增强课堂教学的生动性、吸引力,帮助学生理解领会教学内容" v-bind="validateInfos.ans10" :labelCol="labelCol2" :wrapperCol="wrapperCol2">
<j-dict-select-tag type='radio' v-model:value="formData.ans10" :dictCode="`kc_evaluationans,content,ordernum,queid = '70' order by ordernum asc`" placeholder="请选择综合运用现代信息技术手段,增强课堂教学的生动性、吸引力,帮助学生理解领会教学内容" :disabled="disabled"/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="注重思想性和理论性,具有亲和力和感染力,能够把道理讲深、讲透、讲活,学生学习积极性高,愿意与教师交流反馈" v-bind="validateInfos.ans11" :labelCol="labelCol2" :wrapperCol="wrapperCol2">
<j-dict-select-tag type='radio' v-model:value="formData.ans11" :dictCode="`kc_evaluationans,content,ordernum,queid = '71' order by ordernum asc`" placeholder="请选择注重思想性和理论性,具有亲和力和感染力,能够把道理讲深、讲透、讲活,学生学习积极性高,愿意与教师交流反馈" :disabled="disabled"/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="注重价值引领,增进对党的创新理论的政治认同、思想认同、理论认同、情感认同,坚定“四个自信”" v-bind="validateInfos.ans12" :labelCol="labelCol2" :wrapperCol="wrapperCol2">
<j-dict-select-tag type='radio' v-model:value="formData.ans12" :dictCode="`kc_evaluationans,content,ordernum,queid = '72' order by ordernum asc`" placeholder="请选择注重价值引领,增进对党的创新理论的政治认同、思想认同、理论认同、情感认同,坚定“四个自信”" :disabled="disabled"/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="完成教学计划,课堂秩序良好" v-bind="validateInfos.ans413" :labelCol="labelCol2" :wrapperCol="wrapperCol2">
<j-dict-select-tag type='radio' v-model:value="formData.ans413" :dictCode="`kc_evaluationans,content,ordernum,queid = '73' order by ordernum asc`" placeholder="请选择完成教学计划,课堂秩序良好" :disabled="disabled"/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="课堂诊断" v-bind="validateInfos.ans14" :labelCol="labelCol2" :wrapperCol="wrapperCol2">
<a-textarea v-model:value="formData.ans14" rows="4" placeholder="请输入课堂诊断" :disabled="disabled"/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="总体评价" v-bind="validateInfos.ans15" :labelCol="labelCol2" :wrapperCol="wrapperCol2">
<j-dict-select-tag type='radio' v-model:value="formData.ans15" :dictCode="`kc_evaluationans,content,ordernum,queid = '75' order by ordernum asc`" placeholder="请选择总体评价" :disabled="disabled"/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="指导建议" v-bind="validateInfos.ans16" :labelCol="labelCol2" :wrapperCol="wrapperCol2">
<a-textarea v-model:value="formData.ans16" rows="4" placeholder="请输入指导建议" :disabled="disabled"/>
</a-form-item>
</a-col>
<!-- <a-col :span="24">
<a-form-item label="上课认真听讲、积极思考、主动与老师交流互动" v-bind="validateInfos.ans8" :labelCol="labelCol2" :wrapperCol="wrapperCol2">
<j-dict-select-tag type='radio' v-model:value="formData.ans8" :dictCode="`kc_evaluationans,content,ordernum,queid = '30' order by ordernum asc`" placeholder="请选择上课认真听讲、积极思考、主动与老师交流互动" :disabled="disabled"/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="课堂教学总体印象评价" v-bind="validateInfos.ans9" :labelCol="labelCol2" :wrapperCol="wrapperCol2">
<j-dict-select-tag type='radio' v-model:value="formData.ans9" :dictCode="`kc_evaluationans,content,ordernum,queid = '31' order by ordernum asc`" placeholder="请选择课堂教学总体印象评价" :disabled="disabled"/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="请填写对课堂内容以及其他方面的具体意见或建议" v-bind="validateInfos.ans10" :labelCol="labelCol2" :wrapperCol="wrapperCol2">
<a-textarea v-model:value="formData.ans10" rows="4" placeholder="请输入请填写对课堂内容以及其他方面的具体意见或建议" :disabled="disabled"/>
</a-form-item>
</a-col> -->
</a-row>
</a-form>
<KcKetangbiaoListModal ref="KcKetangbiaoListModalPage" @success="handleSuccess"></KcKetangbiaoListModal>
<CheckUserToolModal ref="CheckUserToolModalRef" @success="userSuccess"/>
</a-spin>
</template>
<script lang="ts" setup>
import { ref, reactive, defineExpose, nextTick, defineProps, computed, onMounted } from 'vue';
import { defHttp } from '/@/utils/http/axios';
import { useMessage } from '/@/hooks/web/useMessage';
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
import KcKetangbiaoListModal from '/@/views/kc/ketang/KcKetangbiaoListModal.vue'
import CheckUserToolModal from '/@/views/kc/kcTingkeBmd/checkuser/CheckUserToolModal.vue';
import { getValueType } from '/@/utils';
import { saveOrUpdate } from '../KcZzSzkc.api';
import { Form } from 'ant-design-vue';
const KcKetangbiaoListModalPage = ref();
const CheckUserToolModalRef = ref();
const props = defineProps({
formDisabled: { type: Boolean, default: false },
formData: { type: Object, default: ()=>{} },
formBpm: { type: Boolean, default: true }
});
const formRef = ref();
const useForm = Form.useForm;
const emit = defineEmits(['register', 'ok']);
const formData = reactive<Record<string, any>>({
id: '',
kcbh: '',
kcmc: '',
skjs: '',
skrq: '',
skdd: '',
tkjsbh: '',
tkjsxm: '',
pksj: '',
ans1: '',
ans2: '',
ans3: '',
ans4: '',
ans5: '',
ans6: '',
ans7: '',
ans8: '',
ans9: '',
ans10: '',
});
const { createMessage } = useMessage();
const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 12 } });
const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 12 } });
const labelCol2 = ref<any>({ xs: { span: 24 }, sm: { span: 8 },style: 'width: 50%; line-height: 18px; white-space: normal', });
const wrapperCol2 = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });
const labelCol3 = ref<any>({ xs: { span: 24 }, sm: { span: 6 } });
const wrapperCol3 = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });
const confirmLoading = ref<boolean>(false);
//
const validatorRules = {
kcmc: [{ required: true, message: '请输入文本!' }],
// kcbh: [{ required: true, message: '!' }],
skjs : [{ required: true, message: '请输入文本!' }],
tkjsxm : [{ required: true, message: '请输入文本!' }],
tkjsbh : [{ required: true, message: '请输入文本!' }],
skrq : [{ required: true, message: '请输入文本!' }],
skdd : [{ required: true, message: '请输入文本!' }],
pksj: [{ required: true, message: '请输入文本!' }],
};
const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: true });
//
const disabled = computed(()=>{
if(props.formBpm === true){
if(props.formData.disabled === false){
return false;
}else{
return true;
}
}
return props.formDisabled;
});
//
function checkTeacher(){
CheckUserToolModalRef.value.add("选择教师")
}
//
function userSuccess(par){
console.log(`🚀 ~ userSuccess ~ par:`, par)
formData.tkjsxm = par.xm;
formData.tkjsbh = par.gh;
}
/**
* 校验课堂数据
*/
async function handleJyktsj() {
KcKetangbiaoListModalPage.value.add("一版听课表")
}
/**
* 获取教师编号
*/
async function handleHqjsbh() {
var url = "/grab/imports/xxhbshryxx/getTeacherinfo";
var params = {xm:formData.tkjsxm};
const data = await defHttp.get({ url, params }, {isTransformResponse: false});
console.log(`🚀 ~ file: KcZzYbtkbForm.vue:187 ~ handleHqjsbh ~ data:`, data)
if (data.result) {
formData.tkjsbh = data.result.gh;
}else{
formData.tkjsbh = "";
createMessage.warning("未查到教师信息");
}
}
function handleSuccess(par){
console.log(`🚀 ~ file: KcZzYbtkbForm.vue:232 ~ handleSuccess ~ par:`, par)
formData.kcmc = par.kcmc;
formData.skjs = par.skjs;
formData.skrq = par.skrq;
formData.skdd = par.skdd;
formData.kcbh = par.kcbh;
}
/**
* 新增
*/
function add() {
edit({});
}
/**
* 编辑
*/
function edit(record) {
nextTick(() => {
resetFields();
//
Object.assign(formData, record);
});
}
/**
* 提交数据
*/
async function submitForm() {
//
await validate();
confirmLoading.value = true;
const isUpdate = ref<boolean>(false);
//
let model = formData;
if (model.id) {
isUpdate.value = true;
}
//
for (let data in model) {
//
if (model[data] instanceof Array) {
let valueType = getValueType(formRef.value.getProps, data);
//
if (valueType === 'string') {
model[data] = model[data].join(',');
}
}
}
await saveOrUpdate(model, isUpdate.value)
.then((res) => {
if (res.success) {
createMessage.success(res.message);
emit('ok');
} else {
createMessage.warning(res.message);
}
})
.finally(() => {
confirmLoading.value = false;
});
}
defineExpose({
add,
edit,
submitForm,
});
</script>
<style lang="less" scoped>
.antd-modal-form {
min-height: 500px !important;
overflow-y: auto;
padding: 24px 24px 24px 24px;
}
</style>

View File

@ -0,0 +1,75 @@
<template>
<a-modal :title="title" :width="width" :visible="visible" @ok="handleOk" :okButtonProps="{ class: { 'jee-hidden': disableSubmit } }" @cancel="handleCancel" cancelText="关闭">
<KcZzSzkcForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false"></KcZzSzkcForm>
</a-modal>
</template>
<script lang="ts" setup>
import { ref, nextTick, defineExpose } from 'vue';
import KcZzSzkcForm from './KcZzSzkcForm.vue'
const title = ref<string>('');
const width = ref<string>('90%');
const visible = ref<boolean>(false);
const disableSubmit = ref<boolean>(false);
const registerForm = ref();
const emit = defineEmits(['register', 'success']);
/**
* 新增
*/
function add() {
title.value = '新增';
visible.value = true;
nextTick(() => {
registerForm.value.add();
});
}
/**
* 编辑
* @param record
*/
function edit(record) {
title.value = disableSubmit.value ? '详情' : '编辑';
visible.value = true;
nextTick(() => {
registerForm.value.edit(record);
});
}
/**
* 确定按钮点击事件
*/
function handleOk() {
registerForm.value.submitForm();
}
/**
* form保存回调事件
*/
function submitCallback() {
handleCancel();
emit('success');
}
/**
* 取消按钮回调事件
*/
function handleCancel() {
visible.value = false;
}
defineExpose({
add,
edit,
disableSubmit,
});
</script>
<style>
/**隐藏样式-modal确定按钮 */
.jee-hidden {
display: none !important;
}
</style>

View File

@ -0,0 +1,598 @@
<template>
<div style="background: #fafafa; height: calc(100vh - 225px); overflow-y: auto; margin: 10px 0; padding: 8px 0 0 0">
<div v-if="showType == 0">
<a-row>
<a-col :span="24"><span class="title">教学大纲</span><a-divider /></a-col>
<div class="work-img">
<img class="work-img-img" src="../../../assets/images/homework.png" />
</div>
<a-col :span="24" style="text-align: center; color: #494b56">
<div>学生您好</div>
<div>教师还未设置教学大纲暂时无法查看</div>
</a-col>
</a-row>
</div>
<div v-if="showType == 999">
<a-row>
<a-col :span="24">
<span class="title">教学大纲内容</span>
<a-divider />
</a-col>
<a-col :span="23" v-for="(item, index) in zyJxdgMainTable.dataSource" :key="index" style="margin:8px auto; background:#fff;border:1px solid #eee;">
<a-row>
<a-col :span="24" style="height: 40px; line-height:40px; background-color:#f6f6f6">
<span class="title">{{ item.title }}</span>
</a-col>
<!-- 单行文本 1 -->
<a-col v-if="item.type === '1'" :span="24" style="margin: 10px; ">
<span class="message-word" v-text="item.content"></span>
</a-col>
<!-- 多行文本 2 -->
<a-col v-else-if="item.type === '2'" :span="24" style="margin: 10px; ">
<span class="message-word" v-text="item.content"></span>
</a-col>
<!-- 富文本 3 -->
<a-col v-else-if="item.type === '3'" :span="24">
<div class="message-word" v-html="item.content"></div>
</a-col>
<!-- 固定表单基础信息 4 -->
<a-col v-else-if="item.type === '4'" v-model:value="item.content" :span="24">
<a-form v-bind="formItemLayout">
<a-row>
<a-col v-for="(item2, index2) in item.zyJxdgPzxxList" :key="index2" :span="12">
<a-form-item :label="item2.title">
<span class="Sheet-word" v-text="item2.content"></span>
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-col>
<!-- 自增表格 5 -->
<a-col v-else-if="item.type === '5'" :span="24">
<a-table :columns="getTableColumns(item.zyJxdgPzxxList)" :dataSource="item.list" :pagination="false">
<!-- <template #bodyCell="{ column, record }">
<a-input placeholder="请输入内容" v-model:value="record[column.key]" style="width: 80%"></a-input>
</template> -->
</a-table>
</a-col>
<!-- 自增单行文本 6 -->
<a-col v-else-if="item.type === '6'" :span="24">
<a-row>
<a-col v-for="(item2, index2) in item.list" :key="index2" >
<span style="padding:20px; color:#888" v-text="item2.title"></span>
</a-col>
</a-row>
</a-col>
<!-- 自增富文本 7 -->
<a-col v-else-if="item.type === '7'" :span="24">
<a-row>
<a-col v-for="(item2, index2) in item.list" :key="index2">
<div class="message-word" v-html="item2.title"></div>
</a-col>
</a-row>
</a-col>
<!-- 自增多行文本 8 -->
<a-col v-else-if="item.type === '8'" :span="24">
<a-row>
<a-col v-for="(item2, index2) in item.list" :key="index2" style="margin: 10px; ">
<span class="message-word" v-text="item2.title"></span>
</a-col>
</a-row>
</a-col>
<!-- 自增表格 9 -->
<a-col v-else-if="item.type === '9'" :span="24">
<a-table :columns="getTableZzColumns2(item.zyJxdgPzxxList)" :dataSource="item.list" :pagination="false">
</a-table>
</a-col>
<!-- 自增表格两列关联 10 -->
<a-col v-else-if="item.type === '10'" :span="24">
<a-table :columns="getTableZzColumns(item.zyJxdgPzxxList)" :dataSource="item.list" :pagination="false">
</a-table>
</a-col>
<!-- 自增表格两列关联 11 -->
<a-col v-else-if="item.type === '11'" :span="24">
<a-table :columns="getTableZzColumns(item.zyJxdgPzxxList)" :dataSource="item.list" :pagination="false">
</a-table>
</a-col>
<a-col v-else> </a-col>
<!-- <a-col :span="24">
<span class="tishi">
<span>{{ item.tsy }}</span>
</span>
</a-col> -->
</a-row>
</a-col>
</a-row>
</div>
</div>
</template>
<script lang="ts" name="zyJxdgBanben-zyJxdgBanben" setup>
import { ref, reactive, computed, unref, onMounted } from 'vue';
import { useRouter } from 'vue-router';
import { defHttp } from '/@/utils/http/axios';
import { queryZyJxdgMainListByMainId, queryDataById, saveOrUpdate2, queryZyJxdgMainListByMainId2 } from '/@/views/kc/zyJxdgBanben/ZyJxdgBanben.api';
import JEditor from '/@/components/Form/src/jeecg/components/JEditor.vue';
//
const { currentRoute } = useRouter();
const { query } = unref(currentRoute);
const { rwbh, xqxn, type, teano } = query; //
const showType = ref<number>(0);
const jxdgInfo = ref<any>({});
const jxdgbbDataSource = ref<any>([]);
const disabled = ref<boolean>(false);
const zyJxdgMainTable = reactive<Record<string, any>>({
loading: false,
dataSource: [],
});
const formItemLayout = {
labelCol: { xs: { span: 24 }, sm: { span: 8 } },
wrapperCol: { xs: { span: 24 }, sm: { span: 13 } },
};
//
function handleGlxm(item) {
var sfsglxm = item.sfsglxm;
if (sfsglxm == '1') {
//
var list1 = item.list; //
if (list1 != null) {
//
var sort = item.sort; //
var alllist = zyJxdgMainTable.dataSource; //
for (var j = 0; j < alllist.length; j++) {
for (var i = 0; i < list1.length; i++) {
var item1 = list1[i];
var title = item1.title; //
var item2 = alllist[j]; //
item2.list = item2.list || [];
if (item2.guanlian == sort) {
//
if (i == 0) {
//
item2.list = [];
}
//
var item3 = item2.zyJxdgPzxxList;
if (item3 != null && item3.length > 0) {
item2.list.push({ [item3[0].id]: title });
}
}
}
}
}
}
}
function handleFabu(sffb){
defHttp.post({ url: '/zyJxdgTeacherMain/zyJxdgTeacherMain/edit', params: { sffb,id:jxdgInfo.value.id} }).then((res) => {
init()
});
}
//
function handleTwoGlxm(item) {
var sfsglxm = item.sfsglxm;
if (sfsglxm == '1') {
//
var list1 = item.list; //
if (list1 != null) {
//
var sort = item.sort; //
var alllist = zyJxdgMainTable.dataSource; //
for (var j = 0; j < alllist.length; j++) {
for (var i = 0; i < list1.length; i++) {
var item1 = list1[i];
var item2 = alllist[j]; //
item2.list = item2.list || [];
if (item2.guanlian == sort) {
//
var item3 = item.zyJxdgPzxxList;
var item4 = item2.zyJxdgPzxxList;
var title1 = item1[item3[0].id];
var title2 = item1[item3[1].id];
//
if (i == 0) {
//
item2.list = [];
}
if (item3 != null && item3.length > 0) {
item2.list.push({ [item4[0].id]: title1, [item4[1].id]: title2 });
}
}
}
}
}
}
}
//
function handleDhwb(item) {
item.list = item.list || [];
item.list.push({
title: '',
sort: item.list.length + 1,
});
}
//
function handleDhwbDel(item, index) {
item.list.splice(index, 1);
for (var i = 0; i < item.list.length; i++) {
item.list[i].sort = i;
}
}
//
function handleDhfwb(item) {
item.list = item.list || [];
item.list.push({
title: '',
sort: item.list.length + 1,
});
}
//
function handleDhfwbDel(item, index) {
item.list.splice(index, 1);
for (var i = 0; i < item.list.length; i++) {
item.list[i].sort = i;
}
}
//
function handleDhwbArea(item) {
item.list = item.list || [];
item.list.push({
title: '',
sort: item.list.length + 1,
});
}
//
function handleDhwbAreaDel(item, index) {
item.list.splice(index, 1);
for (var i = 0; i < item.list.length; i++) {
item.list[i].sort = i;
}
}
//
function handleZzbg(item) {
item.list = item.list || [];
item.list.push({
title: '',
sort: item.list.length,
});
}
//
function handleZzbgDel(list, record) {
list.splice(record, 1);
for (var i = 0; i < list.length; i++) {
list[i].sort = i;
}
}
//
function getTableColumns(list) {
let columns = reactive<any>([]);
for (var i = 0; i < list.length; i++) {
var par = list[i];
var inePar = {
title: par.title,
dataIndex: par.id,
key: par.id,
};
columns.push(inePar);
}
return columns;
}
//
function getTableZzColumns(list) {
let columns = reactive<any>([]);
for (var i = 0; i < list.length; i++) {
var par = list[i];
var inePar = {
title: par.title,
dataIndex: par.id,
key: par.id,
};
columns.push(inePar);
}
var inePar2 = {
title: '操作',
dataIndex: 'action',
key: 'action',
};
columns.push(inePar2);
return columns;
}
//
function getTableZzColumns2(list) {
let columns = reactive<any>([]);
for (var i = 0; i < list.length; i++) {
var par = list[i];
var inePar = {
title: par.title,
dataIndex: par.id,
key: par.id,
};
columns.push(inePar);
}
return columns;
}
//
async function handleCheckBanben(record) {
jxdgInfo.value.banbenId = record.id;
jxdgInfo.value.rwbh = rwbh;
jxdgInfo.value.teacherNo = teano;
//
var id = record.id;
const zyJxdgMainDataList = await queryZyJxdgMainListByMainId(id);
zyJxdgMainTable.dataSource = [...zyJxdgMainDataList];
}
async function submitForm() {
const alllist = zyJxdgMainTable.dataSource;
var values = {
id: jxdgInfo.value.id,
rwbh: rwbh,
banbenId: jxdgInfo.value.banbenId,
teacherNo: teano,
sffb: '0',
list: alllist,
};
console.log('表单提交数据', values);
const isUpdate = values.id ? true : false;
await saveOrUpdate2(values, isUpdate);
setTimeout(() => {
init();
}, 1000);
}
//
function handleShowType(type) {
if (type == 1) {
jxdgInfo.value = {};
zyJxdgMainTable.dataSource = [];
defHttp.get({ url: '/zyJxdgBanben/zyJxdgBanben/list', params: { sffb: '1', pageNo: -1 } }).then((res) => {
jxdgbbDataSource.value = res.records;
});
}else if(type == 2){
type = 1;
defHttp.get({ url: '/zyJxdgBanben/zyJxdgBanben/list', params: { sffb: '1', pageNo: -1 } }).then((res) => {
jxdgbbDataSource.value = res.records;
});
var teacherNo = teano;
zyJxdgMainTable.dataSource = [];
defHttp.get({ url: '/zyJxdgTeacherMain/zyJxdgTeacherMain/queryByRwbhList', params: { rwbh, teacherNo } }).then((res) => {
zyJxdgMainTable.dataSource = [...res];
});
}
showType.value = type;
}
//
async function init() {
console.log('rwbh--->', rwbh);
defHttp.get({ url: '/zyJxdgTeacherMain/zyJxdgTeacherMain/queryByRwbh', params: { rwbh, xqxn, teacherNo: teano } }).then((res) => {
if (res) {
jxdgInfo.value = res;
showType.value = 999;
var teacherNo = teano;
defHttp.get({ url: '/zyJxdgTeacherMain/zyJxdgTeacherMain/queryByRwbhList', params: { rwbh, teacherNo } }).then((res) => {
zyJxdgMainTable.dataSource = [...res];
});
} else {
showType.value = 0;
}
});
if (jxdgInfo.value.id) {
}
}
const jxdgbbColumns = [
{
title: '版本',
align: 'center',
dataIndex: 'title',
},
{
title: '课程类型',
align: 'center',
dataIndex: 'twoTitle_dictText',
},
{
title: '操作',
align: 'action',
key: 'action',
},
];
onMounted(() => {
init();
});
</script>
<style lang="less" scoped>
.title {
margin-left: 20px;
font-size: 16px;
font-weight: bold;
}
.title2 {
font-size: 16px;
font-weight: bold;
}
.ant-divider-horizontal {
display: flex;
clear: both;
width: 100%;
min-width: 100%;
margin: 3px 0 5px;
}
.tishi {
width: 100%;
font-size: 12px;
color: #fd8f02;
margin-top: -4px;
background: #fffbf2;
text-align: center;
padding: 6px 0;
}
.cardClass {
min-height: 200px;
}
.sznrClass {
line-height: 40px;
text-align: center;
}
.ant-card {
box-sizing: border-box;
margin: 0;
padding: 0;
color: rgb(0 0 0);
font-size: 14px;
font-variant: tabular-nums;
line-height: 1.5715;
list-style: none;
font-feature-settings: tnum;
position: relative;
border-radius: 5px;
border: 1px solid #dadada;
background: #f7f7f7;
}
.ant-card-head {
min-height: 48px;
margin-bottom: -1px;
padding: 0 24px;
color: rgba(0, 0, 0, 0.85);
font-weight: 500;
font-size: 16px;
background: transparent;
border-bottom: 1px solid #dadada;
border-radius: 2px 2px 0 0;
}
.ellipsis {
overflow: hidden; /* 确保超出容器的内容被裁剪 */
white-space: nowrap; /* 确保文本在一行内显示 */
text-overflow: ellipsis; /* 超出部分显示省略号 */
}
.ellip-title {
display: flex;
justify-content: space-between;
align-items: flex-end;
margin-top: -10px;
}
.elli-title {
font-size: 16px;
font-weight: bold;
}
.ellip-word {
font-size: 12px;
color: #666666;
margin-right: 10px;
}
.ellip-word2 {
font-size: 12px;
color: #333;
font-weight: bold;
}
.zuanqu:hover {
cursor: pointer;
color: #18a689;
}
.data-suggest {
display: flex;
flex-direction: column;
text-align: center;
width: 25%;
margin-right: 3px;
padding: 8px 3px;
border-radius: 5px;
background: #f7f7f7;
margin-top: 10px;
}
.data-suggest span:nth-child(1) {
font-size: 16px;
font-weight: bold;
}
.data-suggest span:nth-child(2) {
font-size: 12px;
}
.work-img {
width: 100%;
display: flex;
justify-content: center;
margin-top: 80px;
margin-bottom: 30px;
}
.work-img-img {
width: 180px;
height: 139px;
}
.buttonClass {
background: #1ab394;
font-weight: 600;
color: #fff;
border-radius: 3px;
border: none;
}
.mar-right20 {
margin-right: 14px;
}
.button-zhta {
color: #666666;
cursor: pointer;
}
.button-zhta:hover {
cursor: pointer;
color: #18a689;
}
.sear-distance {
padding: 0 10px;
}
.ant-form-item {
box-sizing: border-box;
margin: 10px 0;
padding: 0;
color: rgba(0, 0, 0, 0.85);
font-size: 14px;
font-variant: tabular-nums;
line-height: 1.5715;
list-style: none;
font-feature-settings: tnum;
/* margin-bottom: 24px; */
vertical-align: top;
}
.bled-countenance {
color: #333333;
}
.bled-countenance2 {
color: #999999;
font-size: 12px;
}
.region {
margin: 5px 10px;
padding-bottom: 20px;
background: #fff;
border-radius: 5px;
}
.region-title {
font-size: 16px;
color: #029c88;
padding: 8px 20px;
border-left: 5px solid #029c88;
margin-bottom: 20px;
}
.message-word{
color: #888;
padding:10px 20px;
}
.Sheet-word{
color: #888;
}
</style>

View File

@ -92,9 +92,9 @@ const activeKey = ref('1');
//
onMounted(() => {
loaddata()
setInterval(() => {
loaddata()
}, 60*1000);
// setInterval(() => {
// loaddata()
// }, 60*1000);
});
function loaddata(){
// defHttp.get({ url: '/zyDbtx/zyDbtx/list',params:{pageSize:10,pageNo:1,createBy:userStore.getUserInfo.username} }).then((res) => {

View File

@ -70,9 +70,9 @@ const activeKey = ref('1');
//
onMounted(() => {
loaddata();
setInterval(() => {
loaddata();
}, 60 * 1000);
// setInterval(() => {
// loaddata();
// }, 60 * 1000);
});
function loaddata() {
defHttp

View File

@ -6,12 +6,15 @@
<!-- <a-col :span="9">
<a-button type="primary" class="wenZiJiaCu" style="font-size: 18px;height: 45px;"><RouterLink target='_blank' :to="{path:'/site/qaAddPageXsktpjb',query:{ type: 2, ktId }}">线上课堂评价表</RouterLink></a-button>
</a-col> -->
<a-col :span="12" style="text-align: center;">
<a-col :span="8" style="text-align: center;">
<a-button type="primary" class="wenZiJiaCu" style="font-size: 18px;height: 45px;"><RouterLink target='_blank' :to="{path:'/site/qaAddPageTkjlb',query:{ type: 3, ktId }}">听课记录表</RouterLink></a-button>
</a-col>
<a-col :span="12" style="text-align: center;">
<a-col :span="8" style="text-align: center;">
<a-button type="primary" class="wenZiJiaCu" style="font-size: 18px;height: 45px;"><RouterLink target='_blank' :to="{path:'/site/qaAddPageThpjb',query:{ type: 4, ktId }}">同行评价表</RouterLink></a-button>
</a-col>
<a-col :span="8" style="text-align: center;">
<a-button type="primary" class="wenZiJiaCu" style="font-size: 18px;height: 45px;"><RouterLink target='_blank' :to="{path:'/site/qaAddPageThpjb',query:{ type: 5, ktId }}">思政课程表</RouterLink></a-button>
</a-col>
</a-row>
</div>
<p>

View File

@ -10,7 +10,8 @@
<template #title>
<div style="text-align: center; font-size: 24px;font-weight: bold;">
<!-- 听课足迹{{ $route.query.ktId }}-{{ $route.query.type }} -->
<span v-if="$route.query.type == '4'">东北师范大学本科课堂教学质量评价表同行专家用</span>
<span v-if="$route.query.type == '5'">高校思政课教学指导组听课评价表</span>
<span v-else-if="$route.query.type == '4'">东北师范大学本科课堂教学质量评价表同行专家用</span>
<span v-else-if="$route.query.type == '3'">东北师范大学听课记录表</span>
<span v-else-if="$route.query.type == '2'">线上教学课堂看课听课评价表</span>
</div>
@ -24,7 +25,8 @@
</div>
</template>
<div style="text-align: left;font-size: 1rem;font-weight: 700;margin: 1rem;">
<span v-if="$route.query.type == '4'">该评价表是专门为该课程方面的专家/教师听课研制的评价表更能反映该课堂的教学质量</span>
<span v-if="$route.query.type == '5'">教学态度包含1,2,3题教学内容包含4,5,6,7题教学方法包含8,9,10教学效果包含11,12,13题</span>
<span v-else-if="$route.query.type == '4'">该评价表是专门为该课程方面的专家/教师听课研制的评价表更能反映该课堂的教学质量</span>
<span v-else-if="$route.query.type == '3'">该评价表是方便行政人员和非该课程所属学科的教师听课使用的评价表主要用来反映课堂教学的整体情况</span>
<span v-else-if="$route.query.type == '2'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该评价表是根据线上课堂的特点研制的如果您听的是线上课堂请您填写该评价表如果您同时是该课程所属学科的专家/教师也欢迎您同时填写同行评价表</span>
</div>

View File

@ -50,7 +50,9 @@
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'score'">
<span>
<a-input-number v-model:value="record.score" :min="0" :max="100" @blur="handleJscjbfb"> <template #addonAfter> % </template></a-input-number>
<a-input-number v-model:value="record.score" :min="0" :max="100" @blur="handleJscjbfb">
<template #addonAfter> % </template></a-input-number
>
</span>
</template>
<template v-else-if="column.key === 'lstitle'">
@ -265,16 +267,22 @@
<div class="region">
<div class="region-title"><span class="region-title-headline"></span><span>查重设置</span></div>
<a-form-item label="是否进行查重" :labelCol="labelCol3" :wrapperCol="wrapperCol3">
<j-dict-select-tag
type="radio"
v-model:value="zyInfo.sfcc"
dictCode="yn"
placeholder="请选择是否查重"
:disabled="editDisabled"
/>
<j-dict-select-tag
type="radio"
v-model:value="zyInfo.sfcc"
dictCode="yn"
placeholder="请选择是否查重"
:disabled="editDisabled"
/>
</a-form-item>
<a-form-item label="检测通过率" :labelCol="labelCol3" :wrapperCol="wrapperCol3" style="margin: -1px; margin-left: -10px" v-if="zyInfo.sfcc=='1'">
<a-form-item
label="检测通过率"
:labelCol="labelCol3"
:wrapperCol="wrapperCol3"
style="margin: -1px; margin-left: -10px"
v-if="zyInfo.sfcc == '1'"
>
<a-input-number
v-model:value="zyInfo.wwtgl"
placeholder="请输入检测通过率"
@ -286,7 +294,13 @@
<template #addonAfter> % </template>
</a-input-number>
</a-form-item>
<a-form-item label="比对库设置" :labelCol="labelCol3" :wrapperCol="wrapperCol3" style="margin-left: -10px" v-if="zyInfo.sfcc=='1'">
<a-form-item
label="比对库设置"
:labelCol="labelCol3"
:wrapperCol="wrapperCol3"
style="margin-left: -10px"
v-if="zyInfo.sfcc == '1'"
>
<div style="padding: 5px 0">维普</div>
<div style="display: flex; flex-direction: column">
<a-checkbox v-model:checked="zyInfo.wwcc" :disabled="editDisabled" style="margin-left: 8px">
@ -566,6 +580,12 @@
<ZyInfoStudentListModal ref="ZyInfoStudentListModalPage" @success="handleSuccess"></ZyInfoStudentListModal>
<ZyInfoStudentModal ref="ZyInfoStudentModalPage"></ZyInfoStudentModal>
<XxhbbksListModal ref="XxhbbksListModalPage"></XxhbbksListModal>
<a-modal v-model:visible="imgvisible" title="图片预览" width="800px" :cancelText="`关闭`" :okButtonProps="{ class: { 'jee-hidden': true } }">
<div style="padding: 15px;text-align: center;">
<img :src="ylimgurl" />
</div>
</a-modal>
</div>
</template>
@ -604,6 +624,7 @@ import ZyInfoStudentListModal from '/@/views/zy/zyInfoStudent/ZyInfoStudentListM
import ZyInfoStudentModal from '/@/views/zy/zyInfoStudent/components/ZyInfoStudentModal.vue';
import XxhbbksListModal from '/@/views/kc/xxhbbks/XxhbbksListModal.vue';
import ZyInfoEditModal from './components/ZyInfoEditModal.vue';
import { encryptByBase64 } from '/@/utils/cipher';
const globSetting = useGlobSetting();
const baseApiUrl = globSetting.domainUrl;
@ -613,7 +634,7 @@ const { query } = unref(currentRoute);
const { rwbh, xqxn, type, teano } = query; //
const APagination = Pagination;
const { createConfirm, createMessage } = useMessage();
const queryParam = ref<any>({});
const queryParam = ref<any>({ rwbh });
const queryParamZy = ref<any>({});
const registerModal = ref();
const current = ref<number>(0);
@ -636,12 +657,14 @@ const zyyqShow = ref<boolean>(false);
const pfbzShow = ref<boolean>(false);
const sfccShow = ref<boolean>(false);
const editDisabled = ref<boolean>(false);
const imgvisible = ref<boolean>(false);
const queryType = ref<string>('');
const dataKhnr = ref<any>([]);
const tableCcjgData = ref<any>([]);
const tableXshpData = ref<any>([]);
const rowSelectionKhnr = ref<any>([]);
const ylimgurl = ref<any>('');
const SzybStudentModalpage = ref();
const registerScoreModal = ref();
@ -704,9 +727,9 @@ function handleEndTime(record) {
zyInfo.value.xshpkssj = record;
}
function handleJscjbfb(){
function handleJscjbfb() {
var list = tableData.value;
var cjbfb = qmkszb.value; //
var cjbfb2 = kczyzb.value; //
var zcj = 0;
@ -718,7 +741,7 @@ function handleJscjbfb(){
createMessage.error('第' + (i + 1) + '次作业总成绩的百分比不能为空!');
break;
}
score22 = parseInt(score22)+parseInt(score);
score22 = parseInt(score22) + parseInt(score);
if (score < 0 || score > 100) {
createMessage.error('作业成绩百分比必须在0-100之间');
break;
@ -728,13 +751,12 @@ function handleJscjbfb(){
break;
}
}
zcj = parseInt(score22)+ parseInt(cjbfb)+ parseInt(cjbfb2);
zcj = parseInt(score22) + parseInt(cjbfb) + parseInt(cjbfb2);
if (zcj > 100) {
createMessage.error('作业总的百分比(课程作业占比+期末考试占比+课堂测验占比已经超过100%,请重新输入');
}
}
//
function handleViewInfo(record) {
defHttp.get({ url: '/zyCcjg/zyCcjg/ccjglist', params: { zyStuId: record.id } }).then((res) => {
@ -850,14 +872,34 @@ function handleDown(text) {
}
//
function yulanFile(record) {
if(record.pdfPath){
console.log('🙇‍♀️', record);
if (record.pdfPath) {
var url2 = getFileAccessHttpUrl(record.pdfPath);
let url = baseApiUrl + '/generic/web/viewer.html?file=' + encodeURIComponent(url2);
window.open(url, '_blank');
}else{
createMessage.error('当前作业不支持预览,请下载后查阅!');
} else {
const parts = record.filePath.split('.');
const filetype = parts[parts.length - 1];
if (filetype == 'jpg' || filetype == 'png' || filetype == 'jpeg' || filetype == 'xls' || filetype == 'xlsx' || filetype == 'text') {
imgvisible.value = true;
var url2 = getFileAccessHttpUrl(record.filePath);
console.log('👀', url2);
ylimgurl.value = url2;
// var file = baseApiUrl + "/"+record.filePath;
// console.log('🤬', file);
// window.open('https://fileview.jeecg.com/onlinePreview?url=' + encodeURIComponent(encryptByBase64(file)));
// var url2 = getFileAccessHttpUrl(record.filePath);
// let url = baseApiUrl + '/generic/web/viewer.html?file=' + encodeURIComponent(url2);
// window.open(url, '_blank');
} else if (filetype == 'doc' || filetype == 'docx' || filetype == 'pdf') {
var url2 = getFileAccessHttpUrl(record.pdfPath);
let url = baseApiUrl + '/generic/web/viewer.html?file=' + encodeURIComponent(url2);
window.open(url, '_blank');
} else {
createMessage.error('当前作业不支持预览,请下载后查阅!');
}
}
}
//
function handleBohui(record: Recordable) {
@ -891,7 +933,7 @@ function handleScoreFabu(record: Recordable) {
});
}
//
function handlepiyue(record: Recordable){
function handlepiyue(record: Recordable) {
registerPiyueModal.value.disableSubmit = false;
registerPiyueModal.value.edit(record);
}
@ -981,7 +1023,7 @@ async function batchHandleFabu() {
}
}
function batchHandleKhcl(){
function batchHandleKhcl() {
if (selectedRowKeys.value.length == 0) {
createMessage.warn('请勾选要上传的数据!');
return;
@ -1053,7 +1095,6 @@ function handleBatchAdd() {
var cjbfb2 = ktcyzb.value; //
var zcj = 0;
var score22 = 0;
if (list.length == 0) {
createMessage.error('作业次数不能为空!');
@ -1072,15 +1113,15 @@ function handleBatchAdd() {
sfjx = 1;
break;
}
score22 = parseInt(score22) + parseInt(score);
score22 = parseInt(score22) + parseInt(score);
if (score22 > 100) {
createMessage.error('作业总的百分比(课程作业占比+期末考试占比+课堂测验占比已经超过100%,请重新输入');
sfjx = 1;
break;
}
}
zcj = parseInt(score22)+ parseInt(cjbfb)+ parseInt(cjbfb2);
zcj = parseInt(score22) + parseInt(cjbfb) + parseInt(cjbfb2);
if (zcj > 100) {
createMessage.error('作业总的百分比(课程作业占比+期末考试占比+课堂测验占比已经超过100%,请重新输入');
@ -1108,14 +1149,14 @@ function handleSzzycs(val) {
defHttp.get({ url: '/zyInfo/zyInfo/zyzb', params: { rwbh, xqxn, teano, zyLeixing: '1' } }).then((res) => {
console.log('😥', res);
var list = res;
for(var i = 0; i < list.length; i++){
if(list[i].zyLeixing == '0'){
kczyzb.value = list[i].score
}else if(list[i].zyLeixing == '1'){
qmkszb.value = list[i].score
}else if(list[i].zyLeixing == '2'){
}else if(list[i].zyLeixing == '3'){
ktcyzb.value = list[i].score
for (var i = 0; i < list.length; i++) {
if (list[i].zyLeixing == '0') {
kczyzb.value = list[i].score;
} else if (list[i].zyLeixing == '1') {
qmkszb.value = list[i].score;
} else if (list[i].zyLeixing == '2') {
} else if (list[i].zyLeixing == '3') {
ktcyzb.value = list[i].score;
}
}
});
@ -1237,7 +1278,8 @@ async function submitForm() {
var aigccc = model.aigccc;
var sfcc = model.sfcc;
console.log('🚶‍♂️', model);
if(sfcc == '1'){//
if (sfcc == '1') {
//
if (wwtgl) {
if ((wwcc == false && xncc == false && nwcc == false && aigccc == false) || (!wwcc && !xncc && !nwcc && !aigccc)) {
createMessage.warning('您设置了检测通过率,但您没有设置查重比对库,请先设置查重比对库!');
@ -1253,14 +1295,14 @@ async function submitForm() {
return;
}
}
}else{//
} else {
//
model.wwtgl = null;
model.wwcc = null;
model.xncc = null;
model.nwcc = null;
model.aigccc = null;
}
var xshpkssj = model.xshpkssj;
var xshpjssj = model.xshpjssj;
@ -1491,6 +1533,19 @@ function handleEdit(record, type) {
}
editDisabled.value = type;
zyInfo.value = record;
console.log('👨‍👦', zyInfo.value);
if (zyInfo.value.xncc == 'false') {
zyInfo.value.xncc = null;
}
if (zyInfo.value.nwcc == 'false') {
zyInfo.value.nwcc = null;
}
if (zyInfo.value.wwcc == 'false') {
zyInfo.value.wwcc = null;
}
if (zyInfo.value.aigccc == 'false') {
zyInfo.value.aigccc = null;
}
dataKhnr.value = [];
var kcnr = zyInfo.value.kcnr;
if (kcnr) {