feat:合并

This commit is contained in:
lixg
2022-12-15 11:59:07 +08:00
11 changed files with 294 additions and 267 deletions

1
.env
View File

@@ -1,6 +1,7 @@
VITE_BASE=/fe-student VITE_BASE=/fe-student
VITE_BASE_API=/ VITE_BASE_API=/
VITE_BASE_LOGIN_URL=https://u-pre.boe.com/web/ VITE_BASE_LOGIN_URL=https://u-pre.boe.com/web/
VITE_PROXY_URL=http://111.231.196.214:30001
VITE_BOE_ONLINE_CLASS_URL=https://u-pre.boe.com/pc/course/studyindex?id= VITE_BOE_ONLINE_CLASS_URL=https://u-pre.boe.com/pc/course/studyindex?id=

View File

@@ -2,7 +2,7 @@
* @Author: lixg lixg@dongwu-inc.com * @Author: lixg lixg@dongwu-inc.com
* @Date: 2022-11-21 17:28:10 * @Date: 2022-11-21 17:28:10
* @LastEditors: lixg lixg@dongwu-inc.com * @LastEditors: lixg lixg@dongwu-inc.com
* @LastEditTime: 2022-12-14 22:48:46 * @LastEditTime: 2022-12-15 11:54:03
* @FilePath: /fe-stu/src/App.vue * @FilePath: /fe-stu/src/App.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
--> -->
@@ -59,8 +59,8 @@ function getUserInfo() {
display: flex; display: flex;
width: 100%; width: 100%;
min-height: 100%; min-height: 100%;
// background-color: rgba(242, 245, 247, 1); background-color: rgba(242, 245, 247, 1);
background-color: #ccc; // background-color: #ccc;
#nav { #nav {
width: 220px; width: 220px;
height: 100%; height: 100%;

View File

@@ -17,10 +17,10 @@ export const LINK_DETAILS = linkId => `/link/getOne?linkId=${linkId} post`
export const PROJECT_PROCESS = '/stu/project/process' export const PROJECT_PROCESS = '/stu/project/process'
export const ROUTER_UNCOMPLETE_LIST = '/stu/router/unCompleteTaskList post' export const ROUTER_UNCOMPLETE_LIST = '/stu/router/unCompleteTaskList post'
export const TAS_ACTIVITY_DETAIL = '/activity' export const TAS_ACTIVITY_DETAIL = '/activity'
export const TASK_ACTIVITY_SIGN = '/activitySubmit/updateActivitySignInStatus post' export const TASK_ACTIVITY_SIGN = '/stu/task/activity/sign post'
export const TASK_BROADCAST_COMMIT = '/stu/task/broadcast/commit' export const TASK_BROADCAST_COMMIT = '/stu/task/broadcast/commit'
export const TASK_BROADCAST_DETAIL = '/liveBroadcast' export const TASK_BROADCAST_DETAIL = '/liveBroadcast'
export const TASK_BROADCAST_SIGN = '/stu/task/broadcast/sign' export const TASK_BROADCAST_SIGN = '/stu/task/broadcast/sign post'
export const TASK_VOTE_COMMIT = '/stu/task/vote/commit' export const TASK_VOTE_COMMIT = '/stu/task/vote/commit'
export const TASK_VOTE_DETAIL = '/stu/task/vote/detail' export const TASK_VOTE_DETAIL = '/stu/task/vote/detail'
export const TASK_WORK_COMMIT = '/workSubmit/submitStudentWorkDetail post' export const TASK_WORK_COMMIT = '/workSubmit/submitStudentWorkDetail post'
@@ -48,7 +48,7 @@ export const COMMENT_PRAISE = '/comment/praise post'
export const COMMENT_COLLECTION = '/comment/collection post' export const COMMENT_COLLECTION = '/comment/collection post'
export const ASSESSMENT_SUBMIT_QUERY = assessmentId => `/assessmentSubmit/queryAssessmentSubmitDetailById?assessmentSubmitId=${assessmentId} post` export const ASSESSMENT_SUBMIT_QUERY = assessmentId => `/assessmentSubmit/queryAssessmentSubmitDetailById?assessmentSubmitId=${assessmentId} post`
export const ASSESSMENT_QUERY = assessmentId => `/assessment/queryAssessmentDetailById?assessmentId=${assessmentId} post` export const ASSESSMENT_QUERY = assessmentId => `/stu/task/evaluate/get`
export const ASSESSMENT_SUBMIT = '/assessmentSubmit/submitAssessmentDetail' export const ASSESSMENT_SUBMIT = '/stu/task/evaluate/commit post'
export const ACTIVITY = '/activity' export const ACTIVITY = '/activity'

View File

@@ -14,8 +14,8 @@
<div class="title">面授课{{ data.planDto?.name }}</div> <div class="title">面授课{{ data.planDto?.name }}</div>
<div class="time" style="margin-top: 26px"> <div class="time" style="margin-top: 26px">
<img <img
style="width: 15px; height: 17px" style="width: 15px; height: 17px"
src="../../assets/image/time.png" src="../../assets/image/time.png"
/> />
<div style="margin-left: 8px"> <div style="margin-left: 8px">
{{ data.offcourseDto?.publishTime }} {{ data.offcourseDto?.publishTime }}
@@ -23,15 +23,15 @@
</div> </div>
<div class="time" style="margin-top: 23px"> <div class="time" style="margin-top: 23px">
<img <img
style="width: 16px; height: 18px" style="width: 16px; height: 18px"
src="../../assets/image/position.png" src="../../assets/image/position.png"
/> />
<div style="margin-left: 8px">{{ data.planDto?.address }}</div> <div style="margin-left: 8px">{{ data.planDto?.address }}</div>
</div> </div>
</div> </div>
<div class="btn" @click="toSurvery" v-if="data.planDto?.evalFlag"> <botton :style="{background:`${data.isSurvery?'#999':'rgb(57, 146, 249)'}`}" class="btn" @click="toSurvery"
评估 >{{ data.isSurvery ? '已评估' : '评估' }}
</div> </botton>
</div> </div>
<!-- 基本信息 --> <!-- 基本信息 -->
@@ -42,8 +42,8 @@
<div class="" style="margin-left: 48px; margin-right: 48px"> <div class="" style="margin-left: 48px; margin-right: 48px">
<div class="title"> <div class="title">
<img <img
style="width: 20px; height: 20px" style="width: 20px; height: 20px"
src="../../assets/image/course.png" src="../../assets/image/course.png"
/> />
<div class="text">课程详情</div> <div class="text">课程详情</div>
<div class="box"></div> <div class="box"></div>
@@ -57,16 +57,16 @@
<el-tabs v-model="activeName" @tab-click="handleClick"> <el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="课程附件" name="first"> <el-tab-pane label="课程附件" name="first">
<div <div
v-for="(el, index) in data.planDto?.attach.split(',')" v-for="(el, index) in data.planDto?.attach.split(',')"
:key="index" :key="index"
v-if="data.planDto" v-if="data.planDto"
class="enclosure" class="enclosure"
:style="{ borderBottom: '1px solid rgba(56, 125, 247, 0.2)' }" :style="{ borderBottom: '1px solid rgba(56, 125, 247, 0.2)' }"
> >
<div class="enclosureL"> <div class="enclosureL">
<FileTypeImg <FileTypeImg
v-model="data.planDto.attach.split(',')[index]" v-model="data.planDto.attach.split(',')[index]"
:style="{ :style="{
width: '22px', width: '22px',
height: '26px', height: '26px',
marginLeft: '10px', marginLeft: '10px',
@@ -76,15 +76,15 @@
</div> </div>
<div class="download"> <div class="download">
<img <img
style="width: 16px; height: 15px" style="width: 16px; height: 15px"
src="../../assets/image/download.png" src="../../assets/image/download.png"
/> />
<div style="margin-left: 5px" @click="download(el)">下载</div> <div style="margin-left: 5px" @click="download(el)">下载</div>
</div> </div>
</div> </div>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="课程作业" name="second"> <el-tab-pane label="课程作业" name="second">
<div class="work"> <div class="work" v-if="data.workDto?.workName ">
<div> <div>
<div class="question">{{ data.workDto?.workName }}</div> <div class="question">{{ data.workDto?.workName }}</div>
<div style="margin-top: 16px; display: flex"> <div style="margin-top: 16px; display: flex">
@@ -98,15 +98,15 @@
</div> </div>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="课程考试" name="third"> <el-tab-pane label="课程考试" name="third">
<div class="work"> <div class="work" v-if="data.examinationDto?.examinationTestName">
<div> <div>
<div class="question"> <div class="question">
{{ data.examinationDto?.examinationTestName }} {{ data.examinationDto?.examinationTestName }}
</div> </div>
<div style="margin-top: 16px; display: flex"> <div style="margin-top: 16px; display: flex">
<div <div
class="tag1" class="tag1"
v-if="data.examinationDto?.examinationFlag" v-if="data.examinationDto?.examinationFlag"
> >
必修 必修
</div> </div>
@@ -124,15 +124,15 @@
<div class="teacher"> <div class="teacher">
<div class="title"> <div class="title">
<img <img
style="width: 21px; height: 23px" style="width: 21px; height: 23px"
src="../../assets/image/livelecturer.png" src="../../assets/image/livelecturer.png"
/> />
<div class="text">直播讲师</div> <div class="text">直播讲师</div>
<div class="box"></div> <div class="box"></div>
</div> </div>
<!-- todo #面授课接口 讲师缺少img和介绍--> <!-- todo #面授课接口 讲师缺少img和介绍-->
<div class="teacheritem"> <div class="teacheritem">
<img class="peopleimg" :src="userAvatar" /> <img class="peopleimg" :src="userAvatar"/>
<div style="margin-left: 17px; width: 190px"> <div style="margin-left: 17px; width: 190px">
<div class="teacherName" style="margin-right: 5px"> <div class="teacherName" style="margin-right: 5px">
{{ data.planDto?.teacher }} {{ data.planDto?.teacher }}
@@ -148,29 +148,29 @@
</template> </template>
<script setup> <script setup>
import { computed, reactive, toRefs, watch } from "vue"; import {computed, reactive, toRefs, watch} from "vue";
import FileTypeImg from "@/components/FileTypeImg.vue"; import FileTypeImg from "@/components/FileTypeImg.vue";
import { request, useRequest } from "@/api/request"; import {request, useRequest} from "@/api/request";
import { STU_OFFCOURSE_DETAIL } from "@/api/api"; import {STU_OFFCOURSE_DETAIL} from "@/api/api";
import { useRoute, useRouter } from "vue-router"; import {useRoute, useRouter} from "vue-router";
import { useUserInfo } from "@/api/utils"; import {useUserInfo} from "@/api/utils";
const router = useRouter(); const router = useRouter();
const { const {
query: { courseId, type }, query: {courseId, type},
} = useRoute(); } = useRoute();
const { data } = useRequest(STU_OFFCOURSE_DETAIL, { courseId }); const {data} = useRequest(STU_OFFCOURSE_DETAIL, {courseId});
const { avatar: userAvatar } = useUserInfo( const {avatar: userAvatar} = useUserInfo(
computed(() => data.value?.planDto?.teacherId) computed(() => data.value?.planDto?.teacherId)
); );
const state = reactive({ const state = reactive({
activeName: "first", activeName: "first",
enclosure: "", enclosure: "",
}); });
const { activeName, enclosure } = toRefs(state); const {activeName, enclosure} = toRefs(state);
const handleClick = (tab, event) => { const handleClick = (tab, event) => {
console.log(tab, event); console.log(tab, event);
}; };
@@ -179,9 +179,12 @@ const download = (url) => {
}; };
function toSurvery() { function toSurvery() {
if (data.value.isSurvery) {
return
}
router.push({ router.push({
path: "/surveydetail", path: "/surveydetail",
query: { courseId: data.value.planDto.evaluateId }, query: {courseId: data.value.planDto.evaluateId},
}); });
} }
@@ -197,7 +200,7 @@ function toWork() {
} }
function toExamItem(obj) { function toExamItem(obj) {
router.push({ path: "/starttest", query: { id: obj.courseId } }); router.push({path: "/starttest", query: {id: obj.courseId}});
} }
</script> </script>

