Compare commits

...

12 Commits
v2.2 ... master

  1. 12
      public/index.html
  2. 2
      public/js/ckplayerX2/ckplayer.min.js
  3. 5
      src/assets/css/base.css
  4. 4
      src/assets/css/m.css
  5. BIN
      src/assets/studypath/finedatalink/st1.png
  6. 3
      src/components/AvatarDropDown.vue
  7. 497
      src/components/Footer - 副本.vue
  8. 353
      src/components/Footer.vue
  9. 197
      src/components/Header.vue
  10. 26
      src/main.js
  11. 10
      src/store/index.js
  12. 629
      src/views/class/admin/schedule_admin_class.vue
  13. 955
      src/views/class/admin/student_admin_class.vue
  14. 4
      src/views/class/class_lesson.vue
  15. 7
      src/views/class/play.vue
  16. 63
      src/views/studypath/fineDataLink.vue
  17. 6
      src/views/studypath/jiandaoyun.vue
  18. 3063
      src/views/video/guide/finebi.vue
  19. 3020
      src/views/video/guide/finereport.vue
  20. 3039
      src/views/video/guide/finereportGuide2023.vue
  21. 3106
      src/views/video/guide/jiandaoyun.vue
  22. 19
      src/views/video/play.vue
  23. 3
      src/views/video/video_course.vue

12
public/index.html

@ -266,6 +266,16 @@
</ul> </ul>
<script> <script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?f4d7d83c565e698bd7cedfe9c6297055";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
<!-- <script>
var _hmt = _hmt || []; var _hmt = _hmt || [];
(function(c, l, a, r, i, t, y) { (function(c, l, a, r, i, t, y) {
c[a] = c[a] =
@ -279,6 +289,6 @@
y = l.getElementsByTagName(r)[0]; y = l.getElementsByTagName(r)[0];
y.parentNode.insertBefore(t, y); y.parentNode.insertBefore(t, y);
})(window, document, "clarity", "script", "h6euw7u8lp"); })(window, document, "clarity", "script", "h6euw7u8lp");
</script> </script> -->
</body> </body>
</html> </html>

2
public/js/ckplayerX2/ckplayer.min.js vendored

File diff suppressed because one or more lines are too long

5
src/assets/css/base.css

