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_API=/
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=

View File

@@ -2,7 +2,7 @@
* @Author: lixg lixg@dongwu-inc.com
* @Date: 2022-11-21 17:28:10
* @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
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
@@ -59,8 +59,8 @@ function getUserInfo() {
display: flex;
width: 100%;
min-height: 100%;
// background-color: rgba(242, 245, 247, 1);
background-color: #ccc;
background-color: rgba(242, 245, 247, 1);
// background-color: #ccc;
#nav {
width: 220px;
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 ROUTER_UNCOMPLETE_LIST = '/stu/router/unCompleteTaskList post'
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_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_DETAIL = '/stu/task/vote/detail'
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 ASSESSMENT_SUBMIT_QUERY = assessmentId => `/assessmentSubmit/queryAssessmentSubmitDetailById?assessmentSubmitId=${assessmentId} post`
export const ASSESSMENT_QUERY = assessmentId => `/assessment/queryAssessmentDetailById?assessmentId=${assessmentId} post`
export const ASSESSMENT_SUBMIT = '/assessmentSubmit/submitAssessmentDetail'
export const ASSESSMENT_QUERY = assessmentId => `/stu/task/evaluate/get`
export const ASSESSMENT_SUBMIT = '/stu/task/evaluate/commit post'
export const ACTIVITY = '/activity'

View File

@@ -29,9 +29,9 @@
<div style="margin-left: 8px">{{ data.planDto?.address }}</div>
</div>
</div>
<div class="btn" @click="toSurvery" v-if="data.planDto?.evalFlag">
评估
</div>
<botton :style="{background:`${data.isSurvery?'#999':'rgb(57, 146, 249)'}`}" class="btn" @click="toSurvery"
>{{ data.isSurvery ? '已评估' : '评估' }}
</botton>
</div>
<!-- 基本信息 -->
@@ -84,7 +84,7 @@
</div>
</el-tab-pane>
<el-tab-pane label="课程作业" name="second">
<div class="work">
<div class="work" v-if="data.workDto?.workName ">
<div>
<div class="question">{{ data.workDto?.workName }}</div>
<div style="margin-top: 16px; display: flex">
@@ -98,7 +98,7 @@
</div>
</el-tab-pane>
<el-tab-pane label="课程考试" name="third">
<div class="work">
<div class="work" v-if="data.examinationDto?.examinationTestName">
<div>
<div class="question">
{{ data.examinationDto?.examinationTestName }}
@@ -132,7 +132,7 @@
</div>
<!-- todo #面授课接口 讲师缺少img和介绍-->
<div class="teacheritem">
<img class="peopleimg" :src="userAvatar" />
<img class="peopleimg" :src="userAvatar"/>
<div style="margin-left: 17px; width: 190px">
<div class="teacherName" style="margin-right: 5px">
{{ data.planDto?.teacher }}
@@ -148,21 +148,21 @@
</template>
<script setup>
import { computed, reactive, toRefs, watch } from "vue";
import {computed, reactive, toRefs, watch} from "vue";
import FileTypeImg from "@/components/FileTypeImg.vue";
import { request, useRequest } from "@/api/request";
import { STU_OFFCOURSE_DETAIL } from "@/api/api";
import { useRoute, useRouter } from "vue-router";
import { useUserInfo } from "@/api/utils";
import {request, useRequest} from "@/api/request";
import {STU_OFFCOURSE_DETAIL} from "@/api/api";
import {useRoute, useRouter} from "vue-router";
import {useUserInfo} from "@/api/utils";
const router = useRouter();
const {
query: { courseId, type },
query: {courseId, type},
} = 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)
);
@@ -170,7 +170,7 @@ const state = reactive({
activeName: "first",
enclosure: "",
});
const { activeName, enclosure } = toRefs(state);
const {activeName, enclosure} = toRefs(state);
const handleClick = (tab, event) => {
console.log(tab, event);
};
@@ -179,9 +179,12 @@ const download = (url) => {
};
function toSurvery() {
if (data.value.isSurvery) {
return
}
router.push({
path: "/surveydetail",
query: { courseId: data.value.planDto.evaluateId },
query: {courseId: data.value.planDto.evaluateId},
});
}
@@ -197,7 +200,7 @@ function toWork() {
}
function toExamItem(obj) {
router.push({ path: "/starttest", query: { id: obj.courseId } });
router.push({path: "/starttest", query: {id: obj.courseId}});
}
</script>