View File

@@ -24,7 +24,7 @@
<div class="detail"> <div class="detail">
<div class="detailT"> <div class="detailT">
<div <div
style=" style="
margin-left: 45px; margin-left: 45px;
margin-right: 42px; margin-right: 42px;
position: relative; position: relative;
@@ -33,8 +33,8 @@
> >
<div class="title"> <div class="title">
<img <img
style="width: 20px; height: 20px" style="width: 20px; height: 20px"
src="../../assets/image/yuan.png" src="../../assets/image/yuan.png"
/> />
<div class="text">作业名称</div> <div class="text">作业名称</div>
<div class="box"></div> <div class="box"></div>
@@ -48,52 +48,52 @@
</div> </div>
<UploadImg v-model="fileList" ref="uploadRef"> <UploadImg v-model="fileList" ref="uploadRef">
<button <button
class="shangchuan" class="shangchuan"
style="cursor: pointer" style="cursor: pointer"
@mousemove="showFileList = 1" @mousemove="showFileList = 1"
@mouseout="showFileList = 0" @mouseout="showFileList = 0"
> >
上传 上传
</button> </button>
</UploadImg> </UploadImg>
<div <div
class="uploadDetail" class="uploadDetail"
:style="{ display: showFileList ? 'block' : 'none' }" :style="{ display: showFileList ? 'block' : 'none' }"
@mousemove="showFileList = 1" @mousemove="showFileList = 1"
@mouseout="showFileList = 0" @mouseout="showFileList = 0"
style="padding-top: 60px" style="padding-top: 60px"
> >
<div class="triangle"></div> <div class="triangle"></div>
<div class="square clearfix"> <div class="square clearfix">
<div <div
class="squarecontent1" class="squarecontent1"
v-for="(file, i) in fileList" v-for="(file, i) in fileList"
:key="i" :key="i"
> >
<FileTypeImg <FileTypeImg
v-model="file.name" v-model="file.name"
:style="{ margin: '12px 15px 0 27px' }" :style="{ margin: '12px 15px 0 27px' }"
></FileTypeImg> ></FileTypeImg>
<div class="rarDetail"> <div class="rarDetail">
<span class="detail1" style="margin-right: 130px"> <span class="detail1" style="margin-right: 130px">
{{ file.name }} {{ file.name }}
</span> </span>
<span class="detail2" style="margin-right: 10px" <span class="detail2" style="margin-right: 10px"
>{{ file.percentage }}%</span >{{ file.percentage }}%</span
> >
<span class="detail1">{{ <span class="detail1">{{
{ {
ready: "正在上传", ready: "正在上传",
abort: "暂停", abort: "暂停",
uploading: "正在上传", uploading: "正在上传",
fail: "上传失败", fail: "上传失败",
success: "上传成功", success: "上传成功",
}[file.status] }[file.status]
}}</span> }}</span>
<div class="progress"> <div class="progress">
<div <div
class="progressinner" class="progressinner"
:style="{ width: `${(291 * file.percentage) / 100}px` }" :style="{ width: `${(291 * file.percentage) / 100}px` }"
></div> ></div>
</div> </div>
</div> </div>
@@ -124,8 +124,8 @@
<div class="title"> <div class="title">
<img <img
style="width: 20px; height: 20px" style="width: 20px; height: 20px"
src="../../assets/image/yuan.png" src="../../assets/image/yuan.png"
/> />
<div class="text">作业内容</div> <div class="text">作业内容</div>
<div class="box"></div> <div class="box"></div>
@@ -133,11 +133,10 @@
<div class="join"> <div class="join">
<el-input <el-input
v-model="textarea1" v-model="sbValue.content"
:autosize="{ minRows: 12.5, maxRows: 12.5 }" :autosize="{ minRows: 12.5, maxRows: 12.5 }"
resize="none" resize="none"
type="textarea" type="textarea"
@input="textareaInput"
/> />
</div> </div>
<div style="display: flex; justify-content: center"> <div style="display: flex; justify-content: center">
@@ -148,8 +147,8 @@
<div class="title" style="margin-top: 0px"> <div class="title" style="margin-top: 0px">
<img <img
style="width: 20px; height: 20px" style="width: 20px; height: 20px"
src="../../assets/image/yuan.png" src="../../assets/image/yuan.png"
/> />
<div class="text">历史纪录</div> <div class="text">历史纪录</div>
<div class="box"></div> <div class="box"></div>
@@ -161,10 +160,10 @@
<div class="content2">作业内容</div> <div class="content2">作业内容</div>
</div> </div>
<div <div
v-for="(value, index) in submitList" v-for="(value, index) in submitList"
:key="index" :key="index"
class="historytitle2" class="historytitle2"
:style="{ :style="{
'border-bottom': 'border-bottom':
index === submitList.length - 1 index === submitList.length - 1
? '1px solid rgba(215, 229, 253, 0)' ? '1px solid rgba(215, 229, 253, 0)'
@@ -174,7 +173,7 @@
<div class="content1">{{ value.createTime }}</div> <div class="content1">{{ value.createTime }}</div>
<div class="content2"> <div class="content2">
<div <div
style=" style="
width: 95%; width: 95%;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
@@ -192,8 +191,8 @@
<div class="right"> <div class="right">
<div class="righttitle"> <div class="righttitle">
<img <img
style="width: 20px; height: 20px" style="width: 20px; height: 20px"
src="../../assets/image/yuan.png" src="../../assets/image/yuan.png"
/> />
<div class="text">截止时间</div> <div class="text">截止时间</div>
<div class="box"></div> <div class="box"></div>
@@ -210,21 +209,21 @@
<div class="endtimetext"> <div class="endtimetext">
距离结束还有&nbsp;&nbsp; 距离结束还有&nbsp;&nbsp;
<span class="te">{{ <span class="te">{{
parseInt( parseInt(
dayjs(data?.submitEndTime).diff(dayjs(), "minute") / 60 dayjs(data?.submitEndTime).diff(dayjs(), "minute") / 60
) )
}}</span }}</span
>&nbsp;&nbsp; 小时&nbsp;&nbsp;<span class="te">{{ >&nbsp;&nbsp; 小时&nbsp;&nbsp;<span class="te">{{
dayjs(data?.submitEndTime).diff(dayjs(), "minute") % 60 dayjs(data?.submitEndTime).diff(dayjs(), "minute") % 60
}}</span }}</span
>&nbsp;&nbsp;分钟 >&nbsp;&nbsp;分钟
</div> </div>
</div> </div>
</div> </div>
<div class="righttitle"> <div class="righttitle">
<img <img
style="width: 20px; height: 20px" style="width: 20px; height: 20px"
src="../../assets/image/yuan.png" src="../../assets/image/yuan.png"
/> />
<div class="text">作业说明</div> <div class="text">作业说明</div>
@@ -233,9 +232,9 @@
<div class="explain clearfix"> <div class="explain clearfix">
<!-- todo #作业任务详情 作业说明是作业要求字段么--> <!-- todo #作业任务详情 作业说明是作业要求字段么-->
<div <div
class="explain1" class="explain1"
style="margin-top: 26px" style="margin-top: 26px"
v-html="data?.workRequirement" v-html="data?.workRequirement"
></div> ></div>
</div> </div>
</div> </div>
@@ -245,8 +244,8 @@
</template> </template>
<script setup> <script setup>
import { reactive, ref, toRefs } from "vue"; import {reactive, ref, toRefs} from "vue";
import { request, useRequest } from "@/api/request"; import {request, useRequest} from "@/api/request";
import { import {
TASK_WORK_COMMIT, TASK_WORK_COMMIT,
TASK_WORK_DETAIL, TASK_WORK_DETAIL,
@@ -254,40 +253,41 @@ import {
WORK_HISTROY, WORK_HISTROY,
} from "@/api/api"; } from "@/api/api";
import dayjs from "dayjs"; import dayjs from "dayjs";
import { useRouter } from "vue-router"; import {useRouter} from "vue-router";
import UploadImg from "@/components/img/UploadImg.vue"; import UploadImg from "@/components/img/UploadImg.vue";
import FileTypeImg from "@/components/FileTypeImg.vue"; import FileTypeImg from "@/components/FileTypeImg.vue";
import { useRoute } from "vue-router/dist/vue-router"; import {useRoute} from "vue-router/dist/vue-router";
const fileList = ref([]); const fileList = ref([]);
const uploadRef = ref(); const uploadRef = ref();
const showFileList = ref(0); const showFileList = ref(0);
const state = reactive({ const sbValue = ref({
textarea1: "", content: '',
}); attach: ''
const { textarea1 } = toRefs(state); })
const router = useRouter(); const router = useRouter();
const { const {
query: { courseId: workId, type, id: taskId }, query: {courseId: workId, type, id: taskId},
} = useRoute(); } = useRoute();
const { data } = useRequest(TASK_WORK_DETAIL, { workId, taskId }); const {data} = useRequest(TASK_WORK_DETAIL, {workId, taskId});
const { data: submitList } = useRequest(TASK_WORK_SUBMIT_LIST, { workId }); const {data: submitList} = useRequest(TASK_WORK_SUBMIT_LIST, {workerId:workId});
const handleClick = () => { const handleClick = () => {
console.log(sbValue.value)
console.log(fileList)
request(TASK_WORK_COMMIT, { request(TASK_WORK_COMMIT, {
projectOrRouterLogo: type, projectOrRouterLogo: type,
workUploadContent: textarea1.value, workUploadContent: sbValue.value.content,
workUploadAddress: fileList.value.map(e => e.url).join(',') || '',
workId, workId,
type,
taskId, taskId,
}).then((res) => { }).then((res) => {
submitList.value.unshift(res.data); submitList.value.unshift(res.data);
}); });
textarea1.value = ""; sbValue.value.content = "";
};
const textareaInput = (e) => {
state.textarea1 = e;
}; };
function remove(i) { function remove(i) {
@@ -701,25 +701,25 @@ function reUpload(i) {
.allbox1 { .allbox1 {
background: linear-gradient( background: linear-gradient(
0deg, 0deg,
rgba(160, 193, 230, 0) 0%, rgba(160, 193, 230, 0) 0%,
rgba(161, 195, 231, 0.2) 100% rgba(161, 195, 231, 0.2) 100%
); );
} }
.allbox2 { .allbox2 {
background: linear-gradient( background: linear-gradient(
0deg, 0deg,
rgba(177, 219, 229, 0) 0%, rgba(177, 219, 229, 0) 0%,
rgba(172, 216, 227, 0.2) 100% rgba(172, 216, 227, 0.2) 100%
); );
} }
.allbox3 { .allbox3 {
background: linear-gradient( background: linear-gradient(
0deg, 0deg,
rgba(195, 209, 234, 0) 0%, rgba(195, 209, 234, 0) 0%,
rgba(191, 206, 231, 0.2) 100% rgba(191, 206, 231, 0.2) 100%
); );
} }

View File

@@ -34,8 +34,8 @@
<!-- todo #直播详情 没有位置字段--> <!-- todo #直播详情 没有位置字段-->
<!-- <div class="time" style="margin-top: 23px"> <!-- <div class="time" style="margin-top: 23px">
<img <img
style="width: 16px; height: 18px" style="width: 16px; height: 18px"
src="../../assets/image/position.png" src="../../assets/image/position.png"
/> />
<div style="margin-left: 8px">{{ data?.activityAddress }}</div> <div style="margin-left: 8px">{{ data?.activityAddress }}</div>
@@ -50,14 +50,19 @@
</botton> </botton>
<botton <botton
class="btn" class="btn"
style="background: rgb(57, 146, 249)" :style="{
background: `${data.signFlag ? '#999' : 'rgb(57, 146, 249)'}`,
}"
@click="signClick" @click="signClick"
v-if="!data.signFlag" >{{ data.signFlag ? "已签到" : "签到" }}
>签到
</botton> </botton>
<botton
<botton class="btn" @click="commitClick" v-if="!data.evalFlag" :style="{
>评估 background: `${data.isSurvery ? '#999' : 'rgb(57, 146, 249)'}`,
}"
class="btn"
@click="commitClick"
>{{ data.isSurvery ? "已评估" : "评估" }}
</botton> </botton>
</div> </div>
</div> </div>
@@ -79,24 +84,27 @@
<div style="display: flex; align-items: center"> <div style="display: flex; align-items: center">
<!-- todo #直播 没有课前预习字段--> <!-- todo #直播 没有课前预习字段-->
<div class="content"> <div class="content">
{{ data?.liveExplain }} {{ data.liveExplain }}
</div> </div>
</div> </div>
<div class="title"> <!-- <div class="title">-->
<img <!-- <img-->
style="width: 20px; height: 20px" <!-- style="width: 20px; height: 20px"-->
src="../../assets/image/write.png" <!-- src="../../assets/image/write.png"-->
/> <!-- />-->
<!-- todo #直播 课后作业--> <!-- &lt;!&ndash; todo #直播 课后作业&ndash;&gt;-->
<div class="text">回放链接</div> <!-- <div class="text">课后作业</div>-->
<div class="box"></div> <!-- <div class="box"></div>-->
</div> <!-- </div>-->
<div style="display: flex; align-items: center"> <!-- <div style="display: flex; align-items: center">-->
<div class="content"> <!-- <div class="content">-->
{{ data?.livePlaybackLink ? data?.livePlaybackLink : "-" }} <!-- <span style="font-weight: 600"-->
</div> <!-- >网易有道词典现有功能结构拆解+问题分析</span-->
</div> <!-- ><br/>-->
<!-- 查找资料介绍一种国外日本美国欧洲道路公路铁路城市道路地铁设计规范的演变过程可以一种或几种主要技术指标为例并说明其原因<br/>-->
<!-- </div>-->
<!-- </div>-->
</div> </div>
</div> </div>
</div> </div>
@@ -150,14 +158,15 @@ import { TASK_BROADCAST_DETAIL, TASK_BROADCAST_SIGN } from "@/api/api";
import { useRoute } from "vue-router/dist/vue-router"; import { useRoute } from "vue-router/dist/vue-router";
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
import { useUserInfo } from "@/api/utils"; import { useUserInfo } from "@/api/utils";
import { ElMessage } from "element-plus";
const { const {
query: { courseId }, query: { courseId: liveId, id: taskId, type },
} = useRoute(); } = useRoute();
const router = useRouter(); const router = useRouter();
const { data } = useRequest(TASK_BROADCAST_DETAIL, { liveId: courseId }); const { data } = useRequest(TASK_BROADCAST_DETAIL, { liveId });
console.log("datadatadatadata", data, courseId);
const { avatar: userAvatar } = useUserInfo( const { avatar: userAvatar } = useUserInfo(
computed(() => data.value.userInfoBo?.userId) computed(() => data.value.userInfoBo?.userId)
); );
@@ -176,10 +185,17 @@ const state = reactive({
}); });
const { activeName, teacher } = toRefs(state); const { activeName, teacher } = toRefs(state);
const signClick = () => { const signClick = () => {
if (data.value.signFlag) {
return;
}
data.value.signFlag = 1; data.value.signFlag = 1;
request(TASK_BROADCAST_SIGN, { courseId: liveId }); ElMessage.info("签到成功");
request(TASK_BROADCAST_SIGN, { courseId: liveId, taskId, type });
}; };
const commitClick = () => { const commitClick = () => {
if (data.value.isSurvery) {
return;
}
router.push({ router.push({
path: "/surveydetail", path: "/surveydetail",
query: { courseId: data.value.assessmentId }, query: { courseId: data.value.assessmentId },

View File

@@ -24,8 +24,8 @@
<div class="title">{{ data?.activityName }}</div> <div class="title">{{ data?.activityName }}</div>
<div class="time" style="margin-top: 26px"> <div class="time" style="margin-top: 26px">
<img <img
style="width: 15px; height: 17px" style="width: 15px; height: 17px"
src="../../assets/image/time.png" src="../../assets/image/time.png"
/> />
<div style="margin-left: 8px"> <div style="margin-left: 8px">
{{ data?.activityStartTime + "-" + data?.activityEndTime }} {{ data?.activityStartTime + "-" + data?.activityEndTime }}
@@ -33,13 +33,18 @@
</div> </div>
<div class="time" style="margin-top: 23px"> <div class="time" style="margin-top: 23px">
<img <img
style="width: 16px; height: 18px" style="width: 16px; height: 18px"
src="../../assets/image/position.png" src="../../assets/image/position.png"
/> />
<div style="margin-left: 8px">{{ data?.activityAddress }}</div> <div style="margin-left: 8px">{{ data?.activityAddress }}</div>
</div> </div>
</div> </div>
<div class="btn" v-if="!data.activityFlag" @click="signClick">签到</div> <botton
class="btn"
:style="{background:`${data.signFlag?'#999':'rgb(57, 146, 249)'}`}"
@click="signClick"
>{{ data.signFlag ? '已签到' : '签到' }}
</botton>
</div> </div>
<!-- 基本信息 --> <!-- 基本信息 -->
@@ -50,8 +55,8 @@
<div style="margin-left: 48px; margin-right: 48px"> <div style="margin-left: 48px; margin-right: 48px">
<div class="title"> <div class="title">
<img <img
style="width: 20px; height: 20px" style="width: 20px; height: 20px"
src="../../assets/image/book.png" src="../../assets/image/book.png"
/> />
<div class="text">活动详情</div> <div class="text">活动详情</div>
<div class="box"></div> <div class="box"></div>
@@ -62,8 +67,8 @@
<div class="content"> <div class="content">
{{ {{
data?.activityDuration data?.activityDuration
? data?.activityDuration + "分钟" ? data?.activityDuration + "分钟"
: "-" : "-"
}} }}
</div> </div>
</div> </div>
@@ -78,15 +83,15 @@
<div class="content"> <div class="content">
{{ {{
data?.beforeSignIn data?.beforeSignIn
? "开始前" + data?.beforeSignIn + "分钟开始签到" ? "开始前" + data?.beforeSignIn + "分钟开始签到"
: "-" : "-"
}} }}
</div> </div>
<div class="content"> <div class="content">
{{ {{
data?.afterSignIn data?.afterSignIn
? "开始后" + data?.afterSignIn + "分钟结束签到" ? "开始后" + data?.afterSignIn + "分钟结束签到"
: "-" : "-"
}} }}
</div> </div>
</div> </div>
@@ -109,8 +114,8 @@
<div class="teacher"> <div class="teacher">
<div class="title"> <div class="title">
<img <img
style="width: 24px; height: 20px" style="width: 24px; height: 20px"
src="../../assets/image/call.png" src="../../assets/image/call.png"
/> />
<div class="text">活动公告</div> <div class="text">活动公告</div>
<div class="box"></div> <div class="box"></div>
@@ -126,22 +131,26 @@
</template> </template>
<script setup> <script setup>
import { TAS_ACTIVITY_DETAIL, TASK_ACTIVITY_SIGN, ACTIVITY } from "@/api/api"; import {TAS_ACTIVITY_DETAIL, TASK_ACTIVITY_SIGN, ACTIVITY} from "@/api/api";
import { request, useRequest } from "@/api/request"; import {request, useRequest} from "@/api/request";
import { useRoute } from "vue-router/dist/vue-router"; import {useRoute} from "vue-router/dist/vue-router";
import {ElMessage} from "element-plus";
const { const {
query: { courseId: activityId }, query: {courseId: activityId},
} = useRoute(); } = useRoute();
const { data } = useRequest(ACTIVITY, { activityId }); const {data} = useRequest(ACTIVITY, {activityId});
console.log("data", data);
const signClick = (tab, event) => { const signClick = (tab, event) => {
if (data.value.signFlag) {
return;
}
data.value.signFlag = true
ElMessage.info("签到成功");
request(TASK_ACTIVITY_SIGN, { request(TASK_ACTIVITY_SIGN, {
activitySubmitId: data.activityId, courseId: activityId,
signInStatus: 1, })
}).then((res) => {
data.value.activityFlag = 1;
});
}; };
</script> </script>
@@ -269,12 +278,14 @@ const signClick = (tab, event) => {
left: 23px; left: 23px;
top: 53px; top: 53px;
} }
.activedetail { .activedetail {
margin-top: 30px; margin-top: 30px;
font-size: 14px; font-size: 14px;
font-weight: 500; font-weight: 500;
color: #333330; color: #333330;
line-height: 36px; line-height: 36px;
.content { .content {
color: #677d86; color: #677d86;
} }
@@ -412,9 +423,9 @@ const signClick = (tab, event) => {
background-color: rgba(255, 255, 255, 1); background-color: rgba(255, 255, 255, 1);
border-radius: 8px; border-radius: 8px;
background: linear-gradient( background: linear-gradient(
180deg, 180deg,
rgba(36, 120, 255, 0.15) 0%, rgba(36, 120, 255, 0.15) 0%,
rgba(255, 255, 255) 50% rgba(255, 255, 255) 50%
); );
.title { .title {

View File

@@ -307,7 +307,7 @@ import medal2 from "@/assets/image/medal/medal2.png";
import medal3 from "@/assets/image/medal/medal3.png"; import medal3 from "@/assets/image/medal/medal3.png";
import img from "@/assets/image/uploadimg.png"; import img from "@/assets/image/uploadimg.png";
import { useRequest, request } from "@/api/request"; import { useRequest, request } from "@/api/request";
import { PROJECT_PROCESS, ROUTER_PROCESS } from "@/api/api"; import { PROJECT_PROCESS, ROUTER_PROCESS, LINK_DETAILS } from "@/api/api";
import { useRoute, useRouter } from "vue-router"; import { useRoute, useRouter } from "vue-router";
const { const {

View File

@@ -116,7 +116,13 @@
}" }"
@click="toFinish(value)" @click="toFinish(value)"
> >
{{ types.path[value.type] ? types.toName[value.type] : "未开放" }} {{
value.status === 1
? "已完成"
: types.path[value.type]
? types.toName[value.type]
: "未开放"
}}
</div> </div>
<!-- <div :style="{ display: value.status === 1 ? 'block' : 'none' }">--> <!-- <div :style="{ display: value.status === 1 ? 'block' : 'none' }">-->
<!-- <div--> <!-- <div-->
@@ -352,8 +358,6 @@ const {
} = useRoute(); } = useRoute();
const router = useRouter(); const router = useRouter();
const { data } = useRequest(ROUTER_PROCESS, { routerId }); const { data } = useRequest(ROUTER_PROCESS, { routerId });
console.log("datadata", data);
const { avatar: userAvatar } = useUserInfo( const { avatar: userAvatar } = useUserInfo(
computed(() => data.value?.userInfoBo?.userId) computed(() => data.value?.userInfoBo?.userId)
); );
@@ -603,7 +607,6 @@ function toFinish(d) {
if (types.value.path[d.type] && types.value.path[d.type].startsWith("http")) { if (types.value.path[d.type] && types.value.path[d.type].startsWith("http")) {
//配置文件 //配置文件
const url = types.value.path[d.type] + d.targetId; const url = types.value.path[d.type] + d.targetId;
console.log("url", d, url);
import.meta.env.DEV import.meta.env.DEV
? (window.location.href = url) ? (window.location.href = url)
: (window.parent.location.href = url); : (window.parent.location.href = url);

View File

@@ -2,7 +2,7 @@
<div class="surveydetail" style="padding: 30px"> <div class="surveydetail" style="padding: 30px">
<!-- 面包屑导航 --> <!-- 面包屑导航 -->
<div <div
style="display: flex; align-items: center; justify-content: space-between" style="display: flex; align-items: center; justify-content: space-between"
> >
<div class="crumb"> <div class="crumb">
<div>混合制项目</div> <div>混合制项目</div>
@@ -14,16 +14,16 @@
<div class="prevnext"> <div class="prevnext">
<div class="prev"> <div class="prev">
<img <img
style="width: 23px; height: 23px" style="width: 23px; height: 23px"
src="../../assets/image/prev.png" src="../../assets/image/prev.png"
/> />
<div style="margin-left: 7px">上一个</div> <div style="margin-left: 7px">上一个</div>
</div> </div>
<div class="prev" style="margin-left: 31px"> <div class="prev" style="margin-left: 31px">
<div style="margin-right: 7px">下一个</div> <div style="margin-right: 7px">下一个</div>
<img <img
style="width: 23px; height: 23px" style="width: 23px; height: 23px"
src="../../assets/image/next.png" src="../../assets/image/next.png"
/> />
</div> </div>
</div> </div>
@@ -36,23 +36,23 @@
<div class="bascinfo"> <div class="bascinfo">
<div> <div>
<div <div
class="question" class="question"
v-for="(value, index) in data.scoringQuestionVoList" v-for="(value, index) in data.scoringQuestionVoList"
:key="index" :key="index"
:style="{ 'margin-top': index === 0 ? '57px' : '41px' }" :style="{ 'margin-top': index === 0 ? '57px' : '41px' }"
> >
<div class="text">{{ value.assessmentScTitle }}</div> <div class="text">{{ value.assessmentScTitle }}</div>
<div class="answer"> <div class="answer">
<div class="answerL">完全没用</div> <div class="answerL">完全没用</div>
<div class="answerC"> <div class="answerC">
<div <div
class="answerCitem" class="answerCitem"
v-for="(item, key) in Array.from( v-for="(item, key) in Array.from(
{ length: value.assessmentMaxScore }, { length: value.assessmentMaxScore },
(k, i) => i (k, i) => i
)" )"
:key="key" :key="key"
:style="{ :style="{
'margin-left': key === 0 ? '15px' : '10px', 'margin-left': key === 0 ? '15px' : '10px',
background: background:
value.selectAnswer === item value.selectAnswer === item
@@ -63,7 +63,7 @@
? '#fff' ? '#fff'
: 'rgba(86, 163, 249, 1)', : 'rgba(86, 163, 249, 1)',
}" }"
@click=" @click="
() => { () => {
value.selectAnswer = item; value.selectAnswer = item;
} }
@@ -76,23 +76,20 @@
</div> </div>
</div> </div>
<div <div
class="question" class="question"
style="margin-top: 41px" style="margin-top: 41px"
v-for="(item, i) in data.singleStemVoList" v-for="(item, i) in data.assessmentSingleChoiceDtoList"
:key="i" :key="i"
> >
<div class="text">{{ item.singleStemName }}</div> <div class="text">{{ item.singleStemName }}</div>
<div <div
v-for="(value, index) in item.assessmentSingleChoiceVoList" v-for="(value, index) in item.assessmentSingleChoiceDtoList"
:key="index" :key="index"
style="display: flex; align-items: center" style="display: flex; align-items: center"
:style="{ :style="{'margin-top': index === 0 ? '29px' : '22px',cursor: 'pointer'}"
'margin-top': index === 0 ? '29px' : '22px', @click="
cursor: 'pointer',
}"
@click="
() => { () => {
item.assessmentSingleChoiceVoList.forEach((e) => { item.assessmentSingleChoiceDtoList.forEach((e) => {
e.select = false; e.select = false;
}); });
value.select = true; value.select = true;
@@ -100,56 +97,57 @@
" "
> >
<img <img
style="width: 19px; height: 18px; cursor: pointer" style="width: 19px; height: 18px; cursor: pointer"
:src="value.select ? checkbox : checkbox2" :src="value.select ? checkbox : checkbox2"
/> />
<div class="people">{{ value.singleOptionName }}</div> <div class="people">{{ value.singleOptionName }}</div>
</div> </div>
</div> </div>
<div <div
class="question" class="question"
style="margin-top: 41px" style="margin-top: 41px"
v-for="(item, i) in data.multipleStemVoList" v-for="(item, i) in data.multipleStemVoList"
:key="i" :key="i"
> >
<div class="text">{{ item.multipleStemName }}</div> <div class="text">{{ item.multipleStemName }}</div>
<div <div
v-for="(value, index) in item.multipleChoiceVoList" v-for="(value, index) in item.multipleChoiceVoList"
:key="index" :key="index"
style="display: flex; align-items: center" style="display: flex; align-items: center"
:style="{ :style="{
'margin-top': index === 0 ? '29px' : '22px', 'margin-top': index === 0 ? '29px' : '22px',
cursor: 'pointer', cursor: 'pointer',
}" }"
@click="() => (value.select = !value.select)" @click="() => (value.select = !value.select)"
> >
<img <img
style="width: 19px; height: 18px; cursor: pointer" style="width: 19px; height: 18px; cursor: pointer"
:src="value.select ? checkbox : checkbox2" :src="value.select ? checkbox : checkbox2"
/> />
<div class="people">{{ value.multipleOptionName }}</div> <div class="people">{{ value.multipleOptionName }}</div>
</div> </div>
</div> </div>
<div <div
class="question" class="question"
style="margin-top: 41px" style="margin-top: 41px"
v-for="(item, i) in data.essayQuestionVoList" v-for="(item, i) in data.essayQuestionVoList"
:key="i" :key="i"
> >
<div class="text">{{ item.assessmentQaTitle }}</div> <div class="text">{{ item.assessmentQaTitle }}</div>
<div style="width: 713px; margin-top: 31px; position: relative"> <div style="width: 713px; margin-top: 31px; position: relative">
<el-input <el-input
v-model="item.content" v-model="item.content"
:autosize="{ minRows: 5, maxRows: 5 }" :autosize="{ minRows: 5, maxRows: 5 }"
resize="none" resize="none"
maxlength="200" maxlength="200"
type="textarea" type="textarea"
/> />
<div class="words">{{ item.content?.length || 0 }}/200</div> <div class="words">{{ item.content?.length || 0 }}/200</div>
</div> </div>
</div> </div>
<div style="display: flex; justify-content: center"> <div style="display: flex; justify-content: center"
v-if="data.assessmentEssayQuestionDtoList?.length || data.assessmentMultipleChoiceDtoList?.length || data.assessmentSingleChoiceDtoList?.length || data.assessmentScoringQuestionDtoList?.length">
<div class="submit" @click="submit">提交</div> <div class="submit" @click="submit">提交</div>
</div> </div>
</div> </div>
@@ -161,25 +159,24 @@
<script setup> <script setup>
import checkbox from "@/assets/image/checkbox.png"; import checkbox from "@/assets/image/checkbox.png";
import checkbox2 from "@/assets/image/checkbox2.png"; import checkbox2 from "@/assets/image/checkbox2.png";
import { useRoute } from "vue-router/dist/vue-router"; import {useRoute} from "vue-router/dist/vue-router";
import { request, usePage, useRequest } from "@/api/request"; import {request, usePage, useRequest} from "@/api/request";
import { import {
ASSESSMENT_QUERY, ASSESSMENT_QUERY,
ASSESSMENT_SUBMIT, ASSESSMENT_SUBMIT,
COMMENT_LIST,
DISCUSS_DETAIL,
} from "@/api/api"; } from "@/api/api";
import {ElMessage} from "element-plus";
const { const {
query: { courseId }, query: {courseId},
} = useRoute(); } = useRoute();
const { data } = useRequest(ASSESSMENT_QUERY(courseId), {}); const {data} = useRequest(ASSESSMENT_QUERY(courseId), {id:courseId});
function submit() { function submit() {
request(ASSESSMENT_SUBMIT, data).then(() => { request(ASSESSMENT_SUBMIT, {assessmentId: courseId, result: JSON.stringify(data.value)})
console.log("提交成功"); ElMessage.info("提交成功");
}); router.back()
} }
</script> </script>
<style lang="scss"> <style lang="scss">

View File

@@ -2,22 +2,18 @@
* @Author: lixg lixg@dongwu-inc.com * @Author: lixg lixg@dongwu-inc.com
* @Date: 2022-11-21 17:28:10 * @Date: 2022-11-21 17:28:10
* @LastEditors: lixg lixg@dongwu-inc.com * @LastEditors: lixg lixg@dongwu-inc.com
* @LastEditTime: 2022-12-15 10:22:25 * @LastEditTime: 2022-12-15 11:51:59
* @FilePath: /fe-stu/vite.config.js * @FilePath: /fe-stu/vite.config.js
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/ */
import { defineConfig } from 'vite' import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue' import vue from '@vitejs/plugin-vue'
import legacy from '@vitejs/plugin-legacy'
import { viteMockServe } from 'vite-plugin-mock'
import topLevelAwait from "vite-plugin-top-level-await"; import topLevelAwait from "vite-plugin-top-level-await";
const path = require('path') const path = require('path')
// const url = 'http://localhost:30001'
const url = 'http://111.231.196.214:12013/manageApi' export default defineConfig(({ command, mode }) =>
export default defineConfig(({ command }) =>
({ ({
base: '/fe-student', base: loadEnv(mode, process.cwd()).VITE_BASE,
plugins: [ plugins: [
vue(), vue(),
// legacy({ // legacy({
@@ -39,60 +35,60 @@ export default defineConfig(({ command }) =>
server: { server: {
proxy: { proxy: {
'/file/upload': { '/file/upload': {
target: 'http://111.231.196.214:30001', target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true, changeOrigin: true,
}, },
'/stu': { '/stu': {
target: url, target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true, changeOrigin: true,
}, },
'/queryVoteSubmitDetailById': { '/queryVoteSubmitDetailById': {
target: url, target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true, changeOrigin: true,
}, },
'/work': { '/work': {
target: url, target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true, changeOrigin: true,
}, },
'/discuss': { '/discuss': {
target: url, target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true, changeOrigin: true,
}, },
'/discussSubmit': { '/discussSubmit': {
target: url, target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true, changeOrigin: true,
}, },
'/comment': { '/comment': {
target: url, target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true, changeOrigin: true,
}, },
'/vote': { '/vote': {
target: url, target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true, changeOrigin: true,
}, },
'/admin': { '/admin': {
target: url, target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true, changeOrigin: true,
}, '/activity': { }, '/activity': {
target: url, target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true, changeOrigin: true,
}, '/liveBroadcast': { }, '/liveBroadcast': {
target: url, target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true, changeOrigin: true,
}, '/examination': { }, '/examination': {
target: url, target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true, changeOrigin: true,
}, '/assessment': { }, '/assessment': {
target: url, target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true, changeOrigin: true,
}, '/workSubmit': { }, '/workSubmit': {
target: url, target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true, changeOrigin: true,
}, '/userbasic': { }, '/userbasic': {
target: 'https://u-pre.boe.com', target: 'https://u-pre.boe.com',
changeOrigin: true, changeOrigin: true,
}, '/link': { }, '/link': {
target: url, target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true, changeOrigin: true,
}, },
} }