@ -363,7 +363,7 @@ a:hover {
font-size: 36px !important; font-size: 36px !important;
} }
.lht17 { .lht17 {
lint-height: 17px; line-height: 17px;
} }
.lht18 { .lht18 {
line-height: 18px; line-height: 18px;
@ -418,6 +418,9 @@ a:hover {
.colffa { .colffa {
color: #ffa940; color: #ffa940;
} }
.colff4 {
color: #ff4d4f;
}
.col28c { .col28c {
color: #28c346; color: #28c346;

4
src/assets/css/m.css

@ -53,7 +53,11 @@
.m-db-800 { .m-db-800 {
display: block !important; display: block !important;
} }
.msg-box {
width: 100% !important;
}
} }
:root { :root {
--van-red: #0082fc; --van-red: #0082fc;
} }

BIN
src/assets/studypath/finedatalink/st1.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 75 KiB

3
src/components/AvatarDropDown.vue

@ -49,6 +49,7 @@
import { reactive, toRefs } from "vue"; import { reactive, toRefs } from "vue";
import { getUid } from "@/utils/cookie"; import { getUid } from "@/utils/cookie";
import { getUserInfoShequ } from "@/api/user"; import { getUserInfoShequ } from "@/api/user";
import store from "@/store";
export default { export default {
setup() { setup() {
const state = reactive({ const state = reactive({
@ -59,7 +60,7 @@ export default {
const res = await getUserInfoShequ(state.uid); const res = await getUserInfoShequ(state.uid);
if (res.code === 200) { if (res.code === 200) {
state.user = res.data; state.user = res.data;
console.log(state.user); store.commit("set_user_name", res.data.username);
} }
}; };
resGetUserInfoShequ(); resGetUserInfoShequ();

497
src/components/Footer - 副本.vue

@ -0,0 +1,497 @@
<template>
<el-backtop class="feedback-backtop">
<svg viewBox="64 64 896 896" focusable="false" data-icon="up" width="14" height="14" fill="currentColor" aria-hidden="true">
<path d="M890.5 755.3L537.9 269.2c-12.8-17.6-39-17.6-51.7 0L133.5 755.3A8 8 0 00140 768h75c5.1 0 9.9-2.5 12.9-6.6L512 369.8l284.1 391.6c3 4.1 7.8 6.6 12.9 6.6h75c6.5 0 10.3-7.4 6.5-12.7z"></path>
</svg>
</el-backtop>
<footer class="m-dn">
<div class="footer">
<div class="deanfooter" id="deanfooter" style="margin-top:0">
<div class="w1200">
<div>
<div class="flex-1 mb8">
<img
class="foot_logo"
alt=""
src="data:image/png;base64,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"
/>
<div class="foot_a">
<a class="foot_a_item" href="https://www.fanruan.com/privacy" target="_blank">隐私政策</a>
<a class="foot_a_item" href="https://bbs.fanruan.com/thread-102821-1-1.html" rel="nofollow" target="_blank">帆软用户协议</a>
<a class="foot_a_item" href="https://bbs.fanruan.com/thread-135379-1-1.html" rel="nofollow" target="_blank">联系管理员</a>
<a href="https://www.fanruan.com/support" target="_blank">联系帆软</a>
</div>
</div>
<div class="xs0">
<span id="debuginfo">
Copyright © <a href="https://www.fanruan.com/" target="_blank">帆软软件有限公司</a>
<span class="foot_a_item mlf16">版权所有</span>
<a href="https://beian.miit.gov.cn/#/Integrated/index">苏ICP备18065767号</a>
</span>
</div>
</div>
<div class="clear"></div>
</div>
</div>
</div>
</footer>
<div class="m-footr m-db">
<div class="footer_row">
<span>Copyright © </span>
<a class="acol808" href="https://www.fanruan.com">帆软软件有限公司</a>
<span> 版权所有</span>
</div>
<a class="acol808" href="https://beian.miit.gov.cn/#/Integrated/index">苏ICP备18065767号</a>
</div>
<!-- 用户侧 -->
<div class="service_feddback_box m-dn">
<el-popover placement="left" trigger="hover" width="392px" popper-class="new-popper">
<div class="tel_txt_box dr-feedback-popover-wrapper">
<div class="dr-feedback-popover">
<div class="dr-feedback-popover-item-click dr-feedback-popover-item" onclick="window.open('https://service.fanruan.com/support')">
<div class="dr-feedback-popover-item-logo">
<img src="https://fanruanbbs.obs.cn-east-2.myhuaweicloud.com/ui/digit-fe/feedback/support.png" />
</div>
<div>
<div class="dr-feedback-popover-item-title-wrapper" style="gap: 8px;">
<div class="ant-space-item" style="">
<span class="title">在线支持</span>
</div>
<div class="ant-space-item">
<span role="img" aria-label="arrow-right" class="anticon anticon-arrow-right icon">
<svg viewBox="64 64 896 896" focusable="false" data-icon="arrow-right" width="12" height="12" fill="currentColor" aria-hidden="true">
<path d="M869 487.8L491.2 159.9c-2.9-2.5-6.6-3.9-10.5-3.9h-88.5c-7.4 0-10.8 9.2-5.2 14l350.2 304H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h585.1L386.9 854c-5.6 4.9-2.2 14 5.2 14h91.5c1.9 0 3.8-.7 5.2-2L869 536.2a32.07 32.07 0 000-48.4z"></path>
</svg>
</span>
</div>
</div>
<div class="grey-text">工作日9:00-12:0013:30-17:30在线</div>
<div class="dr-feedback-popover-item-info-wrapper">
<div>
<div class="grey-text">或拨打热线电话</div>
<div>
<div class="ant-space css-ph9edi ant-space-horizontal ant-space-align-center" style="gap: 8px;">
<div class="ant-space-item" style="">
<span class="grey-text">大陆</span>
</div>
<div class="ant-space-item">
<div class="ant-space css-ph9edi ant-space-horizontal ant-space-align-center blue-text" style="gap: 8px;">
<div class="ant-space-item">400-811-8890 转2</div>
</div>
</div>
</div>
</div>
<div>
<div>
<span class="grey-text">海外</span>
<span class="blue-text">(+86) 0510-66758729</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="dr-feedback-popover-item-click dr-feedback-popover-item" style="cursor: pointer;" @click="pageFeedbackHanlder(true)">
<div class="dr-feedback-item">
<div class="dr-feedback-popover-item-logo">
<img alt="feedback" src="https://hwobs.fanruan.com/ui/digit-fe/feedback/feedback.png" />
</div>
<div>
<div class="dr-feedback-popover-item-title-wrapper" style="gap: 8px;">
<span class="title">页面反馈</span>
<span class="anticon anticon-arrow-right icon">
<svg viewBox="64 64 896 896" focusable="false" data-icon="arrow-right" width="12" height="12" fill="currentColor" aria-hidden="true">
<path d="M869 487.8L491.2 159.9c-2.9-2.5-6.6-3.9-10.5-3.9h-88.5c-7.4 0-10.8 9.2-5.2 14l350.2 304H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h585.1L386.9 854c-5.6 4.9-2.2 14 5.2 14h91.5c1.9 0 3.8-.7 5.2-2L869 536.2a32.07 32.07 0 000-48.4z"></path>
</svg>
</span>
</div>
<div class="grey-text">针对当前网页的建议问题反馈</div>
</div>
</div>
</div>
<div class="dr-feedback-popover-item">
<div class="dr-feedback-popover-item-logo">
<img src="https://hwobs.fanruan.com/ui/digit-fe/feedback/consult.png" />
</div>
<div>
<div class="ant-space css-ph9edi ant-space-horizontal ant-space-align-center dr-feedback-popover-item-title-wrapper" style="gap: 8px;">
<div class="ant-space-item">
<span class="title">售前咨询</span>
</div>
</div>
<div class="grey-text">采购需求/获取报价/预约演示</div>
<div class="dr-feedback-popover-item-info-wrapper">
<div class="grey-text">或拨打: <span class="blue-text">400-811-8890 转1</span></div>
</div>
</div>
<div>
<img alt="qr" src="https://fanruanbbs.obs.cn-east-2.myhuaweicloud.com/ui/digit-fe/feedback/qr.png" width="80" />
</div>
</div>
<div class="dr-feedback-popover-item" style="margin-bottom: 0">
<div class="dr-feedback-popover-item-logo">
<img src="https://hwobs.fanruan.com/ui/digit-fe/feedback/tel.png" />
</div>
<div>
<div class="ant-space css-ph9edi ant-space-horizontal ant-space-align-center dr-feedback-popover-item-title-wrapper" style="gap: 8px;">
<div class="ant-space-item">
<span class="title">总裁办24H电话</span>
</div>
</div>
<div class="blue-text">173 1278 1526</div>
</div>
</div>
</div>
</div>
<template #reference>
<div class="dr-feedback">
<div class="dr-feedback-inner">
<img class="dr-feedback-inner-icon" src="https://hwobs.fanruan.com/ui/digit-fe/feedback/customer.png" />
<div>获取帮助</div>
</div>
</div>
</template>
</el-popover>
</div>
<el-dialog title="提交页面反馈" v-model="showFeedback" width="800px" custom-class="foot-dialog-feedback">
<div class="flex-1 dia-msg-til">
<span style="color: #FFA940; margin: 3px 6px 0 0;">
<svg viewBox="64 64 896 896" focusable="false" data-icon="info-circle" width="1em" height="1em" fill="currentColor" aria-hidden="true">
<path d="M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"></path>
<path d="M464 336a48 48 0 1096 0 48 48 0 10-96 0zm72 112h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V456c0-4.4-3.6-8-8-8z"></path>
</svg>
</span>
<span>
仅适用于当前网页的意见收集帆软产品问题请在
<a class="col008" href="https://bbs.fanruan.com/wenda" target="_blank">问答板块提问</a> <a class="col008" href="https://service.fanruan.com/" target="_blank">前往服务平台</a> 获取技术支持
</span>
</div>
<div id="feedbackIframe" style=" width:800px; height: 500px; overflow: hidden; border-radius: 8px;"></div>
</el-dialog>
</template>
<script>
import { toRefs, reactive, getCurrentInstance } from "vue";
import { getTicketToken } from "@/api/user";
import { getUid } from "@/utils/cookie";
import { onBeforeRouteUpdate, useRoute } from "vue-router";
export default {
setup() {
const { proxy } = getCurrentInstance();
const route = useRoute();
const state = reactive({
showFeedback: false,
dialogShuzhiniao: false,
uid: getUid(),
ticketToken: null,
curPageUrl: window.location.href,
isFanruanUser: false,
mobile: null,
comLoginUrl: proxy.$root.com_login_url2 + route.path,
});
onBeforeRouteUpdate((to) => {
state.curPageUrl = proxy.$root.com_edu_url + to.fullPath;
state.comLoginUrl = proxy.$root.com_login_url2 + to.fullPath;
});
// token
const resGetTicketToken = async () => {
const params = {
referer: state.curPageUrl,
};
const res = await getTicketToken(params);
if (res.code === 200) {
let data = res.data;
if (data.finer === true) {
state.isFanruanUser = true;
state.mobile = data.mobile;
} else {
state.isFanruanUser = false;
state.ticketToken = data.ticketToken;
}
}
};
resGetTicketToken();
//
const pageFeedbackHanlder = (display) => {
if (state.uid > 0 && state.isFanruanUser === true) {
//
if (display === false) {
const remIframe = document.getElementById("iframe_shuzhiniao");
document.querySelector("body").removeChild(remIframe);
} else {
const iframe = document.createElement("iframe");
iframe.src = `https://pe9qbh7c.shuzhiniao.com/web/#/h5/business/brd?embedded=true&modal=true&hideRootMenu=true&spaceId=11093&类型=37047&反馈人UID=${state.uid}&页面URL=${state.curPageUrl}&反馈人手机号=${state.mobile}&hiddenFields=页面URL,反馈人UID,处理人回复,类型`;
iframe.style = "width: 100vw; height: 100vh; position: fixed; top: 0px; left: 0px; z-index: 100000; border:none;";
iframe.id = "iframe_shuzhiniao";
document.querySelector("body").appendChild(iframe);
}
} else if (state.uid > 0) {
//
state.showFeedback = true;
setTimeout(function() {
const iframe = document.createElement("iframe");
iframe.src = `https://pe9qbh7c.shuzhiniao.com/web/#/ticket/a2555f84970f418a98960adb4029aed1/form?embedded=true&hiddenFields=${encodeURIComponent("页面URL,反馈人UID,处理人回复")}&ticketToken=${state.ticketToken}`;
iframe.style = "width: 100%; height: 100%; border:none;";
iframe.id = "iframe_shuzhiniao";
let makediv = document.getElementById("feedbackIframe");
makediv.appendChild(iframe);
}, 200);
} else {
//
window.location.replace(state.comLoginUrl);
}
};
// iframe
function receiveMessage(event) {
const { data } = event;
if (data && data.type === "closeModal" && data.id === "shuzhiniao-create-issue") {
// iframe
pageFeedbackHanlder(false);
}
}
window.addEventListener("message", receiveMessage, false);
return {
...toRefs(state),
pageFeedbackHanlder,
};
},
};
</script>
<style lang="scss">
.feedback-backtop {
align-items: center;
background-color: #fff !important;
border-radius: 8px !important;
bottom: 80px !important;
box-shadow: 0 4px 12px 0 rgba(4, 43, 79, 0.12);
cursor: pointer;
display: flex !important;
height: 36px !important;
justify-content: center !important;
position: fixed;
right: 10px !important;
width: 36px !important;
background-image: none !important;
color: #333;
}
.new-popper {
border-radius: 8px !important;
}
.service_feddback_box {
position: fixed;
top: 50%;
transform: translateY(-50%);
right: 10px;
}
.dr-feedback {
background: linear-gradient(144deg, #00b8fe 16%, #0082fc 87%);
border-radius: 8px;
box-shadow: 0 4px 12px 0 rgba(4, 43, 79, 0.12);
height: 84px;
width: 36px;
line-height: 1.5714285714285714;
}
.dr-feedback,
.dr-feedback-inner {
align-items: center;
display: flex;
flex-direction: column;
justify-content: center;
position: relative;
z-index: 2;
}
.dr-feedback-inner {
color: #fff;
cursor: pointer;
font-size: 12px;
line-height: 14px;
text-align: center;
width: 80%;
}
.dr-feedback-inner-icon {
height: 20px;
margin-bottom: 8px;
width: 20px;
}
.dr-feedback-popover {
box-sizing: border-box;
padding: 4px;
width: 100%;
}
.dr-feedback-popover:before {
content: "";
position: absolute;
right: -20px;
top: 0;
width: 20px;
height: 100%;
}
.ant-space {
display: inline-flex;
}
.ant-space-align-center {
align-items: center;
}
.dr-feedback-popover-wrapper .dr-feedback-popover-item {
align-items: flex-start;
background: linear-gradient(180deg, #f3f6ff, #fff);
border: 0.5px solid #d6dfe7;
border-radius: 8px;
box-sizing: border-box;
display: flex;
gap: 12px;
margin-bottom: 16px;
padding: 12px;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
font-size: 14px;
line-height: 1.5714285714285714;
}
.dr-feedback-popover-wrapper .dr-feedback-popover-item-logo {
width: 48px;
}
.dr-feedback-popover-wrapper .dr-feedback-popover-item-logo img {
width: 100%;
border: none;
}
.dr-feedback-popover-item-title-wrapper {
display: inline-flex;
align-items: center;
.anticon-arrow-right {
color: #1f1f1f;
}
.title {
color: #1f1f1f;
}
}
.dr-feedback-popover-item-click {
cursor: pointer;
&:hover .dr-feedback-popover-item-title-wrapper {
.anticon-arrow-right {
color: #0082fc;
}
.title {
color: #0082fc;
}
}
}
.dr-feedback-popover-wrapper .dr-feedback-popover-item-title-wrapper .title {
font-family: PingFangSC, PingFangSC-Semibold;
font-size: 14px;
font-weight: 600;
line-height: 24px;
text-align: left;
}
.dr-feedback-popover-wrapper .dr-feedback-popover-item .grey-text {
color: #8a9cb0;
font-size: 14px;
}
.dr-feedback-popover-wrapper .dr-feedback-popover-item-info-wrapper {
margin-top: 10px;
}
.dr-feedback-popover-wrapper .dr-feedback-popover-item .blue-text {
color: #0082fc;
font-size: 14px;
}
.dr-feedback-item {
display: flex;
gap: 10px;
}
</style>
<style lang="scss">
.dia-msg-til {
background-color: #fefbe6;
padding: 10px 20px;
border: 1px solid #ffe58f;
margin-top: 6px;
color: #333;
}
.foot-dialog-feedback {
.el-dialog__body {
padding: 0 !important;
}
}
.footer {
height: 100px;
color: #8097ad;
font-size: 14px;
line-height: 18px;
background: #fff;
padding: 24px 0;
margin-top: 40px;
border-top: #eaf0f9 solid 1px;
}
.foot_logo {
width: 72px;
margin-right: 24px;
}
.foot_a {
margin-top: 2px;
}
.foot_a_item {
margin-right: 20px;
&::after {
content: " ";
display: inline-block;
position: relative;
width: 1px;
height: 14px;
background-color: #8097ad;
right: -10px;
top: 2px;
}
}
.footer a {
color: #8097ad;
text-decoration: none;
}
.footer a:hover {
color: #0082fc;
}
.m-footr {
display: none;
background-color: #fff;
border-top: #eaf0f9 solid 1px;
text-align: center;
font-size: 14px;
padding: 14px 0;
color: #8097ad;
margin-top: 40px;
.footer_row {
padding-bottom: 8px;
}
}
.acol808 {
color: #808696;
&:hover {
color: #0082fc;
}
}
</style>

353
src/components/Footer.vue

@ -1,5 +1,10 @@
<template> <template>
<el-backtop></el-backtop> <el-backtop class="feedback-backtop">
<svg viewBox="64 64 896 896" focusable="false" data-icon="up" width="14" height="14" fill="currentColor" aria-hidden="true">
<path d="M890.5 755.3L537.9 269.2c-12.8-17.6-39-17.6-51.7 0L133.5 755.3A8 8 0 00140 768h75c5.1 0 9.9-2.5 12.9-6.6L512 369.8l284.1 391.6c3 4.1 7.8 6.6 12.9 6.6h75c6.5 0 10.3-7.4 6.5-12.7z"></path>
</svg>
</el-backtop>
<footer class="m-dn"> <footer class="m-dn">
<div class="footer"> <div class="footer">
<div class="deanfooter" id="deanfooter" style="margin-top:0"> <div class="deanfooter" id="deanfooter" style="margin-top:0">
@ -43,47 +48,111 @@
</div> </div>
<!-- 用户侧 --> <!-- 用户侧 -->
<div class="dr-feedback m-dn"> <div class="service_feddback_box m-dn">
<div class="dr-feedback-item" @click="pageFeedbackHanlder(true)"> <el-popover placement="left" trigger="hover" width="392px" popper-class="new-popper">
<span class="anticon anticon-edit dr-feedback-item-icon"> <div class="tel_txt_box dr-feedback-popover-wrapper">
<svg viewBox="64 64 896 896" focusable="false" data-icon="edit" width="1em" height="1em" fill="currentColor" aria-hidden="true"> <div class="dr-feedback-popover">
<path d="M257.7 752c2 0 4-.2 6-.5L431.9 722c2-.4 3.9-1.3 5.3-2.8l423.9-423.9a9.96 9.96 0 000-14.1L694.9 114.9c-1.9-1.9-4.4-2.9-7.1-2.9s-5.2 1-7.1 2.9L256.8 538.8c-1.5 1.5-2.4 3.3-2.8 5.3l-29.5 168.2a33.5 33.5 0 009.4 29.8c6.6 6.4 14.9 9.9 23.8 9.9zm67.4-174.4L687.8 215l73.3 73.3-362.7 362.6-88.9 15.7 15.6-89zM880 836H144c-17.7 0-32 14.3-32 32v36c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-36c0-17.7-14.3-32-32-32z"></path> <div class="dr-feedback-popover-item-click dr-feedback-popover-item" onclick="window.open('https://service.fanruan.com/support')">
</svg> <div class="dr-feedback-popover-item-logo">
</span> <img src="https://fanruanbbs.obs.cn-east-2.myhuaweicloud.com/ui/digit-fe/feedback/support.png" />
<div>页面反馈</div> </div>
</div> <div>
<div class="dr-feedback-popover-item-title-wrapper" style="gap: 8px;">
<el-popover placement="left" trigger="hover" width="240px"> <div class="ant-space-item" style="">
<div style="padding: 10px;"> <span class="title">在线支持</span>
<div class="dr-feedback-contract-item"> </div>
<div class="dr-feedback-contract-item-title">帆软社区管理员</div> <div class="ant-space-item">
<a href="https://bbs.fanruan.com/thread-135379-1-1.html" target="_blank" rel="noreferrer">社区管理员联系方式一览</a> <span role="img" aria-label="arrow-right" class="anticon anticon-arrow-right icon">
</div> <svg viewBox="64 64 896 896" focusable="false" data-icon="arrow-right" width="12" height="12" fill="currentColor" aria-hidden="true">
<div class="dr-feedback-contract-item"> <path d="M869 487.8L491.2 159.9c-2.9-2.5-6.6-3.9-10.5-3.9h-88.5c-7.4 0-10.8 9.2-5.2 14l350.2 304H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h585.1L386.9 854c-5.6 4.9-2.2 14 5.2 14h91.5c1.9 0 3.8-.7 5.2-2L869 536.2a32.07 32.07 0 000-48.4z"></path>
<div class="dr-feedback-contract-item-title">售前咨询电话</div> </svg>
<a href="tel:+400-811-8890" target="_blank" rel="noreferrer">400-811-8890 转1</a> </span>
</div> </div>
<div class="dr-feedback-contract-item"> </div>
<div class="dr-feedback-contract-item-title">在线技术支持电话</div> <div class="grey-text">工作日9:00-12:0013:30-17:30在线</div>
<a href="tel:+400-811-8890" target="_blank" rel="noreferrer">400-811-8890 转2</a> <div class="dr-feedback-popover-item-info-wrapper">
</div> <div>
<div class="dr-feedback-contract-item"> <div class="grey-text">或拨打热线电话</div>
<div class="dr-feedback-contract-item-title">海外客户技术支持电话</div> <div>
<a href="tel:+0510-66758729" target="_blank" rel="noreferrer">(+86) 0510-66758729</a> <div class="ant-space css-ph9edi ant-space-horizontal ant-space-align-center" style="gap: 8px;">
</div> <div class="ant-space-item" style="">
<div class="dr-feedback-contract-item"> <span class="grey-text">大陆</span>
<div class="dr-feedback-contract-item-title">总裁办24H投诉电话</div> </div>
<a href="tel:+17312781526" target="_blank" rel="noreferrer">173 1278 1526</a> <div class="ant-space-item">
<div class="ant-space css-ph9edi ant-space-horizontal ant-space-align-center blue-text" style="gap: 8px;">
<div class="ant-space-item">400-811-8890 转2</div>
</div>
</div>
</div>
</div>
<div>
<div>
<span class="grey-text">海外</span>
<span class="blue-text">(+86) 0510-66758729</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="dr-feedback-popover-item-click dr-feedback-popover-item" style="cursor: pointer;" @click="pageFeedbackHanlder(true)">
<div class="dr-feedback-item">
<div class="dr-feedback-popover-item-logo">
<img alt="feedback" src="https://hwobs.fanruan.com/ui/digit-fe/feedback/feedback.png" />
</div>
<div>
<div class="dr-feedback-popover-item-title-wrapper" style="gap: 8px;">
<span class="title">页面反馈</span>
<span class="anticon anticon-arrow-right icon">
<svg viewBox="64 64 896 896" focusable="false" data-icon="arrow-right" width="12" height="12" fill="currentColor" aria-hidden="true">
<path d="M869 487.8L491.2 159.9c-2.9-2.5-6.6-3.9-10.5-3.9h-88.5c-7.4 0-10.8 9.2-5.2 14l350.2 304H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h585.1L386.9 854c-5.6 4.9-2.2 14 5.2 14h91.5c1.9 0 3.8-.7 5.2-2L869 536.2a32.07 32.07 0 000-48.4z"></path>
</svg>
</span>
</div>
<div class="grey-text">针对当前网页的建议问题反馈</div>
</div>
</div>
</div>
<div class="dr-feedback-popover-item">
<div class="dr-feedback-popover-item-logo">
<img src="https://hwobs.fanruan.com/ui/digit-fe/feedback/consult.png" />
</div>
<div>
<div class="ant-space css-ph9edi ant-space-horizontal ant-space-align-center dr-feedback-popover-item-title-wrapper" style="gap: 8px;">
<div class="ant-space-item">
<span class="title">售前咨询</span>
</div>
</div>
<div class="grey-text">采购需求/获取报价/预约演示</div>
<div class="dr-feedback-popover-item-info-wrapper">
<div class="grey-text">或拨打: <span class="blue-text">400-811-8890 转1</span></div>
</div>
</div>
<div>
<img alt="qr" src="https://fanruanbbs.obs.cn-east-2.myhuaweicloud.com/ui/digit-fe/feedback/qr.png" width="80" />
</div>
</div>
<div class="dr-feedback-popover-item" style="margin-bottom: 0">
<div class="dr-feedback-popover-item-logo">
<img src="https://hwobs.fanruan.com/ui/digit-fe/feedback/tel.png" />
</div>
<div>
<div class="ant-space css-ph9edi ant-space-horizontal ant-space-align-center dr-feedback-popover-item-title-wrapper" style="gap: 8px;">
<div class="ant-space-item">
<span class="title">总裁办24H电话</span>
</div>
</div>
<div class="blue-text">173 1278 1526</div>
</div>
</div>
</div> </div>
</div> </div>
<template #reference> <template #reference>
<div class="dr-feedback-item"> <div class="dr-feedback">
<span role="img" aria-label="phone" class="anticon anticon-phone dr-feedback-item-icon"> <div class="dr-feedback-inner">
<svg viewBox="64 64 896 896" focusable="false" data-icon="phone" width="1em" height="1em" fill="currentColor" aria-hidden="true"> <img class="dr-feedback-inner-icon" src="https://hwobs.fanruan.com/ui/digit-fe/feedback/customer.png" />
<path d="M877.1 238.7L770.6 132.3c-13-13-30.4-20.3-48.8-20.3s-35.8 7.2-48.8 20.3L558.3 246.8c-13 13-20.3 30.5-20.3 48.9 0 18.5 7.2 35.8 20.3 48.9l89.6 89.7a405.46 405.46 0 01-86.4 127.3c-36.7 36.9-79.6 66-127.2 86.6l-89.6-89.7c-13-13-30.4-20.3-48.8-20.3a68.2 68.2 0 00-48.8 20.3L132.3 673c-13 13-20.3 30.5-20.3 48.9 0 18.5 7.2 35.8 20.3 48.9l106.4 106.4c22.2 22.2 52.8 34.9 84.2 34.9 6.5 0 12.8-.5 19.2-1.6 132.4-21.8 263.8-92.3 369.9-198.3C818 606 888.4 474.6 910.4 342.1c6.3-37.6-6.3-76.3-33.3-103.4zm-37.6 91.5c-19.5 117.9-82.9 235.5-178.4 331s-213 158.9-330.9 178.4c-14.8 2.5-30-2.5-40.8-13.2L184.9 721.9 295.7 611l119.8 120 .9.9 21.6-8a481.29 481.29 0 00285.7-285.8l8-21.6-120.8-120.7 110.8-110.9 104.5 104.5c10.8 10.8 15.8 26 13.3 40.8z"></path> <div>获取帮助</div>
</svg> </div>
</span>
<div>联系我们</div>
</div> </div>
</template> </template>
</el-popover> </el-popover>
@ -127,8 +196,6 @@ export default {
comLoginUrl: proxy.$root.com_login_url2 + route.path, comLoginUrl: proxy.$root.com_login_url2 + route.path,
}); });
getTicketToken();
onBeforeRouteUpdate((to) => { onBeforeRouteUpdate((to) => {
state.curPageUrl = proxy.$root.com_edu_url + to.fullPath; state.curPageUrl = proxy.$root.com_edu_url + to.fullPath;
state.comLoginUrl = proxy.$root.com_login_url2 + to.fullPath; state.comLoginUrl = proxy.$root.com_login_url2 + to.fullPath;
@ -172,7 +239,7 @@ export default {
state.showFeedback = true; state.showFeedback = true;
setTimeout(function() { setTimeout(function() {
const iframe = document.createElement("iframe"); const iframe = document.createElement("iframe");
iframe.src = `https://pe9qbh7c.shuzhiniao.com/web/#/ticket/a2555f84970f418a98960adb4029aed1/form?embedded=true&hiddenFields=${encodeURIComponent("页面URL,反馈人UID,处理人回复")}&ticketToken=${state.ticketToken}`; iframe.src = `https://pe9qbh7c.shuzhiniao.com/web/#/ticket/a2555f84970f418a98960adb4029aed1/form?embedded=true&hiddenFields=${encodeURIComponent("类型,页面URL,反馈人UID,处理人回复")}&ticketToken=${state.ticketToken}`;
iframe.style = "width: 100%; height: 100%; border:none;"; iframe.style = "width: 100%; height: 100%; border:none;";
iframe.id = "iframe_shuzhiniao"; iframe.id = "iframe_shuzhiniao";
let makediv = document.getElementById("feedbackIframe"); let makediv = document.getElementById("feedbackIframe");
@ -203,83 +270,165 @@ export default {
</script> </script>
<style lang="scss"> <style lang="scss">
.dia-msg-til { .feedback-backtop {
background-color: #fefbe6; align-items: center;
padding: 10px 20px; background-color: #fff !important;
border: 1px solid #ffe58f; border-radius: 8px !important;
margin-top: 6px; bottom: 80px !important;
box-shadow: 0 4px 12px 0 rgba(4, 43, 79, 0.12);
cursor: pointer;
display: flex !important;
height: 36px !important;
justify-content: center !important;
position: fixed;
right: 10px !important;
width: 36px !important;
background-image: none !important;
color: #333; color: #333;
} }
.foot-dialog-feedback { .new-popper {
.el-dialog__body { border-radius: 8px !important;
padding: 0 !important; }
} .service_feddback_box {
position: fixed;
top: 50%;
transform: translateY(-50%);
right: 10px;
z-index: 5;
} }
/* 用户右侧 */
.dr-feedback { .dr-feedback {
position: fixed; background: linear-gradient(144deg, #00b8fe 16%, #0082fc 87%);
bottom: 150px; border-radius: 8px;
transform: translate(-50%, -50%); box-shadow: 0 4px 12px 0 rgba(4, 43, 79, 0.12);
right: 12px; height: 84px;
background-color: #fff; width: 36px;
box-shadow: 0 4px 12px 0 rgb(4 43 79 / 12%); line-height: 1.5714285714285714;
width: 48px; }
box-sizing: border-box;
font-size: 14px; .dr-feedback,
color: #617288; .dr-feedback-inner {
align-items: center;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center;
position: relative;
z-index: 2;
}
.dr-feedback-inner {
color: #fff;
cursor: pointer;
font-size: 12px;
line-height: 14px;
text-align: center;
width: 80%;
}
.dr-feedback-inner-icon {
height: 20px;
margin-bottom: 8px;
width: 20px;
}
.dr-feedback-popover {
box-sizing: border-box;
padding: 4px;
width: 100%;
}
.dr-feedback-popover:before {
content: "";
position: absolute;
right: -20px;
top: 0;
width: 20px;
height: 100%;
}
.ant-space {
display: inline-flex;
}
.ant-space-align-center {
align-items: center;
}
.dr-feedback-popover-wrapper .dr-feedback-popover-item {
align-items: flex-start;
background: linear-gradient(180deg, #f3f6ff, #fff);
border: 0.5px solid #d6dfe7;
border-radius: 8px; border-radius: 8px;
overflow: hidden; box-sizing: border-box;
z-index: 999; display: flex;
gap: 12px;
.dr-feedback-item { margin-bottom: 16px;
transition: all 0.3s; padding: 12px;
padding: 16px 8px; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
display: flex; font-size: 14px;
align-items: center; line-height: 1.5714285714285714;
justify-content: center; }
flex-direction: column; .dr-feedback-popover-wrapper .dr-feedback-popover-item-logo {
cursor: pointer; width: 48px;
text-align: center; }
.dr-feedback-popover-wrapper .dr-feedback-popover-item-logo img {
&:not(:last-of-type) { width: 100%;
border-bottom: 1px solid #edf3f9; border: none;
} }
.dr-feedback-popover-item-title-wrapper {
display: inline-flex;
align-items: center;
.anticon-arrow-right {
color: #1f1f1f;
}
.title {
color: #1f1f1f;
}
}
&:hover { .dr-feedback-popover-item-click {
cursor: pointer;
&:hover .dr-feedback-popover-item-title-wrapper {
.anticon-arrow-right {
color: #0082fc; color: #0082fc;
} }
.title {
.dr-feedback-item-icon { color: #0082fc;
width: 20px;
height: 20px;
margin-bottom: 8px;
}
svg {
width: 20px;
height: 20px;
} }
} }
} }
.dr-feedback-contract-item { .dr-feedback-popover-wrapper .dr-feedback-popover-item-title-wrapper .title {
&:not(:last-child) { font-family: PingFangSC, PingFangSC-Semibold;
margin-bottom: 20px; font-size: 14px;
} font-weight: 600;
line-height: 24px;
text-align: left;
}
.dr-feedback-popover-wrapper .dr-feedback-popover-item .grey-text {
color: #8a9cb0;
font-size: 14px;
}
.dr-feedback-popover-wrapper .dr-feedback-popover-item-info-wrapper {
margin-top: 10px;
}
.dr-feedback-popover-wrapper .dr-feedback-popover-item .blue-text {
color: #0082fc;
font-size: 14px;
}
.dr-feedback-item {
display: flex;
gap: 10px;
}
</style>
a { <style lang="scss">
color: #1890ff; .dia-msg-til {
background-color: #fefbe6;
padding: 10px 20px;
border: 1px solid #ffe58f;
margin-top: 6px;
color: #333;
}
.foot-dialog-feedback {
.el-dialog__body {
padding: 0 !important;
} }
.el-dialog__header {
.dr-feedback-contract-item-title { text-align: left !important;
color: #333 !important;
color: var(--dr-text-black);
font-size: 14px;
font-weight: 700;
margin-bottom: 4px;
} }
} }

197
src/components/Header.vue

@ -2,43 +2,59 @@
<header class="header" id="myheader"> <header class="header" id="myheader">
<div class="wrapper"> <div class="wrapper">
<!-- left --> <!-- left -->
<div class="nav-lf flex-1"> <div class="nav-lf flex-1">
<div class="nav-logo"> <div class="navlf_item">
<a href="https://home.fanruan.com/"><img src="@/assets/fine_logo_dynamic.gif" class="logo-img"/></a> <div class="nav-logo">
<a href="https://home.fanruan.com/"><img src="@/assets/fine_logo_dynamic.gif" class="logo-img"/></a>
</div>
<div class="nav-line"></div>
<a href="https://home.fanruan.com/" class="nav-title">帆软社区</a>
</div>
<div class="navlf_item navlf-item-box">
<a href="https://home.fanruan.com/" class="nav-item">首页</a>
<a href="https://service.fanruan.com" class="nav-item">服务平台</a>
<a href="https://help.fanruan.com/" class="nav-item">文档</a>
<a href="https://edu.fanruan.com/" class="nav-item active">学院</a>
<a href="https://bbs.fanruan.com/wenda" class="nav-item">问答</a>
<a href="https://bbs.fanruan.com/topic" class="nav-item">论坛</a>
<a href="https://cert.fanruan.com/" class="nav-item">认证</a>
<a href="https://bbs.fanruan.com/jobs" class="nav-item">招聘</a>
<a href="https://bbs.fanruan.com/task" class="nav-item">任务</a>
<a href="https://market.fanruan.com/" class="nav-item">市场</a>
</div> </div>
<div class="nav-line"></div>
<router-link to="/" class="nav-title">帆软学院</router-link>
</div> </div>
<!-- rigt --> <!-- search -->
<div class="nav-rt"> <div class="search-box flex-1">
<!-- search --> <form class="searchform" method="get" autocomplete="off" action="https://search.fanruan.com/?q=" target="_blank" v-if="is_search">
<div class="search-box flex-1"> <div class="el-input el-input--small el-input--suffix topsearch flex-1">
<form class="searchform" method="get" autocomplete="off" action="https://search.fanruan.com/?q=" target="_blank" v-if="is_search"> <input class="el-input__inner" name="q" type="text" autocomplete="off" tabindex="" aria-label="" placeholder="请输入关键词" @focus="isfocus('focus')" @blur="isfocus('blur')" v-on:input="isinput" />
<div class="el-input el-input--small el-input--suffix topsearch flex-1"> <button class="el-input__suffix search_sub" type="submit" :class="{ active_btn: kwbtn }">
<input class="el-input__inner" name="q" type="text" autocomplete="off" tabindex="" aria-label="" placeholder="请输入关键词" @focus="isfocus('focus')" @blur="isfocus('blur')" v-on:input="isinput" /> <span class="el-input__suffix-inner search_btn">
<button class="el-input__suffix search_sub" type="submit" :class="{ active_btn: kwbtn }"> <i class="iconfont icon-icon_icon-53 icon-ss" :class="{ active: kwfocus }"></i>
<span class="el-input__suffix-inner search_btn"> </span>
<i class="iconfont icon-icon_icon-53 icon-ss" :class="{ active: kwfocus }"></i> </button>
</span> </div>
</button> </form>
</div>
</form> <div class="searchform" v-else>
<div class="el-input el-input--small el-input--suffix topsearch flex-1">
<div class="searchform" v-else> <div class="el-input__inner" style="color: #B5C1D0; line-height: 30px;">登录后方可搜索</div>
<div class="el-input el-input--small el-input--suffix topsearch flex-1"> <button class="el-input__suffix search_sub" type="submit" :class="{ active_btn: kwbtn }">
<div class="el-input__inner" style="color: #B5C1D0; line-height: 30px;">登录后方可搜索</div> <span class="el-input__suffix-inner search_btn">
<button class="el-input__suffix search_sub" type="submit" :class="{ active_btn: kwbtn }"> <i class="iconfont icon-icon_icon-53 icon-ss" :class="{ active: kwfocus }"></i>
<span class="el-input__suffix-inner search_btn"> </span>
<i class="iconfont icon-icon_icon-53 icon-ss" :class="{ active: kwfocus }"></i> </button>
</span>
</button>
</div>
</div> </div>
</div> </div>
</div>
<!-- rigt -->
<div class="nav-rt">
<nav class="infomation"> <nav class="infomation">
<el-dropdown v-if="com_user_token" class="personal" placement="bottom-end" popper-class="new-dropdown" show-timeout="0"> <el-dropdown v-if="com_user_token" class="personal" placement="bottom-end" popper-class="new-dropdown" :show-timeout="0">
<span class="el-dropdown-link"> <span class="el-dropdown-link">
<el-avatar :src="avatarUrl + uid" :size="32" fit="cover" icon="el-icon-user-solid"></el-avatar> <el-avatar :src="avatarUrl + uid" :size="32" fit="cover" icon="el-icon-user-solid"></el-avatar>
<i class="el-icon-arrow-down el-icon--right"></i> <i class="el-icon-arrow-down el-icon--right"></i>
@ -90,7 +106,7 @@
<div class="mainbox"> <div class="mainbox">
<div class="edu-head"> <div class="edu-head">
<div class="edu-nav"> <div class="edu-nav">
<router-link class="item" to="/">首页</router-link> <router-link class="item" to="/">学院首页</router-link>
<router-link class="item" to="/studypath/finereport" :class="$route.meta.active == 'studypath' ? 'active' : ''">学习路径 </router-link> <router-link class="item" to="/studypath/finereport" :class="$route.meta.active == 'studypath' ? 'active' : ''">学习路径 </router-link>
<router-link class="item" to="/video" :class="$route.meta.active == 'video' ? 'active' : ''">视频课</router-link> <router-link class="item" to="/video" :class="$route.meta.active == 'video' ? 'active' : ''">视频课</router-link>
<router-link class="item" to="/class" :class="$route.meta.active == 'class' ? 'active' : ''">学习班</router-link> <router-link class="item" to="/class" :class="$route.meta.active == 'class' ? 'active' : ''">学习班</router-link>
@ -368,9 +384,9 @@ export default defineComponent({
z-index: 201; z-index: 201;
.wrapper { .wrapper {
width: 1200px; width: 100%;
background: #fff; background: #fff;
margin: 0 auto; padding: 0 20px;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
@ -380,7 +396,7 @@ export default defineComponent({
width: 1px; width: 1px;
height: 24px; height: 24px;
background-color: #dbe3ea; background-color: #dbe3ea;
margin: 0 20px; margin: 0 8px;
} }
.nav-logo { .nav-logo {
width: 128px; width: 128px;
@ -398,65 +414,88 @@ export default defineComponent({
text-decoration: none !important; text-decoration: none !important;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
} }
}
.nav-rt {
display: inline-flex;
align-items: center;
.search-box {
height: 48px;
margin: 0 auto;
width: 460px;
transition: all 0.2s;
.searchform { .navlf_item {
width: 100%; display: flex;
align-items: center;
}
.navlf-item-box {
margin-left: 32px;
.nav-item {
&:hover {
color: #0082fc;
}
margin-right: 20px;
font-size: 16px;
color: #17243e;
transition: all 0.3s;
} }
.active {
.search_sub { color: #0082fc;
border-radius: 0px 20px 20px 0px;
height: 32px;
cursor: pointer;
background: none;
border: none;
right: 0;
} }
}
}
.search_btn { .search-box {
display: inline-block; height: 48px;
color: #617288; flex: 1 1;
width: 48px; max-width: 500px;
margin: 0 0 0 4px;
transition: all 0.2s;
.active { .searchform {
color: #0082fc; width: 100%;
} }
}
.active_btn { .search_sub {
background-color: #0082fc; border-radius: 0px 20px 20px 0px;
height: 32px;
cursor: pointer;
background: none;
border: none;
right: 0;
}
.icon-ss { .search_btn {
color: #fff; display: inline-block;
} color: #617288;
} width: 48px;
.el-input__inner { .active {
border: none; color: #0082fc;
border: 1px solid #eef3fa;
background-color: #eef3fa;
border-radius: 100px;
font-size: 14px;
} }
}
.el-input__inner:focus { .active_btn {
border: 1px solid #0082fc; background-color: #0082fc;
background-color: #fff;
}
::placeholder { .icon-ss {
color: #8496ab !important; color: #fff;
} }
} }
.el-input__inner {
border: none;
border: 1px solid #eef3fa;
background-color: #eef3fa;
border-radius: 100px;
font-size: 14px;
}
.el-input__inner:focus {
border: 1px solid #0082fc;
background-color: #fff;
}
::placeholder {
color: #8496ab !important;
}
}
.nav-rt {
display: inline-flex;
align-items: center;
.infomation { .infomation {
position: relative; position: relative;
height: 100%; height: 100%;
@ -581,7 +620,7 @@ export default defineComponent({
} }
.avatar_down { .avatar_down {
width: 340px; width: 300px;
padding: 0 20px; padding: 0 20px;
background-color: #ffffff; background-color: #ffffff;
background-clip: padding-box; background-clip: padding-box;

26
src/main.js

@ -33,17 +33,17 @@ app.use(VueWechatTitle)
app.use(jsSeamlessScroll) app.use(jsSeamlessScroll)
app.mount('#app') app.mount('#app')
router.afterEach(() => { router.afterEach(() => {
// setTimeout(() => { setTimeout(() => {
// //百度统计 //百度统计
// var _hmt = _hmt || []; var _hmt = _hmt || [];
// (function () { (function () {
// //每次执行前,先移除上次插入的代码 //每次执行前,先移除上次插入的代码
// document.getElementById('baidu_tj') && document.getElementById('baidu_tj').remove(); document.getElementById('baidu_tj') && document.getElementById('baidu_tj').remove();
// var hm = document.createElement("script"); var hm = document.createElement("script");
// hm.src = "https://hm.baidu.com/hm.js?f4d7d83c565e698bd7cedfe9c6297055"; hm.src = "https://hm.baidu.com/hm.js?f4d7d83c565e698bd7cedfe9c6297055";
// hm.id = "baidu_tj" hm.id = "baidu_tj"
// var s = document.getElementsByTagName("script")[0]; var s = document.getElementsByTagName("script")[0];
// s.parentNode.insertBefore(hm, s); s.parentNode.insertBefore(hm, s);
// })(); })();
// }, 0); }, 0);
}); });

10
src/store/index.js

@ -13,7 +13,8 @@ export default createStore({
// isShowFooter: true // isShowFooter: true
fr_access_token: "", fr_access_token: "",
fr_appid: "", fr_appid: "",
fr_uid: "" fr_uid: "",
userName: "",
}, },
getters: { getters: {
get_token(state) { get_token(state) {
@ -34,6 +35,9 @@ export default createStore({
let fr_uid = state.fr_uid || Cookies.get(UidKey) || null; let fr_uid = state.fr_uid || Cookies.get(UidKey) || null;
return encode(`${fr_appid}.${fr_access_token}.${fr_uid}`) return encode(`${fr_appid}.${fr_access_token}.${fr_uid}`)
}, },
get_user_name(state) {
return state.userName;
},
}, },
mutations: { mutations: {
@ -61,6 +65,10 @@ export default createStore({
Cookies.remove(expiresTimeKey); Cookies.remove(expiresTimeKey);
}, },
set_user_name(state, data){
state.userName = data;
}
}, },
actions: { actions: {
Login({ commit }) { Login({ commit }) {

629
src/views/class/admin/schedule_admin_class.vue

@ -1,339 +1,320 @@
<template> <template>
<div>
<div> <el-table v-loading="loading" :data="tableData" style="width: 100%" @selection-change="handleSelectionChange" row-key="id" default-expand-all lazy :tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
<el-table-column prop="title" label="目录大纲">
<el-table v-loading="loading" :data="tableData" style="width: 100%" <template #default="scope">
@selection-change="handleSelectionChange" row-key="id" default-expand-all lazy <span v-if="scope.row.children" class="f18 fw600 col333">{{ scope.row.title }}</span>
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"> <a v-else :href="'/class/play/' + classid + '/' + scope.row.id" target="_blank" class="item-pl f15"> <i class="iconfont icon-bofang2 colb3c f14 mrt10"></i>{{ scope.row.title }} </a>
</template>
<el-table-column prop="title" label="目录大纲"> </el-table-column>
<template #default='scope'>
<span v-if="scope.row.children" class="f18 fw600 col333">{{scope.row.title}}</span> <el-table-column fixed="right" label="发布状态" width="100">
<a v-else :href="'/class/play/'+classid+'/'+scope.row.id" target="_blank" class="item-pl f15"> <template #default="scope">
<i class="iconfont icon-bofang2 colb3c f14 mrt10"></i>{{scope.row.title}} <el-switch v-if="!scope.row.children" v-model="scope.row.display" :active-value="1" :inactive-value="0" active-color="#0082fc" inactive-color="#dadde5" @click="handleClose(scope.row)"> </el-switch>
</a> </template>
</template> </el-table-column>
</el-table-column> </el-table>
</div>
<el-table-column fixed="right" label="发布状态" width="100">
<template #default="scope">
<el-switch v-if="!scope.row.children" v-model="scope.row.display" :active-value="1"
:inactive-value="0" active-color="#0082fc" inactive-color="#dadde5"
@click="handleClose(scope.row)">
</el-switch>
</template>
</el-table-column>
</el-table>
</div>
</template> </template>
<script> <script>
import { useRoute } from 'vue-router' import { useRoute } from "vue-router";
import { scheduleList, noticeAdd, noticeEdit, scheduleUpdate, studyLog } from "@/api/study_admin"; import { scheduleList, noticeAdd, noticeEdit, scheduleUpdate, studyLog } from "@/api/study_admin";
import { ref, toRefs, reactive, getCurrentInstance, nextTick } from 'vue'; import { ref, toRefs, reactive, getCurrentInstance, nextTick } from "vue";
import store from '@/store' import store from "@/store";
import { _debounce } from "@/utils/debounce"; import { _debounce } from "@/utils/debounce";
export default { export default {
name: 'class_homework', name: "class_homework",
setup() { setup() {
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance();
const route = useRoute() const route = useRoute();
const classid = route.params.classid; const classid = route.params.classid;
const state = reactive({ const state = reactive({
headers: { headers: {
'authentication': store.getters.get_authentication authentication: store.getters.get_authentication,
}, },
loading: true, loading: true,
tableData: [], // tableData: [], //
multipleSelection: [], // multipleSelection: [], //
total: 0, // total: 0, //
page: 1, // page: 1, //
perpage: 10, // perpage: 10, //
id: '', id: "",
kw: '', kw: "",
dialogFormVisible: false, dialogFormVisible: false,
dialogEdit: false, dialogEdit: false,
dialogUidLog: false, dialogUidLog: false,
numbereRef: { numbereRef: {
title: '', title: "",
url: '', url: "",
}, },
rules: { rules: {
title: [ title: [{ required: true, message: "请输入公告内容", trigger: "blur" }],
{ required: true, message: '请输入公告内容', trigger: 'blur' }, url: [{ required: true, type: "url", message: "请输入正确的url", trigger: "blur" }],
], },
url: [ rowStudent: {},
{ required: true, type: "url", message: '请输入正确的url', trigger: 'blur' }, modEdit: {
], id: "",
}, xs_name: "",
rowStudent: {}, gongsi: "",
modEdit: { gangwei: "",
id: '', shouji: "",
xs_name: '', fenshu: "",
gongsi: '', beizhu: "",
gangwei: '', },
shouji: '', uidLog: [],
fenshu: '', alltime: "",
beizhu: '', username: "",
}, });
uidLog: [],
alltime: '', //
username: '', const getnotice = async () => {
}) state.loading = true;
const res = await scheduleList(classid);
// if (res.code === 200) {
const getnotice = async () => { state.tableData = res.data;
state.loading = true state.total = res.data.total;
const res = await scheduleList(classid); state.page = res.data.current_page;
if (res.code === 200) { state.loading = false;
state.tableData = res.data }
state.total = res.data.total };
state.page = res.data.current_page getnotice();
state.loading = false
} //
}; const getUserLog = async (uid) => {
getnotice(); state.loading = true;
const res = await studyLog(classid, uid);
// if (res.code === 200) {
const getUserLog = async (uid) => { state.uidLog = res.data.data;
state.loading = true state.alltime = res.data.alltime;
const res = await studyLog(classid, uid); state.username = res.data.username;
if (res.code === 200) { state.dialogUidLog = true;
state.uidLog = res.data.data; state.loading = false;
state.alltime = res.data.alltime; }
state.username = res.data.username; };
state.dialogUidLog = true;
state.loading = false // item
} const setItem = (item) => {
}; state.item = item;
state.isShowItem = true;
// item };
const setItem = (item) => {
state.item = item const handleOption = () => {
state.isShowItem = true state.page = 1;
} getnotice();
};
const handleOption = () => {
state.page = 1 //
getnotice() const handleSelectionChange = (val) => {
} state.multipleSelection = val;
};
const changePage = (val) => {
// state.page = val;
const handleSelectionChange = (val) => { getnotice();
state.multipleSelection = val };
} //
const changePage = (val) => { const handleSizeChange = (val) => {
state.page = val state.perpage = val;
getnotice() getnotice();
} };
//
const handleSizeChange = (val) => { //
state.perpage = val const handleClose = async (row) => {
getnotice() const params = {
} data: {
id: row.id,
// display: row.display,
const handleClose = async (row) => { title: row.title,
const params = { },
data: { };
id: row.id, const res = await scheduleUpdate(classid, params);
display: row.display, if (res.message === "success") {
title: row.title, if (res.data.display == 1) {
} proxy.$notify({
} title: "发布成功",
const res = await scheduleUpdate(classid, params); type: "success",
if (res.message === 'success') { iconClass: "schedule-success",
if (res.data.display == 1) { message: res.data.title + "【发布成功】",
proxy.$notify({ });
title: '发布成功', } else {
type: 'success', proxy.$notify.info({
message: res.data.title + '【发布成功】', title: "取消发布成功",
}); type: "info",
} else { iconClass: "schedule-info",
proxy.$notify.info({ message: res.data.title + "【已取消发布】",
title: '取消发布成功', });
message: res.data.title + '【已取消发布】', }
}); } else {
} proxy.$message({
} else { type: "error",
proxy.$message({ message: "服务器错误",
type: 'error', center: true,
message: '服务器错误', });
center: true }
}); };
}
//
const submitForm = _debounce(() => {
_submitForm();
}, 300);
const numberValidateRef = ref(null);
const _submitForm = () => {
nextTick(() => {
numberValidateRef.value.validate(async (valid) => {
if (valid) {
const params = {
title: state.numbereRef.title,
url: state.numbereRef.url,
}; };
const res = await noticeAdd(classid, params);
if (res.message === "success") {
state.dialogFormVisible = false;
proxy.$message({
// type: "success",
const submitForm = _debounce(() => { message: "添加成功",
_submitForm(); center: true,
}, 300) });
const numberValidateRef = ref(null); setTimeout(function() {
const _submitForm = () => { getnotice();
nextTick(() => { }, 100);
numberValidateRef.value.validate(async (valid) => {
if (valid) {
const params = {
title: state.numbereRef.title,
url: state.numbereRef.url,
}
const res = await noticeAdd(classid, params)
if (res.message === 'success') {
state.dialogFormVisible = false;
proxy.$message({
type: 'success',
message: '添加成功',
center: true
});
setTimeout(function () {
getnotice()
}, 100);
}
}
});
})
}
const noticeValidateRef = ref(null);
const resnoticeEdit = () => {
noticeValidateRef.value.validate(async (valid) => {
if (valid) {
const params = {
data: state.modEdit,
}
const res = await noticeEdit(classid, params);
if (res.code === 200) {
state.dialogEdit = false;
proxy.$message({
type: 'success',
message: '编辑成功',
center: true
});
getnotice()
}
}
});
}
const openStudent = (row) => {
state.modEdit = row;
state.dialogEdit = true;
}
const eidtForm = () => {
resnoticeEdit();
}
// const tableRowClassName = ({ row }) => {
// if (row.children) {
// return 'title-row';
// }
// return '';
// }
return {
...toRefs(state),
classid,
setItem,
handleSelectionChange,
getnotice,
changePage,
handleOption,
handleClose,
handleSizeChange,
numberValidateRef,
submitForm,
openStudent,
eidtForm,
getUserLog,
noticeValidateRef,
//tableRowClassName
} }
}
});
});
};
const noticeValidateRef = ref(null);
const resnoticeEdit = () => {
noticeValidateRef.value.validate(async (valid) => {
if (valid) {
const params = {
data: state.modEdit,
};
const res = await noticeEdit(classid, params);
if (res.code === 200) {
state.dialogEdit = false;
proxy.$message({
type: "success",
message: "编辑成功",
center: true,
});
getnotice();
}
} }
} });
};
const openStudent = (row) => {
state.modEdit = row;
state.dialogEdit = true;
};
const eidtForm = () => {
resnoticeEdit();
};
// const tableRowClassName = ({ row }) => {
// if (row.children) {
// return 'title-row';
// }
// return '';
// }
return {
...toRefs(state),
classid,
setItem,
handleSelectionChange,
getnotice,
changePage,
handleOption,
handleClose,
handleSizeChange,
numberValidateRef,
submitForm,
openStudent,
eidtForm,
getUserLog,
noticeValidateRef,
//tableRowClassName
};
},
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.item-pl:hover{ .item-pl:hover {
.icon-bofang2{ .icon-bofang2 {
color: #0082fc; color: #0082fc;
} }
} }
.item_log { .item_log {
width: 120px; width: 120px;
display: inline-block; display: inline-block;
text-align: right; text-align: right;
} }
.tab-header { .tab-header {
padding: 24px 0 10px 0; padding: 24px 0 10px 0;
} }
.ptlist { .ptlist {
padding: 6px 0; padding: 6px 0;
overflow-y: auto; overflow-y: auto;
font-size: 14px; font-size: 14px;
li { li {
padding: 2px 0; padding: 2px 0;
} }
} }
.ifprt { .ifprt {
padding-right: 10px !important; padding-right: 10px !important;
} }
.infobox { .infobox {
line-height: 24px; line-height: 24px;
padding: 0 20px; padding: 0 20px;
} }
.scrollbar { .scrollbar {
height: 106px; height: 106px;
overflow: hidden; overflow: hidden;
} }
.min-pd { .min-pd {
padding: 6px 10px; padding: 6px 10px;
} }
::v-deep .el-scrollbar__wrap { ::v-deep .el-scrollbar__wrap {
max-height: 300px; max-height: 300px;
overflow-x: hidden; overflow-x: hidden;
} }
::v-deep .el-icon-close { ::v-deep .el-icon-close {
display: none !important; display: none !important;
} }
::v-deep .el-icon-close-tip { ::v-deep .el-icon-close-tip {
display: none !important; display: none !important;
} }
::v-deep .el-button i { ::v-deep .el-button i {
line-height: 0; line-height: 0;
} }
</style> </style>
<style> <style>
.el-dialog__body { .el-dialog__body {
padding: 20px 30px 30px 30px; padding: 20px 30px 30px 30px;
} }
/* .title-row td{ .schedule-success {
color: #67c23a !important;
}
.schedule-info {
color: #909399 !important;
}
/* .title-row td{
background-color:#F3F8FF; background-color:#F3F8FF;
} */ } */
</style> </style>

955
src/views/class/admin/student_admin_class.vue

@ -1,152 +1,146 @@
<template> <template>
<div>
<div> <div class="tab-header flex-3">
<div class="tab-header flex-3"> <li>
<li> <el-button type="primary" size="medium" icon="el-icon-circle-plus" @click="dialogFormVisible = true">添加学生 </el-button>
<el-button type="primary" size="medium" icon="el-icon-circle-plus" @click="dialogFormVisible = true">添加学生 <el-button type="danger" size="medium" icon="el-icon-delete" @click="handleClose()" class="mrt10">批量删除</el-button>
</el-button> </li>
<el-button type="danger" size="medium" icon="el-icon-delete" @click="handleClose()" class="mrt10">批量删除</el-button> <li>
</li> <el-input style="width: 200px; margin-right: 10px" placeholder="手机号 / uid / 姓名" v-model="kw" @change="handleOption" size="medium" clearable>
<li> <template #prefix>
<el-input style="width: 200px; margin-right: 10px" placeholder="uid / 姓名" v-model="kw" @change="handleOption" <i class="el-input__icon el-icon-search"></i>
size="medium" clearable>
<template #prefix>
<i class="el-input__icon el-icon-search"></i>
</template>
</el-input>
<el-button size="medium" type="primary" icon="el-icon-search" @click="handleOption">搜索</el-button>
</li>
</div>
<el-table v-loading="loading" :data="tableData" tooltip-effect="dark" style="width: 100%" stripe
@selection-change="handleSelectionChange" @cell-dblclick="openStudent">
<el-table-column type="selection" width="50">
</el-table-column>
<el-table-column prop="id" label="编号" width="80">
</el-table-column>
<el-table-column prop="uid" label="uid" >
<template #default='scope'>
<span>{{scope.row.uid}}</span>
</template>
</el-table-column>
<el-table-column prop="username" label="昵称">
<template #default='scope'>
<div>
<li>{{scope.row.username}}</li>
<a :href="com_shequ_url+'/u/'+scope.row.uid" target="_blank" class="col008 f12">查看主页</a>
</div>
</template>
</el-table-column>
<el-table-column prop="xs_name" label="姓名">
</el-table-column>
<el-table-column prop="gongsi" label="公司">
<template #default='scope'>
<el-popover effect="light" trigger="hover" placement="top" v-if="scope.row.gongsi">
<template #default>
<p>{{scope.row.gongsi}}</p>
</template>
<template #reference>
<div class="name-wrapper">
<span class="hide-txt2">{{scope.row.gongsi}}</span>
</div>
</template>
</el-popover>
<span v-else>--</span>
</template>
</el-table-column>
<el-table-column prop="shouji" label="手机号" width="130px">
</el-table-column>
<el-table-column prop="pfenshu" label="学生动态" width="200px">
<template #default='scope'>
<div style="line-height: 28px;">
<a @click="getUserLog(scope.row.uid)" href="javascript:;" class="col008 item_log">观看记录<span
class="colff3">{{scope.row.logNum}}</span></a>
<span class="item_log">已看课时<span class="colff3">{{scope.row.videoNum}}</span></span>
<span class="item_log">已提交作业<span class="colff3">{{scope.row.workNum}}</span></span>
<span class="item_log">作业平均分<span class="colff3">{{scope.row.pfenshu}}</span></span>
</div>
</template>
</el-table-column>
<el-table-column prop="beizhu" label="备注">
<template #default='scope'>
<el-popover effect="light" trigger="hover" placement="top" width="300px" v-if="scope.row.beizhu">
<template #default>
<p style=" padding:6px; line-height: 24px;">{{scope.row.beizhu}}</p>
</template>
<template #reference>
<div class="name-wrapper">
<span class="hide-txt2">{{scope.row.beizhu}}</span>
</div>
</template>
</el-popover>
<span v-else>--</span>
</template> </template>
</el-table-column> </el-input>
<el-button size="medium" type="primary" icon="el-icon-search" @click="handleOption">搜索</el-button>
<el-table-column label="操作" fixed="right" > </li>
<template #default="scope">
<el-button size="mini" type="primary" icon="el-icon-edit" circle @click="openStudent(scope.row)"></el-button>
<el-popconfirm title="确定删除该学生吗?" @confirm="handleClose(scope.row.id)">
<template #reference>
<el-button size="mini" type="danger" icon="el-icon-delete" circle></el-button>
</template>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
<!--总数超过一页再展示分页器-->
<div class="myel-pg-lf">
<el-pagination background @size-change="handleSizeChange" layout="total, prev, pager, next,jumper" :total="total"
:page-size="perpage" :current-page="page" @current-change="changePage" />
</div>
</div> </div>
<el-table v-loading="loading" :data="tableData" tooltip-effect="dark" style="width: 100%" stripe @selection-change="handleSelectionChange" @cell-dblclick="openStudent">
<!-- 报名弹出层 --> <el-table-column type="selection" width="50"> </el-table-column>
<el-dialog title="添加学生" v-model="dialogFormVisible" width="650px" center custom-class="sign-form"> <el-table-column prop="id" label="编号" width="80"> </el-table-column>
<el-form :model="numbereRef" :rules="rules" label-position="right" ref="numberValidateRef">
<el-form-item label="学生uid" prop="uids"> <el-table-column prop="uid" label="uid">
<el-input type="textarea" v-model="numbereRef.uids" class="key-input" placeholder="输入学生的社区用户uid"></el-input> <template #default="scope">
</el-form-item> <span>{{ scope.row.uid }}</span>
<div class="col7e8" style="line-height: 24px"> </template>
<p>支持批量添加101,102,103多个uid用英文逗号隔开</p> </el-table-column>
</div>
</el-form> <el-table-column prop="username" label="昵称">
<template #default="scope">
<template #footer> <div>
<span class="dialog-footer"> <li>{{ scope.row.username }}</li>
<el-button @click="dialogFormVisible = false"> </el-button> <a :href="com_shequ_url + '/u/' + scope.row.uid" target="_blank" class="col008 f12">查看主页</a>
<el-button type="primary" @click="submitForm"> </el-button> </div>
</span> </template>
</template> </el-table-column>
</el-dialog>
<el-table-column prop="xs_name" label="姓名"> </el-table-column>
<!-- 编辑弹出层 --> <el-table-column prop="gongsi" label="公司">
<el-dialog :title="'编辑学生:'+modEdit.username" v-model="dialogEdit" width="650px" center custom-class="sign-form"> <template #default="scope">
<el-form :model="modEdit" label-position="right" label-width="100px"> <el-popover effect="light" trigger="hover" placement="top" v-if="scope.row.gongsi">
<template #default>
<el-form-item label="姓名" prop="xs_name"> <p>{{ scope.row.gongsi }}</p>
<el-input class="key-input" v-model="modEdit.xs_name"></el-input> </template>
</el-form-item> <template #reference>
<el-form-item label="公司" prop="gongsi"> <div class="name-wrapper">
<el-input class="key-input" v-model="modEdit.gongsi"></el-input> <span class="hide-txt2">{{ scope.row.gongsi }}</span>
</el-form-item> </div>
</template>
</el-popover>
<!-- <el-select v-model="modEdit.gangwei" multiple placeholder="岗位" class="fl"> <span v-else>--</span>
</template>
</el-table-column>
<el-table-column prop="shouji" label="手机号" width="130px"> </el-table-column>
<el-table-column prop="pfenshu" label="学生动态" width="200px">
<template #default="scope">
<div style="line-height: 28px;">
<a @click="getUserLog(scope.row.uid)" href="javascript:;" class="col008 item_log"
>观看记录<span class="colff3">{{ scope.row.logNum }}</span
></a
>
<span class="item_log"
>已看课时<span class="colff3">{{ scope.row.videoNum }}</span
></span
>
<span class="item_log"
>已提交作业<span class="colff3">{{ scope.row.workNum }}</span
></span
>
<span class="item_log"
>作业平均分<span class="colff3">{{ scope.row.pfenshu }}</span></span
>
</div>
</template>
</el-table-column>
<el-table-column prop="beizhu" label="备注">
<template #default="scope">
<el-popover effect="light" trigger="hover" placement="top" width="300px" v-if="scope.row.beizhu">
<template #default>
<p style=" padding:6px; line-height: 24px;">{{ scope.row.beizhu }}</p>
</template>
<template #reference>
<div class="name-wrapper">
<span class="hide-txt2">{{ scope.row.beizhu }}</span>
</div>
</template>
</el-popover>
<span v-else>--</span>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right">
<template #default="scope">
<el-button size="mini" type="primary" icon="el-icon-edit" circle @click="openStudent(scope.row)"></el-button>
<el-popconfirm title="确定删除该学生吗?" @confirm="handleClose(scope.row.id)">
<template #reference>
<el-button size="mini" type="danger" icon="el-icon-delete" circle></el-button>
</template>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
<!--总数超过一页再展示分页器-->
<div class="myel-pg-lf">
<el-pagination background @size-change="handleSizeChange" layout="total, prev, pager, next,jumper" :total="total" :page-size="perpage" :current-page="page" @current-change="changePage" />
</div>
</div>
<!-- 报名弹出层 -->
<el-dialog title="添加学生" v-model="dialogFormVisible" width="650px" center custom-class="sign-form">
<el-form :model="numbereRef" :rules="rules" label-position="right" ref="numberValidateRef">
<el-form-item label="手机号" prop="uids">
<el-input type="textarea" v-model="numbereRef.uids" class="key-input" placeholder="输入学生的手机号"></el-input>
</el-form-item>
<div class="col7e8" style="line-height: 24px">
<p>支持批量添加15900012345,158xxx,...多个手机号用英文逗号隔开</p>
</div>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="dialogFormVisible = false"> </el-button>
<el-button type="primary" @click="submitForm"> </el-button>
</span>
</template>
</el-dialog>
<!-- 编辑弹出层 -->
<el-dialog :title="'编辑学生:' + modEdit.username" v-model="dialogEdit" width="650px" center custom-class="sign-form">
<el-form :model="modEdit" label-position="right" label-width="100px">
<el-form-item label="姓名" prop="xs_name">
<el-input class="key-input" v-model="modEdit.xs_name"></el-input>
</el-form-item>
<el-form-item label="公司" prop="gongsi">
<el-input class="key-input" v-model="modEdit.gongsi"></el-input>
</el-form-item>
<!-- <el-select v-model="modEdit.gangwei" multiple placeholder="岗位" class="fl">
<el-option :key="2" label="业务人员" :value="2"></el-option> <el-option :key="2" label="业务人员" :value="2"></el-option>
<el-option :key="3" label="技术人员" :value="3"></el-option> <el-option :key="3" label="技术人员" :value="3"></el-option>
<el-option :key="4" label="CIO或CTO等高层人员" :value="4"></el-option> <el-option :key="4" label="CIO或CTO等高层人员" :value="4"></el-option>
@ -155,353 +149,344 @@
<el-option :key="1" label="其他" :value="1"></el-option> <el-option :key="1" label="其他" :value="1"></el-option>
</el-select> --> </el-select> -->
<el-form-item label="手机" prop="shouji">
<el-form-item label="手机" prop="shouji"> <el-input class="key-input" v-model="modEdit.shouji"></el-input>
<el-input class="key-input" v-model="modEdit.shouji"></el-input> </el-form-item>
</el-form-item>
<el-form-item label="备注" prop="beizhu">
<el-form-item label="备注" prop="beizhu"> <el-input type="textarea" class="key-input" v-model="modEdit.beizhu"> </el-input>
<el-input type="textarea" class="key-input" v-model="modEdit.beizhu"> </el-form-item>
</el-input> <el-input type="hidden" class="key-input" v-model="modEdit.id" :value="modEdit.id"></el-input>
</el-form-item> </el-form>
<el-input type="hidden" class="key-input" v-model="modEdit.id" :value="modEdit.id"></el-input>
<template #footer>
</el-form> <span class="dialog-footer">
<el-button @click="dialogEdit = false"> </el-button>
<template #footer> <el-button type="primary" @click="eidtForm"> </el-button>
<span class="dialog-footer"> </span>
<el-button @click="dialogEdit = false"> </el-button> </template>
<el-button type="primary" @click="eidtForm"> </el-button> </el-dialog>
</span>
</template> <el-dialog :title="username + '的观看记录'" v-model="dialogUidLog" width="1100px">
</el-dialog> <el-table :data="uidLog" v-loading="loading">
<el-table-column property="title" label="课时名称"></el-table-column>
<el-dialog :title="username+'的观看记录'" v-model="dialogUidLog" width="1100px"> <el-table-column property="videotime1" label="课时时长">
<el-table :data="uidLog" v-loading="loading"> <template #default="scope">
<el-table-column property="title" label="课时名称"></el-table-column> <span v-if="scope.row.videotime1">{{ scope.row.videotime1 }}:</span>
<el-table-column property="videotime1" label="课时时长"> <span v-else>{{ scope.row.videotime2 }}:{{ scope.row.videotime3 }}</span>
<template #default='scope'> </template>
<span v-if="scope.row.videotime1">{{scope.row.videotime1}}:</span> </el-table-column>
<span v-else>{{scope.row.videotime2}}:{{scope.row.videotime3}}</span> <el-table-column property="sum" label="观看总时长"></el-table-column>
</template> <el-table-column property="id" label="开始观看时间">
</el-table-column> <template #default="scope">
<el-table-column property="sum" label="观看总时长"></el-table-column> <div v-for="(item, i) in scope.row.item" :key="i">
<el-table-column property="id" label="开始观看时间"> {{ item.startTime }}
<template #default='scope'> </div>
<div v-for="(item, i) in scope.row.item" :key="i"> </template>
{{item.startTime}} </el-table-column>
</div> <el-table-column property="id" label="本次观看时长">
</template> <template #default="scope">
</el-table-column> <div v-for="(item, i) in scope.row.item" :key="i">
<el-table-column property="id" label="本次观看时长"> {{ item.onetime }}
<template #default='scope'> </div>
<div v-for="(item, i) in scope.row.item" :key="i"> </template>
{{item.onetime}} </el-table-column>
</div> </el-table>
</template> </el-dialog>
</el-table-column> </template>
</el-table>
</el-dialog> <script>
import { useRoute } from "vue-router";
</template> import { studentList, addStudent, getStudent, editStudent, delStudent, studyLog } from "@/api/study_admin";
import { ref, toRefs, reactive, getCurrentInstance, nextTick } from "vue";
import store from "@/store";
import { _debounce } from "@/utils/debounce";
<script> export default {
import { useRoute } from 'vue-router' name: "class_homework",
import { studentList, addStudent, getStudent, editStudent, delStudent,studyLog } from "@/api/study_admin"; setup() {
import { ref, toRefs, reactive, getCurrentInstance, nextTick } from 'vue'; const { proxy } = getCurrentInstance();
import store from '@/store' const route = useRoute();
import { _debounce } from "@/utils/debounce"; const classid = route.params.classid;
export default { const state = reactive({
name: 'class_homework', headers: {
setup() { authentication: store.getters.get_authentication,
const { proxy } = getCurrentInstance() },
const route = useRoute() loading: true,
const classid = route.params.classid; tableData: [], //
const state = reactive({ multipleSelection: [], //
headers: { total: 0, //
'authentication': store.getters.get_authentication page: 1, //
}, perpage: 10, //
loading: true, id: "",
tableData: [], // kw: "",
multipleSelection: [], // dialogFormVisible: false,
total: 0, // dialogEdit: false,
page: 1, // dialogUidLog: false,
perpage: 10, // numbereRef: {
id: '', uids: "",
kw: '', },
dialogFormVisible: false, rules: {
dialogEdit: false, uids: [{ required: true, message: "请输入学生手机号", trigger: "blur" }],
dialogUidLog: false, },
numbereRef: { rowStudent: {},
uids: '' modEdit: {
}, id: "",
rules: { xs_name: "",
uids: [ gongsi: "",
{ required: true, message: '请输入学生uid', trigger: 'blur' }, gangwei: "",
], shouji: "",
}, fenshu: "",
rowStudent: {}, beizhu: "",
modEdit: { },
id: '', uidLog: [],
xs_name: '', alltime: "",
gongsi: '', username: "",
gangwei: '', });
shouji: '',
fenshu: '', //
beizhu: '', const getStudentList = async () => {
}, state.loading = true;
uidLog:[], const params = {
alltime:'', page: state.page,
username:'', perpage: state.perpage,
}) id: state.id,
kw: state.kw,
// };
const getStudentList = async () => { const res = await studentList(classid, params);
state.loading = true if (res.code === 200) {
const params = { state.tableData = res.data.data;
page: state.page, state.total = res.data.total;
perpage: state.perpage, state.page = res.data.current_page;
id: state.id, state.loading = false;
kw: state.kw, }
} };
const res = await studentList(classid, params); getStudentList();
if (res.code === 200) {
state.tableData = res.data.data //
state.total = res.data.total const getUserLog = async (uid) => {
state.page = res.data.current_page state.loading = true;
state.loading = false const res = await studyLog(classid, uid);
} if (res.code === 200) {
}; state.uidLog = res.data.data;
state.alltime = res.data.alltime;
state.username = res.data.username;
state.dialogUidLog = true;
state.loading = false;
}
};
// item
const setItem = (item) => {
state.item = item;
state.isShowItem = true;
};
const handleOption = () => {
state.page = 1;
getStudentList();
};
//
const handleSelectionChange = (val) => {
state.multipleSelection = val;
};
const changePage = (val) => {
state.page = val;
getStudentList();
};
//
const handleSizeChange = (val) => {
state.perpage = val;
getStudentList();
};
//
const resdelStudent = async (params) => {
const res = await delStudent(classid, params);
if (res.code === 200) {
proxy.$message({
type: "success",
message: "删除成功",
center: true,
});
getStudentList(); getStudentList();
}
// };
const getUserLog = async (uid) => {
state.loading = true const handleClose = (id) => {
const res = await studyLog(classid, uid); let params;
if (res.code === 200) { if (id) {
state.uidLog = res.data.data; params = [id];
state.alltime = res.data.alltime; } else {
state.username = res.data.username; if (!state.multipleSelection.length) {
state.dialogUidLog=true; proxy.$message({
state.loading = false type: "error",
} message: "请选择编号",
}; center: true,
});
// item return;
const setItem = (item) => {
state.item = item
state.isShowItem = true
}
const handleOption = () => {
state.page = 1
getStudentList()
}
//
const handleSelectionChange = (val) => {
state.multipleSelection = val
}
const changePage = (val) => {
state.page = val
getStudentList()
}
//
const handleSizeChange = (val) => {
state.perpage = val
getStudentList()
} }
params = state.multipleSelection.map((i) => i.id);
}
// proxy
const resdelStudent = async (params) => { .$confirm("此操作将永久删除, 是否继续?", "提示", {
const res = await delStudent(classid, params); confirmButtonText: "确定",
if (res.code === 200) { cancelButtonText: "取消",
proxy.$message({ type: "warning",
type: 'success', })
message: '删除成功', .then(() => {
center: true resdelStudent(params);
}); })
getStudentList() .catch(() => {});
} };
};
//
const handleClose = (id) => { const submitForm = _debounce(() => {
let params _submitForm();
if (id) { }, 300);
params = [id] const numberValidateRef = ref(null);
} else { const _submitForm = () => {
if (!state.multipleSelection.length) { nextTick(() => {
numberValidateRef.value.validate(async (valid) => {
if (valid) {
const params = {
uids: state.numbereRef.uids,
};
const res = await addStudent(classid, params);
if (res.message === "success") {
state.dialogFormVisible = false;
proxy.$message({ proxy.$message({
type: 'error', type: "success",
message: '请选择编号', message: "添加成功",
center: true center: true,
}); });
return setTimeout(function() {
getStudentList();
}, 100);
} }
params = state.multipleSelection.map(i => i.id)
} }
});
proxy.$confirm('此操作将永久删除, 是否继续?', '提示', { });
confirmButtonText: '确定', };
cancelButtonText: '取消',
type: 'warning' //
}).then(() => { const resgetStudent = async (id) => {
resdelStudent(params); const res = await getStudent(classid, id);
}).catch(() => { if (res.code === 200) {
}); state.modEdit = res.data;
}
//
const submitForm = _debounce(() => {
_submitForm();
}, 300)
const numberValidateRef = ref(null);
const _submitForm = () => {
nextTick(() => {
numberValidateRef.value.validate(async (valid) => {
if (valid) {
const params = {
uids: state.numbereRef.uids,
}
const res = await addStudent(classid, params)
if (res.message === 'success') {
state.dialogFormVisible = false;
proxy.$message({
type: 'success',
message: '添加成功',
center: true
});
setTimeout(function () {
getStudentList()
}, 100);
}
}
});
})
}
//
const resgetStudent = async (id) => {
const res = await getStudent(classid, id);
if (res.code === 200) {
state.modEdit = res.data
state.dialogEdit = true
}
};
//
const reseditStudent = async () => {
const params = {
data: state.modEdit,
}
const res = await editStudent(classid, params);
if (res.code === 200) {
state.dialogEdit = false;
proxy.$message({
type: 'success',
message: '编辑成功',
center: true
});
getStudentList()
}
};
const getid = (id) => {
resgetStudent(id);
}
const eidtForm = () => {
reseditStudent();
}
const openStudent = (row) => {
state.modEdit = row;
state.dialogEdit = true; state.dialogEdit = true;
} }
};
return {
...toRefs(state), //
classid, const reseditStudent = async () => {
setItem, const params = {
handleSelectionChange, data: state.modEdit,
getStudentList, };
changePage, const res = await editStudent(classid, params);
handleOption, if (res.code === 200) {
handleClose, state.dialogEdit = false;
handleSizeChange, proxy.$message({
numberValidateRef, type: "success",
submitForm, message: "编辑成功",
getid, center: true,
eidtForm, });
getUserLog, getStudentList();
openStudent,
}
}
}
</script>
<style lang="scss" scoped>
.item_log {
width: 120px;
display: inline-block;
}
.tab-header {
padding: 24px 0 10px 0;
}
.ptlist {
padding: 6px 0;
overflow-y: auto;
font-size: 14px;
li {
padding: 2px 0;
} }
} };
.ifprt { const getid = (id) => {
padding-right: 10px !important; resgetStudent(id);
} };
const eidtForm = () => {
.infobox { reseditStudent();
line-height: 24px; };
padding: 0 20px;
} const openStudent = (row) => {
state.modEdit = row;
.scrollbar { state.dialogEdit = true;
height: 106px; };
overflow: hidden;
} return {
...toRefs(state),
.min-pd { classid,
padding: 6px 10px; setItem,
} handleSelectionChange,
getStudentList,
::v-deep .el-scrollbar__wrap { changePage,
max-height: 300px; handleOption,
overflow-x: hidden; handleClose,
} handleSizeChange,
numberValidateRef,
::v-deep .el-icon-close { submitForm,
display: none !important; getid,
} eidtForm,
getUserLog,
::v-deep .el-icon-close-tip { openStudent,
display: none !important; };
} },
};
::v-deep .el-button i { </script>
line-height: 0;
} <style lang="scss" scoped>
</style> .item_log {
width: 120px;
<style> display: inline-block;
.el-dialog__body { }
padding: 20px 30px 30px 30px;
} .tab-header {
</style> padding: 24px 0 10px 0;
}
.ptlist {
padding: 6px 0;
overflow-y: auto;
font-size: 14px;
li {
padding: 2px 0;
}
}
.ifprt {
padding-right: 10px !important;
}
.infobox {
line-height: 24px;
padding: 0 20px;
}
.scrollbar {
height: 106px;
overflow: hidden;
}
.min-pd {
padding: 6px 10px;
}
::v-deep .el-scrollbar__wrap {
max-height: 300px;
overflow-x: hidden;
}
::v-deep .el-icon-close {
display: none !important;
}
::v-deep .el-icon-close-tip {
display: none !important;
}
::v-deep .el-button i {
line-height: 0;
}
</style>
<style>
.el-dialog__body {
padding: 20px 30px 30px 30px;
}
</style>

4
src/views/class/class_lesson.vue

@ -18,6 +18,10 @@
<template #default> <template #default>
<div class="lesson"> <div class="lesson">
<el-empty :image-size="150" description=" " v-if="lessonList.length === 0">
<div class="col617">等待老师发布...</div>
</el-empty>
<div class="looplist" v-for="(item, i) in lessonList" :key="i"> <div class="looplist" v-for="(item, i) in lessonList" :key="i">
<div class="otile flex-1"> <div class="otile flex-1">
<h2>{{ item.title }}</h2> <h2>{{ item.title }}</h2>

7
src/views/class/play.vue

@ -4,7 +4,8 @@
<div v-if="!com_user_token"> <div v-if="!com_user_token">
<el-empty :image-size="200" description=" ">无权限查看当前页面需要 <a :href="com_login_url" class="col008">登录</a></el-empty> <el-empty :image-size="200" description=" ">无权限查看当前页面需要 <a :href="com_login_url" class="col008">登录</a></el-empty>
</div> </div>
<div v-if="isAuth"> <div v-if="isAuth && com_user_token">
>
<div class="main"> <div class="main">
<div class="videoBox flex-2"> <div class="videoBox flex-2">
<div class="viewtil" style="min-height:8%"> <div class="viewtil" style="min-height:8%">
@ -320,7 +321,7 @@ export default {
// id // id
state.logid = res.data.logid; state.logid = res.data.logid;
state.videoid = res.data.id; state.videoid = res.data.id;
console.log("log_videoid", state.videoid); // console.log("log_videoid", state.videoid);
// //
let winState = { url: id }; let winState = { url: id };
@ -387,7 +388,7 @@ export default {
onMounted(() => { onMounted(() => {
var new_element = document.createElement("script"); var new_element = document.createElement("script");
new_element.setAttribute("type", "text/javascript"); new_element.setAttribute("type", "text/javascript");
new_element.setAttribute("src", "/js/ckplayerX2/ckplayer.min.js"); new_element.setAttribute("src", "/js/ckplayerX2/ckplayer.min.js?v=2.1");
document.body.appendChild(new_element); document.body.appendChild(new_element);
// //

63
src/views/studypath/fineDataLink.vue

@ -18,7 +18,7 @@
<div class="w1200 pdb50"> <div class="w1200 pdb50">
<div class="boxtil flex-1"> <div class="boxtil flex-1">
<div class="yinhao"></div> <div class="yinhao"></div>
<div class="txt">学习路线图</div> <div class="txt">知识结构</div>
</div> </div>
<div class="subbox1" style="display: flex;" id="knowledgeStructure"> <div class="subbox1" style="display: flex;" id="knowledgeStructure">
@ -114,15 +114,19 @@
</a> </a>
<div class="f14" style="padding: 20px 0 10px; line-height: 22px;"> <div class="f14" style="padding: 20px 0 10px; line-height: 22px;">
完成快速入门学习即可抽取 完成快速入门学习即可抽取
</div> </div>
<div class="flex-6" style="line-height: 24px;">
<div class="flex-1"> <div class="coupon_bg flex-1">
<span class="f14 flex-1"> <i class="iconfont icon-youhuiquan colb3c f20 lf_c"></i>
<i class="iconfont icon-book colb3c f20"></i> <div class="lineBox">
<span class="col333" style="margin-left: 10px;">全套学习资料</span> <i class="arrow el-icon-caret-bottom line_bottom"></i>
</span> <div class="line_l"></div>
<span class="f12 col7e8" style="padding-left: 10px">价值200元</span> <i class="arrow el-icon-caret-top line_top"></i>
</div>
<div>
<a href="https://www.jiandaoyun.com/l/645608ecf1bf6800081e9a5c/d/64560942257222000873d3fe" target="_blank" class="col008" style="margin:0 10px;">学习资料下载</a>
<span class="f12 col7e8">价值200元</span>
</div> </div>
</div> </div>
</div> </div>
@ -260,6 +264,45 @@
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
.coupon_bg {
background-color: #fef7f2;
border-radius: 6px;
height: 42px;
.lf_c {
margin: 0 14px;
}
.lineBox {
position: relative;
width: 15px;
height: 100%;
.line_bottom,
.line_top {
left: 0;
position: absolute;
font-size: 18px;
color: #fff;
}
.line_bottom {
top: -7px;
}
.line_top {
bottom: -7px;
}
.line_l {
position: absolute;
width: 1px;
height: 100%;
border: 1px #fff dashed;
left: 50%;
}
}
}
.subbox4 { .subbox4 {
width: 590px; width: 590px;
} }
@ -375,7 +418,7 @@
.itembox { .itembox {
width: 356px; width: 356px;
height: 725px; height: 735px;
position: relative; position: relative;
background-color: #fff; background-color: #fff;
border-radius: 6px; border-radius: 6px;

6
src/views/studypath/jiandaoyun.vue

@ -230,7 +230,7 @@
<div class="infobox"> <div class="infobox">
<div class="f24 col333">简道云学习班从入门到精通·实战班</div> <div class="f24 col333">简道云学习班从入门到精通·实战班</div>
<div class="f16 col617" style="margin: 10px 0 20px;"> <div class="f16 col617" style="margin: 10px 0 20px;">
5周体系化课程 助力你成为全公司最会用简道云的人 3周体系化课程 助力你成为全公司最会用简道云的人
</div> </div>
<div class="icoxbox flex-6"> <div class="icoxbox flex-6">
<li> <li>
@ -252,7 +252,7 @@
<div class="flex-1 m_kaike" style="margin-top: 30px;" v-if="is_showclass === true"> <div class="flex-1 m_kaike" style="margin-top: 30px;" v-if="is_showclass === true">
<a href="https://bbs.fanruan.com/course/jiandaoyun/standard/?sqtj" target="_blank" class="btn-jdy f14" style=" width: 278px; padding: 10px 0; margin-right: 20px;"> 了解详情{{ start_day }}开课 </a> <a href="https://bbs.fanruan.com/course/jiandaoyun/standard/?sqtj" target="_blank" class="btn-jdy f14" style=" width: 278px; padding: 10px 0; margin-right: 20px;"> 了解详情{{ start_day }}开课 </a>
<div class="f14 col617 flex-1"> <div class="f14 col617 flex-1">
<span>课时5</span> <span style="margin: -2px 4px 0 4px;"></span> <span>课时3</span> <span style="margin: -2px 4px 0 4px;"></span>
<span>{{ people_count }}人已完成学习</span> <span>{{ people_count }}人已完成学习</span>
</div> </div>
</div> </div>
@ -260,7 +260,7 @@
<div class="flex-1 m_kaike" style="margin-top: 30px;" v-if="is_showclass === false"> <div class="flex-1 m_kaike" style="margin-top: 30px;" v-if="is_showclass === false">
<span class="btn-ddd f14" style=" width: 278px; padding: 10px 0; margin-right: 20px;">暂无开课计划</span> <span class="btn-ddd f14" style=" width: 278px; padding: 10px 0; margin-right: 20px;">暂无开课计划</span>
<div class="f14 col617 flex-1"> <div class="f14 col617 flex-1">
<span>课时5</span> <span style="margin: -2px 4px 0 4px;"></span> <span>课时3</span> <span style="margin: -2px 4px 0 4px;"></span>
<span>{{ people_count }}人已完成学习</span> <span>{{ people_count }}人已完成学习</span>
</div> </div>
</div> </div>

3063
src/views/video/guide/finebi.vue

File diff suppressed because it is too large Load Diff

3020
src/views/video/guide/finereport.vue

File diff suppressed because it is too large Load Diff

3039
src/views/video/guide/finereportGuide2023.vue

File diff suppressed because it is too large Load Diff

3106
src/views/video/guide/jiandaoyun.vue

File diff suppressed because it is too large Load Diff

19
src/views/video/play.vue

@ -203,7 +203,7 @@ export default {
state.play_title = res.data.it618_name; state.play_title = res.data.it618_name;
state.videoObject.video = res.data.it618_videourl; state.videoObject.video = res.data.it618_videourl;
console.log("res.data", res.data); // console.log("res.data", res.data);
if (res.data.playtime > 0) { if (res.data.playtime > 0) {
state.videoObject.seek = res.data.playtime; state.videoObject.seek = res.data.playtime;
@ -281,7 +281,7 @@ export default {
// //
state.pointTimer++; state.pointTimer++;
console.log(state.pointTimer); // console.log(state.pointTimer);
if (state.pointTimer == 5) { if (state.pointTimer == 5) {
state.pointTimer = 0; state.pointTimer = 0;
let log2Param = { let log2Param = {
@ -326,7 +326,7 @@ export default {
// id // id
state.logid = res.data.logid; state.logid = res.data.logid;
state.videoid = res.data.id; state.videoid = res.data.id;
console.log("log_videoid", state.videoid); // console.log("log_videoid", state.videoid);
// //
let winState = { url: id }; let winState = { url: id };
@ -393,7 +393,7 @@ export default {
onMounted(() => { onMounted(() => {
var new_element = document.createElement("script"); var new_element = document.createElement("script");
new_element.setAttribute("type", "text/javascript"); new_element.setAttribute("type", "text/javascript");
new_element.setAttribute("src", "/js/ckplayerX2/ckplayer.min.js"); new_element.setAttribute("src", "/js/ckplayerX2/ckplayer.min.js?v=2.1");
document.body.appendChild(new_element); document.body.appendChild(new_element);
// //
@ -853,3 +853,14 @@ body {
} }
} }
</style> </style>
<style type="text/css">
video::-internal-media-controls-download-button {
display: none;
}
video::-webkit-media-controls-enclosure {
overflow: hidden;
}
video::-webkit-media-controls-panel {
width: calc(100% + 30px);
}
</style>

3
src/views/video/video_course.vue

@ -312,6 +312,7 @@
<div id="tab-menu3_box" class="btile flex-1 tab_cur_box"> <div id="tab-menu3_box" class="btile flex-1 tab_cur_box">
<h2>课程评论</h2> <h2>课程评论</h2>
<div class="f15 colff4" style="padding-left: 24px;">备注如需提交问题可点击页面右侧按钮 获取帮助-页面反馈</div>
</div> </div>
<div class="comment_box"> <div class="comment_box">
<div class="post-box"> <div class="post-box">
@ -634,7 +635,7 @@ export default {
const res = await addComment(courseid, state.postmsg); const res = await addComment(courseid, state.postmsg);
if (res.message === "success") { if (res.message === "success") {
const newComment = { const newComment = {
uname: state.userInfo.username, uname: store.getters.get_user_name,
msg: state.postmsg.msg, msg: state.postmsg.msg,
fenshu: state.postmsg.fenshu, fenshu: state.postmsg.fenshu,
ptime: "刚刚", ptime: "刚刚",

Loading…
Cancel
Save