feat:增加直播外链等

This commit is contained in:
lixg
2023-01-17 19:46:43 +08:00
53 changed files with 17879 additions and 1252 deletions

View File

@@ -18,26 +18,31 @@
</main>
</div>
</template>
<script>
import { computed, defineComponent } from "vue";
<script setup>
import { computed, onMounted } from "vue";
import { useRouter, useRoute } from "vue-router";
export default defineComponent({
setup() {
const router = useRouter();
const route = useRoute();
console.log("router", router.getRoutes(), route);
const routes = computed(() => {
return router.getRoutes().filter((e) => e.meta?.isLink);
});
import { useStore } from "vuex";
import { boeRequest } from "@/api/request";
import { GET_USER_INFO } from "@/api/ThirdApi";
import { getCookie } from "@/api/utils";
const currentRouteName = computed(() => route.name);
const store = useStore();
const router = useRouter();
return {
routes,
name: currentRouteName,
};
},
onMounted(() => {
window.location.href.includes("/login") || getUserInfo();
});
function getUserInfo() {
boeRequest(GET_USER_INFO).then((res) => {
console.log(222222222);
console.log(res);
res.result.avatar = res.result.avatar
? res.result.avatar
: "/800e23f7-b58c-4192-820d-0c6a2b7544cc.png";
store.commit("SET_USER", res.result);
});
}
</script>
<style lang="scss">
#app {
@@ -87,6 +92,7 @@ export default defineComponent({
}
}
}
main {
flex: 1;
width: 100%;

11
src/api/CONST.js Normal file
View File

@@ -0,0 +1,11 @@
/*
* @Author: lixg lixg@dongwu-inc.com
* @Date: 2023-01-16 13:59:11
* @LastEditors: lixg lixg@dongwu-inc.com
* @LastEditTime: 2023-01-16 13:59:17
* @FilePath: /stu_h5/src/api/CONST.js
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
export const PROJECT = 1;
export const ROUTER = 2;
export const COURSE = 3;

5
src/api/ThirdApi.js Normal file
View File

@@ -0,0 +1,5 @@
export const BASE = 'https://u-pre.boe.com'
export const GET_USER_LIST = `/userbasic/user/list post`
export const GET_USER_INFO = `/userbasic/user/info post`

40
src/api/api.js Normal file
View File

@@ -0,0 +1,40 @@
/*
* @Author: lixg lixg@dongwu-inc.com
* @Date: 2023-01-13 11:42:48
* @LastEditors: lixg lixg@dongwu-inc.com
* @LastEditTime: 2023-01-17 17:06:24
* @FilePath: /stu_h5/src/api/api.js
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
export const BASE = 'http://localhost:3000'
export const LOGIN = '/admin/CheckUser/userLogin post'
export const FILE_UPLOAD = '/file/upload'
export const ROUTER_CHAPTER_LIST = '/stu/router/chapterList'
export const ROUTER_LIST = '/stu/router/list post'
export const ROUTER_PROCESS = '/stu/router/process'
export const ROUTER_UNCOMPLETE_LIST = '/stu/router/unCompleteTaskList'
export const TAS_ACTIVITY_DETAIL = '/stu/task/activity/detail'
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 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'
export const TASK_WORK_DETAIL = '/workSubmit/getWorkDetailByTaskId'
export const STU_OFFCOURSE_DETAIL = '/stu/offcourse/detail post'
export const WORK_QUERYWORKDETAILBYID = '/work/queryWorkDetailById'
export const EXAMINATION_QUERYEXAMINATIONDETAILBYID = '/examination/queryExaminationDetailById'
export const DISCUSS_COLLECTION = '/discussSubmit/clickDiscussCollectionCountOr POST'
export const DISCUSS_LIKE = '/discussSubmit/clickDiscussLikeCountOr POST'
export const ACTIVITY = '/activity'
export const EXAMINATION_QUERY = examinationId => `/examination/queryExaminationDetailById?examinationId=${examinationId} post`
export const TASK_OFFCOURSE_NOTASK_SIGN = '/stu/task/offcourse/notask/sign post'
export const TASK_OFFCOURSE_SIGN = '/stu/task/offcourse/sign post'
export const LINK_DETAILS = linkId => `/link/getOne?linkId=${linkId} post`
export const STUDY_RECORD = '/stu/task/thirdTask/submit post'
export const TASK_WORK_SUBMIT_LIST = '/workSubmit/queryWorkSubmitDetailById'
export const WORK_HISTROY = '/workSubmit/queryWorkDetailListByStuId'
export const ASSESSMENT_QUERY = assessmentId => `/stu/task/queryAssessmentDetailById`
export const ASSESSMENT_SUBMIT = '/stu/task/evaluate/commit post'

149
src/api/request.js Normal file
View File

@@ -0,0 +1,149 @@
import router from "@/router";
import { reactive, ref, toRefs, watch } from "vue";
import axios from 'axios';
import { getCookie } from "@/api/utils";
import JSONBigInt from 'json-bigint';
const JSONBigIntStr = JSONBigInt({ storeAsString: true });
export function usePage(_url, param) {
const state = reactive({
data: {},
loading: false,
total: 0,
size: 10,
current: 1,
params: { pageNo: 1, pageSize: 10, ...param }
})
watch(param, () => {
state.params = { ...state.params, ...param }
fetchData()
})
function fetchData() {
state.loading = true
request(_url, state.params).then(r => {
state.params.pageNo === 1 ? (state.data = (r.data.records || r.data.rows)) : (state.data = [...state.data, ...(r.data.records || r.data.rows)])
state.size = r.data.size
state.total = r.data.total
state.current = r.data.current
state.loading = false
})
}
fetchData()
return {
...toRefs(state),
fetchData,
};
}
export function useRequest(_url, params = {}) {
const data = ref({})
const loading = ref(false)
watch(params, () => {
fetchData()
})
function fetchData() {
loading.value = true
request(_url, params).then(r => {
data.value = r.data
loading.value = false
})
}
fetchData()
return {
data,
loading,
fetchData,
};
}
export async function request(_url, params) {
const s = _url.split(' ')
let url = s[0]
const method = s[1]?.toLowerCase() || 'get'
if (method === 'get') {
let paramsArray = [];
//拼接参数
if (params) {
Object.keys(params).forEach(key => paramsArray.push(key + '=' + params[key]))
if (url.search(/\?/) === -1) {
url += '?' + paramsArray.join('&')
} else {
url += '&' + paramsArray.join('&')
}
}
}
const body = method !== 'get' ? params || {} : {}
return axios({
url,
method,
headers: {
'token': getCookie('token'),
...method !== 'get' ? { 'Content-Type': 'application/json' } : {}
},
baseURL: import.meta.env.VITE_BASE_API,
...method !== 'get' ? { data: JSON.stringify(body) } : {}
}).then(resp => resp.data).then(response => {
if (response.code !== 200 && response.code !== 0) {
if (response.code === 1000) {
(import.meta.env.MODE === 'development' || import.meta.env.MODE === 'test') ? router.push({ path: '/login' }) : window.open(import.meta.env.VITE_BASE_LOGIN_URL, '_top')
}
// if (import.meta.env.DEV && response.code === 1000) {
// router.push({path: '/login'})
// } else {
// window.open()
// response.showMsg && notification.open({
// message: response.showMsg,
// duration: 2,
// });
// }
throw new Error('接口异常')
}
return response
}).catch(e => {
console.log('eeeee', e)
// router.push({path: '/login'})
})
}
export async function boeRequest(_url, params) {
const s = _url.split(' ')
let url = s[0]
const method = s[1]?.toLowerCase() || 'get'
if (method === 'get') {
let paramsArray = [];
//拼接参数
if (params) {
Object.keys(params).forEach(key => paramsArray.push(key + '=' + params[key]))
if (url.search(/\?/) === -1) {
url += '?' + paramsArray.join('&')
} else {
url += '&' + paramsArray.join('&')
}
}
}
const body = method !== 'get' ? params || {} : {}
return fetch(url, {
method,
headers: {
token: getCookie('token'),
...method !== 'get' ? { 'Content-Type': 'application/json' } : {}
},
...method !== 'get' ? { body: JSON.stringify(body) } : {}
}).then(res => {
return res.text()
}).then(res => {
return JSONBigIntStr.parse(res)
}).then(res => {
console.log(res)
if (res.status === 500) {
import.meta.env.MODE === 'development' ? router.push({ path: '/login', query: { returnUrl: router.currentRoute.value.fullPath } }) : window.open(import.meta.env.VITE_BASE_LOGIN_URL + window.location.url, '_top')
}
return res
})
}

28
src/api/utils.js Normal file
View File

@@ -0,0 +1,28 @@
import {watch, ref} from "vue";
import {boeRequest} from "@/api/request";
import {GET_USER_LIST} from "@/api/ThirdApi";
export function useImage(src) {
return new URL(`../assets/image/${src}`, import.meta.url).href
}
export function setCookie(name, value, perpetual) {
const d = new Date()
d.setDate(perpetual * 24 * 60 * 60 * 1000)
document.cookie = `${name}=${value};expires=${d.toGMTString()};path=/`
}
export function getCookie(name) {
return document.cookie?.split(";").find(e => e.includes(name))?.replace(`${name}=`, '') || ''
}
export function useUserInfo(id) {
const userInfo = ref({})
watch(id, () => {
id.value && boeRequest(GET_USER_LIST, {id: id.value}).then(res => {
userInfo.value = res.result.userInfoList[0]
userInfo.value.avatar = userInfo.value.avatar?userInfo.value.avatar:'/800e23f7-b58c-4192-820d-0c6a2b7544cc.png'
})
})
return userInfo
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 590 B

View File

@@ -1,13 +1,13 @@
const Images = {
//选择按钮
checkboxImg: require('./checkbox.png'),
checkbox2Img: require('./checkbox2.png'),
zipImg: require('./filestorag/zip.png'),
excelImg: require('./filestorag/excel.png'),
mdImg: require('./filestorag/md.png'),
pdfImg: require('./filestorag/pdf.png'),
pptImg: require('./filestorag/ppt.png'),
rarImg: require('./filestorag/rar.png'),
wordImg: require('./filestorag/word.png'),
checkboxImg: import('./checkbox.png'),
checkbox2Img: import('./checkbox2.png'),
zipImg: import('./filestorag/zip.png'),
excelImg: import('./filestorag/excel.png'),
mdImg: import('./filestorag/md.png'),
pdfImg: import('./filestorag/pdf.png'),
pptImg: import('./filestorag/ppt.png'),
rarImg: import('./filestorag/rar.png'),
wordImg: import('./filestorag/word.png'),
}
export default Images

Binary file not shown.

After

Width:  |  Height:  |  Size: 790 B

BIN
src/assets/image/return.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 B

View File

@@ -0,0 +1,57 @@
<!--
* @Author: lixg lixg@dongwu-inc.com
* @Date: 2023-01-15 14:57:30
* @LastEditors: lixg lixg@dongwu-inc.com
* @LastEditTime: 2023-01-15 15:16:42
* @FilePath: /stu_h5/src/components/FileTypeImg.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
<template>
<img
class="file"
:style="style"
:src="
{
pdf,
doc: word,
ppt,
zip,
excel,
xlsx: excel,
xls: excel,
rar,
book,
md,
docx: word,
png,
}[filePath.split('.').slice(-1)] || book
"
/>
</template>
<script setup>
import rar from "@/assets/image/file/rar.png";
import excel from "@/assets/image/file/excel.png";
import md from "@/assets/image/file/md.png";
import pdf from "@/assets/image/file/pdf.png";
import ppt from "@/assets/image/file/ppt.png";
import word from "@/assets/image/file/word.png";
import zip from "@/assets/image/file/zip.png";
import book from "@/assets/image/file/book.png";
import { defineProps, ref } from "vue";
const { modelValue = "", style } = defineProps({
modelValue: String,
style: {
type: Object,
default: {},
},
});
const filePath = ref(modelValue);
console.log("filePath", filePath);
</script>
<style lang="scss">
.file {
width: 22px;
height: 26px;
}
</style>

View File

@@ -0,0 +1,83 @@
<!--
* @Author: lixg lixg@dongwu-inc.com
* @Date: 2023-01-16 17:26:39
* @LastEditors: lixg lixg@dongwu-inc.com
* @LastEditTime: 2023-01-16 18:21:05
* @FilePath: /stu_h5/src/components/ReturnHead.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
<template>
<div class="returnHead">
<div style="width: 46px">
<img
style="width: 9px; height: 15px"
src="../assets/image/return.png"
@click="returnclick"
/>
</div>
<div class="text">{{ text }}</div>
<div class="publish" v-if="showpublish" @click="publishClick">
<img
style="width: 13px; height: 12px"
src="../assets/image/publish.png"
/>
<div style="margin-left: 5px; color: #2478ff">发布</div>
</div>
<div class="publish" v-else></div>
</div>
</template>
<script >
import { useRouter } from "vue-router";
export default {
name: "ReturnHead",
props: {
text: String,
showpublish: {
type: Boolean,
default: false,
},
publishWork: {
type: Function,
default: null,
},
},
setup(props, ctx) {
const router = useRouter();
const returnclick = () => {
router.back();
};
const publishClick = () => {
props.publishWork && props.publishWork();
};
return {
returnclick,
publishClick,
};
},
};
</script>
<style scoped lang="scss">
.returnHead {
width: 95%;
height: 44px;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 14px;
background-color: #ffffff;
padding-left: 2.5%;
padding-right: 2.5%;
.text {
font-size: 18px;
font-weight: 600;
color: #323233;
line-height: 12px;
margin-left: 11px;
}
.publish {
width: 46px;
display: flex;
align-items: center;
}
}
</style>

12
src/mock/index.js Normal file
View File

@@ -0,0 +1,12 @@
import {createProdMockServer} from 'vite-plugin-mock/es/createProdMockServer'
const context = import.meta.glob("./mocks/*.js", {eager: true})
const API = await import("../api/api")
const array = Object.keys(context).map(path =>
Object.keys(context[path].default).map(url => ({
url: API[url].split(' ')[0],
method: API[url].split(' ').length > 1 ? API[url].split(' ')[1] : 'get',
response: context[path].default[url]
}))).reduce((r, m) => [...r, ...m])
console.log(array)
createProdMockServer([...array])

97
src/mock/mocks/ballot.js Normal file
View File

@@ -0,0 +1,97 @@
export default {
//路径图展开列表
ROUTER_CHAPTER_LIST: () => ({
"code": 200,
"msg": "请求成功!",
"data": {
"rows": [
{
"chapterId": 0,
"name": ""
}
]
},
//学员路径图列表
}),
ROUTER_LIST: () => ({
"code": 0,
"data": {
"pageNo": 0,
"pageSize": 0,
"pages": 0,
"rows": [
{
"name": "asdffad",
"picUrl": "asdfasdf",
"remark": "sdfasf",
"routerId": 0,
"status": 0,
"target": "adfsf "
}
],
"total": 0
},
"msg": "",
"success": true
}),
//学员路径图进度明细
ROUTER_PROCESS: () => ({
"code": 0,
"data": {
"certCnt": 0,
"chapterProcessList": [
{
"chapterId": 0,
"chapterName": "序:产品经理从初级到中级",
"taskProcessList": [
{
"currentRatio": 63,
"flag": true,
"name": "趣味课前小测 - MBTI测试你适合做哪个方向",
"routerTaskId": 0,
"status": 1,
"type": 0
}
],
"status": 1,
}
],
"currentChapterCnt": 20,
"currentReqCnt": 0,
"name": "",
"routerId": 0,
"totalChapterCnt": 70,
"totalReqCnt": 0,
"userInfoBo": {
"deptName": "",
"jobName": "教师是学生的镜子,学生是老师的影子",
"userId": 0,
"userName": "王星天"
}
},
"msg": "",
"success": true
}),
//未完成任务列表
ROUTER_UNCOMPLETE_LIST: () => ({
"code": 0,
"data": {
"pageNo": 0,
"pageSize": 0,
"pages": 0,
"rows": [
{
"chapterId": 0,
"chapterName": "",
"name": "",
"routerId": 0,
"routerTaskId": 0,
"routerTaskName": ""
}
],
"total": 0
},
"msg": "",
"success": true
})
}

3
src/mock/mocks/debate.js Normal file
View File

@@ -0,0 +1,3 @@
export default {
}

76
src/mock/mocks/face.js Normal file
View File

@@ -0,0 +1,76 @@
export default {
STU_OFFCOURSE_DETAIL: () => ({
"code": 0,
"data": {
"applyFlag": 0,
"evalFlag": 0,
"evalItem": {
"courseId": 0,
"name": ""
},
"examFlag": 0,
"examItem": {
"courseId": 0,
"name": "模块化产品展示相关案例与展示:如何自由组合你的思考?"
},
"offCourseInfo": {
"attach": "",
"auditStatus": 0,
"categoryId": 0,
"createId": 0,
"createName": "",
"createTime": "",
"intro": `
通过对各级人员的软件平台培训,使其能够了解如何运用乾元坤和智能信息管理系统来提升企业管理水平,最大限度发挥软件产品在企业中的作用。<br/>
1.使企业不同部门人员掌握便捷、有效的系统平台操作方法;<br/>
2.通过系统平台的培训提高员工对企业的管理理念认识与提升。<br/>
3.通过系统平台培训加强沟通,统一部署,协同工作,提高效率。<br/>
`,
"meaning": "",
"name": "核心项目面授课",
"offcourseId": 0,
"outline": "",
"picUrl": "",
"projectId": 0,
"projectName": "",
"publishStatus": 0,
"publishTime": "",
"sceneId": 0,
"score": 0,
"status": 0,
"targetUser": "",
"teacher": "",
"teacherId": 0,
"tips": "",
"updateTime": ""
},
"offCoursePlanInfo": {
"address": "大族广场",
"applyFlag": 0,
"attach": "附件1.pdf,附件2.excel",
"beginTime": '2022-07-20 20:00-21:00',
"completeType": 0,
"createTime": 0,
"endTime": 0,
"evalFlag": 1,
"name": "",
"offcourseId": 0,
"offcoursePlanId": 0,
"score": 0,
"signFlag": 0,
"signWordFlag": 0,
"studentCnt": 0,
"teacher": "",
"teacherId": 0
},
"stuFlag": 0,
"workFlag": 0,
"workItem": {
"courseId": 0,
"name": "社交产品如何做好模块化处理?"
}
},
"msg": "",
"success": true
}),
}

254
src/mock/mocks/task.js Normal file
View File

@@ -0,0 +1,254 @@
export default {
//路径图展开列表
TAS_ACTIVITY_DETAIL: () => ({
"code": 0,
"data": {
"detail": {
"createTime": "2022-07-20 20:00-21:00",
"createUser": 0,
"submitEndTime": "",
"submitStartTime": "",
"updateTime": "",
"updateUser": 0,
"workEnclosureAddress": "大族广场",
"workFlag": "",
"workId": 0,
"workName": "【其他活动】管理者进阶腾飞班 - 专属线下活动",
"workRequirement": `写字楼介绍 <br />
大族广场写字楼采用国际顶级硬件设施美国OTIS电梯、麦克维尔中央空调、高端安防系统等商务空间新标准匹配项目在亦庄地标综合体的形象。写字楼空间设计由亚洲著名的
室内空间设计大师之一梁景华设计,写字楼群由六栋(T1—T6)呈舰队排列的5A写字楼构成形成独特的舰队造型。
<br />
购物中心介绍 <br />
大族广场Mall&More位于北京经济技术开发区核心商圈荣华路由荷兰鹿特丹缤纷市场设计师HANS
VAN DALEN
主持设计,秉持自然与未来和谐共生理念,倡导乐活、有机、绿色环保的生活方式,传递生活美学。
<br />
大族广场Mall&More汇集众多知名优质品牌,7FRESH生鲜超市、CGV星聚汇影城、中信书店、源力悦体等,集购物、餐饮、娱乐、文化于一体,丰富的业态品类为消费者提供城市
生活的第三空间感受。<br />
大族广场Mall&More以人为本,不断提升服务水平,升级消费购物体验,致力于营造更加舒适的购物环境与空间,打造有温度的品牌。同时根据春夏秋冬四季策划丰富多样的大型主题
活动;为会员设置专属的沙龙活动,打造专属会员日等,与顾客近距离产生情感上的互动与链接,为城市人们提供自由、放松、愉悦的社交空间与精神的栖息地。<br />`,
"workTag": ""
},
"signFlag": 0
},
"msg": "",
"success": true
}),
TASK_ACTIVITY_SIGN: () => ({
"code": 0,
"data": {},
"msg": "",
"success": true
}),
TASK_BROADCAST_COMMIT: () => ({
"code": 0,
"data": {},
"msg": "",
"success": true
}),
TASK_BROADCAST_DETAIL: () => ({
"code": 0,
"data": {"assessmentsubmitvo": {
"assessmentId": 0,
"assessmentName": "",
"assessment_submit_id": 0,
"createTime": "",
"createUser": 0,
"essayQuestionSubmitDtoList": [
{
"assessmentSubmitId": 0,
"assessment_submit_id": 0,
"createTime": "",
"createUser": 0,
"qaSubmitId": 0,
"qaSubmitStemAnswer": "",
"qaSubmitStemId": 0,
"qaSubmitStemName": 0,
"questionType": "",
"updateTime": "",
"updateUser": 0
}
],
"multipleSubmitChoiceDtoList": [
{
"assessmentSubmitId": 0,
"createTime": "",
"createUser": 0,
"multipleSubmitId": 0,
"multipleSubmitOptionDtoList": [
{
"answerOptionId": 0,
"answerOptionName": "",
"createTime": "",
"createUser": 0,
"multipleId": 0,
"multipleSubmitId": 0,
"updateTime": "",
"updateUser": 0
}
],
"questionType": "",
"stemName": "",
"updateTime": "",
"updateUser": 0
}
],
"scoringQuestionSubmitDtoList": [
{
"assessmentSubmitId": 0,
"assessment_submit_id": 0,
"createTime": "",
"createUser": 0,
"questionType": "",
"scSubmitId": 0,
"scSubmitScore": 0,
"scSubmitStemId": 0,
"scSubmitStemTitle": 0,
"updateTime": "",
"updateUser": 0
}
],
"singleChoiceSubmitDtoList": [
{
"answerOptionId": 0,
"answerOptionName": 0,
"assessmentSubmitId": 0,
"createTime": "",
"createUser": 0,
"questionType": "",
"singleSubmitId": 0,
"stemName": "",
"updateTime": "",
"updateUser": 0
}
],
"stuId": "",
"stuName": "",
"updateTime": "",
"updateUser": 0
},
"detail": {
"afterSignIn": "",
"assessmentId": 0,
"beforeSignIn": "",
"createTime": "",
"createUser": 0,
"isEvaluate": "",
"liveCover": "",
"liveDuration": 0,
"liveEndTime": "",
"liveExplain": `当你走进这直播间,我和毛不易老师@毛不易就已
经在直播间等你们了!今晚20点30不见不散!<br/>`,
"liveFlag": "",
"liveId": 0,
"liveLink": "",
"liveName": "管理者进阶腾飞班 - 毕业典礼",
"livePlayback": "",
"livePlaybackLink": "",
"liveStartTime": "2022-07-20 20:00-21:00",
"liveTag": "",
"liveTeacherId": 0,
"otherSettings": "",
"signOutTime": "",
"standardSettings": "",
"updateTime": "",
"updateUser": 0
},
"evalFlag": 0,
"signFlag": 0,
"submitVo": {
"assessmentSubmitId": "",
"createTime": "",
"createUser": 0,
"liveId": "",
"liveSubmitId": 0,
"signInTime": "",
"stuId": "",
"stuName": "",
"updateTime": "",
"updateUser": 0
}
},
"msg": "",
"success": true
}),
TASK_BROADCAST_SIGN: () => ({
"code": 0,
"data": {},
"msg": "",
"success": true
}),
TASK_VOTE_COMMIT: () => ({
"code": 0,
"data": {},
"msg": "",
"success": true
}),
TASK_VOTE_DETAIL: () => ({
"code": 0,
"data": {
"accessCnt": 20,
"detail": {
"ballotId": 0,
"baseVote": "",
"createTime": "",
"createUser": 0,
"updateTime": "",
"updateUser": 0,
"voteEndTime": "2022-11-22 00:00:00",
"voteExplain": "为提高核心项目讲解体验,现向广大学员征集较为接受的授课方式,每位学员可投票2个选项我们将选取最高选项的两个做后续讲解。",
"voteFlag": "",
"voteId": 0,
"voteName": "",
"voteStartTime": "2022-11-14 00:00:00",
"voteTag": ""
},
"viewCnt": 10,
"voteCnt": 10,
"voteFlag": 0
},
"msg": "",
"success": true
}),
TASK_WORK_COMMIT: () => ({
"code": 0,
"data": {},
"msg": "",
"success": true
}),
TASK_WORK_DETAIL: () => ({
"code": 0,
"data": {
"detail": {
"createTime": "",
"createUser": 0,
"submitEndTime": "2022-12-22 00:00:00",
"submitStartTime": "2022-11-22 00:00:00",
"updateTime": "",
"updateUser": 0,
"workEnclosureAddress": "",
"workFlag": "",
"workId": 0,
"workName": "管理者进阶腾飞班 - 第一次作业 - 沙盘实验",
"workRequirement": `1、阅读文章做名校题库翻译文言文整体文化常识和<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;文言知识`,
"workTag": ""
},
"workSubmitList": [
{
"createTime": "2022-7-20 00:00",
"createUser": 0,
"stuId": "",
"stuName": "",
"updateTime": "",
"updateUser": 0,
"workId": 0,
"workSubmitId": 0,
"workUploadAddress": "",
"workUploadContent": "大唐之音鉴赏 - 2022/7/20.zip"
}
]
},
"msg": "",
"success": true
}),
}

View File

@@ -1,16 +1,14 @@
const routes = [];
const context = require.context('@/views', true, /\.vue$/, 'lazy');
context.keys().forEach(path => {
// console.log('path', path)
const context =import.meta.glob("../views/*/*.vue", {eager: true})
Object.keys(context).forEach(path => {
const componentName = path.replace(/.*\/([^\\.\\/]*)\.vue$/, '$1');
routes.push({
path: `/${componentName.toLowerCase()}`,
name: componentName,
component: () => context(path),
component: context[path].default,
meta: {
isLink: true
}
});
});
export default routes;

View File

@@ -1,3 +1,4 @@
<<<<<<< HEAD
/*
* @Author: 李晓鸽 lixg@dongwu-inc.com
* @Date: 2022-11-21 18:45:34
@@ -7,21 +8,40 @@
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
import { createRouter, createWebHashHistory } from 'vue-router';
=======
import {createRouter, createWebHashHistory, createWebHistory} from 'vue-router';
>>>>>>> origin/develop
import routesConfig from './config';
import {getCookie} from "@/api/utils";
// console.log('routesConfig', routesConfig)
const routes = [
{
path: '/',
name: '首页',
redirect: routesConfig[0].path
},
...routesConfig
{
path: '/',
name: '首页',
redirect: routesConfig[0].path
},
...routesConfig
]
const router = createRouter({
<<<<<<< HEAD
history: createWebHashHistory("/student-h5/"),
routes
=======
history: createWebHistory(import.meta.env.VITE_BASE),
routes
})
router.beforeEach((to, from, next) => {
if (!getCookie('token')) {
if (import.meta.env.MODE === "development" || import.meta.env.MODE === "test") {
to.path.includes('/login') ? next() : next({path: '/login', query: {returnUrl: to.fullPath}})
}else {
window.location.href = import.meta.env.VITE_BASE_LOGIN_URL + import.meta.env.VITE_BASE+to.fullPath
}
}
next()
>>>>>>> origin/develop
})
export default router

View File

@@ -2,10 +2,14 @@ import { createStore } from 'vuex'
export default createStore({
state: {
userInfo: {}
},
getters: {
},
mutations: {
SET_USER(state, userInfo) {
state.userInfo = userInfo
},
},
actions: {
},

View File

@@ -1,11 +1,10 @@
<template>
<div class="activities">
<ReturnHead text="活动详情"></ReturnHead>
<div class="main">
<div class="notice">
<span class="text"
>请各位选课的同学提前阅读本课程的教学大纲与计划请各位选课的同学提前阅读本课程的教学大纲与计划</span
>
<span class="close"></span>
<div class="notice" :style="{ display: closeBtn ? 'flex' : 'none' }">
<span class="text">{{ data?.activityNotice }}</span>
<span class="close" @click="isShowClose"></span>
</div>
<div class="title">
<div class="titlemain">
@@ -19,7 +18,7 @@
margin-bottom: 8px;
"
>
管理者进阶腾飞班 - 专属线下活动
{{ data?.activityName }}
</div>
<div class="time">
<img
@@ -27,7 +26,8 @@
src="../../assets/image/faceteach/time.png"
/>
<div style="font-size: 12px; color: rgba(110, 123, 132, 1)">
2022-07-20 20:00-21:00
{{ data?.activityStartTime ? data?.activityStartTime : "-" }}
{{ data?.activityEndTime ? data?.activityEndTime : "-" }}
</div>
</div>
<div class="time" style="margin-top: 9px">
@@ -36,34 +36,212 @@
src="../../assets/image/faceteach/position.png"
/>
<div style="font-size: 12px; color: rgba(110, 123, 132, 1)">
大族广场
{{ data?.activityAddress }}
</div>
</div>
</div>
<el-button class="titlebtn" @click="open">签到</el-button>
<div v-if="projectStatus && projectEndTime" class="sign">
<div
v-if="
projectStatus !== '3' &&
new Date(projectEndTime).getTime() > new Date().getTime()
"
class="sign"
>
<botton
v-if="isAllowSign"
class="btn"
:style="{
background: data.signFlag ? '#999' : 'rgb(57, 146, 249)',
}"
@click="signClick"
>{{ data.signFlag ? "已签到" : "签到" }}
</botton>
<botton
v-else
class="btn"
:style="{ background: '#999' }"
@click="signClick"
>{{ data.signFlag ? "已签到" : "签到" }}
</botton>
</div>
</div>
<div v-else class="sign">
<div class="sign">
<button
v-if="isAllowSign"
class="btn"
:style="{
background: data.signFlag ? '#999' : 'rgb(57, 146, 249)',
}"
@click="signClick"
>
{{ data.signFlag ? "已签到" : "签到" }}
</button>
<button
v-else
class="btn"
:style="{ background: '#999' }"
@click="signClick"
>
{{ data.signFlag ? "已签到" : "签到" }}
</button>
</div>
</div>
</div>
</div>
<div class="details">
<div class="details_title">活动详情</div>
<div class="details_content">
大族广场写字楼采用国际顶级硬件设施美国OTIS电梯麦克维尔中央空调高端安防系统等商务空间新标准匹配项目在亦庄地标综合体的形象写字楼空间设计由亚洲著名的室内空间设计大师之一梁景华设计写字楼群由六栋(T1T6)呈舰队排列的5A写字楼构成形成独特的舰队造型<br />购物中心介绍<br />大族广场Mall&More位于北京经济技术开发区核心商圈荣华路由荷兰鹿特丹缤纷市场设计师HANS
VAN DALEN
主持设计,秉持自然与未来和谐共生理念,倡导乐活有机绿色环保的生活方式,传递生活美学<br />大族广场Mall&More汇集众多知名优质品牌,7FRESH生鲜超市CGV星聚汇影城中信书店源力悦体等,集购物餐饮娱乐文化于一体,丰富的业态品类为消费者提供城市生活的第三空间感受<br />大族广场Mall&More以人为本,不断提升服务水平,升级消费购物体验,致力于营造更加舒适的购物环境与空间,打造有温度的品牌同时根据春夏秋冬四季策划丰富多样的大型主题活动为会员设置专属的沙龙活动打造专属会员日等
<div>
<span>活动时长:</span>
<div class="content">
{{
data?.activityDuration ? data?.activityDuration + "分钟" : "-"
}}
</div>
</div>
<div>
<span>活动地点:</span>
<div class="content">
{{ data?.activityAddress ? data?.activityAddress : "-" }}
</div>
</div>
<div>
<span>活动考勤:</span>
<div class="content">
{{
data?.beforeSignIn
? "活动开始前" + data?.beforeSignIn + "分钟开始签到"
: "-"
}}
</div>
<div class="content">
{{
data?.afterSignIn
? "活动开始后" + data?.afterSignIn + "分钟结束签到"
: "-"
}}
</div>
</div>
<!--
<div>
<div>活动完成标准:</div>
<div class="content">
{{ data?.standardSettings ? "仅签到" : "-" }}
</div>
</div>
-->
<div>
<span>活动说明:</span>
<div class="content">
{{ data?.activityExplain ? data?.activityExplain : "-" }}
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
// import { reactive, toRefs } from "vue";
//import TitleHead from "@/components/TitleHead.vue";
export default {
name: "ActivitiesPage",
components: {
//TitleHead,
},
setup() {},
<script setup>
import { TASK_ACTIVITY_SIGN, ACTIVITY } from "@/api/api";
import { request, useRequest } from "@/api/request";
import { useRouter } from "vue-router";
import { useRoute } from "vue-router/dist/vue-router";
import { ElMessage } from "element-plus";
import { reactive, onUnmounted, toRefs } from "vue";
import ReturnHead from "@/components/ReturnHead.vue";
const router = useRouter();
const returnclick = () => {
router.back();
};
const {
query: { courseId: activityId, id: taskId, type },
} = useRoute();
console.log("query", activityId, taskId, type);
const state = reactive({
isAllowSign: false,
closeBtn: true,
});
const { isAllowSign, closeBtn } = toRefs(state);
const { data } = useRequest(ACTIVITY, { activityId });
console.log("data", data);
const signClick = (tab, event) => {
if (data.value.signFlag) {
return;
}
if (!state.isAllowSign) {
// console.log("data.signFlag", data.value.signFlag, isAllowSign);
ElMessage.warning("未在允许签到时间范围内");
return;
}
data.value.signFlag = true;
ElMessage.warning("签到成功");
request(TASK_ACTIVITY_SIGN, {
courseId: activityId,
taskId,
type,
});
};
let timer = null;
//判断能否签到
function isSignClick() {
timer = setInterval(() => {
let beginTime = new Date(data.value.activityStartTime).getTime();
let endTime = !data.value.afterSignIn
? new Date(data.value.activityEndTime).getTime()
: new Date(data.value.activityStartTime).getTime();
let nowTime = new Date().getTime();
if (data.value.beforeSignIn && data.value.afterSignIn) {
//有开始前有开始后
beginTime = beginTime - data.value.beforeSignIn * 60 * 1000;
endTime = endTime + data.value.afterSignIn * 60 * 1000;
console.log("1111");
} else if (data.value.beforeSignIn && !data.value.afterSignIn) {
//只有开始前无开始后
beginTime = beginTime - data.value.beforeSignIn * 60 * 1000;
console.log("11112222");
} else if (!data.value.beforeSignIn && data.value.afterSignIn) {
//无开始前有开始后
endTime = endTime + data.value.afterSignIn * 60 * 1000;
console.log("1111333");
}
// console.log(nowTime, beginTime, endTime, data.value);
// console.log(nowTime < endTime, nowTime > beginTime);
// console.log(state.isAllowSign);
if (nowTime < endTime && nowTime > beginTime) {
state.isAllowSign = true;
} else {
state.isAllowSign = false;
}
// console.log(
// "isAllowSign",
// state.isAllowSign,
// nowTime,
// endTime,
// beginTime,
// nowTime < endTime,
// nowTime > beginTime
// );
}, 1000);
}
isSignClick();
onUnmounted(() => {
if (timer) {
clearInterval(timer);
}
});
//是否显示头部公告
const isShowClose = () => {
state.closeBtn = false;
};
</script>
@@ -83,8 +261,9 @@ export default {
width: 100%;
height: 25px;
display: flex;
justify-content: center;
// justify-content: center;
position: relative;
.text {
//display: flex;
height: 25px;
@@ -97,6 +276,7 @@ export default {
text-overflow: ellipsis;
overflow: hidden;
}
.close {
display: flex;
position: absolute;
@@ -110,6 +290,7 @@ export default {
margin-bottom: 8px;
}
}
.title {
width: 100%;
//height: 74px;
@@ -117,6 +298,7 @@ export default {
background-color: rgba(255, 255, 255, 1);
display: flex;
justify-content: center;
.titlemain {
width: 90%;
display: flex;
@@ -124,12 +306,16 @@ export default {
margin-bottom: 15px;
justify-content: space-between;
align-items: center;
.timeposition {
.time {
display: flex;
align-items: center;
}
width: calc(100% - 93px);
// background-color: pink;
}
.titlebtn {
width: 83px;
height: 33px;
@@ -145,8 +331,23 @@ export default {
line-height: 12px;
cursor: pointer;
}
.sign {
width: 93px;
height: 33px;
.btn {
width: 93px;
height: 33px;
border-radius: 6px;
border: 0;
font-size: 14px;
cursor: pointer;
flex-shrink: 0;
color: #fff;
}
}
}
}
.details {
width: 100%;
margin-top: 11.5px;
@@ -155,6 +356,7 @@ export default {
align-items: center;
background-color: rgba(255, 255, 255, 1);
padding-bottom: 20px;
.details_title {
width: 90%;
display: flex;
@@ -165,13 +367,24 @@ export default {
padding: 17px 0 17px 0px;
border-bottom: 0.5px solid rgba(241, 242, 243, 1);
}
.details_content {
display: flex;
// display: flex;
width: 90%;
margin-top: 15px;
font-size: 13px;
color: rgba(110, 123, 132, 1);
line-height: 30.29px;
.content {
// margin: 25px 24px 49px 49px;
color: #677d86;
width: 361px;
// height: 304px;
// line-height: 24px;
// font-size: 16px;
font-weight: bold;
margin-left: 10px;
}
}
}
}

View File

@@ -152,7 +152,7 @@ export default {
display: flex;
justify-content: center;
// margin-top: -17.5px;
margin-top: 20px;
// margin-top: 20px;
.noticebox {
width: 100%;
background: #fff;

View File

@@ -156,6 +156,7 @@
<script>
import { reactive, toRefs } from "vue";
// import TitleHead from "@/components/TitleHead.vue";
import px from '@/assets/image/discuss/px.jpg'
export default {
name: "DiscussDetail",
components: {
@@ -168,8 +169,8 @@ export default {
name: "罗宗梅",
time: "2022-09-01",
re: "教师基本功扎实,知识讲解准确,教学设计合理,始终以学生为主体,自主学习,小组交流讨论,上台交流展示等形式,师生配合默契,取得了较好的学习效果。",
head: require("../../assets/image/discuss/px.jpg"),
reimg: require("../../assets/image/discuss/px.jpg"),
head: px,
reimg: px,
},
],
@@ -178,7 +179,7 @@ export default {
name: "赵雪梨",
time: "3天前",
re: "教学重难点突出,板书条理清晰。教学步骤设计合理由浅入深,循序渐进。",
head: require("../../assets/image/discuss/px.jpg"),
head: px,
},
// {
// name: "赵雪梨",

View File

@@ -48,14 +48,18 @@
<div class="samei">{{ item.pinglun }}</div>
<div class="imgcont">
<img
v-if="item.isGood"
@click="getId(item)"
style="margin-left: 56px"
class="imgs"
:src="
item.isGood
? require('../../assets/image/discuss/dianzan2.png')
: require('../../assets/image/discuss/dianzan.png')
"
src="../../assets/image/discuss/dianzan2.png"
/>
<img
v-else
@click="getId(item)"
style="margin-left: 56px"
class="imgs"
src="../../assets/image/discuss/dianzan.png"
/>
</div>
<div :class="item.isGood ? 'sameii' : 'samei'">

View File

@@ -0,0 +1,362 @@
<template>
<div class="evaluation">
<ReturnHead text="测评详情"></ReturnHead>
<!-- <TitleHead text="【投票】管理者进阶腾飞班 - 授课方式"></TitleHead> -->
<!-- <div class="top" :style="{ display: closeBtn ? 'flex' : 'none' }">
<div class="topin">
<div class="topsa">
{{ data?.liveNotice }}
</div>
<img
class="topimg"
@click="isShowClose"
src="../../assets/image/liveboradcast/cha.png"
/>
</div>
</div> -->
<div class="notice" style="margin-top: 0">
<div class="noticebox">
<!-- <div class="avator">
<img class="avaimg" :src="teacherInfo.avatar" />
<div class="avaname">{{ data.userInfoBo?.userName }}</div>
</div> -->
<div class="mani">
<div class="joininfo">测评{{ data?.linkName }}</div>
<div class="contenttitle">
<img class="timeimg" src="../../assets/image/ballotpage/time.png" />
<div class="timee">
{{ data?.liveStartTime + " 至 " + data?.liveEndTime }}
</div>
</div>
<div class="timebox">
<div class="samez" style="margin-left: 18px">
{{ hour }}
</div>
<div class="samey"></div>
<div class="samez">
{{ minute }}
</div>
<div class="samey"></div>
<div class="samez">
{{ seconds }}
</div>
<div class="samey"></div>
</div>
<div class="midline"></div>
</div>
</div>
</div>
<div class="notice">
<div class="noticebox">
<div class="mani">
<div class="joininfo">测评说明</div>
<div class="line"></div>
<div class="contentone">
<div class="actinner">
{{ data.linkDescription }}
</div>
</div>
</div>
</div>
<div class="btnbox">
<div class="submitbtn" @click="goOuterChain">去查看</div>
</div>
</div>
</div>
</template>
<script setup>
import ReturnHead from "@/components/ReturnHead.vue";
import { computed, reactive, toRefs, onUnmounted, ref } from "vue";
import img from "@/assets/image/uploadimg.png";
import { request, useRequest } from "@/api/request";
import { LINK_DETAILS, STUDY_RECORD } 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";
import dayjs from "dayjs";
const {
query: {
courseId: linkId,
id: taskId,
type,
status,
chapterOrStageId,
infoId,
studentId,
},
} = useRoute();
const router = useRouter();
console.log("外链信息", linkId);
const { data } = useRequest(LINK_DETAILS(linkId));
console.log("外链信息", data);
const goOuterChain = () => {
status != 1 &&
request(STUDY_RECORD, {
studentId: studentId,
targetId: infoId,
logo: type,
stageOrChapterId: chapterOrStageId,
taskId: taskId,
});
window.open(data.value.linkAddress, "_top");
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="scss">
.clearfix:before,
.clearfix:after {
content: " ";
display: table;
clear: both;
}
.evaluation {
width: 100%;
.top {
width: 100%;
display: flex;
justify-content: center;
height: 25px;
background-color: #fffbee;
.topin {
// text-align: center;
width: 90%;
height: 25px;
display: flex;
justify-content: space-between;
.topsa {
color: #ff9e00;
line-height: 25px;
font-size: 12px;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.topimg {
height: 10px;
width: 10px;
margin-top: 7px;
}
}
}
.notice {
width: 100%;
// display: flex;
// justify-content: center;
// // margin-top: -17.5px;
padding-bottom: 24px;
margin-top: 20px;
background: #fff;
.noticebox {
width: 100%;
background: #fff;
// border-radius: 4px;
position: relative;
display: flex;
justify-content: center;
.avator {
display: flex;
position: absolute;
right: 29px;
top: 30px;
// background-color:red;
// z-index: 999;
.avaimg {
width: 30px;
height: 30px;
border-radius: 50%;
}
.avaname {
line-height: 30px;
margin-left: 8px;
color: #0d233a;
}
}
.line {
width: 100%;
height: 0;
border-top: 1px solid #f1f2f3;
margin-top: 17px;
position: absolute;
left: 0;
}
.mani {
width: 90%;
margin-top: 20px;
// position:relative;
.joininfo {
color: #0d233a;
font-size: 16px;
font-weight: bold;
}
.contenttitle {
width: 100%;
// height:10px;
margin-top: 15px;
// background-color: #bfa;
display: flex;
.timeimg {
width: 12.8px;
height: 13px;
}
.timee {
color: #6e7b84;
font-size: 14px;
line-height: 13px;
margin-left: 6px;
}
}
.midline {
height: 0;
border-top: 1px solid #f1f2f3;
width: 100%;
margin-top: 15px;
margin-bottom: 15px;
}
.timebox {
display: flex;
width: 100%;
height: 49px;
background-color: #f2f5f7;
margin-top: 17.5px;
margin-bottom: 27.5px;
border-radius: 10px;
.samez {
color: #0060ff;
font-size: 18px;
line-height: 49px;
margin-left: 13px;
}
.samey {
color: #6e7b84;
font-size: 14px;
line-height: 49px;
margin-left: 13px;
}
}
.detailin {
width: 100%;
// height: 100px;
// background-color: red;
display: flex;
justify-content: center;
.in {
margin-left: 20px;
width: 86%;
color: #6e7b84;
line-height: 30px;
font-size: 13px;
}
}
.contentone {
margin-top: 43px;
display: flex;
justify-content: space-between;
width: 100%;
margin-bottom: 20px;
// height: 200px;
.actinner {
// background-color: red;
color: #6e7b84;
font-size: 13px;
line-height: 30px;
}
.de {
width: 100%;
height: 34px;
border-radius: 10px;
background-color: #f2f5f7;
display: flex;
justify-content: space-between;
.deal {
color: #333330;
font-weight: bold;
line-height: 34px;
margin-left: 21px;
font-size: 14px;
}
.rightpng {
width: 6px;
height: 11px;
margin-right: 6px;
margin-top: 12px;
}
}
.ballotjoincontainer {
display: flex;
width: 100%;
justify-content: center;
.ballotjoin {
width: 85%;
// height:100px;
// background-color: #bfa;
.ballotitem {
.upitem {
display: flex;
justify-content: space-between;
.left {
display: flex;
.leftimg {
width: 4.5px;
height: 14.5px;
margin-top: 1px;
}
.leftcontent {
margin-left: 9px;
color: #6e7b84;
font-size: 13px;
line-height: 30px;
margin-top: -5px;
}
}
.btn {
background-color: #2478ff;
color: #fff;
width: 64px;
height: 21px;
border-radius: 10px;
border: 0;
font-size: 12px;
line-height: 19px;
margin-top: -1px;
}
}
.thinline {
width: 100%;
border-top: 1px solid #f1f2f3;
margin-top: 17px;
margin-bottom: 17px;
}
}
}
}
}
}
}
.btnbox {
width: 301.5px;
height: 33px;
background-color: #2478ff;
border-radius: 6px;
box-shadow: 0px 1px 8px 0px rgba(56, 125, 247, 0.7);
font-size: 14px;
margin: 30px auto 0 auto;
text-align: center;
line-height: 33px;
.submitbtn {
border: none;
border-radius: 6px;
background-color: #2478ff;
color: #ffffff;
}
}
}
}
</style>

View File

@@ -3,7 +3,6 @@
<!-- <TitleHead text="【考试】管理者进阶腾飞班 - 毕业典礼"></TitleHead> -->
<div class="notice">
<div class="noticebox">
<div class="main">
<div class="e_title">管理者进阶腾飞班 - 第一次考试</div>
<div class="et_detail">
@@ -35,23 +34,17 @@
<th>状态</th>
</tr>
<tr class="trbox2">
<td>
2022-7-20 00:00
</td>
<td>2022-7-20 00:00</td>
<td>10</td>
<td>已完成</td>
</tr>
<tr class="trbox3">
<td>
2022-7-20 00:00
</td>
<td>2022-7-20 00:00</td>
<td>10</td>
<td>已完成</td>
</tr>
<tr class="trbox4">
<td>
2022-7-20 00:00
</td>
<td>2022-7-20 00:00</td>
<td>10</td>
<td>已完成</td>
</tr>
@@ -59,7 +52,6 @@
</div>
</div>
</div>
</div>
</div>
</template>
@@ -78,7 +70,7 @@ export default {
<style lang="scss" scoped>
.examination {
width: 100%;
background-color: #F2F5F7;
background-color: #f2f5f7;
}
.notice {
@@ -86,109 +78,109 @@ export default {
margin-top: 10px;
font-size: 14px;
}
.noticebox {
width: 100%;
background: #fff;
margin-bottom: 11.5px;
.main {
width: 90%;
margin: 0 auto;
padding-top: 18.5px;
padding-bottom: 27.5px;
.noticebox {
width: 100%;
background: #fff;
margin-bottom: 11.5px;
.main {
width: 90%;
margin: 0 auto;
padding-top: 18.5px;
padding-bottom: 27.5px;
}
}
.e_title {
margin-bottom: 14.5px;
font-weight: 600;
}
.et_detail {
display: flex;
margin-bottom: 11.5px;
align-items: center;
.et_icon {
width: 15px;
height: 15px;
background-image: url("../../assets/image/readyexamination/time.png");
background-size: 100% 100%;
margin-right: 6px;
}
.et_time {
color: #6e7b84;
}
}
.et_box {
margin-top: 16.5px;
background-color: #f2f5f7;
border-radius: 10px;
padding: 18px 0 17px 22px;
.et_length {
display: flex;
align-items: center;
.et_name {
margin-right: 5px;
color: #6e7b84;
}
.et_minute {
color: #2478ff;
margin-right: 56px;
}
.et_lineicon {
width: 17.5px;
height: 17.5px;
background-image: url(../../assets/image/readyexamination/smile.png);
margin-right: 8px;
}
.et_score {
color: #ff9e00;
}
}
.e_title{
margin-bottom: 14.5px ;
font-weight: 600;
}
.et_detail{
display: flex;
margin-bottom: 11.5px;
align-items: center;
.et_icon{
width: 15px;
height: 15px;
background-image: url('../../assets/image/readyexamination/time.png');
background-size: 100% 100%;
margin-right: 6px;
}
.et_time{
color: #6E7B84;
}
}
.et_box{
margin-top: 16.5px;
background-color: #F2F5F7;
border-radius: 10px;
padding: 18px 0 17px 22px;
.et_length{
display: flex;
align-items: center;
.et_name{
margin-right: 5px;
color: #6E7B84;
}
.et_minute{
color: #2478FF;
margin-right: 56px;
}
.et_lineicon{
width: 17.5px;
height: 17.5px;
background-image: url(../../assets/image/readyexamination/smile.png);
margin-right: 8px;
}
.et_score{
color: #FF9E00;
}
}
}
}
.btnbox {
width: 301.5px;
height: 33px;
background-color: #2478ff;
border-radius: 6px;
box-shadow: 0px 1px 8px 0px rgba(56, 125, 247, 0.7);
font-size: 13.5px;
margin: 18.5px auto 43.5px 20px;
text-align: center;
line-height: 33px;
.textbtn {
width: 301.5px;
border: none;
background-color: #2478ff;
border-radius: 6px;
color: #ffffff;
}
}
.e_form {
width: 100%;
display: flex;
flex-direction: column;
font-size: 12px;
color: #333330;
table {
width: 100%;
border-collapse: collapse;
text-align: center;
margin-bottom: 6.5px ;
.trbox1 {
width: 342.5px;
height: 40px;
border-radius: 4px;
background-color: #f2f5f7;
}
td {
padding: 14.5px;
}
.trbox2,
.trbox3,
.trbox4 {
border-bottom: 0.5px solid #F1F2F3;
}
}
}
.btnbox {
width: 100%;
height: 33px;
background-color: #2478ff;
border-radius: 6px;
box-shadow: 0px 1px 8px 0px rgba(56, 125, 247, 0.7);
font-size: 13.5px;
// margin: 18.5px auto 43.5px 20px;
margin-top: 18.5px;
margin-bottom: 43.5px;
text-align: center;
line-height: 33px;
.textbtn {
width: 90%;
border: none;
background-color: #2478ff;
border-radius: 6px;
color: #ffffff;
}
}
.e_form {
width: 100%;
display: flex;
flex-direction: column;
font-size: 12px;
color: #333330;
table {
width: 100%;
border-collapse: collapse;
text-align: center;
margin-bottom: 6.5px;
.trbox1 {
width: 342.5px;
height: 40px;
border-radius: 4px;
background-color: #f2f5f7;
}
td {
padding: 14.5px;
}
.trbox2,
.trbox3,
.trbox4 {
border-bottom: 0.5px solid #f1f2f3;
}
}
}
</style>

View File

@@ -1,6 +1,7 @@
<template>
<div class="faceteach">
<TitleHead text="【其他活动】核心项目面授课"></TitleHead>
<ReturnHead text="课程详情"></ReturnHead>
<TitleHead :text="'【面授课】' + data.planDto?.name"></TitleHead>
<div class="main">
<div class="title">
<div class="titlemain">
@@ -11,7 +12,11 @@
src="../../assets/image/faceteach/time.png"
/>
<div style="font-size: 12px; color: rgba(110, 123, 132, 1)">
2022-07-20 20:00-21:00
{{
dayjs(data.planDto?.beginTime).format("YYYY-MM-DD HH:mm") +
" 至 " +
dayjs(data.planDto?.endTime).format("YYYY-MM-DD HH:mm")
}}
</div>
</div>
<div class="time" style="margin-top: 9px">
@@ -20,32 +25,129 @@
src="../../assets/image/faceteach/position.png"
/>
<div style="font-size: 12px; color: rgba(110, 123, 132, 1)">
大族广场
{{ data.planDto?.address }}
</div>
</div>
</div>
<div class="titlebtn">评估</div>
<!-- <div class="titlebtn">评估</div> -->
<div v-if="projectStatus && projectEndTime">
<div
v-if="
projectStatus !== '3' &&
new Date(projectEndTime).getTime() > new Date().getTime()
"
style="display: flex"
>
<botton
class="titlebtn"
style="margin-right: 20px"
:style="{
background: isAllowSign
? data.signFlag
? '#999'
: 'rgb(57, 146, 249)'
: '#999',
}"
@click="signClick"
>{{ data.signFlag ? "已签到" : "签到" }}
</botton>
<!-- <botton style="background: #999" class="btn" @click="toSurvery" v-if="data.planDto?.evalFlag == 0">
评估
</botton> -->
<botton
v-if="data.planDto?.evalFlag !== 0"
:style="{
background: `${
new Date(data.planDto?.beginTime).getTime() >
new Date().getTime()
? '#999'
: data.isSurvery
? '#999'
: 'rgb(57, 146, 249)'
}`,
}"
class="titlebtn"
@click="toSurvery"
>{{ data.isSurvery ? "已评估" : "评估" }}
</botton>
</div>
</div>
<div v-else>
<div style="display: flex">
<botton
class="titlebtn"
style="margin-right: 20px"
:style="{
background: isAllowSign
? data.signFlag
? '#999'
: 'rgb(57, 146, 249)'
: '#999',
}"
@click="signClick"
>{{ data.signFlag ? "已签到" : "签到" }}
</botton>
<!-- <botton style="background: #999" class="btn" @click="toSurvery" v-if="data.planDto?.evalFlag == 0">
评估
</botton> -->
<botton
v-if="data.planDto?.evalFlag !== 0"
:style="{
background: `${
new Date(data.planDto?.beginTime).getTime() >
new Date().getTime()
? '#999'
: data.isSurvery
? '#999'
: 'rgb(57, 146, 249)'
}`,
}"
class="titlebtn"
@click="toSurvery"
>{{ data.isSurvery ? "已评估" : "评估" }}
</botton>
</div>
</div>
<!-- <button
v-if="data.planDto?.evalFlag !== 0"
:style="{
background: `${
new Date(data.planDto?.beginTime).getTime() >
new Date().getTime()
? '#999'
: data.isSurvery
? '#999'
: 'rgb(57, 146, 249)'
}`,
}"
class="titlebtn"
@click="toSurvery"
>
{{ data.isSurvery ? "已评估" : "评估" }}
</button> -->
</div>
</div>
<div class="teacher">
<div style="width: 90%">
<div class="teachertitle">
<div class="teachertitle" style="width: 100px">
<img
style="width: 17px; height: 17px"
src="../../assets/image/faceteach/livelecturer.png"
/>
<div class="talk">直播讲师</div>
<div class="box"></div>
<div class="talk">面授课讲师</div>
<div class="box" style="width: 80px; right: 0px"></div>
</div>
<div class="teachermain">
<img class="teacherAvatar" src="../../assets/image/img.jpg" />
<img class="teacherAvatar" :src="teacherInfo.avatar" />
<div style="flex: 1; margin-left: 11px; margin-right: 13px">
<div class="teacherName">王星天显示事业</div>
<div class="teacherName">{{ data.planDto?.teacher }}</div>
<div class="teacherIntro">
教师是学生的镜子,学生是 老师的影子
{{ data.planDto?.bandDesc }}
</div>
</div>
<div class="teacherFollow">+ 关注</div>
<!-- <div class="teacherFollow">+ 关注</div> -->
</div>
</div>
</div>
@@ -60,12 +162,7 @@
<div class="box"></div>
</div>
<div class="detailMain">
通过对各级人员的软件平台培训使其能够了解如何
运用乾元坤和智能信息管理系统来提升企业管理水平
最大限度发挥软件产品在企业中的作用<br />
1.使企业不同部门人员掌握便捷有效的系统平台操 作方法;<br />
2.通过系统平台的培训提高员工对企业的管理理念认 识与提升<br />
3.通过系统平台培训加强沟通统一部署协同工作 提高效率
{{ data.planDto?.description }}
</div>
</div>
</div>
@@ -74,76 +171,215 @@
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="课程附件" name="first">
<div
v-for="(el, index) in enclosure"
:key="el.id"
class="enclosure"
:style="{
'border-bottom':
index === enclosure.length - 1
? null
: '1px solid rgba(56, 125, 247, 0.2)',
}"
v-if="data.planDto?.attach === ''"
style="
font-size: 14px;
font-weight: 400;
line-height: 24px;
cursor: pointer;
margin-left: 40px;
margin-top: 20px;
margin-bottom: 20px;
"
>
<div class="enclosureL">
<img style="width: 19.5px; height: 22px" :src="el.img" />
<div style="margin-left: 15px">{{ el.name }}</div>
</div>
<div class="download">
<img
style="width: 13px; height: 12px"
src="../../assets/image/faceteach/download.png"
/>
<div style="margin-left: 2.5px">下载</div>
此课程无附件
</div>
<div v-else>
<div
v-for="(el, index) in formateArr(data.planDto?.attach)"
:key="index"
class="enclosure"
:style="{
borderBottom: '1px solid rgba(56, 125, 247, 0.2)',
}"
>
<div class="enclosureL">
<FileTypeImg
:v-model="
el.name
? el.name
: el.slice(el.lastIndexOf('/') + 1, el.indexOf('-')) +
el.slice(el.lastIndexOf('.'))
"
:style="{
width: '19.5px',
height: '22px',
marginLeft: '10px',
}"
></FileTypeImg>
<div style="margin-left: 15px">
{{
el.name
? el.name
: el.slice(el.lastIndexOf("/") + 1, el.indexOf("-")) +
el.slice(el.lastIndexOf("."))
}}
</div>
<!-- <img style="width: 19.5px; height: 22px" :src="el.img" />
<div style="margin-left: 15px">{{ el.name }}</div> -->
</div>
<div
v-if="
projectStatus !== '3' &&
new Date(projectEndTime).getTime() > new Date().getTime()
"
>
<div
v-if="
new Date(data.planDto.beginTime).getTime() >
new Date().getTime()
"
class="download"
>
<img
style="width: 13px; height: 12px"
src="../../assets/image/faceteach/download.png"
/>
<div style="margin-left: 2.5px" @click="downloads(el)">
下载
</div>
</div>
<div v-else class="download">
<img
style="width: 13px; height: 12px"
src="../../assets/image/faceteach/download.png"
/>
<div
style="margin-left: 2.5px; color: #999"
@click="download(el.name ? el.response.data : el)"
>
下载
</div>
</div>
</div>
</div>
</div>
</el-tab-pane>
<el-tab-pane label="课程作业" name="second">
<div class="work">
<div class="question">社交产品如何做好模块化处理</div>
<div style="display: flex; justify-content: space-between">
<div
style="
margin-top: 16px;
flex: 1;
display: flex;
flex-wrap: wrap;
"
>
<div class="tag1" style="margin: 0px 10px 10px 0px">
必修
</div>
<div class="tag3" style="margin: 0px 10px 10px 0px">
作业
<div v-if="data.workDto">
<div>
<div class="question">{{ data.workDto?.workName }}</div>
<div style="display: flex; justify-content: space-between">
<div
style="
margin-top: 16px;
flex: 1;
display: flex;
flex-wrap: wrap;
"
>
<div
class="tag1"
v-if="data.workDto?.workFlag"
style="margin: 0px 10px 10px 0px"
>
必修
</div>
<div class="tag3" style="margin: 0px 10px 10px 0px">
作业
</div>
</div>
</div>
</div>
<div class="submit">提交</div>
<div
v-if="
projectStatus !== '3' &&
new Date(projectEndTime).getTime() > new Date().getTime()
"
:style="{
background:
new Date(data.planDto?.beginTime).getTime() >
new Date().getTime()
? '#999'
: '',
}"
class="submit"
@click="toWork"
>
交作业
</div>
</div>
<div
v-else
style="
font-size: 14px;
font-weight: 400;
line-height: 24px;
cursor: pointer;
margin-left: 40px;
margin-top: 20px;
"
>
此课程无作业
</div>
</div>
</el-tab-pane>
<el-tab-pane label="课程考试" name="third">
<div class="work">
<el-tab-pane
label="课程考试"
name="third"
:disabed="dayjs().isBefore(dayjs(data.planDto?.beginTime))"
>
<div class="work" v-if="data.examinationDto?.examinationTestName">
<div class="question">
模块化产品展示相关案例与展示如何自由组合你的 思考
{{ data.examinationDto?.examinationName }}
</div>
<div style="display: flex; justify-content: space-between">
<div
style="
margin-top: 16px;
flex: 1;
display: flex;
flex-wrap: wrap;
"
>
<div class="tag1" style="margin: 0px 10px 10px 0px">
必修
</div>
<div class="tag3" style="margin: 0px 10px 10px 0px">
作业
<div>
<div
style="
margin-top: 16px;
flex: 1;
display: flex;
flex-wrap: wrap;
"
>
<div
class="tag1"
style="margin: 0px 10px 10px 0px"
v-if="data.examinationDto?.examinationFlag"
>
必修
</div>
<div class="tag3" style="margin: 0px 10px 10px 0px">
考试
</div>
</div>
</div>
<div class="submit">提交</div>
<div
v-if="
projectStatus !== '3' &&
new Date(projectEndTime).getTime() > new Date().getTime()
"
:style="{
background:
new Date(data.planDto?.beginTime).getTime() >
new Date().getTime()
? '#999'
: '',
}"
class="submit"
@click="toExamItem(data.examinationDto)"
>
去考试
</div>
</div>
</div>
<div
v-else
style="
font-size: 14px;
font-weight: 400;
line-height: 24px;
cursor: pointer;
margin-left: 40px;
margin-top: 20px;
margin-bottom: 20px;
"
>
此课程无考试
</div>
</el-tab-pane>
</el-tabs>
</div>
@@ -152,79 +388,217 @@
</div>
</template>
<script>
import { reactive, toRefs } from "vue";
<script setup>
import TitleHead from "@/components/TitleHead.vue";
export default {
name: "FaceTeach",
components: {
TitleHead,
},
setup() {
const state = reactive({
activeName: "first",
enclosure: [
{
id: 1,
name: "项目参考文档.doc",
img: require("../../assets/image/file/word.png"),
},
{
id: 2,
name: "人工智能启蒙讲解讲义.pptx",
img: require("../../assets/image/file/ppt.png"),
},
{
id: 3,
name: "人工智能启蒙讲解讲义.xlsx",
img: require("../../assets/image/file/excel.png"),
},
],
teacher: [
{
id: 1,
name: "王星天(显示事业)",
introduce: "教师是学生的镜子,学生是老师的影子。",
peopleimg: require("../../assets/image/img.jpg"),
medal: [
require("../../assets/image/medal/medal1.png"),
require("../../assets/image/medal/medal2.png"),
require("../../assets/image/medal/medal3.png"),
],
},
{
id: 2,
name: "王星天(显示事业)",
introduce: "教师是学生的镜子,学生是老师的影子。",
peopleimg: require("../../assets/image/img.jpg"),
medal: [
require("../../assets/image/medal/medal1.png"),
require("../../assets/image/medal/medal2.png"),
],
},
{
id: 3,
name: "王星天(显示事业)",
introduce:
"教师是学生的镜子,学生是老师的影子。教师是学生的镜子,学生是老师的影子。教师是学生的镜子,学生是老师的影子。教师是学生的镜子,学生是老师的影子。",
peopleimg: require("../../assets/image/img.jpg"),
medal: [
require("../../assets/image/medal/medal1.png"),
require("../../assets/image/medal/medal2.png"),
require("../../assets/image/medal/medal3.png"),
],
},
],
});
const handleClick = (tab, event) => {
console.log(tab, event);
};
return {
...toRefs(state),
handleClick,
};
},
import ReturnHead from "@/components/ReturnHead.vue";
import { computed, reactive, toRefs, watch, onUnmounted } from "vue";
import FileTypeImg from "@/components/FileTypeImg.vue";
import { request, useRequest } from "@/api/request";
import {
STU_OFFCOURSE_DETAIL,
TASK_OFFCOURSE_NOTASK_SIGN,
TASK_OFFCOURSE_SIGN,
TASK_BROADCAST_SIGN,
} from "@/api/api";
import { useRoute, useRouter } from "vue-router";
import { useUserInfo } from "@/api/utils";
import { ElMessage, messageConfig } from "element-plus";
import dayjs from "dayjs";
const router = useRouter();
const returnclick = () => {
router.back();
};
const {
query: { courseId, type, id: taskId, projectStatus, projectEndTime },
} = useRoute();
const { data } = useRequest(STU_OFFCOURSE_DETAIL, { courseId });
console.log("datadatadatadatadatadatadata", data);
console.log("项目状态字段传递", projectStatus, projectEndTime);
const teacherInfo = useUserInfo(computed(() => data.value?.planDto?.teacherId));
const state = reactive({
activeName: "first",
enclosure: "",
isAllowSign: false,
});
const { activeName, enclosure, isAllowSign } = toRefs(state);
const handleClick = (tab, event) => {
console.log("附件", tab, event);
};
const download = (url) => {
window.open(url);
};
const downloads = (url) => {
ElMessage.warning("未到开始时间,请耐心等待!");
};
function formateArr(strs) {
let newArr = [];
try {
newArr = JSON.parse(strs);
} catch {
newArr = strs.split(",");
}
console.log("112233", newArr);
return newArr;
}
let timer = null;
//判断能否签到
function isSignClick() {
timer = setInterval(() => {
let beginTime = new Date(data.value.planDto?.beginTime).getTime();
let endTime = !data.value.planDto?.afterStart
? new Date(data.value.planDto?.endTime).getTime()
: new Date(data.value.planDto?.beginTime).getTime();
let nowTime = new Date().getTime();
if (data.value.planDto?.beforeStart && data.value.planDto?.afterStart) {
//有开始前有开始后
beginTime = beginTime - data.value.planDto?.beforeStart * 60 * 1000;
endTime = endTime + data.value.planDto?.afterStart * 60 * 1000;
console.log("1111");
} else if (
data.value.planDto?.beforeStart &&
!data.value.planDto?.afterStart
) {
//只有开始前无开始后
beginTime = beginTime - data.value.planDto?.beforeStart * 60 * 1000;
console.log("11112222");
} else if (
!data.value.planDto?.beforeStart &&
data.value.planDto?.afterStart
) {
//无开始前有开始后
endTime = endTime + data.value.planDto?.afterStart * 60 * 1000;
console.log("1111333");
}
if (nowTime < endTime && nowTime > beginTime) {
state.isAllowSign = true;
} else {
state.isAllowSign = false;
}
// console.log(
// "isAllowSign",
// state.isAllowSign,
// nowTime,
// endTime,
// beginTime,
// nowTime < endTime,
// nowTime > beginTime
// );
}, 1000);
}
isSignClick();
//签到
const signClick = () => {
if (data.value.signFlag) {
return;
}
// console.log(
// "data.signFlag",
// data.value.signFlag,
// state.isAllowSign,
// !state.isAllowSign
// );
//if (data.value.planDto.beginTime) {
// let date1 = new Date(data.value.planDto.beginTime).getTime()
// let date2 = new Date().getTime()
// if (date1 > date2) {
// ElMessage.info("未到开始时间,请耐心等待!");
// return;
// }
//}
if (!state.isAllowSign) {
// console.log("data.signFlag", data.value.signFlag, isAllowSign);
ElMessage.warning("未在允许签到时间范围内");
return;
}
data.value.signFlag = 1;
ElMessage.warning("签到成功");
if (taskId) {
request(TASK_OFFCOURSE_SIGN, { courseId: courseId, taskId, type });
} else {
request(TASK_OFFCOURSE_NOTASK_SIGN, { courseId: courseId });
}
};
function toSurvery() {
if (data.value.isSurvery) {
// return;
}
if (
data.value.planDto.beginTime &&
dayjs().isBefore(data.value.planDto.beginTime)
) {
ElMessage.warning("课程未开始,请耐心等待!");
return;
}
if (data.value.planDto.evalFlag == 0) {
ElMessage.warning("此课程无评估");
return;
}
router.push({
path: "/investigatpage",
query: {
id: taskId,
courseId: data.value.planDto.evaluateId,
pName: "面授课",
infoId: data.value.planDto.offcoursePlanId,
chapterOrStageId: 0,
sName: data.value.planDto.name,
type,
},
});
}
function toWork() {
if (data.value.planDto.beginTime) {
let date1 = new Date(data.value.planDto.beginTime).getTime();
let date2 = new Date().getTime();
if (date1 > date2) {
ElMessage.warning("未到开始时间,请耐心等待!");
}
}
router.push({
path: "/homeworkpage",
query: {
courseId: data.value.workDto.workId,
id: taskId,
infoId: data.value.offcourseDto.offcourseId,
chapterOrStageId: 0,
type,
pName: "面授课",
sName: data.value.planDto.name,
},
});
}
function toExamItem(obj) {
if (data.value.planDto.beginTime) {
let date1 = new Date(data.value.planDto.beginTime).getTime();
let date2 = new Date().getTime();
if (date1 > date2) {
ElMessage.warning("未到开始时间,请耐心等待!");
}
}
console.log("obj", obj.examinationTestId);
window.open(
import.meta.env.VITE_BOE_EXAM_DETAIL_URL + obj.examinationTestId,
"_top"
); //测评
// router.push({ path: import.meta.env.VITE_BOE_EXAM_DETAIL_URL+ obj.examinationTestId });
}
onUnmounted(() => {
if (timer) {
clearInterval(timer);
}
});
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->

View File

@@ -1,123 +1,206 @@
<template>
<div class="homeworkpage">
<!-- <TitleHead text="【投票】管理者进阶腾飞班 - 授课方式"></TitleHead> -->
<ReturnHead text="作业详情"></ReturnHead>
<div class="notice">
<div class="noticebox">
<div class="mani">
<div class="joininfo">
管理者进阶腾飞班 - 第一次作业 - 沙盘实验
</div>
<div class="joininfo">{{ data?.workName }}</div>
<div class="contenttitle">
<img class="timeimg" src="../../assets/image/ballotpage/time.png" >
<div class="timee">2022-07-20 20:00-21:00</div>
<img class="timeimg" src="../../assets/image/ballotpage/time.png" />
<div class="timee">
{{ data?.submitStartTime }}{{ data?.submitEndTime }}
</div>
</div>
<div class="timebox">
<div class="samez" style="margin-left:18px">00</div>
<div class="samez" style="margin-left: 18px">
{{ hour }}
</div>
<div class="samey"></div>
<div class="samez">00</div>
<div class="samez">
{{ minute }}
</div>
<div class="samey"></div>
<div class="samez">00</div>
<div class="samez">
{{ seconds }}
</div>
<div class="samey"></div>
</div>
</div>
</div>
</div>
<div class="notice">
<div class="noticebox">
<div class="mani">
<div class="joininfo">
作业详情
</div>
<div class="joininfo">作业详情</div>
<div class="line"></div>
<div class="contentone">
<div class="ballotdetail">
1阅读文章做名校题库翻译文言文整体文化常识和文言知识<br/>2中国古代诗词文化鉴赏大唐之音两宋清雅明清情致
{{ data?.workRequirement }}
</div>
</div>
</div>
</div>
</div>
<div class="notice">
<div class="noticebox">
<div class="mani">
<div class="joininfo">
历史纪录
</div>
<div class="joininfo">历史纪录</div>
<div class="line"></div>
<div class="contentone" style="margin-bottom:10px;">
<div class="contentone" style="margin-bottom: 10px">
<div class="hiscon">
<div
class="historyitem clearfix"
v-for="(item,index) in historywork"
:key="item.id"
:style="index%2 !==0? null : 'background-color:#F2F5F7'"
<div
class="historyitem clearfix"
v-for="(item, index) in submitList"
:key="index"
:style="index % 2 !== 0 ? null : 'background-color:#F2F5F7'"
>
<div class="itemtime">{{item.time}}</div>
<div class="itemtitle">{{item.title}}</div>
<div class="itemtime">{{ item.createTime }}</div>
<div class="itemtitle" :title="item.workUploadContent">
{{ item.workUploadContent }}
</div>
</div>
</div>
</div>
</div>
<div class="btnc">
<button class="btncc">交作业</button>
</div>
<div class="btnc" @click="dohomework">
<button class="btncc">交作业</button>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { reactive, toRefs } from "vue";
// import TitleHead from "@/components/TitleHead.vue";
export default {
name: "HomeworkPage",
components: {
// TitleHead,
},
setup() {
const state = reactive({
historywork:[
{
id:1,
time:'2022-7-20 00:00',
title:'大唐之音鉴赏 - 2022/7/20.zip'
},
{
id:2,
time:'2022-7-18 00:00',
title:'《木兰辞》翻译:叹息声一声接着一声,木兰姑娘当门在织布。…'
},
{
id:3,
time:'2022-7-14 00:00',
title:'大唐之音鉴赏 - 2022/7/20.zip'
},
{
id:4,
time:'2022-7-18 00:00',
title:'《木兰辞》翻译:叹息声一声接着一声,木兰姑娘当门在织布。…'
},
]
});
<script setup>
import { computed, onUnmounted, reactive, ref, toRefs } from "vue";
import { request, useRequest } from "@/api/request";
import {
TASK_WORK_COMMIT,
TASK_WORK_DETAIL,
TASK_WORK_SUBMIT_LIST,
WORK_HISTROY,
} from "@/api/api";
import dayjs from "dayjs";
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 { ElMessage } from "element-plus";
import ReturnHead from "@/components/ReturnHead.vue";
const fileList = ref([]);
// const fielPath = ref(import.meta.env.VITE_FILE_PATH);
const uploadRef = ref();
return {
...toRefs(state),
}
},
const centerDialogVisible = ref(false);
const sbValue = ref({
content: "",
attach: "",
});
const router = useRouter();
const returnclick = () => {
router.back();
};
const {
query: {
courseId: workId,
type,
id: taskId,
pName,
sName,
projectStatus,
projectEndTime,
infoId,
},
} = useRoute();
console.log("type", type);
const { data } =
taskId && taskId !== "undefined"
? useRequest(TASK_WORK_DETAIL, { workId, taskId })
: useRequest(TASK_WORK_DETAIL, { workId });
console.log("data==----->", data);
//作业倒计时
let hour = ref(0);
let minute = ref(0);
let seconds = ref(0);
let timer = setInterval(() => {
let endTime = parseInt(new Date(data.value.submitEndTime).getTime() / 1000);
let nowTime = parseInt(new Date().getTime() / 1000);
if (endTime > nowTime) {
hour.value = parseInt(
dayjs(data.value.submitEndTime).diff(dayjs(), "minute") / 60
);
minute.value = parseInt(
dayjs(data.value.submitEndTime).diff(dayjs(), "minute") % 60
);
seconds.value = parseInt(
dayjs(data.value.submitEndTime).diff(dayjs(), "seconds") -
(hour.value * 60 + minute.value) * 60
);
} else {
clearInterval(timer);
}
}, 1000);
onUnmounted(() => {
clearInterval(timer);
});
const { data: submitList } = useRequest(TASK_WORK_SUBMIT_LIST, {
workerId: workId,
});
console.log("submitList==----->", submitList);
//交作业
const dohomework = () => {
console.log("workId", workId, type, taskId);
router.push({
path: "/uploadwork",
query: { type: type, workId: workId, taskId: taskId },
});
};
// const open = () => {
// centerDialogVisible.value = true;
// };
// const showFileList = computed(() => {
// return fileList.value.length;
// });
// const handleClick = () => {
// console.log(fileList.value, uploadRef.value);
// if (!sbValue.value.content) {
// if (fileList.value.length === 0) {
// return ElMessage.warning("请输入作业内容");
// }
// }
// request(TASK_WORK_COMMIT, {
// projectOrRouterLogo: type,
// workUploadContent: sbValue.value.content,
// workUploadAddress: fileList.value.map((e) => e.url).join(",") || "",
// workId,
// type,
// taskId: taskId || infoId,
// }).then((res) => {
// console.log(res);
// submitList.value.unshift(res.data);
// open();
// sbValue.value.content = "";
// fileList.value = [];
// remove(0);
// clearFiles();
// });
// };
// function clearFiles() {
// uploadRef.value.clearFiles();
// }
// function remove(i) {
// uploadRef.value.remove(i);
// }
// function reUpload(i) {
// uploadRef.value.reUpload(i);
// }
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
@@ -136,7 +219,7 @@ export default {
display: flex;
justify-content: center;
// margin-top: -17.5px;
margin-top: 20px;
margin-top: 10px;
.noticebox {
width: 100%;
background: #fff;
@@ -144,60 +227,60 @@ export default {
position: relative;
display: flex;
justify-content: center;
.line{
width: 100%;
height: 0;
border-top: 1px solid #F1F2F3;
margin-top: 17px;
position:absolute;
left:0;
}
.line {
width: 100%;
height: 0;
border-top: 1px solid #f1f2f3;
margin-top: 17px;
position: absolute;
left: 0;
}
.mani {
width: 90%;
margin-top: 20px;
// position:relative;
.joininfo{
color:#0D233A;
.joininfo {
color: #0d233a;
font-size: 16px;
font-weight: bold;
}
.contenttitle{
width:100%;
.contenttitle {
width: 100%;
// height:10px;
margin-top: 15px;
// background-color: #bfa;
display:flex;
.timeimg{
display: flex;
.timeimg {
width: 12.8px;
height: 13px;
}
.timee{
color:#6E7B84;
.timee {
color: #6e7b84;
font-size: 14px;
line-height: 13px;
margin-left: 6px;
}
}
.timebox{
display:flex;
.timebox {
display: flex;
width: 100%;
height:49px;
background-color:#F2F5F7;
height: 49px;
background-color: #f2f5f7;
margin-top: 17.5px;
margin-bottom: 27.5px;
border-radius: 10px;
.samez{
color:#0060FF;
.samez {
color: #0060ff;
font-size: 18px;
line-height: 49px;
margin-left: 13px;
}
.samey{
color:#6E7B84;
.samey {
color: #6e7b84;
font-size: 14px;
line-height: 49px;
margin-left: 13px;
}
}
@@ -208,49 +291,52 @@ export default {
width: 100%;
margin-bottom: 20px;
// height: 200px;
.ballotdetail{
color:#6E7B84;
.ballotdetail {
color: #6e7b84;
line-height: 30px;
font-size: 13px;
}
.hiscon{
.hiscon {
width: 100%;
.historyitem{
.historyitem {
// margin-left: 21px;
width: 100%;
border-radius: 4px;
.itemtime{
color:#6E7B84;
.itemtime {
color: #6e7b84;
margin-left: 21px;
font-size: 12px;
margin-top: 11px;
}
.itemtitle{
.itemtitle {
line-height: 22px;
font-size: 13px;
color:#333330;
margin:10.5px 0 10.5px 21px;
color: #333330;
margin: 10.5px 0 10.5px 21px;
width: 90%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
}
.btnc{
width:100%;
display: flex;
justify-content: center;
.btncc{
margin-bottom: 19px;
height:33px;
width:88%;
border:0;
background-color: #2478FF;
border-radius: 6px;
color:#fff;
font-size: 14px;
}
.btnc {
width: 100%;
display: flex;
justify-content: center;
.btncc {
margin-bottom: 19px;
height: 33px;
width: 88%;
border: 0;
background-color: #2478ff;
border-radius: 6px;
color: #fff;
font-size: 14px;
}
}
}
}
}

View File

@@ -1,4 +1,9 @@
<template>
<ReturnHead
text="写作业"
:showpublish="true"
:publishWork="publishWork"
></ReturnHead>
<div
class="uploadworkpage"
:style="{
@@ -31,18 +36,58 @@
</template>
<script>
import { reactive, toRefs } from "vue";
import { reactive, toRefs, ref } from "vue";
import ReturnHead from "@/components/ReturnHead.vue";
import { request, useRequest } from "@/api/request";
import { TASK_WORK_COMMIT } from "@/api/api";
import { useRoute } from "vue-router/dist/vue-router";
import { ElMessage } from "element-plus";
export default {
name: "UploadWork",
components: {},
components: {
ReturnHead,
},
setup() {
const state = reactive({
text: "",
textarea: "",
screenHeight: document.body.clientHeight, // 屏幕高度
});
const {
query: { workId, type, taskId, infoId },
} = useRoute();
const textarea = ref("");
const fileList = ref([]);
//发布作业
const publishWork = () => {
console.log("点击了发布", workId, type, taskId);
if (!textarea.value) {
if (fileList.value.length === 0) {
return ElMessage.warning("请输入作业内容");
}
}
let obj = {
projectOrRouterLogo: type,
workUploadContent: textarea.value,
workUploadAddress: fileList.value.map((e) => e.url).join(",") || "",
workId,
type,
taskId: taskId || infoId,
};
console.log("obj", obj);
request(TASK_WORK_COMMIT, obj).then((res) => {
console.log("上传作业", res);
// submitList.value.unshift(res.data);
// open();
textarea.value = "";
fileList.value = [];
// remove(0);
// clearFiles();
});
};
return {
...toRefs(state),
publishWork,
textarea,
};
},
};
@@ -60,7 +105,7 @@ clearfix:after {
background-color: #fff;
// margin-top: 73.5px;
.inputcontainer {
margin-top: 20px;
margin-top: 10px;
background-color: #fff;
width: 100%;
// height: 100px;

View File

@@ -1,72 +1,82 @@
<template>
<div class="Investigat">
<!-- <TitleHead text="【调研】管理者进阶腾飞班 - 培训阶段性调研"></TitleHead> -->
<ReturnHead text="评估详情"></ReturnHead>
<div class="notice">
<div class="noticebox">
<div class="mani">
<!-- <div class="dir">
<div class="samegt pre"></div>
<div class="sameg">上一个</div>
<div class="sameg" style="margin-left: 15.5px">下一个</div>
<div class="samegt next"></div>
</div> -->
<div
class="question"
v-for="(value, index) in question"
v-for="(value, index) in questionList"
:key="index"
:style="{ 'margin-top': '20px' }"
>
<div class="text">{{ value.text }}</div>
<div class="answerLcontainer">
<div class="answerL">
<div>完全没用</div>
<div>非常好</div>
<div v-if="value.questionType == '4'">
<div class="text">{{ value.assessmentScTitle }}</div>
<div class="answerLcontainer">
<div class="answerL">
<div>完全没用</div>
<div>非常好</div>
</div>
</div>
</div>
<div class="answer">
<div class="answerC">
<div class="itemwrap">
<div
class="answerCitem"
v-for="(item, key) in select"
:key="key"
:style="{
background:
value.selectAnswer === item
? 'rgba(86, 163, 249, 1)'
: 'rgba(86, 163, 249, 0)',
color:
value.selectAnswer === item
? '#fff'
: 'rgba(86, 163, 249, 1)',
}"
@click="score(value, item)"
>
<div>{{ item }}</div>
<div class="answer">
<div class="answerC">
<div class="itemwrap">
<div
class="answerCitem"
v-for="(item, key) in orderArr(
value.assessmentMinScore,
value.assessmentMaxScore
)"
:key="key"
:style="{
background:
value.selectAnswer === item
? 'rgba(86, 163, 249, 1)'
: 'rgba(86, 163, 249, 0)',
color:
value.selectAnswer === item
? '#fff'
: 'rgba(86, 163, 249, 1)',
}"
@click="
() => {
if (data.isSubmit) {
return;
}
value.selectAnswer = item;
}
"
>
<div>{{ item + 1 }}</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="question" style="margin-top: 20px">
<div class="text">4类似相应的课程您认为适合哪些人观看</div>
<div
v-for="(value, index) in viewpeople"
:key="index"
style="display: flex; align-items: center"
:style="{ 'margin-top': '22px' }"
@click="selectPeople(value)"
>
<div class="conn">
<div class="peoplecontainer">
<div v-else-if="value.questionType == '1'">
<div class="question" style="margin-top: 20px">
<div class="text">{{ value?.singleStemName }}</div>
<div
v-for="(values, indexs) in value.assessmentSingleChoiceVoList"
:key="indexs"
style="display: flex; align-items: center"
:style="{ 'margin-top': '22px' }"
@click="
() => {
if (data.isSubmit) {
return;
}
value.assessmentSingleChoiceVoList.forEach((e) => {
e.select = false;
});
values.select = true;
}
"
>
<img
style="width: 14px; height: 13px"
:src="
value.select
? require('../../assets/image/investigat/checkbox.png')
: require('../../assets/image/investigat/checkbox2.png')
"
style="width: 14px; height: 14px"
:src="values.select ? checkbox : checkbox2"
/>
<div
class="people"
@@ -76,31 +86,103 @@
margin-top: -2.5px;
"
>
{{ value.text }}
{{ values.singleOptionName }}
</div>
</div>
</div>
</div>
</div>
<div class="question" style="margin-top: 21px">
<div class="text">5您的其他意见</div>
<div style="margin-top: 21px; position: relative">
<div class="inputcon">
<el-input
style="width: 87%"
v-model="textarea1"
:autosize="{ minRows: 5, maxRows: 5 }"
resize="none"
maxlength="200"
type="textarea"
@input="textareaInput"
/>
<div v-else-if="value.questionType == '2'">
<div class="question" style="margin-top: 20px">
<div class="text">{{ value?.multipleStemName }}</div>
<div
v-for="(values, indexs) in value.multipleChoiceVoList"
:key="indexs"
style="display: flex; align-items: center"
:style="{ 'margin-top': '22px' }"
@click="
() => {
if (data.isSubmit) {
return;
}
values.select = !values.select;
}
"
>
<img
style="width: 14px; height: 14px"
:src="values.select ? checkbox : checkbox2"
/>
<div
class="people"
style="
font-size: 13px;
margin-left: 7px;
margin-top: -2.5px;
"
>
{{ values.multipleOptionName }}
</div>
</div>
</div>
</div>
<div v-else-if="value.questionType == '3'">
<div class="question" style="margin-top: 21px">
<div class="text">{{ value.assessmentQaTitle }}</div>
<div style="margin-top: 21px; position: relative">
<div class="inputcon">
<el-input
style="width: 87%"
v-model="value.content"
:autosize="{ minRows: 5, maxRows: 5 }"
resize="none"
maxlength="200"
type="textarea"
:readonly="!!data.isSubmit"
/>
</div>
<div class="words">{{ value.content?.length || 0 }}/200</div>
</div>
</div>
<div class="words">{{ textarealength }}/200</div>
</div>
</div>
<div style="display: flex; justify-content: center">
<div class="submit">提交</div>
<div
style="display: flex; justify-content: center; width: 100%"
v-if="
data.essayQuestionVoList?.length ||
data.multipleStemVoList?.length ||
data.scoringQuestionVoList?.length ||
data.singleStemVoList?.length
"
>
<div
v-if="projectStatus && projectEndTime"
style="width: 100%; display: flex; justify-content: center"
>
<div
v-if="
projectStatus !== '3' &&
new Date(projectEndTime).getTime() > new Date().getTime()
"
class="submit"
@click="submit"
:style="{ background: data.isSubmit ? '#999' : '#2478ff' }"
>
提交
</div>
</div>
<div
v-else
style="width: 100%; display: flex; justify-content: center"
>
<div
class="submit"
@click="submit"
:style="{ background: data.isSubmit ? '#999' : '#2478ff' }"
>
提交
</div>
</div>
</div>
</div>
</div>
@@ -108,90 +190,178 @@
</div>
</template>
<script>
import { reactive, toRefs } from "vue";
// import TitleHead from "@/components/TitleHead.vue";
export default {
name: "InvestigatPage",
components: {
// TitleHead,
},
setup() {
const state = reactive({
question: [
{
id: 1,
text: "1、您觉得课程对您是否有用",
selectAnswer: 0,
},
{
id: 2,
text: "2、您是否会推荐课程给其他同事",
selectAnswer: 0,
},
{
id: 3,
text: "3、后续该讲师有其他课程是否会参与",
selectAnswer: 0,
},
],
select: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
viewpeople: [
{
id: 1,
text: "基础员工",
select: false,
},
{
id: 2,
text: "中层管理",
select: false,
},
{
id: 3,
text: "专业人员",
select: false,
},
{
id: 4,
text: "高级管理",
select: false,
},
],
textarea1: "",
textarealength: 0,
});
const score = (value, item) => {
let arr = state.question;
arr.map((i) => {
if (i.id === value.id) {
i.selectAnswer = item;
}
});
state.question = arr;
};
const selectPeople = (value) => {
let arr = state.viewpeople;
arr.map((i) => {
if (i.id === value.id) {
i.select = !i.select;
}
});
state.viewpeople = arr;
};
const textareaInput = (e) => {
// console.log("eee", e);
state.textarea1 = e;
state.textarealength = e.length;
};
return {
...toRefs(state),
score,
selectPeople,
textareaInput,
};
<script setup>
import { ref, reactive, toRefs } from "vue";
import checkbox from "@/assets/image/checkbox.png";
import checkbox2 from "@/assets/image/checkbox2.png";
import { useRoute, useRouter } from "vue-router/dist/vue-router";
import { request, usePage, useRequest } from "@/api/request";
import { ASSESSMENT_QUERY, ASSESSMENT_SUBMIT } from "@/api/api";
import { ElMessage } from "element-plus";
import ReturnHead from "@/components/ReturnHead.vue";
import dayjs from "dayjs";
const {
query: {
courseId,
id: taskId,
infoId,
type,
pName,
sName,
chapterOrStageId,
projectStatus,
projectEndTime,
},
} = useRoute();
const router = useRouter();
const returnclick = () => {
clearInterval(timers);
router.back();
};
const { data } = useRequest(ASSESSMENT_QUERY(courseId), {
id: courseId,
type,
chapterOrStageId,
targetId: infoId ? infoId : 0,
});
console.log("我是查询评估的参数", {
id: courseId,
type,
chapterOrStageId,
targetId: infoId ? infoId : 0,
});
console.log("我是需要排序得题目", data);
// 答题时间
const answerTime = dayjs(new Date()).format("YYYY-MM-DD HH:mm:ss");
console.log("录入首次进入页面时间", answerTime);
// 数组去空对象
function formateArr(datas) {
let allArr = [];
for (let i = 0; i < datas.length; i++) {
for (let j = 0; j < datas[i].length; j++) {
allArr.push(datas[i][j]);
}
}
let newarr = allArr.sort((a, b) => {
return a.orderNumber - b.orderNumber;
});
console.log("我是排序后的题目", newarr);
return newarr;
}
const questionList = ref([]);
const timers = setInterval(() => {
console.log(data);
console.log(data.value.assessmentId);
if (data.value.assessmentId) {
clearInterval(timers);
console.log([
data.value.essayQuestionVoList,
data.value.multipleStemVoList,
data.value.scoringQuestionVoList,
data.value.singleStemVoList,
]);
questionList.value = formateArr([
data.value.essayQuestionVoList,
data.value.multipleStemVoList,
data.value.scoringQuestionVoList,
data.value.singleStemVoList,
]);
}
}, 1000);
setTimeout(() => {
clearInterval(timers);
}, 30000);
// 生成数组
function orderArr(a, b) {
let arrs = [];
for (let i = 0; i < 10; i++) {
if (i + 1 >= a && i + 1 <= b) {
arrs.push(i);
}
}
return arrs;
}
const centerDialogVisible = ref(false);
const open = () => {
centerDialogVisible.value = true;
};
function submit() {
console.log("录入首次进入页面时间", answerTime);
if (1 > 0) {
console.log(data);
console.log("我是提交的数据", {
targetId: infoId ? infoId : 0, // 项目、路径图或开课的Id
chapterOrStageId: chapterOrStageId ? chapterOrStageId : 0, // 关卡或者阶段Id 关卡Id不允许为空
assessmentId: courseId,
taskId: taskId ? taskId : 0,
type,
result: JSON.stringify(data.value),
});
}
if (data.value.isSubmit) {
return;
}
console.log("data.value", data.value);
let list1 = data.value.assessmentEssayQuestionDtoList;
if (list1 && list1.length > 0) {
list1.forEach((item) => {
if (item && !item.content) {
return ElMessage.warning("您有未填写的评估题干");
}
});
}
let list2 = data.value.assessmentScoringQuestionDtoList;
if (list2 && list2.length > 0) {
list2.forEach((item) => {
if (item && !item.selectAnswer) {
return ElMessage.warning("您有未填写的评估题干");
}
});
}
let list3 = data.value.assessmentSingleChoiceDtoList;
if (list3 && list3.length > 0) {
let flag = 0;
list3.forEach((item) => {
flag = flag + item.select ? 1 : 0;
});
if (flag == 0) {
return ElMessage.warning("您有未填写的评估题干");
}
}
let list4 = data.value.assessmentMultipleChoiceDtoList;
if (list4 && list4.length > 0) {
let flag = 0;
list4.forEach((item) => {
flag = flag + item.select ? 1 : 0;
});
if (flag == 0) {
return ElMessage.warning("您有未填写的评估题干");
}
}
data.value.isSubmit = !data.value.isSubmit;
ElMessage.success("提交成功");
request(ASSESSMENT_SUBMIT, {
targetId: infoId ? infoId : 0, // 项目、路径图或开课的Id
chapterOrStageId: chapterOrStageId ? chapterOrStageId : 0, // 关卡或者阶段Id 关卡Id不允许为空
assessmentId: courseId,
taskId: taskId ? taskId : 0,
type,
result: JSON.stringify(data.value),
beginTime: answerTime,
}).then(() => {
open();
});
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
@@ -210,7 +380,7 @@ export default {
display: flex;
justify-content: center;
// margin-top: -17.5px;
margin-top: 20px;
margin-top: 10px;
.noticebox {
// width: 90%;
width: 100%;

View File

@@ -1,32 +1,155 @@
<template>
<div class="liveboradcast">
<ReturnHead text="课程直播"></ReturnHead>
<!-- <TitleHead text="【投票】管理者进阶腾飞班 - 授课方式"></TitleHead> -->
<div class="top">
<div class="top" :style="{ display: closeBtn ? 'flex' : 'none' }">
<div class="topin">
<div class="topsa">
请各位选课的同学提前阅读本课程的教学大纲与计划
{{ data?.liveNotice }}
</div>
<img class="topimg" src="../../assets/image/liveboradcast/cha.png" />
<img
class="topimg"
@click="isShowClose"
src="../../assets/image/liveboradcast/cha.png"
/>
</div>
</div>
<div class="notice" style="margin-top: 0">
<div class="noticebox">
<div class="avator">
<img class="avaimg" src="../../assets/image/liveboradcast/px.jpg" />
<div class="avaname">刘敏</div>
<img class="avaimg" :src="teacherInfo.avatar" />
<div class="avaname">{{ data.userInfoBo?.userName }}</div>
</div>
<div class="mani">
<div class="joininfo">管理者进阶腾飞班 - 专属线下活动</div>
<div class="joininfo">{{ data?.liveName }}</div>
<div class="contenttitle">
<img class="timeimg" src="../../assets/image/ballotpage/time.png" />
<div class="timee">2022-07-20 20:00-21:00</div>
<div class="timee">
{{ data?.liveStartTime + " 至 " + data?.liveEndTime }}
</div>
</div>
<div class="midline"></div>
<div class="timebox">
<div class="timebox" v-if="projectStatus && projectEndTime">
<div
v-if="
projectStatus !== '3' &&
new Date(projectEndTime).getTime() > new Date().getTime()
"
class="allbtn"
>
<botton
class="samebtn btno"
:style="{
background: `${
new Date(data.liveStartTime).getTime() >
new Date().getTime()
? '#999'
: 'rgb(59, 191, 252)'
}`,
}"
@click="showClick"
>观看
</botton>
<botton
class="samebtn btnt"
:style="{
background: `${
!isAllowSign
? '#999'
: data.signFlag
? '#999'
: 'rgb(57, 146, 249)'
}`,
}"
@click="signClick"
>{{ data.signFlag ? "已签到" : "签到" }}
</botton>
<botton
:style="{
background: `${
new Date(data.liveStartTime).getTime() >
new Date().getTime()
? '#999'
: data.isSurvery
? '#999'
: 'rgb(57, 146, 249)'
}`,
}"
class="samebtn btnr"
@click="commitClick"
v-if="data.isEvaluate && data.isEvaluate == 1"
>{{ data.isSurvery ? "已评估" : "评估" }}
</botton>
</div>
<div v-else class="threeBtn">
<botton
:style="{
background: `${
new Date(data.liveStartTime).getTime() >
new Date().getTime()
? '#999'
: data.isSurvery
? '#999'
: 'rgb(57, 146, 249)'
}`,
}"
class="samebtn btnr"
@click="commitClick"
v-if="data.isEvaluate && data.isEvaluate == 1 && data.isSurvery"
>{{ data.isSurvery ? "已评估" : "评估" }}
</botton>
</div>
</div>
<div class="timebox" v-else>
<div class="allbtn">
<button class="samebtn btno">观看</button>
<button class="samebtn btnt">签到</button>
<button class="samebtn btnr">评估</button>
<botton
class="samebtn btno"
:style="{
background: `${
new Date(data.liveStartTime).getTime() >
new Date().getTime()
? '#999'
: 'rgb(59, 191, 252)'
}`,
}"
@click="showClick"
>观看
</botton>
<botton
class="samebtn btnt"
:style="{
background: `${
!isAllowSign
? '#999'
: data.signFlag
? '#999'
: 'rgb(57, 146, 249)'
}`,
}"
@click="signClick"
>{{ data.signFlag ? "已签到" : "签到" }}
</botton>
<botton
:style="{
background: `${
new Date(data.liveStartTime).getTime() >
new Date().getTime()
? '#999'
: data.isSurvery
? '#999'
: 'rgb(57, 146, 249)'
}`,
}"
class="samebtn btnr"
@click="commitClick"
v-if="data.isEvaluate && data.isEvaluate == 1"
>{{ data.isSurvery ? "已评估" : "评估" }}
</botton>
</div>
</div>
</div>
@@ -36,19 +159,17 @@
<div class="notice">
<div class="noticebox">
<div class="mani">
<div class="joininfo">活动详情</div>
<div class="joininfo">直播说明</div>
<div class="line"></div>
<div class="contentone">
<div class="actinner">
活动详情<br />通过对各级人员的软件平台培训使其能够了解如何运用乾元坤和智能信息管理系统来提升企业管理水平最大限度发挥软件产品在企业中的作用;<br />
培训目标<br />1.使企业不同部门人员掌握便捷有效的系统平台操作方法;<br />2.通过系统平台的培训提高员工对企业的管理理念认识与提升<br />3.通过系统平台培训加强沟通统一部署协同工作提高效率<br />
培训对象<br />集团领导各相关部门领导总经理车间主管车间操作员
{{ data.liveExplain }}
</div>
</div>
</div>
</div>
</div>
<div class="notice">
<!-- <div class="notice">
<div class="noticebox">
<div class="mani">
<div class="joininfo">课后作业</div>
@@ -69,20 +190,162 @@
</div>
</div>
</div>
</div>
</div> -->
</div>
</template>
<script>
// import { reactive, toRefs } from "vue";
// import TitleHead from "@/components/TitleHead.vue";
export default {
name: "LiveBoradcast",
components: {
// TitleHead,
<script setup>
import ReturnHead from "@/components/ReturnHead.vue";
import { computed, reactive, toRefs, onUnmounted, ref } from "vue";
import img from "@/assets/image/uploadimg.png";
import { request, useRequest } from "@/api/request";
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";
import dayjs from "dayjs";
const {
query: {
courseId: liveId,
id: taskId,
type,
pName,
sName,
projectStatus,
projectEndTime,
},
setup() {},
} = useRoute();
const router = useRouter();
const returnclick = () => {
router.back();
};
const { data } = useRequest(TASK_BROADCAST_DETAIL, { liveId });
console.log("直播信息", data);
const teacherInfo = useUserInfo(computed(() => data.value.userInfoBo?.userId));
const state = reactive({
activeName: "first",
teacher: [],
isAllowSign: false,
});
const { activeName, teacher, isAllowSign } = toRefs(state);
const signClick = () => {
if (!state.isAllowSign) {
// console.log("data.signFlag", data.value.signFlag, isAllowSign);
ElMessage.warning("未在允许签到时间范围内");
return;
}
if (data.value.signFlag) {
return;
}
data.value.signFlag = 1;
ElMessage.warning("签到成功");
request(TASK_BROADCAST_SIGN, { courseId: liveId, taskId, type });
};
let timer = null;
//判断能否签到
function isSignClick() {
timer = setInterval(() => {
let beginTime = new Date(data.value.liveStartTime).getTime();
let endTime = !data.value.afterSignIn
? new Date(data.value.liveEndTime).getTime()
: new Date(data.value.liveStartTime).getTime();
let nowTime = new Date().getTime();
if (data.value.beforeSignIn && data.value.afterSignIn) {
//有开始前有开始后
beginTime = beginTime - data.value.beforeSignIn * 60 * 1000;
endTime = endTime + data.value.afterSignIn * 60 * 1000;
console.log("1111");
} else if (data.value.beforeSignIn && !data.value.afterSignIn) {
//只有开始前无开始后
beginTime = beginTime - data.value.beforeSignIn * 60 * 1000;
console.log("11112222");
} else if (!data.value.beforeSignIn && data.value.afterSignIn) {
//无开始前有开始后
endTime = endTime + data.value.afterSignIn * 60 * 1000;
console.log("1111333");
}
if (nowTime < endTime && nowTime > beginTime) {
state.isAllowSign = true;
} else {
state.isAllowSign = false;
}
// console.log(
// "isAllowSign",
// state.isAllowSign,
// nowTime,
// endTime,
// beginTime,
// nowTime < endTime,
// nowTime > beginTime
// );
}, 1000);
}
isSignClick();
const commitClick = () => {
if (data.value.liveStartTime) {
let date1 = new Date(data.value.liveStartTime).getTime();
let date2 = new Date().getTime();
if (date1 > date2) {
ElMessage.warning("未到时间,请耐心等待!");
return;
}
}
if (data.value.isSurvery) {
// return;
}
if (data.value.isEvaluate == 0) {
ElMessage.warning("此直播无评估");
return;
}
console.log({
courseId: data.value.assessmentId,
taskIds: taskId,
chapterOrStageId: 0,
pName: "直播",
sName: data.value.liveName,
type: 4,
});
router.push({
path: "/surveydetail",
query: {
courseId: data.value.assessmentId,
infoId: data.value.liveId,
chapterOrStageId: 0,
pName: "直播",
sName: data.value.liveName,
type: 4,
},
});
};
function showClick() {
if (data.value.liveStartTime) {
let date1 = new Date(data.value.liveStartTime).getTime();
let date2 = new Date().getTime();
if (date1 > date2) {
ElMessage.warning("未到开始时间,请耐心等待!");
return;
}
}
window.open(data.value.liveLink, "_top");
}
//是否显示头部公告
const closeBtn = ref(true);
const isShowClose = () => {
closeBtn.value = false;
};
onUnmounted(() => {
if (timer) {
clearInterval(timer);
}
});
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
@@ -111,6 +374,9 @@ export default {
color: #ff9e00;
line-height: 25px;
font-size: 12px;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.topimg {
height: 10px;
@@ -211,6 +477,9 @@ export default {
color: #fff;
font-size: 14px;
border-radius: 6px;
display: flex;
align-items: center;
justify-content: center;
}
.btno {
background-color: #00c1fc;

78
src/views/login/login.vue Normal file
View File

@@ -0,0 +1,78 @@
<!--
* @Author: lixg lixg@dongwu-inc.com
* @Date: 2023-01-13 11:42:48
* @LastEditors: lixg lixg@dongwu-inc.com
* @LastEditTime: 2023-01-13 14:12:17
* @FilePath: /stu_h5/src/views/login/login.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
<template>
<div
:style="{
margin: 'auto',
background:
'url(http://img.gz2c.com/FoTcLY8ww-ISCFlwyCoYuLim1BMt) no-repeat',
backgroundSize: '100% 100%',
width: '100%',
height: '100vh',
display: 'flex',
}"
>
<div
:style="{
width: '300px',
height: '300px',
margin: '10% auto',
padding: '20px 30px',
textAlign: 'center',
borderRadius: '10px',
background: '#e0e0e0',
boxShadow: '20px 20px 60px #bebebe,-20px -20px 60px #ffffff',
}"
>
<div :style="{ fontSize: '24px', paddingBottom: '30px' }">用户登录</div>
<div>
<input placeholder="用户名" v-model="form.account" />
<input
placeholder="密码"
v-model="form.password"
:style="{ marginTop: '30px' }"
type="password"
/>
<button :style="{ marginTop: '30px' }" @click="loginUser">登录</button>
</div>
</div>
</div>
</template>
<script setup>
import { useRoute, useRouter } from "vue-router";
import { ref } from "vue";
import { LOGIN } from "@/api/api";
import { setCookie } from "@/api/utils";
import { request } from "@/api/request";
const router = useRouter();
const {
query: { returnUrl },
} = useRoute();
const returnclick = () => {
router.back();
};
const form = ref({
account: "10181457",
password: "1234567890Aa",
});
async function loginUser() {
console.log(
"await request(LOGIN, form.value)",
await request(LOGIN, form.value)
);
const { data: token } = await request(LOGIN, form.value);
setCookie("token", token, 10);
returnUrl && (window.location.href = decodeURI(returnUrl));
// await router.push({path: returnUrl || "/learnpath"});
}
</script>

View File

@@ -0,0 +1,360 @@
<template>
<div class="outerchain">
<ReturnHead text="外链详情"></ReturnHead>
<!-- <TitleHead text="【投票】管理者进阶腾飞班 - 授课方式"></TitleHead> -->
<!-- <div class="top" :style="{ display: closeBtn ? 'flex' : 'none' }">
<div class="topin">
<div class="topsa">
{{ data?.liveNotice }}
</div>
<img
class="topimg"
@click="isShowClose"
src="../../assets/image/liveboradcast/cha.png"
/>
</div>
</div> -->
<div class="notice" style="margin-top: 0">
<div class="noticebox">
<!-- <div class="avator">
<img class="avaimg" :src="teacherInfo.avatar" />
<div class="avaname">{{ data.userInfoBo?.userName }}</div>
</div> -->
<div class="mani">
<div class="joininfo">外链{{ data?.linkName }}</div>
<!-- <div class="contenttitle">
<img class="timeimg" src="../../assets/image/ballotpage/time.png" />
<div class="timee">
{{ data?.liveStartTime + " 至 " + data?.liveEndTime }}
</div>
</div> -->
<div class="midline"></div>
</div>
</div>
</div>
<div class="notice">
<div class="noticebox">
<div class="mani">
<div class="joininfo">外链说明</div>
<div class="line"></div>
<div class="contentone">
<div class="actinner">
{{ data.linkDescription }}
</div>
</div>
</div>
</div>
<div class="btnbox">
<div class="submitbtn" @click="goOuterChain">去查看</div>
</div>
</div>
</div>
</template>
<script setup>
import ReturnHead from "@/components/ReturnHead.vue";
import { computed, reactive, toRefs, onUnmounted, ref } from "vue";
import img from "@/assets/image/uploadimg.png";
import { request, useRequest } from "@/api/request";
import { LINK_DETAILS, STUDY_RECORD } 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";
import dayjs from "dayjs";
const {
query: {
courseId: linkId,
id: taskId,
type,
status,
chapterOrStageId,
infoId,
studentId,
},
} = useRoute();
const router = useRouter();
console.log("外链信息", linkId);
const { data } = useRequest(LINK_DETAILS(linkId));
console.log("外链信息", data);
const goOuterChain = () => {
status != 1 &&
request(STUDY_RECORD, {
studentId: studentId,
targetId: infoId,
logo: type,
stageOrChapterId: chapterOrStageId,
taskId: taskId,
});
window.open(data.value.linkAddress, "_top");
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="scss">
.clearfix:before,
.clearfix:after {
content: " ";
display: table;
clear: both;
}
.outerchain {
width: 100%;
.top {
width: 100%;
display: flex;
justify-content: center;
height: 25px;
background-color: #fffbee;
.topin {
// text-align: center;
width: 90%;
height: 25px;
display: flex;
justify-content: space-between;
.topsa {
color: #ff9e00;
line-height: 25px;
font-size: 12px;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.topimg {
height: 10px;
width: 10px;
margin-top: 7px;
}
}
}
.notice {
width: 100%;
// display: flex;
// justify-content: center;
// // margin-top: -17.5px;
padding-bottom: 24px;
margin-top: 20px;
background: #fff;
.noticebox {
width: 100%;
background: #fff;
// border-radius: 4px;
position: relative;
display: flex;
justify-content: center;
.avator {
display: flex;
position: absolute;
right: 29px;
top: 30px;
// background-color:red;
// z-index: 999;
.avaimg {
width: 30px;
height: 30px;
border-radius: 50%;
}
.avaname {
line-height: 30px;
margin-left: 8px;
color: #0d233a;
}
}
.line {
width: 100%;
height: 0;
border-top: 1px solid #f1f2f3;
margin-top: 17px;
position: absolute;
left: 0;
}
.mani {
width: 90%;
margin-top: 20px;
// position:relative;
.joininfo {
color: #0d233a;
font-size: 16px;
font-weight: bold;
}
.contenttitle {
width: 100%;
// height:10px;
margin-top: 15px;
// background-color: #bfa;
display: flex;
.timeimg {
width: 12.8px;
height: 13px;
}
.timee {
color: #6e7b84;
font-size: 14px;
line-height: 13px;
margin-left: 6px;
}
}
.midline {
height: 0;
border-top: 1px solid #f1f2f3;
width: 100%;
margin-top: 15px;
margin-bottom: 15px;
}
.timebox {
display: flex;
justify-content: center;
width: 100%;
// height: 100px;
// background-color: #bfa;
margin-bottom: 15px;
.allbtn {
width: 92%;
display: flex;
justify-content: space-between;
// background-color: lightcoral;
.samebtn {
width: 93px;
height: 33px;
border: 0;
color: #fff;
font-size: 14px;
border-radius: 6px;
display: flex;
align-items: center;
justify-content: center;
}
.btno {
background-color: #00c1fc;
}
.btnt {
background-color: #0096fa;
}
.btnr {
background-color: #2478ff;
}
}
}
.detailin {
width: 100%;
// height: 100px;
// background-color: red;
display: flex;
justify-content: center;
.in {
margin-left: 20px;
width: 86%;
color: #6e7b84;
line-height: 30px;
font-size: 13px;
}
}
.contentone {
margin-top: 43px;
display: flex;
justify-content: space-between;
width: 100%;
margin-bottom: 20px;
// height: 200px;
.actinner {
// background-color: red;
color: #6e7b84;
font-size: 13px;
line-height: 30px;
}
.de {
width: 100%;
height: 34px;
border-radius: 10px;
background-color: #f2f5f7;
display: flex;
justify-content: space-between;
.deal {
color: #333330;
font-weight: bold;
line-height: 34px;
margin-left: 21px;
font-size: 14px;
}
.rightpng {
width: 6px;
height: 11px;
margin-right: 6px;
margin-top: 12px;
}
}
.ballotjoincontainer {
display: flex;
width: 100%;
justify-content: center;
.ballotjoin {
width: 85%;
// height:100px;
// background-color: #bfa;
.ballotitem {
.upitem {
display: flex;
justify-content: space-between;
.left {
display: flex;
.leftimg {
width: 4.5px;
height: 14.5px;
margin-top: 1px;
}
.leftcontent {
margin-left: 9px;
color: #6e7b84;
font-size: 13px;
line-height: 30px;
margin-top: -5px;
}
}
.btn {
background-color: #2478ff;
color: #fff;
width: 64px;
height: 21px;
border-radius: 10px;
border: 0;
font-size: 12px;
line-height: 19px;
margin-top: -1px;
}
}
.thinline {
width: 100%;
border-top: 1px solid #f1f2f3;
margin-top: 17px;
margin-bottom: 17px;
}
}
}
}
}
}
}
.btnbox {
width: 301.5px;
height: 33px;
background-color: #2478ff;
border-radius: 6px;
box-shadow: 0px 1px 8px 0px rgba(56, 125, 247, 0.7);
font-size: 14px;
margin: 30px auto 0 auto;
text-align: center;
line-height: 33px;
.submitbtn {
border: none;
border-radius: 6px;
background-color: #2478ff;
color: #ffffff;
}
}
}
}
</style>

View File

@@ -0,0 +1,60 @@
<!--
* @Author: lixg lixg@dongwu-inc.com
* @Date: 2023-01-16 10:08:44
* @LastEditors: lixg lixg@dongwu-inc.com
* @LastEditTime: 2023-01-16 13:55:43
* @FilePath: /stu_h5/src/views/pathmap/LearnPath.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
<template>
<div class="learnpath">
<div class="main">
<div v-for="(el, index) in data" :key="index">
<div @click="goDetails(el)">{{ el.name }}</div>
</div>
</div>
</div>
</template>
<script setup>
import { computed, ref } from "vue";
// import nostarted from "../../assets/image/nostarted.png";
// import completed from "../../assets/image/completed.png";
// import ongoing from "../../assets/image/ongoing.png";
import { usePage } from "@/api/request";
import { ROUTER_LIST } from "@/api/api";
import { useRouter } from "vue-router";
import store from "@/store";
// import PathDetailImage from "@/components/PathDetailImage.vue";
const detail = ref();
const showmapdetail = ref(false);
const currentStageId = ref();
const userInfo = computed(() => store.state.userInfo);
console.log("userInfo", userInfo);
const { data } = usePage(ROUTER_LIST, { pageSize: 60 });
console.log("学习路径列表", data, data.value);
const router = useRouter();
const goDetails = (item) => {
// console.log("item", item);
router.push({
path: "/pathmappage",
query: { routerId: item.routerId, routerName: item.routerName },
});
};
</script>
<style lang="scss">
.learnpath {
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
.main {
width: 100%;
display: flex;
flex-direction: column;
//justify-content: center;
}
}
</style>

View File

@@ -9,15 +9,19 @@
<span class="close"></span>
</div>
<div class="content">
<div class="title">中级产品经理</div>
<div class="title">{{ data?.name }}</div>
<div class="text2">
课程简介课程简介课程简介课程简介课程简介课程简介课程简介课程简介课程简介课程简介课程简介课程简介课程简介简介课程简介
{{ data?.remark }}
</div>
</div>
</div>
<div class="down">
<div class="project_title">项目内容</div>
<div class="project_first">
<div class="project_title">学习路径内容</div>
<!-- <div
class="project_first"
>
<div class="course1_first">
<div class="text8">管理者如何持续找到发力点</div>
<div class="course1_right">
@@ -48,10 +52,10 @@
</div>
</div>
</div>
</div>
</div> -->
<div class="project_second">
<div class="course1_first">
<div class="text8">第一讲业务起航的支点 - 你的风格</div>
<div class="text8">{{ data?.currentStageName }}</div>
<div class="course1_right">
<div class="circular"></div>
<div class="text9">进行中</div>
@@ -59,22 +63,53 @@
</div>
</div>
<div class="secondcontent">
<div class="question">
<div class="issue">
趣味课前小测 - MBTI测试你适合做哪个方向
<div
class="question"
v-for="(el, index) in data?.taskBoList"
:key="index"
>
<div>
<div class="issue">
{{ el.name }}
</div>
<div class="coursetag">
<div
class="tag1"
style="margin-right: 11px; margin-top: 16px"
v-if="el.flag"
>
必修
</div>
<div
class="tag2"
style="margin-right: 11px; margin-top: 16px"
v-if="!el.flag"
>
选修
</div>
<div
class="tag3"
style="margin-right: 11px; margin-top: 16px"
>
{{ types.typeName[el.type] || "" }}
</div>
</div>
</div>
<div
class="goclass"
:style="{
background: `${types.path[el.type] ? '#2478ff' : '#999'}`,
}"
@click="toFinish(el)"
>
{{
el.status === 1
? "已完成"
: types.path[el.type]
? types.toName[el.type]
: "未开放"
}}
</div>
<div class="tag1">选修</div>
<div class="tag2">测评</div>
</div>
<div class="question">
<div class="issue">社交产品如何做好模块化处理</div>
<div class="tag3">必修</div>
<div class="tag2">作业</div>
</div>
<div class="question">
<div class="issue">社交产品如何做好模块化处理</div>
<div class="tag3">必修</div>
<div class="tag2">讨论</div>
</div>
</div>
</div>
@@ -83,7 +118,215 @@
</div>
</template>
<script></script>
<script setup>
import { computed, reactive, ref, watch } from "vue";
// import circle from "../../assets/image/pathdetails/circle.png";
// import circle2 from "../../assets/image/pathdetails/circle2.png";
import { boeRequest, useRequest, request } from "@/api/request";
import { ROUTER_PROCESS, LINK_DETAILS, STUDY_RECORD } from "@/api/api";
import { useRoute, useRouter } from "vue-router";
import { ElMessage } from "element-plus";
import store from "@/store";
import { ROUTER } from "@/api/CONST";
const {
query: { routerId, routerName },
} = useRoute();
const router = useRouter();
const returnclick = () => {
router.back();
};
const { data } = useRequest(ROUTER_PROCESS, { routerId });
const userInfo = computed(() => store.state.userInfo);
console.log("lalalallala", data);
const activeName = ref("first");
const handleClick = (tab, event) => {
console.log(tab, event);
};
const path = { 1: "path" };
const dialogVisible = ref(false);
const dialogVisibleTip = ref("");
const types = ref({
typeName: {
1: "在线",
2: "面授",
3: "案例",
4: "作业",
5: "考试",
6: "直播",
7: "外链",
8: "讨论",
9: "活动",
10: "测评",
11: "评估",
12: "投票",
13: "项目",
},
toName: {
1: "去上课",
2: "去上课",
3: "去阅读",
4: "去完成",
5: "去完成",
6: "去观看",
7: "去查看",
8: "去讨论",
9: "去签到",
10: "去完成",
11: "去完成",
12: "去投票",
13: "去完成",
},
path: {
1: import.meta.env.VITE_BOE_ONLINE_CLASS_URL, //在线
2: "/faceteach",
3: import.meta.env.VITE_BOE_CASS_DETAIL_URL, //案例
4: "/homeworkpage",
5: import.meta.env.VITE_BOE_EXAM_DETAIL_URL, //考试
6: "/liveboradcast",
7: "/outerchain", //外联
// 7: ({ targetId }) => window.open(targetId, "_top"), //外联
8: "/discusspage",
9: "/activitiespage",
10: ({ evaType, targetId }) =>
window.open(
evaType == 0
? import.meta.env.VITE_BOE_TEST_DETAIL_URL + targetId
: import.meta.env.VITE_BOE_TEST_OUT_DETAIL_URL +
targetId +
`&quizTaskKid=${routerId}&channelCode=learningpath`,
"_top"
), //测评
11: "/investigatpage",
12: "/ballotpage",
13: "/projectdetails",
},
});
function toFinish(d) {
console.log(d);
console.log(data.value.currentStageId, routerId);
if (!types.value.path[d.type]) {
ElMessage.error("暂时未开放");
return;
}
if (d.type == 2) {
let date1 = new Date(d.endTime).getTime();
let date2 = new Date().getTime();
if (date1 < date2) {
dialogVisibleTip.value = "当前面授课已结束";
dialogVisible.value = true;
//return
}
}
if (d.type == 4) {
let date1 = new Date(d.endTime).getTime();
let date2 = new Date().getTime();
if (date1 < date2) {
dialogVisibleTip.value = "当前作业已结束";
dialogVisible.value = true;
//return
}
}
// 直播结束时间
if (d.type == 6) {
let date1 = new Date(d.endTime).getTime();
let date2 = new Date().getTime();
if (date1 < date2) {
dialogVisibleTip.value = "当前直播已结束";
dialogVisible.value = true;
//return
}
}
// 考试 停用
if (d.type == 5) {
if (d.taskStatus == 1 || d.taskStatus == 2) {
// ElMessage.error("该任务无法学习,请联系管理员进行替换。")
dialogVisibleTip.value = "该任务无法学习,请联系管理员进行替换!";
dialogVisible.value = true;
return;
}
}
// 评估 停用
if (d.type == 11) {
if (d.taskStatus == 1 || d.taskStatus == 2) {
// ElMessage.error("该任务无法学习,请联系管理员进行替换。")
dialogVisibleTip.value = "该任务无法学习,请联系管理员进行替换!";
dialogVisible.value = true;
return;
}
}
// 其他活动 结束时间
if (d.type == 9) {
let date1 = new Date(d.endTime).getTime();
let date2 = new Date().getTime();
if (date1 < date2) {
dialogVisibleTip.value = "当前活动已结束";
dialogVisible.value = true;
//return
}
}
// 在线课 停用 -- 暂时没有在线课停用标记
if (d.type == 1) {
if (d.taskStatus == 1 || d.taskStatus == 2) {
// ElMessage.error("该任务无法学习,请联系管理员进行替换。")
dialogVisibleTip.value = "该任务无法学习,请联系管理员进行替换!";
dialogVisible.value = true;
return;
}
}
// 面授课 停用
if (d.type == 2) {
if (d.taskStatus == 1 || d.taskStatus == 2) {
// ElMessage.error("该任务无法学习,请联系管理员进行替换。")
dialogVisibleTip.value = "该任务无法学习,请联系管理员进行替换!";
dialogVisible.value = true;
return;
}
}
if (d.type === 3) {
d.status !== 1 &&
request(STUDY_RECORD, {
studentId: userInfo.value.id,
targetId: data.value.routerId,
logo: ROUTER,
stageOrChapterId: data.value.currentStageId,
taskId: d.routerTaskId,
});
}
console.log("点击跳转");
if (typeof types.value.path[d.type] === "string") {
types.value.path[d.type] &&
types.value.path[d.type].startsWith("http") &&
window.open(types.value.path[d.type] + d.targetId, "_top");
types.value.path[d.type] &&
types.value.path[d.type].startsWith("/") &&
router.push({
path: types.value.path[d.type],
query: {
id: d.routerTaskId,
type: ROUTER,
infoId: routerId,
courseId: d.courseId,
pName: data.value.name,
sName: data.value.currentStageName,
chapterOrStageId: data.value.currentStageId,
studentId: userInfo.value.id,
status: d.status,
},
});
} else if (typeof types.value.path[d.type] === "function") {
console.log("ddddddd", d);
types.value.path[d.type](d);
// console.log("types.value.path[d.type](d)", d);
}
}
</script>
<style lang="scss">
.pathmap {
@@ -436,6 +679,12 @@
position: relative;
height: 72px;
border-bottom: 0.5px solid rgba(241, 242, 243, 1);
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
.issue {
width: 100%;
display: flex;
@@ -443,45 +692,64 @@
line-height: 30.29px;
color: rgba(110, 123, 132, 1);
}
.tag1 {
position: absolute;
left: 0;
bottom: 14.5px;
.coursetag {
display: flex;
justify-content: center;
align-items: center;
font-size: 13px;
color: rgba(203, 128, 231, 1);
border: 0.5px solid rgba(203, 128, 231, 1);
line-height: 19.2px;
//padding: 0 10px;
flex-wrap: wrap;
}
.tag2 {
position: absolute;
left: 92px;
bottom: 14.5px;
.goclass {
width: 63px;
height: 23px;
background: #2478ff;
box-shadow: 0px 1px 8px 0px rgba(56, 125, 247, 0.7);
border-radius: 4px;
font-size: 14px;
font-weight: 800;
color: #ffffff;
display: flex;
justify-content: center;
align-items: center;
font-size: 13px;
color: rgba(136, 157, 238, 1);
border: 0.5px solid rgba(136, 157, 238, 1);
line-height: 19.2px;
//padding: 0 10px;
}
.tag3 {
position: absolute;
left: 0;
bottom: 14.5px;
display: flex;
justify-content: center;
align-items: center;
font-size: 13px;
color: rgba(104, 206, 234, 1);
border: 0.5px solid rgba(104, 206, 234, 1);
line-height: 19.2px;
//padding: 0 10px;
margin-right: 37px;
cursor: pointer;
}
// .tag1 {
// position: absolute;
// left: 0;
// bottom: 14.5px;
// display: flex;
// justify-content: center;
// align-items: center;
// font-size: 13px;
// color: rgba(203, 128, 231, 1);
// border: 0.5px solid rgba(203, 128, 231, 1);
// line-height: 19.2px;
// //padding: 0 10px;
// }
// .tag2 {
// position: absolute;
// left: 92px;
// bottom: 14.5px;
// display: flex;
// justify-content: center;
// align-items: center;
// font-size: 13px;
// color: rgba(136, 157, 238, 1);
// border: 0.5px solid rgba(136, 157, 238, 1);
// line-height: 19.2px;
// //padding: 0 10px;
// }
// .tag3 {
// position: absolute;
// left: 0;
// bottom: 14.5px;
// display: flex;
// justify-content: center;
// align-items: center;
// font-size: 13px;
// color: rgba(104, 206, 234, 1);
// border: 0.5px solid rgba(104, 206, 234, 1);
// line-height: 19.2px;
// //padding: 0 10px;
// }
}
}
}

View File

@@ -0,0 +1,17 @@
<template>
<el-result
icon="success"
title="签到异常"
sub-title="请联系管理员"
>
<template #extra>
<el-button type="primary" @click="toIndex">返回首页</el-button>
</template>
</el-result>
</template>
<script setup>
function toIndex(){
window.location.href = import.meta.env.VITE_BOE_API_URL
}
</script>

View File

@@ -0,0 +1,17 @@
<template>
<el-result
icon="success"
title="签到成功"
sub-title="您已经签到成功"
>
<template #extra>
<el-button type="primary" @click="toIndex">返回首页</el-button>
</template>
</el-result>
</template>
<script setup>
function toIndex(){
window.location.href = import.meta.env.VITE_BOE_API_URL
}
</script>

View File

@@ -0,0 +1,17 @@
<template>
<el-result
icon="success"
title="签到异常"
sub-title="您不在此课程中"
>
<template #extra>
<el-button type="primary" @click="toIndex">返回首页</el-button>
</template>
</el-result>
</template>
<script setup>
function toIndex(){
window.location.href = import.meta.env.VITE_BOE_API_URL
}
</script>

View File

@@ -0,0 +1,17 @@
<template>
<el-result
icon="success"
title="签到成功"
sub-title="您已经签到成功"
>
<template #extra>
<el-button type="primary" @click="toIndex">返回首页</el-button>
</template>
</el-result>
</template>
<script setup>
function toIndex(){
window.location.href = import.meta.env.VITE_BOE_API_URL
}
</script>