View File

@@ -133,11 +133,10 @@
<div class="join">
<el-input
v-model="textarea1"
v-model="sbValue.content"
:autosize="{ minRows: 12.5, maxRows: 12.5 }"
resize="none"
type="textarea"
@input="textareaInput"
/>
</div>
<div style="display: flex; justify-content: center">
@@ -245,8 +244,8 @@
</template>
<script setup>
import { reactive, ref, toRefs } from "vue";
import { request, useRequest } from "@/api/request";
import {reactive, ref, toRefs} from "vue";
import {request, useRequest} from "@/api/request";
import {
TASK_WORK_COMMIT,
TASK_WORK_DETAIL,
@@ -254,40 +253,41 @@ import {
WORK_HISTROY,
} from "@/api/api";
import dayjs from "dayjs";
import { useRouter } from "vue-router";
import {useRouter} from "vue-router";
import UploadImg from "@/components/img/UploadImg.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 uploadRef = ref();
const showFileList = ref(0);
const state = reactive({
textarea1: "",
});
const { textarea1 } = toRefs(state);
const sbValue = ref({
content: '',
attach: ''
})
const router = useRouter();
const {
query: { courseId: workId, type, id: taskId },
query: {courseId: workId, type, id: taskId},
} = useRoute();
const { data } = useRequest(TASK_WORK_DETAIL, { workId, taskId });
const { data: submitList } = useRequest(TASK_WORK_SUBMIT_LIST, { workId });
const {data} = useRequest(TASK_WORK_DETAIL, {workId, taskId});
const {data: submitList} = useRequest(TASK_WORK_SUBMIT_LIST, {workerId:workId});
const handleClick = () => {
console.log(sbValue.value)
console.log(fileList)
request(TASK_WORK_COMMIT, {
projectOrRouterLogo: type,
workUploadContent: textarea1.value,
workUploadContent: sbValue.value.content,
workUploadAddress: fileList.value.map(e => e.url).join(',') || '',
workId,
type,
taskId,
}).then((res) => {
submitList.value.unshift(res.data);
});
textarea1.value = "";
};
const textareaInput = (e) => {
state.textarea1 = e;
sbValue.value.content = "";
};
function remove(i) {

View File

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

View File

@@ -39,7 +39,12 @@
<div style="margin-left: 8px">{{ data?.activityAddress }}</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>
<!-- 基本信息 -->
@@ -126,22 +131,26 @@
</template>
<script setup>
import { TAS_ACTIVITY_DETAIL, TASK_ACTIVITY_SIGN, ACTIVITY } from "@/api/api";
import { request, useRequest } from "@/api/request";
import { useRoute } from "vue-router/dist/vue-router";
import {TAS_ACTIVITY_DETAIL, TASK_ACTIVITY_SIGN, ACTIVITY} from "@/api/api";
import {request, useRequest} from "@/api/request";
import {useRoute} from "vue-router/dist/vue-router";
import {ElMessage} from "element-plus";
const {
query: { courseId: activityId },
query: {courseId: activityId},
} = useRoute();
const { data } = useRequest(ACTIVITY, { activityId });
console.log("data", data);
const {data} = useRequest(ACTIVITY, {activityId});
const signClick = (tab, event) => {
if (data.value.signFlag) {
return;
}
data.value.signFlag = true
ElMessage.info("签到成功");
request(TASK_ACTIVITY_SIGN, {
activitySubmitId: data.activityId,
signInStatus: 1,
}).then((res) => {
data.value.activityFlag = 1;
});
courseId: activityId,
})
};
</script>
@@ -269,12 +278,14 @@ const signClick = (tab, event) => {
left: 23px;
top: 53px;
}
.activedetail {
margin-top: 30px;
font-size: 14px;
font-weight: 500;
color: #333330;
line-height: 36px;
.content {
color: #677d86;
}

View File

@@ -307,7 +307,7 @@ import medal2 from "@/assets/image/medal/medal2.png";
import medal3 from "@/assets/image/medal/medal3.png";
import img from "@/assets/image/uploadimg.png";
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";
const {

View File

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

View File

@@ -78,21 +78,18 @@
<div
class="question"
style="margin-top: 41px"
v-for="(item, i) in data.singleStemVoList"
v-for="(item, i) in data.assessmentSingleChoiceDtoList"
:key="i"
>
<div class="text">{{ item.singleStemName }}</div>
<div
v-for="(value, index) in item.assessmentSingleChoiceVoList"
v-for="(value, index) in item.assessmentSingleChoiceDtoList"
:key="index"
style="display: flex; align-items: center"
:style="{
'margin-top': index === 0 ? '29px' : '22px',
cursor: 'pointer',
}"
:style="{'margin-top': index === 0 ? '29px' : '22px',cursor: 'pointer'}"
@click="
() => {
item.assessmentSingleChoiceVoList.forEach((e) => {
item.assessmentSingleChoiceDtoList.forEach((e) => {
e.select = false;
});
value.select = true;
@@ -149,7 +146,8 @@
<div class="words">{{ item.content?.length || 0 }}/200</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>
</div>
@@ -161,25 +159,24 @@
<script setup>
import checkbox from "@/assets/image/checkbox.png";
import checkbox2 from "@/assets/image/checkbox2.png";
import { useRoute } from "vue-router/dist/vue-router";
import { request, usePage, useRequest } from "@/api/request";
import {useRoute} from "vue-router/dist/vue-router";
import {request, usePage, useRequest} from "@/api/request";
import {
ASSESSMENT_QUERY,
ASSESSMENT_SUBMIT,
COMMENT_LIST,
DISCUSS_DETAIL,
} from "@/api/api";
import {ElMessage} from "element-plus";
const {
query: { courseId },
query: {courseId},
} = useRoute();
const { data } = useRequest(ASSESSMENT_QUERY(courseId), {});
const {data} = useRequest(ASSESSMENT_QUERY(courseId), {id:courseId});
function submit() {
request(ASSESSMENT_SUBMIT, data).then(() => {
console.log("提交成功");
});
request(ASSESSMENT_SUBMIT, {assessmentId: courseId, result: JSON.stringify(data.value)})
ElMessage.info("提交成功");
router.back()
}
</script>
<style lang="scss">

View File

@@ -2,22 +2,18 @@
* @Author: lixg lixg@dongwu-inc.com
* @Date: 2022-11-21 17:28:10
* @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
* @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 legacy from '@vitejs/plugin-legacy'
import { viteMockServe } from 'vite-plugin-mock'
import topLevelAwait from "vite-plugin-top-level-await";
const path = require('path')
// const url = 'http://localhost:30001'
const url = 'http://111.231.196.214:12013/manageApi'
export default defineConfig(({ command }) =>
export default defineConfig(({ command, mode }) =>
({
base: '/fe-student',
base: loadEnv(mode, process.cwd()).VITE_BASE,
plugins: [
vue(),
// legacy({
@@ -39,60 +35,60 @@ export default defineConfig(({ command }) =>
server: {
proxy: {
'/file/upload': {
target: 'http://111.231.196.214:30001',
target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true,
},
'/stu': {
target: url,
target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true,
},
'/queryVoteSubmitDetailById': {
target: url,
target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true,
},
'/work': {
target: url,
target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true,
},
'/discuss': {
target: url,
target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true,
},
'/discussSubmit': {
target: url,
target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true,
},
'/comment': {
target: url,
target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true,
},
'/vote': {
target: url,
target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true,
},
'/admin': {
target: url,
target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true,
}, '/activity': {
target: url,
target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true,
}, '/liveBroadcast': {
target: url,
target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true,
}, '/examination': {
target: url,
target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true,
}, '/assessment': {
target: url,
target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true,
}, '/workSubmit': {
target: url,
target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true,
}, '/userbasic': {
target: 'https://u-pre.boe.com',
changeOrigin: true,
}, '/link': {
target: url,
target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true,
},
}