目录
实验老师编辑好实验任务后,还得将任务发送给选中课程的所有学生
实验老师发布实验
ExMsgMapper.xml:
首先要将此任务是否被学生可见的属性isvisiable设置为"是",然后再将选了这门课的所有学生查询出啦,批量插入到ex_msg表中
ExMsgMapper.xml:
<update id="sendTask">
update ex_msg
set isvisiable = "是"
where id = #{id}
</update>
<select id="getStudent" resultType="org.jeecg.modules.demo.CourseSelect.entity.CourseSelset">
select *
from course_selset
where les_id = #{courseid} and les_ord = #{courseord}
</select>
ExMsgMapper:
void sendTask(@Param("id") String id);
List<CourseSelset> getStudent(@Param("courseid") String courseid,@Param("courseord") String courseord);
IExMsgService:
void sendTask(String id);
List<CourseSelset> getStudent(String courseid, String courseord);
ExMsgServiceImpl:
@RequestMapping(value = "/sendTask",method = RequestMethod.GET)
public Result<Object> sendTask(@RequestParam(name = "id",required = true) String id){
exMsgService.sendTask(id);
return Result.OK();
}
@RequestMapping(value = "getExStudent",method = RequestMethod.GET)
public Result<Object> getExStudent(@RequestParam(name = "extid",required = true) String extid,
@RequestParam(name = "exname",required = true) String exname,
@RequestParam(name = "courseid",required = true) String courseid,
@RequestParam(name = "courseord",required = true) String courseord,
@RequestParam(name = "coursename",required = true) String coursename,
@RequestParam(name = "courseclass",required = true) String courseclass,
@RequestParam(name = "isvisiable",required = true) String isvisiable,
@RequestParam(name = "experimentname",required = true) String experimentname,
@RequestParam(name = "extimes",required = true) String extimes,
@RequestParam(name = "filecontentString",required = true) String filecontentString,
@RequestParam(name = "deadline",required = true) String deadline
) throws ParseException {
//获取所有学生
List<CourseSelset> allStudent = exMsgService.getStudent(courseid,courseord);
List<ExMsg> exMsgList = new ArrayList<>();
//for将所有学生信息插入到exMsgList中
for(int i = 0;i<allStudent.size();i++){
CourseSelset courseSelset = allStudent.get(i);
ExMsg exMsgItem = new ExMsg();
exMsgItem.setExtid(extid);
exMsgItem.setExname(exname);
exMsgItem.setCourseid(courseid);
exMsgItem.setCourseord(courseord);
exMsgItem.setCoursename(coursename);
exMsgItem.setCourseclass(courseclass);
exMsgItem.setExperimentname(experimentname);
exMsgItem.setExtimes(extimes);
exMsgItem.setFilecontentString(filecontentString);
exMsgItem.setIsvisiable(isvisiable);
exMsgItem.setSid(courseSelset.getStuId());
exMsgItem.setStuname(courseSelset.getStuName());
exMsgItem.setIshandle("否");
SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date deadlineTime = formatter.parse(deadline);
exMsgItem.setDeadline(deadlineTime);
exMsgItem.setScorevisiable("否");
exMsgList.add(exMsgItem);
}
//使用saveBatch批量加入
exMsgService.saveBatch(exMsgList);
return Result.OK();
}
ExMsgList.vue:
使用@click="sendTask(record)",点击"发布实验"触发点击事件,调用sendTask,传入选中实验任务的信息
sendTask(record){
if(record.isvisiable != "是"){
getAction("ExMsg/exMsg/sendTask",{id:record.id}).then(res=>{
if(res.success){
this.loadData()
}else{
this.$message.error("操作失败")
}
})
getAction("ExMsg/exMsg/getExStudent",{extid:record.extid,exname:record.exname,courseid:record.courseid,courseord:record.courseord,coursename:record.coursename,courseclass:record.courseclass
,isvisiable:"是",experimentname: record.experimentname,extimes: record.extimes,filecontentString:record.filecontentString,deadline:record.deadline}).then(res=>{
if(res.success){
this.$message.success("操作成功")
this.loadData()
}else{
this.$message.error("操作失败")
}
})
}else{//实验发布后,不能再次发布
this.$message.error("此任务已发布,不可重复发布!")
}
}
},
健壮性
发布后不能再编辑:
handleEdit: function (record) {
//实验老师发布任务后,不可再编辑
if(record.isvisiable == "是"){
this.$message.error("此任务已发布,不可编辑!")
return
}
//excApply提交申请后,isapply值为"是"
if(record.isapply == "是"){
this.$message.error("此任务已申请,不可编辑!")
return
}
this.$refs.modalForm.edit(record);
this.$refs.modalForm.title = "编辑";
this.$refs.modalForm.disableSubmit = false;
},
结果:
2.发布后不能再次发布:
3.实验任务发布后不可删除:
修改JeecgListMixin.js中的handleDelete()方法,当它发布后就不能删除;没有发布九可以删除
handleDelete1: function (id,isvisiable) {
if(isvisiable == "是"){
this.$message.error("此任务已发布,不能删除!")
return
}
if(!this.url.delete){
this.$message.error("请设置url.delete属性!")
return
}
var that = this;
deleteAction(that.url.delete, {id: id}).then((res) => {
if (res.success) {
//重新计算分页问题
that.reCalculatePage(1)
that.$message.success(res.message);
that.loadData();
} else {
that.$message.warning(res.message);
}
});
},
学生提交实验作业
未截止任务
学生界面要获取到任务还没到截止时间的任务,方便学生查看自己需要完成的作业
ExsMsgMapper.xml:
选择截止日期大于等于此时此刻的任务
使用
<select id="getExList" resultType="org.jeecg.modules.demo.ExMsg.entity.ExMsg">
select *
from ex_msg
where sid = #{sid} and isvisiable = "是" and deadline >= #{deadline}
</select>
ExMsgMapper:
List<ExMsg> getExList(@Param("sid") String sid,@Param("deadline") Date deadline);
ExMsgServiceImpl:
@Override
public List<ExMsg> getExList(String sid, Date deadline) {
return this.baseMapper.getExList(sid,deadline);
}
ExMsgController:
使用System.currentTimeMillis()来获得当前事件秒数,再用Date封装转为Date格式,即为当前时间
@RequestMapping(value = "/getExList",method = RequestMethod.GET)
public Result<?> getExList(@RequestParam(name="sid",defaultValue = "1")String sid) throws ParseException {
SysUser sysUser = iFlowThirdService.getLoginUser();
sid = sysUser.getUsername();
Date deadline = new Date(System.currentTimeMillis());
System.out.println(deadline);
List<ExMsg> allList = exMsgService.getExList(sid,deadline);
return Result.ok(allList);
}
将前端StuExMsgList.vue url中list的设置为"/ExMsg/exMsg/getExList"
url: {
list: "/ExMsg/exMsg/getExList",
delete: "/ExMsg/exMsg/delete",
deleteBatch: "/ExMsg/exMsg/deleteBatch",
exportXlsUrl: "/ExMsg/exMsg/exportXls",
importExcelUrl: "ExMsg/exMsg/importExcel",
},
获取到未截止任务需要可以上传实验作业文件,这个时候需要使用JUpload组件
<j-upload v-model="record.homeworkString" :serviceType = '"1"' :recordOne = "record"></j-upload>
在JUpload的props中添加serviceType属性来储存服务类型,props中添加recordOne来储存此行record信息
props:{
serviceType: {
type: String,
default: 'demo',
required: false
},
recordOne:{
type:Object,
default:{},
},
}
在data中添加handleSerType来判断服务类型
data(){
handleSerType:{
homework: "1",
doneHomework:"2"
},
}
"上传文件"按钮只要有添加文件或者删除文件等变动,就会调用handleChange()方法
上传文件直接使用JUpload组件中的handleChange()中,即info.file.status==='done'
上传文件后,如果没提交实验,仍属于未提交作业,因此要修改弹出信息来提示用户
用@click="handleTask(record) ”来设置“提交实验”的点击事件
ExMsgMapper.xml:
<update id="handleHomework">
update ex_msg set homework = #{homework},ishandle = "是"
where sid = #{sid} and courseid = #{courseid} and courseord = #{courseord} and extimes = #{extimes}
</update>
ExMsgContrller:
@RequestMapping(value = "/handleTask",method = RequestMethod.GET)
public Result<Object> handleTask(@RequestParam(name = "courseid",required = true) String courseid,
@RequestParam(name = "courseord",required = true) String courseord,
@RequestParam(name = "extimes",required = true) String extimes,
@RequestParam(name = "homeworkString",required = true) String homeworkString
){
SysUser sysUser = iFlowThirdService.getLoginUser();
String sid = sysUser.getUsername();
try {
byte[] homework = homeworkString.getBytes("UTF-8");
exMsgService.handleHomework(sid,courseid,courseord,extimes,homework);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return Result.OK();
}
StuExMsgList.vue:
handleTask(record){
if(record.ishandle == "是"){
this.$message.error("实验已提交,不可重复提交!")
return
}else if(record.homeworkString == ''){
this.$message.error("不可提交空作业!")
return
}
getAction("ExMsg/exMsg/handleTask",{courseid:record.courseid,courseord:record.courseord,extimes:record.extimes,homeworkString:record.homeworkString}).then(res=>{
if(res.success){
this.$message.success("操作成功")
this.loadData()
}else{
this.$message.error("操作失败")
}
})
},
提交试验后,表格属性会改变
健壮性:
实验提交后不能重复提交:
不可提交空作业:
删除作业
"上传文件"按钮只要有添加文件或者删除文件等变动,就会调用handleChange()方法
此处主要发生移除文件改变,即info.file.status == 'remove',所以要对handleChange()中的此if判断做修改:
handleChange(info) {
if(this.serviceType != this.handleSerType.doneHomework){
console.log("--文件列表改变--")
if(!info.file.status && this.uploadGoOn === false){
info.fileList.pop();
}
let fileList = info.fileList
if(info.file.status==='done'){
if(this.number>0){
fileList = fileList.slice(-this.number);
}
if(info.file.response.success){
fileList = fileList.map((file) => {
if (file.response) {
let reUrl = file.response.message;
file.url = getFileAccessHttpUrl(reUrl);
}
return file;
});
}
this.$message.success(`${info.file.name} 上传成功!`);
}else if (info.file.status === 'error') {
this.$message.error(`${info.file.name} 上传失败.点击‘提交实验’按钮交作业`);
}else if(info.file.status === 'removed'){
this.handleDelete(info.file)
//添加接口来实现删除提交作业的功能
if(this.serviceType == this.handleSerType.homework){
getAction("ExMsg/exMsg/deleteTask",{courseid:this.recordOne.courseid,courseord:this.recordOne.courseord,extimes:this.recordOne.extimes}).then(res=>{
if(res.success){
this.$message.success("操作成功")
loadData()
}else{
this.$message.error("操作失败")
}
})
getAction("ExMsg/exMsg/getAllExList").then(res=>{
if(res.success){
this.$message.success("getList操作成功")
loadData()
}else{
this.$message.error("操作失败")
}
})
}
}
this.fileList = fileList
if(info.file.status==='done' || info.file.status === 'removed'){
//returnUrl为true时仅返回文件路径
if(this.returnUrl){
this.handlePathChange()
}else{
//returnUrl为false时返回文件名称、文件路径及文件大小
this.newFileList = [];
for(var a=0;a<fileList.length;a++){
// update-begin-author:lvdandan date:20200603 for:【TESTA-514】【开源issue】多个文件同时上传时,控制台报错
if(fileList[a].status === 'done' ) {
var fileJson = {
fileName:fileList[a].name,
filePath:fileList[a].response.message,
fileSize:fileList[a].size
};
this.newFileList.push(fileJson);
}else{
return;
}
// update-end-author:lvdandan date:20200603 for:【TESTA-514】【开源issue】多个文件同时上传时,控制台报错
}
this.$emit('change', this.newFileList);
}
}
}else{
this.$message.error("实验已截至,不可修改!");
}
},
this.file.status == 'remove'移除文件判断中调用后端接口先移除任务,再重新连接后端"/ExMsg/exMsg/getExList"获取实验列表
//添加接口来实现删除提交作业的功能
if(this.serviceType == this.handleSerType.homework){
getAction("/ExMsg/exMsg/deleteTask",{courseid:this.recordOne.courseid,courseord:this.recordOne.courseord,extimes:this.recordOne.extimes}).then(res=>{
if(res.success){
this.$message.success("操作成功")
loadData()
}else{
this.$message.error("操作失败")
}
})
getAction("/ExMsg/exMsg/getExList").then(res=>{
if(res.success){
loadData()
}else{
this.$message.error("操作失败")
}
})
}
ExMsgMapper.xml:
<update id="deleteHomework">
update ex_msg set homework = null,ishandle = "否"
where sid = #{sid} and courseid = #{courseid} and courseord = #{courseord} and extimes = #{extimes}
</update>
ExMsgServiceImpl:
@Override
public void deleteHomework(String sid, String courseid, String courseord, String extimes) {
this.baseMapper.deleteHomework(sid,courseid,courseord,extimes);
}
ExMsgController:
@RequestMapping(value = "/deleteTask",method = RequestMethod.GET)
public Result<Object> deleteTask(@RequestParam(name = "courseid",required = true) String courseid,
@RequestParam(name = "courseord",required = true) String courseord,
@RequestParam(name = "extimes",required = true) String extimes
){
SysUser sysUser = iFlowThirdService.getLoginUser();
String sid = sysUser.getUsername();
exMsgService.deleteHomework(sid,courseid,courseord,extimes);
return Result.OK();
}