Compare commits

..

No commits in common. 'master' and 'chengdu' have entirely different histories.

  1. 25
      src/App.vue
  2. 438
      src/assets/css/main.css
  3. BIN
      src/assets/img/add.png
  4. BIN
      src/assets/img/equal.png
  5. BIN
      src/assets/img/indexBg.jpg
  6. BIN
      src/assets/img/inside.png
  7. BIN
      src/assets/img/left_up.png
  8. BIN
      src/assets/img/offshelf.png
  9. BIN
      src/assets/img/outside.png
  10. BIN
      src/assets/img/right_up.png
  11. 17
      src/components/common/Header.vue
  12. 4
      src/components/common/Studentcommon/Achievement.vue
  13. 1
      src/components/common/Studentcommon/FictitiousList.vue
  14. 6
      src/components/common/Studentcommon/registration.vue
  15. 11
      src/components/page/Assessment.vue
  16. 44
      src/components/page/ClientLogin.vue
  17. 47
      src/components/page/Dashboard.vue
  18. 121
      src/components/page/Index.vue
  19. 49
      src/components/page/Login.vue
  20. 87
      src/components/page/PersonalCenter.vue
  21. 9
      src/components/page/ProjectIntro.vue
  22. 22
      src/components/page/ProjectPattern.vue
  23. 30
      src/components/page/Record.vue
  24. 48
      src/components/page/RegisterForm.vue
  25. 424
      src/components/page/ShowExperiment.vue
  26. 1
      src/components/page/TeachingVideo.vue
  27. 20
      src/config/index.js
  28. 14
      src/utils/api.js
  29. 32
      src/utils/core.js
  30. 9
      src/utils/http.js

@ -12,6 +12,7 @@
if (sessionStorage.getItem("kd_client_store") ) {
this.$store.replaceState(Object.assign({}, this.$store.state,JSON.parse(sessionStorage.getItem("kd_client_store"))))
}
//vuexsessionStorage
window.addEventListener("beforeunload",()=>{
sessionStorage.setItem("kd_client_store",JSON.stringify(this.$store.state))
@ -19,27 +20,3 @@
}
}
</script>
<style>
.el-divider>.el-divider__text{
color: #5277F7;
font-size: 23px;
}
.el-page-header__left:hover{
opacity: 0.7;
}
.el-page-header{
position: fixed;
}
.el-page-header__left{
top: 20px;
left: 20px;
}
.el-page-header__left>.el-icon-back{
font-size: 20px;
color: #5277F7;
}
.el-page-header__left>.el-page-header__title{
font-size: 20px;
color: #5277F7;
}
</style>

@ -1,438 +0,0 @@
* {
margin: 0;
padding: 0;
}
html,
body,
#app,
.wrapper {
width: 100%;
height: 100%;
overflow: hidden;
}
body {
font-family: 'PingFang SC', "Helvetica Neue", Helvetica, "microsoft yahei", arial, STHeiTi, sans-serif;
font-size: 16px;
}
a {
text-decoration: none
}
i{
font-style: normal;
cursor: pointer;
}
li {
list-style-type:none;
}
img{
cursor: pointer;
}
.content-box {
height: 100%;
-webkit-transition: left .3s ease-in-out;
transition: left .3s ease-in-out;
background: #fff;
}
.clearfix::after {
display: block;
content: ".";
height: 0;
clear: both;
visibility: hidden;
}
.content {
height: 100vh;
width: auto;
overflow-y: auto;
/* width: 1960px; */
overflow-x: hidden;
/* height: 100%; */
box-sizing: border-box;
position: relative;
}
.content_back{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 530px;
}
/* .content-collapse {
left: 65px;
} */
.scroll_wrap{
height: 100vh;
overflow-y: auto;
}
.container {
padding: 30px;
background: #fff;
border: 1px solid #ddd;
border-radius: 5px;
}
.crumbs {
margin: 10px 0;
}
.el-table tr:hover {
background: #f5f7fa;
}
#app .el-table thead{
color: #2D2D2D;
}
/* table表格 */
.el-table th{
/* background-color: #E5E5E5!important; */
font-size: 18px;
font-weight: normal;
}
.el-table td{
font-size: 16px;
font-weight: normal;
}
/* 分页按钮 */
.pagination {
margin: 20px 0;
text-align: right;
}
.pagination .el-pagination__total{
font-size: 16px!important;
}
#app .el-pagination.is-background .btn-next:last-child{
margin-right: 0!important;
/* background-color: #fff!important; */
}
#app .pagination_pageNumber{
color: #ccc;
margin-right: 4px;
margin-bottom: 20px;
}
#app .el-cascader{
display: block!important;
}
.plugins-tips {
padding: 20px 10px;
margin-bottom: 20px;
}
.el-button+.el-tooltip {
margin-left: 10px;
}
#app .el-row {
margin-left: 0!important;
margin-right: 0!important;
}
#app .information .el-col-24{
padding-left: 0!important;
padding-right: 0!important;
}
/* 边距 */
.mab20{
margin-bottom: 20px;
}
.mar20{
margin-right: 20px;
}
.mat20 {
margin-top: 20px;
}
.mar50{
margin: 50px 0;
}
.ml20{
margin-left: 20px;
}
.hr_tag{
width: 8px;
height: 18px;
background: #2D2D2D;
}
.hr_text{
font-size: 18px;
color: #2D2D2D;
margin-left: 10px;
}
.hr_tag_red{
width: 8px;
height: 20px;
background: #BB2A17;
}
.hr_text_red{
font-size: 18px;
color: #2D2D2D;
font-weight: bold;
margin-left: 10px;
}
/* 下拉选择框 */
#app .el-select{
display: block!important;
}
.move-enter-active,
.move-leave-active {
transition: opacity .5s;
}
.move-enter,
.move-leave {
opacity: 0;
}
/*BaseForm*/
.form-box {
width: 600px;
}
.form-box .line {
text-align: center;
}
/* form-item的label */
#app .el-form-item__label{
font-size: 16px;
}
.el-time-panel__content::after,
.el-time-panel__content::before {
margin-top: -7px;
}
.el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default) {
padding-bottom: 0;
}
/*Upload*/
.pure-button {
width: 150px;
height: 40px;
line-height: 40px;
text-align: center;
color: #fff;
border-radius: 3px;
}
.g-core-image-corp-container .info-aside {
height: 45px;
}
/*VueEditor*/
.ql-container {
min-height: 400px;
}
.ql-snow .ql-tooltip {
transform: translateX(117.5px) translateY(10px) !important;
}
.editor-btn {
margin-top: 20px;
}
#app .ml10{
margin-left: 10px;
}
#app .mr10{
margin-right: 10px;
}
.mab200{
margin-bottom: 200px;
}
.mat40{
margin-top: 40px;
}
.mat25{
margin-top: 25px;
}
.mat10{
margin-top: 10px;
}
.hr_tag{
width: 8px;
height: 18px;
background: white;
}
.hr_text{
font-size: 16px;
color: #2D2D2D;
margin-left: 10px;
}
/*flex*/
.flex-center{
display: flex;
align-items: center;
}
.flex-end{
display: flex;
/* justify-content: space-between;
align-items: flex-end; */
justify-content:end
}
.flex-start{
display: flex;
align-items: flex-start;
}
.flex-between{
display: flex;
align-items: center;
justify-content: space-between;
}
.flex-column-between{
display: flex;
justify-content: space-between;
flex-direction: column;
}
.flex-start-between{
display: flex;
align-items: flex-start;
justify-content: space-between;
}
.flex-around{
display: flex;
align-items: center;
justify-content: space-around;
}
.flex-start-around{
display: flex;
align-items: flex-start;
justify-content: center;
}
.flex-end-content{
display: flex;
align-items: center;
justify-content: flex-end;
}
.flex-justify-content{
display: flex;
align-items: center;
justify-content: center;
}
.flex-column-content{
display: flex;
align-items: center;
flex-direction: column;
}
/* 输入框圆角 */
#app .el-input--suffix .el-input__inner{
border-radius: 8px;
}
/* 输入框圆角 */
/* #app .dialog .el-input--suffix .el-input__inner{
border-radius: 0;
} */
#app .el-date-editor--daterange.el-input__inner{
width: 100%;
border-radius: 8px;
}
#app .bondDate .el-date-editor--daterange.el-input__inner{
width: 30%;
margin: 0 25px 0 10px;
}
/* 消除数字input箭头 */
input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
-webkit-appearance: none;
}
input[type="number"]{
-moz-appearance: textfield;
}
.class_name .el-form-item__content{
margin-left: 0!important;
}
.class_detail .el-row{
margin-left: 20px!important;
margin-right: 20px!important;
}
[v-cloak] {
display: none;
}
/* 溢出省略号 */
.ellipsis{
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.search_view{
padding: 30px 0 20px 0;
border-bottom: 1px solid #e5e5e5;
}
.mal10{
margin-left: 10px;
}
.pab0{
padding-bottom: 0;
}
.two_nxetStep{
margin-top: 20px;
text-align: center;
}
.el-divider>.el-divider__text{
color: #5277F7;
font-size: 23px;
}
.el-page-header__left:hover{
opacity: 0.7;
}
.el-page-header{
position: fixed;
}
.el-page-header__left{
top: 40px;
left: 20px;
}
.el-page-header__left>.el-icon-back{
font-size: 20px;
color: #5277F7;
}
.el-page-header__left>.el-page-header__title{
font-size: 20px;
color: #5277F7;
}
/*滚动条样式*/
::-webkit-scrollbar {
width: 1px;
height: 1px;
}
::-webkit-scrollbar-thumb {
border-radius: 1px;
-webkit-box-shadow: inset 0 0 1px white;
background: white;
}
::-webkit-scrollbar-track {
-webkit-box-shadow: inset 0 0 1px white;
border-radius: 0;
background:white;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 703 KiB

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

@ -34,18 +34,17 @@ export default {
this.userName = userName
})
},
// computed: {
// username() {
// let username = sessionStorage.getItem('kd_client_username');
// return username ? username : this.name;
// }
// },
methods: {
loginout() {
// this.$router.push('/login')
// this.$store.replaceState({})
// sessionStorage.clear()
this.$get(this.api.logout,{
token:this.$store.state.token
}).then(res => {
this.$store.replaceState({})
sessionStorage.clear()
this.$router.push('/login')
})
sessionStorage.removeItem('kd_client_username');
location.reload()
},
toPersonalCenter(){
this.$router.push('/personalcenter')

@ -56,11 +56,11 @@ export default {
mounted() {
this.handleCurrentChange(1); //
//
this.$refs.message.href = `http://120.78.198.231/experiment/exportPractice?courseId=${this.courseId}&studentId=${this.studentId}&projectPermissions=${this.projectPermissions}&titles=%E6%AC%A1%E5%BA%8F,%E7%BB%83%E4%B9%A0%E5%90%8D%E7%A7%B0,%E5%AE%9E%E9%AA%8C%E9%A1%B9%E7%9B%AE,%E5%BE%97%E5%88%86,%E8%80%97%E6%97%B6,%E8%B5%B7%E5%A7%8B%E6%97%B6%E9%97%B4,%E7%BB%93%E6%9D%9F%E6%97%B6%E9%97%B4,%E6%9F%A5%E7%9C%8B`;
this.$refs.message.href = `http://www.liuwanr.cn:8080/experiment/exportPractice?courseId=${this.courseId}&studentId=${this.studentId}&projectPermissions=${this.projectPermissions}&titles=%E6%AC%A1%E5%BA%8F,%E7%BB%83%E4%B9%A0%E5%90%8D%E7%A7%B0,%E5%AE%9E%E9%AA%8C%E9%A1%B9%E7%9B%AE,%E5%BE%97%E5%88%86,%E8%80%97%E6%97%B6,%E8%B5%B7%E5%A7%8B%E6%97%B6%E9%97%B4,%E7%BB%93%E6%9D%9F%E6%97%B6%E9%97%B4,%E6%9F%A5%E7%9C%8B`;
},
watch: {
changeCourseId(n, o) {
this.$refs.message.href = `http://120.78.198.231/experiment/exportPractice?courseId=${this.courseId}&studentId=${this.studentId}&projectPermissions=${this.projectPermissions}&titles=%E6%AC%A1%E5%BA%8F,%E7%BB%83%E4%B9%A0%E5%90%8D%E7%A7%B0,%E5%AE%9E%E9%AA%8C%E9%A1%B9%E7%9B%AE,%E5%BE%97%E5%88%86,%E8%80%97%E6%97%B6,%E8%B5%B7%E5%A7%8B%E6%97%B6%E9%97%B4,%E7%BB%93%E6%9D%9F%E6%97%B6%E9%97%B4,%E6%9F%A5%E7%9C%8B`;
this.$refs.message.href = `http://www.liuwanr.cn:8080/experiment/exportPractice?courseId=${this.courseId}&studentId=${this.studentId}&projectPermissions=${this.projectPermissions}&titles=%E6%AC%A1%E5%BA%8F,%E7%BB%83%E4%B9%A0%E5%90%8D%E7%A7%B0,%E5%AE%9E%E9%AA%8C%E9%A1%B9%E7%9B%AE,%E5%BE%97%E5%88%86,%E8%80%97%E6%97%B6,%E8%B5%B7%E5%A7%8B%E6%97%B6%E9%97%B4,%E7%BB%93%E6%9D%9F%E6%97%B6%E9%97%B4,%E6%9F%A5%E7%9C%8B`;
this.handleCurrentChange(1);
}
},

@ -42,6 +42,7 @@ export default {
};
},
created() {
console.log(11,this.$route)
this.getData();
},
methods: {

@ -1,6 +1,9 @@
<template>
<div class="Achievement-container">
<!-- <el-tabs v-model="activeName">
<el-tab-pane label="虚拟实验" name="first"></el-tab-pane>
<el-tab-pane label="教学实验" name="second"></el-tab-pane>
</el-tabs> -->
<div class="tabs">
<a class="item" v-for="(item,index) in tabs" :key="index" :class="{active: index == activeName}" @click="tabChange(index)">{{item}}</a>
</div>
@ -49,7 +52,6 @@ export default {
// this.$refs.message.href = `http://liuwanr.cn:8080/attendance/exportPractice?studentId=${this.studentId}&courseId=${this.$store.state.courseId}&titles=%E5%BA%8F%E5%8F%B7,%E9%A1%B9%E7%9B%AE%E5%90%8D%E7%A7%B0,%E5%AE%9E%E9%AA%8C%E9%A1%B9%E7%9B%AE,%E8%80%83%E5%8B%A4%E8%AE%B0%E5%BD%95,%E7%AD%BE%E5%88%B0%E6%97%B6%E9%97%B4`;
},
methods: {
exportData() {
if(this.activeName == 'first'){
location.href = `${this.api.exportProjectRecord}?userId=${this.userId}`

@ -1,8 +1,5 @@
<template>
<div class="pd20">
<div class="back">
<i class="el-icon-back" @click="toBack">&nbsp;返回</i>
</div>
<el-row :gutter="20">
<el-col :span="24">
<el-card shadow="hover" class="mgb20">
@ -76,6 +73,9 @@
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<!-- <el-button v-if="scope.row.status != 3" type="text" @click="entry(scope.row)" :disabled="scope.row.status != 2">进入</el-button>
<el-button v-else type="text" @click="show(scope.row)">查看成绩</el-button> -->
<el-button v-if="scope.row.status == 3 && !scope.row.reportId" type="text" disabled>未参加</el-button>
<el-button v-if="scope.row.status != 3 && !scope.row.reportId" type="text" @click="entry(scope.row)" :disabled="scope.row.status != 2">进入</el-button>
<el-button v-if="scope.row.status == 2 && scope.row.reportId" type="text" disabled>已提交</el-button>
@ -146,6 +146,7 @@ export default {
}
},
mounted() {
console.log(22,this.pattern)
this.getClass()
this.getData()
this.timer = setInterval(this.getData,1000)
@ -154,10 +155,6 @@ export default {
})
},
methods: {
//
toBack(){
this.$router.go(-1)
},
getData() {
let data = {
classId: this.form.classId,

@ -55,7 +55,7 @@
<el-button type="text" class="forget" @click="forget">忘记密码</el-button>
</div>
</div>
<register v-else :isReg.sync="isReg" @updateInfo="updateInfo" @showDialog="showDialog"></register>
<register v-else :isReg.sync="isReg" @updateInfo="updateInfo"></register>
</div>
<!-- 选择角色 -->
@ -116,9 +116,6 @@
</span>
</template>
</el-dialog>
<el-dialog title="个人隐私协议" :visible.sync="privacyVisible" width="40%" center>
<div v-html="privacyAgreement">&nbsp;</div>
</el-dialog>
</div>
</template>
@ -130,6 +127,8 @@ export default {
activeName: '0',
isReg: false,
loginForm: {
// username: '15794146134',
// password: '111aaa',
username: '',
password: '',
},
@ -165,19 +164,13 @@ export default {
phoneTimer: null,
newPassword: '',
emailOpener: '',
phoneOpener: '',
urlData:'',
type:'',
privacyVisible:false,
privacyAgreement:`<div &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以下隐私协议是本学校对用户隐私保护的许诺,请您务必仔细阅读本协议,以了解我们关于管理您个人信息的情况。本隐私协议的全部条款属于本软件用户服务协议的重要部份之一。<br />\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;为了给您提供更准确、更有针对性的服务,本软件可能会以如下方式,使用您提交的个人信息。但本软件会以高度的勤勉义务对待这些信息,在未征得您许可的情况下,不会将这些信息对外公开或向第三方提供。</p>\n<p>一、保有您提供的信息</p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本软件会在您自愿选择服务或提供信息的情况下收集您的个人信息,并将这些信息进行整合,以便向您提供更好的用户服务。请您在注册时及时、详尽及准确的提供个人资料,并不断更新注册资料,符合及时、详尽准确的要求。所有原始键入的资料将引用为注册资料。如果因注册信息不真实而引起的问题,由您自行承担相应的后果。请您不要将您的帐号、密码转让或出借予他人使用。如您发现您的帐号遭他人非法使用,应立即通知本软件。因黑客行为或用户的保管疏忽导致帐号、密码遭他人非法使用,本软件不承担责任。</p>\n<p>二、保有您的使用记录</p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当您使用本软件的服务时,服务器会自动记录一些信息,包括手机型号、IP地址等。</p>\n<p> 在如下情况下,本软件会遵照您的意愿或法律的规定披露您的个人信息,由此引发的问题将由您个人承担:<br />\n(1)事先获得您的授权;<br />\n(2)只有透露你的个人资料,才能提供你所要求的产品和服务;<br />\n(3)根据有关的法律法规要求;<br />\n(4)按照相关政府主管部门的要求;<br />\n(5)为维护本软件的合法权益。<br />\n(6)您同意让第三方共享资料。<br />\n(7)我们发现您违反了本软件的服务条款或使用规定。<br />\n(8)我们需要向代表我们提供产品或服务的学校提供资料(除非我们另行通知你,否则这些学校无权使用你的身份识别资料)。</p>\n<p>三、本《隐私政策》不适用于以下情况:</p>\n<p>(1)通过我们的服务而接入的第三方服务(包括任何第三方网站)收集的信息。本政策仅适用于我们所收集的信息,并不适用于任何第三方提供的服务或第三方的信息使用规则,我们对任何第三方使用由您提供的信息不承担任何责任;</p>\n<p>(2)通过在我们服务中进行广告服务的其他学校或机构所收集的信息。</p>\n<p>四、隐私权政策的修订</p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们可能适时修订本政策的条款,修订政策也是构成本政策的一部分。如修订政策造成您在本政策下权利的实质减少,我们将在修订生效前通过在主页上显著位置提示或向您发送电子邮件或以其他方式通知您。在该种情况下,若您继续使用我们的服务,即表示同意受经修订的本政策的约束。</p>\n<p>五、用户如何更正或投诉个人信息</p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果您需要查询、修改或更正您的个人信息,或对个人信息保护问题有任何疑问或建议,您可以通过服务支持邮箱msdw@maxsdsp.com联系我们。</p>\n<p>著作权归本学校所有。商业转载请联系作者获得授权,非商业转载请注明出处。</p>\n`,
accountName:''
phoneOpener: ''
};
},
components: {
register
},
mounted(){
this.autoLogin()
this.$once('hook:beforeDestroy', function () {
clearInterval(this.phoneTimer)
this.phoneTimer = null
@ -186,32 +179,8 @@ export default {
})
},
methods: {
//
showDialog(data){
this.privacyVisible = data.isShow
},
//type
//01
autoLogin(){
let currentUrl = window.location.href
let A = currentUrl.split('?')
let B = A[1].split('&')
B.forEach(item => {
if(item.includes('account')){
let account = item.split('=')
this.loginForm.username = account[1]
}
if(item.includes('type')){
let type = item.split('=')
this.type = type[1]
}
})
if(this.type == '1'){
this.loginForm.password = 'Qw654321'
this.getSchool('loginForm')
}
},
backIndex(){
// this.$router.go(-1);
this.$router.push('login');
},
getSchool(form) {
@ -255,6 +224,9 @@ export default {
});
},
getRole(form) {
// this.userId = this.schoolList.find((n,k) => {
// return n.schoolId == this.schoolId
// }).userId
let data = {
userId: this.userId,
schoolId: this.schoolId

@ -1,6 +1,28 @@
<template>
<div>
<div v-show="activeName!='index'" class="back_index" @click="toIndex"><i class="iconfont icon-home"></i></div>
<div class="header_tab">
<!-- <el-tabs v-model="activeName" @tab-click="tabChange" :before-leave="saveActive">
<el-tab-pane label="首页" name="index">
</el-tab-pane>
<el-tab-pane label="课前预习" name="first">
</el-tab-pane>
<el-tab-pane label="练习模式" name="second">
</el-tab-pane>
<el-tab-pane label="竞赛列表" name="third">
</el-tab-pane>
<el-tab-pane label="考核列表" name="fourth" v-if="shwoAss">
</el-tab-pane>
<el-tab-pane label="实验记录" name="fifth">
</el-tab-pane>
</el-tabs> -->
<Index v-if="activeName=='index'"></Index>
<TeachingVideo v-if="!showProject && activeName!='fourth' && activeName!='fifth' && activeName!='index' && activeName!='second'"></TeachingVideo>
<Project v-if="showProject"></Project>
@ -149,6 +171,10 @@ export default {
Assessment
},
methods: {
toIndex() {
// this.$router.push('dashboard')
this.activeName = 'index'
},
getClass(){
this.$get(`${this.api.mineClass}?userId=${this.userId}`).then(res => {
if(!res.list.length){
@ -386,7 +412,26 @@ export default {
outline: none;
box-shadow: none !important;
}
.back_index:hover{
opacity: 0.8;
cursor: pointer;
}
.back_index{
position: fixed;
right: 0px;
top: 48%;
width: 80px;
height: 80px;
background: white;
text-align: center;
z-index: 100;
}
.icon-home{
font-size: 50px;
color: #FF5288;
font-weight: 600;
line-height: 80px;
}
h3{
color: #328aff;
margin-bottom: 10px;

@ -1,20 +1,8 @@
<template>
<div class="wrap">
<div class="button_wrap flex-between">
<div class="button_item left" @click="toNext(0)">
<div class="text_wrap">
<div>期货交易</div>
<div>虚仿实验</div>
</div>
<div class="img_wrap"><img src="../../assets/img/left_up.png" alt=""></div>
</div>
<div class="button_item right" @click="toNext(1)">
<div class="text_wrap">
<div>期权交易</div>
<div>虚仿实验</div>
</div>
<div class="img_wrap"><img src="../../assets/img/right_up.png" alt=""></div>
</div>
<div class="button_wrap">
<div class="button_item" @click="toNext(0)"><i class="iconfont icon-arrowRight"></i></div>
<div class="button_item" @click="toNext(1)"><i class="iconfont icon-arrowRight"></i></div>
</div>
<div class="notice">
<div></div>
@ -22,20 +10,8 @@
<div>此处期货交易虚拟实验为2020新版本</div>
<div>2019旧版本入口为<a href="http://www.jgsyzx.uestc.cn/">http://www.jgsyzx.uestc.cn/</a></div>
</div>
</div>
<el-dialog :visible.sync="changeVisible" width="30%" :modal-append-to-body="false" :close-on-click-modal="false" :show-close="false" center title="更改密码">
<el-form label-width="80px" :model="regForm" :rules="regRules">
<el-form-item prop="password" label="新密码">
<el-input type="password" v-model="regForm.password" placeholder="请输入密码"></el-input>
</el-form-item>
<el-form-item prop="rePassword" label="确认密码">
<el-input type="password" v-model="regForm.rePassword" placeholder="请再次输入密码"></el-input>
</el-form-item>
</el-form>
<span slot="footer" center class="dialog-footer">
<el-button type="primary" @click="setPassword"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
@ -43,52 +19,15 @@ export default {
name: 'project',
data() {
return {
changeVisible:false,
regForm:{
password:'',
rePassword:''
},
regRules: {
password: [
{ required: true, message: '请输入密码', trigger: 'blur' },
{ pattern: /^.{8,}$/, message: '请输入8位数以上的密码', trigger: 'blur' }
],
rePassword: [
{ required: true, message: '请再次输入密码', trigger: 'blur' },
{ pattern: /^.{8,}$/, message: '请输入6位数以上的密码', trigger: 'blur' }
]
},
};
},
mounted() {
this.showChangePass()
},
methods:{
setPassword(){
if(this.regForm.password !== this.regForm.rePassword){
return this.$message.warning('两次输入的密码不一致,请重新输入')
}else{
this.$post(this.api.resetUserPwd,{password:this.regForm.password}).then(res =>{
this.changeVisible = false
return this.$message.success('更改成功')
}).catch(err=>{
return this.$message.error(err.errmessage)
})
}
},
showChangePass(){
this.$get(this.api.isRequiredReset).then(res =>{
if(this.$store.state.userName.includes('专家')){
}else{
if(res.message) this.changeVisible = true
}
}).catch(err=>{})
},
methods: {
toFuture(){
sessionStorage.setItem("model",0);//
this.core.toSubSystem('','','',0)
},
toNext(val) {
@ -104,44 +43,34 @@ export default {
position: fixed;
background: url('../../assets/img/indexBg.jpg');
background-size: 100%;
box-sizing: border-box;
padding: 0px 180px;
.button_wrap{
width: 600px;
margin:37vh auto 0 auto;
width: 920px;
height: 60px;
// background: red;
margin-top: 600px;
margin-left: 350px;
display: flex;
justify-content: space-between;
.button_item{
height: 100px;
margin-bottom: 230px;
.text_wrap{
div{
width: 200px;
text-align:justify;
text-justify:distribute-all-lines;
font-size: 40px;
font-weight: bold;
margin: 20px 0px;
text-align-last:justify
}
margin-bottom: 30px;
}
.img_wrap{
text-align: center;
width: 60px;
height: 60px;
background: #FF5288;
.icon-arrowRight{
font-size: 55px;
color: white;
}
}
.button_item:hover{
opacity: 0.7;
cursor: pointer;
}
.left{
color: #FF5288;
}
.right{
color: #3677ED;
background: #002E66;
cursor: pointer
}
}
.notice{
width: 900px;
margin-top: 100px;
margin-left: 100px;
display: flex;
// color: #002E66;
color: #7AA0B7;
font-size: 24px;
letter-spacing:4px;

@ -14,9 +14,9 @@
<div>期货期权交易虚拟仿真实验</div>
</div>
<div class="content_button">
<a @click="visiteShow = true"><div>学生端</div></a>
<a @click="toClient"><div>学生端</div></a>
<a @click="toMang"><div>教师端(教学活动查看入口)</div></a>
<a @click="toExpert"><div style="background:#CD3E6A">专家通道/游客通道</div></a>
<a @click="toExpert"><div style="background:#CD3E6A">专家通道</div></a>
</div>
<div class="content_footer">
<div>建议使用谷歌浏览器进行实验</div>
@ -32,29 +32,14 @@
<div class="count_people">实验人数&nbsp;{{proAccessNum.testNum}}</div>
</div>
</div>
<el-dialog title="访问方式" :visible.sync="visiteShow" width="40%" top="11%" :modal-append-to-body="false" center>
<div class="flex-between visite_wrap">
<div class="visite_item" @click="userAuth">
<img src="../../assets/img/inside.png" alt="#">
<div>校内人员</div>
</div>
<div class="visite_item" @click="toClient">
<img src="../../assets/img/outside.png" alt="#">
<div>校外人员</div>
</div>
</div>
</el-dialog>
</div>
</template>
<script>
import axios from 'axios';
import { Loading } from 'element-ui'
export default {
data() {
return {
responseUrl:'',
visiteShow:false,
proAccessNum:{
currentNum:'',
historyNum:'',
@ -71,11 +56,6 @@ export default {
this.accessNum()
},
methods:{
//
userAuth(){
location.href = 'https://finance.uestc.cn/liuwanr/userInfo/loginSchoolPerson'
},
accessNum(){
this.$get(this.api.getAccessNum).then(res =>{
this.proAccessNum.currentNum = res.currentNum,
@ -84,12 +64,10 @@ export default {
}).catch(err=>{})
},
toClient(){
location.href = location.host.includes('116.63.168.79') ? 'http://116.63.168.79/kdclient/#/clientLogin?type=0' : 'https://finance.uestc.cn/kdclient/#/clientLogin?type=0'
// this.$router.push(`/clientLogin?type=0`)
this.visiteShow = false
location.href = location.host.includes('116.63.168.79') ? 'http://116.63.168.79/kdclient/#/clientLogin' : 'http://122.9.154.146/kdclient/#/clientLogin'
},
toMang(){
location.href = location.host.includes('116.63.168.79') ? 'http://116.63.168.79/kdserver/#/login' : 'https://finance.uestc.cn/kdserver/#/login'
location.href = location.host.includes('116.63.168.79') ? 'http://116.63.168.79/kdserver/#/login' : 'http://122.9.154.146/kdserver/#/login'
},
toExpert(){
this.loadIns = Loading.service({
@ -150,25 +128,6 @@ export default {
</script>
<style lang="scss" scoped>
.visite_wrap{
padding: 0px 80px;
.visite_item{
width: 230px;
height: 260px;
text-align: center;
font-size: 23px;
img{
width: 200px;
}
// background: red;
}
.visite_item:hover{
opacity: 0.8;
cursor: pointer;
color: #2D68F2;
}
}
.wrap{
font-family: '微软雅黑';
width: 100%;

@ -10,7 +10,7 @@
:action="this.api.uploadUserAvatars"
:data="{userId:this.$store.state.userId}"
name="file"
:limit="1"
:limit="3"
:on-success="getRes"
>
<div>点击更改头像</div>
@ -37,20 +37,6 @@
</label> -->
</div>
<div class="item">
<span>教育程度</span>
<el-select
v-model="personalInformation.educationDegree"
placeholder="请选择教育程度"
>
<el-option
v-for="(item,index) in educationDegreeList"
:key="index"
:label="item.name"
:value="item.value"
></el-option>
</el-select>
</div>
<!-- <div class="item">
<span>所在国家</span>
<el-select
v-model="personalInformation.countries"
@ -63,7 +49,7 @@
:value="item.value"
></el-option>
</el-select>
</div> -->
</div>
</div>
<div class="line">
<div class="item">
@ -114,7 +100,7 @@
</div>
</div>
</div>
<!-- <div class="line">
<div class="line">
<div class="item">
<span>出生年月日</span>
<el-date-picker
@ -128,9 +114,9 @@
<span>证件</span>
<input id="idnumber" class="idnumber" placeholder="请输入证件" type="text" v-model="personalInformation.idNumber"/>
</div>
</div> -->
</div>
<div class="line">
<!-- <div class="item">
<div class="item">
<span>教育程度</span>
<el-select
v-model="personalInformation.educationDegree"
@ -143,23 +129,23 @@
:value="item.value"
></el-option>
</el-select>
</div> -->
<!-- <div class="item">
</div>
<div class="item">
<span>当前所在学校</span>
<el-select v-model="personalInformation.schoolAppellationId" filterable placeholder="请选择学校" class="school">
<el-option v-for="(item,index) in schoolList" :key="index" :label="item.schoolName" :value="item.schoolId"></el-option>
</el-select>
</div> -->
</div>
</div>
<!-- 个人档案 -->
<!-- <p class="meta-title plus">
<p class="meta-title plus">
<span>个人档案</span>
<el-button type="text" icon="el-icon-plus" @click="addArch">新增</el-button>
</p> -->
</p>
</div>
<!-- <div class="information" style="margin-top: 20px;">
<div class="information" style="margin-top: 20px;">
<div class="archives" v-for="(archive,index) in archivesList" :key="index" v-show="index == 0 || showArch">
<div class="line">
<div class="item">
@ -261,7 +247,7 @@
</div>
</div>
</div>
</div> -->
</div>
<div class="fold" v-if="archivesList.length > 1">
<img :class="{ 'arrowTransform': showArch, 'arrowTransformReturn': !showArch}" style="width: 21px;height: 17px;" src="../../assets/img/open.png" alt="" @click="foldArch">
@ -284,41 +270,34 @@
/>
</div>
<div class="item">
<span>密码</span>
<div class="btns flex-end-content">
<el-button type="primary" size="small" @click="bindPassword">更换</el-button>
</div>
</div>
</div>
<div class="line">
<!-- <div class="item">
<span>手机号</span>
<div class="btns flex-between">
<span>{{personalInformation.phone}}</span>
<el-button v-if="personalInformation.phone" type="primary" size="small" @click="bindPhone">更换</el-button>
<el-button v-else type="primary" size="small" @click="bindPhone">绑定</el-button>
</div>
</div> -->
<!-- <div class="item">
</div>
</div>
<div class="line">
<div class="item">
<span>邮箱</span>
<div class="btns flex-between">
<span>{{personalInformation.email}}</span>
<el-button v-if="personalInformation.email" type="primary" size="small" @click="bindEmail">更换</el-button>
<el-button v-else type="primary" size="small" @click="bindEmail">绑定</el-button>
</div>
</div> -->
</div>
<!-- <div class="item">
<span>微信</span>
<input id="weChat" class="weChat" disabled placeholder="微信" type="text" v-model="personalInformation.weChatID"/>
</div> -->
<div class="line">
<!-- <div class="item">
<div class="item">
<span>密码</span>
<div class="btns flex-end-content">
<el-button type="primary" size="small" @click="bindPassword">更换</el-button>
</div>
</div> -->
</div>
<!-- <div class="item"></div> -->
</div>
</div>
@ -617,6 +596,14 @@ export default {
}else{
this.$set(e, 'ProfessionalList', []);
}
// if(e.provinceId){
// this.$get(this.api.queryCity,{provinceId: e.provinceId}).then(res => {
// this.$set(e, 'cityList', res.message);
// }).catch(res => {});
// }else{
// this.$set(e, 'cityList', []);
// }
console.log(11,window.scrollTo)
})
}else{
this.concatArch(1)
@ -657,7 +644,7 @@ export default {
this.archivesList.forEach((n,k) => {
if(!n.personalCareerId) isEmpty = true
})
// if(isEmpty) return this.$message.warning('');
if(isEmpty) return this.$message.warning('请选择职业');
this.showArch = true
this.concatArch()
},
@ -735,6 +722,14 @@ export default {
this.archivesList[index].professionalClassName = ''
this.archivesList[index].professionalId = ''
this.archivesList[index].professionalName = ''
// this.archivesList.map(e =>{
// if(e.disciplineId == item){
// e.professionalClassId = '',
// e.professionalClassName = '',
// e.professionalId = '',
// e.professionalName = ''
// }
// })
},
getItemProfessionalClass(item,index){
this.clearItemClass(index)
@ -777,6 +772,12 @@ export default {
clearItemProfess(index){
this.archivesList[index].professionalId = ''
this.archivesList[index].professionalName = ''
// this.archivesList.map(e =>{
// if(e.professionalClassId == item){
// e.professionalId = '',
// e.professionalName = ''
// }
// })
},
getItemProfessional(item,index){
this.clearItemProfess(index)
@ -829,7 +830,7 @@ export default {
if(!n.personalCareerId) isEmpty = true
n.userId = this.userId
})
// if(isEmpty) return this.$message.warning('')
if(isEmpty) return this.$message.warning('请选择职业')
if(this.personalInformation.idNumber && !/(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)/.test(this.personalInformation.idNumber)) return this.$message.warning('请输入正确的证件号码')
let personalInformation = this.personalInformation
let userInfoEntity = {
@ -883,6 +884,7 @@ export default {
if(!this.emailTimer){
this.emailDisabled = true
this.emailTimer = setInterval(() => {
console.log('倒计时中')
if(count > 0){
count--
this.emailBtnText = `${count}秒后重试`
@ -900,6 +902,7 @@ export default {
if(!this.phoneTimer){
this.phoneDisabled = true
this.phoneTimer = setInterval(() => {
console.log('倒计时中')
if(count > 0){
count--
this.phoneBtnText = `${count}秒后重试`

@ -1,6 +1,5 @@
<template>
<div class="wrap">
<el-page-header @back="core.goBack" ></el-page-header>
<!-- 项目介绍+课前预习 -->
<div class="nav_wrap">
<div class="introduce">项目介绍</div>
@ -11,7 +10,7 @@
<div class="project_title">{{title}}</div>
<div class="peoject_content">
<div class="content_text">{{contentText}}</div>
<!-- <div class="back_index" @click="toIndex"><i class="iconfont icon-home"></i></div> -->
<div class="back_index" @click="toIndex"><i class="iconfont icon-home"></i></div>
</div>
</div>
<!-- 选择期权模式基础+挑战 -->
@ -20,9 +19,7 @@
<div class="icon_one icon_wrap"><i class="iconfont icon-arrowRight"></i></div>
<div class="select_title one_title">期货套期保值实验</div>
</div>
<div class="select_item" @click="toNext(3)">
<div class="icon_two icon_wrap"><i class="iconfont icon-arrowRight"></i></div>
<div class="select_title two_title">期货套利实验</div>
<div class="select_item" >
</div>
</div>
<div class="select_wrap" v-else>
@ -119,6 +116,7 @@ export default {
title:'',
contentText:'',
passExam: [1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513].includes(this.$store.state.studentId),
userId: this.$store.state.userId,
evaluationVisible: false,
resultVisible: false,
@ -337,7 +335,6 @@ export default {
};
</script>
<style lang="scss" scoped>
.wrap{
width: 100%;
height: 100%;

@ -1,6 +1,5 @@
<template>
<div class="wrap">
<el-page-header @back="core.goBack" ></el-page-header>
<div class="content_one">
<div class="content_one_title">
{{projectList[pattern].title}}
@ -40,36 +39,29 @@
</div>
</div>
</div>
<!-- <div class="back_index" @click="toIndex"><i class="iconfont icon-home"></i></div> -->
<div class="back_index" @click="toIndex"><i class="iconfont icon-home"></i></div>
</div>
</template>
<script>
import config from '@/config'
export default {
data() {
return {
pattern: Number(this.$route.query.pattern),
projectList:[{
title:'期权套期保值实验',
url:`${this.$config.baseUrl}/kd/#/Dashboard`,
url:'http://122.9.154.146/kd/#/Dashboard',
principle:'本实验根据《金融交易策略设计与模拟》等理论课程的大纲要求,将期权基础知识考核、期权实战规则、模拟开户和期权策略设计等内容融会贯通于十个步骤,考察学生利用期权策略减少价格波动对企业经营影响的能力。',
step:'1. 实验背景介绍;2. 期权实战规则;3. 模拟开户;4. 银期转账;5. 实验角色选择;6. 行情查看与期权选择;7. 期权开仓;8. 期权平仓;9. 核算损益;10. 填写实验报告',
prepare:'完成此实验前,应该了解期货期权的相关定义、期权的交易规则、期权交易的核算规则等相关知识点。'
},{
title:'期权组合保险实验',
url:`${this.$config.baseUrl}/kdChallenge/#/Dashboard`,
url:'http://122.9.154.146/kdChallenge/#/Dashboard',
principle:'本实验根据《金融交易策略设计与模拟》等理论课程的大纲要求,将期权delta风险中性策略、交叉对冲和期权组合策略设计等知识点融会贯通于十个步骤,考察学生利用期权组合策略减少价格波动对企业经营影响的能力。',
step:'1.关于delta动态调仓的实验背景;2.关于交叉对冲的实验背景;3.实验案例;4.最优对冲比率计算;5.合约选择;6.期权组合开仓;7.期权组合调仓;8.期权组合平仓;9.核算损益;10.填写实验报告;',
prepare:'开始实验前,应了解期权定义、期权交易规则、希腊字母delta、交叉对冲和不同期权组合策略的盈亏图。'
},{
title:'期货套期保值实验',
url:`${this.$config.baseUrl}/future/#/Dashboard`,
principle:'本实验根据《金融交易策略设计与模拟》等理论课程的大纲要求,将期货基础知识考核、期货实战规则、模拟开户和期货策略设计等内容融会贯通于十个步骤,考察学生利用期货策略减少价格波动对企业经营影响的能力。',
step:'1. 期货交易实例;2. 期货实战规则;3. 期货账户开户;4. 银期转账;5. 实验案例和实验角色选择;6. 期货合约选择;7. 期货合约开仓;8. 期货合约平仓;9.核算损益;10. 填写实验报告',
prepare:'完成此实验前,应该了解期货的相关定义、期货的交易规则、期货交易的核算规则等相关知识点。'
},{
title:'期货套利实验',
url: `${this.$config.baseUrl}/future/#/Dashboard`,
url:'http://122.9.154.146/future/#/Dashboard',
principle:'本实验根据《金融交易策略设计与模拟》等理论课程的大纲要求,将期货基础知识考核、期货实战规则、模拟开户和期货策略设计等内容融会贯通于十个步骤,考察学生利用期货策略减少价格波动对企业经营影响的能力。',
step:'1. 期货交易实例;2. 期货实战规则;3. 期货账户开户;4. 银期转账;5. 实验案例和实验角色选择;6. 期货合约选择;7. 期货合约开仓;8. 期货合约平仓;9.核算损益;10. 填写实验报告',
prepare:'完成此实验前,应该了解期货的相关定义、期货的交易规则、期货交易的核算规则等相关知识点。'
@ -84,12 +76,16 @@ export default {
this.$router.go(-1)
},
toPrac(){
if(this.pattern == 2){
sessionStorage.setItem("model",0);
this.core.toSubSystem('','','',0)
}else{
this.core.toSubSystem('','','',this.pattern)
}
},
toNext(index) {
sessionStorage.setItem('pattern',this.pattern)
this.$router.push(`dashboard#${index}`)
sessionStorage.setItem('isOld',true)
},
},
};

@ -1,8 +1,5 @@
<template>
<div class="pd20">
<div class="back">
<i class="el-icon-back" @click="toBack">&nbsp;返回</i>
</div>
<el-card shadow="hover" class="mgb20">
<div class="cka-Overview">
<p style="padding-bottom: 10px;font-size: 16px">实验概览</p>
@ -54,23 +51,14 @@ export default {
this.getData();
},
methods: {
//
toBack(){
if(sessionStorage.getItem('isOld')){
this.$router.go(-1)
sessionStorage.removeItem('isOld')
}else{
this.$router.push(`/dashboard#0`)
location.reload()
}
},
getData() {
this.$get(`${this.api.fictitiousScore}/${this.userId}`, {})
.then(res => {
this.overview = res.data
}).catch(err => {});
})
.catch(err => {
console.log(err);
});
}
},
components: {
@ -81,16 +69,6 @@ export default {
</script>
<style lang="scss">
.back{
height: 40px;
line-height: 40px;
font-size: 20px;
color: #5277F7;
i:hover{
cursor: pointer;
opacity: 0.7;
}
}
.horizontalVerticalCenter {
display: flex;
align-items: center;

@ -1,6 +1,8 @@
<template>
<div>
<!-- <h2>学生注册 <div class="back" @click="toLogin">返回登录</div></h2> -->
<h2>学生注册</h2>
<el-form class="register" :model="regForm" :rules="regRules" ref="reg" label-width="0px">
<div class="line">
<el-form-item prop="userName">
@ -48,6 +50,18 @@
</el-select>
</el-form-item>
</div>
<!-- <div class="line">
<el-form-item prop="phone">
<p class="label">手机号</p>
<el-input v-model="regForm.phone" placeholder="请输入手机号"></el-input>
</el-form-item>
<el-form-item style="margin-right: 5%">
<button type="button" class="code-btn">发送验证码</button>
</el-form-item>
<el-form-item prop="code">
<el-input v-model="regForm.code" placeholder="输入验证码"></el-input>
</el-form-item>
</div> -->
<div class="line">
<el-form-item prop="password">
<p class="label">*密码设置</p>
@ -66,16 +80,8 @@
<img :src="verifyCode" style="cursor: pointer;" @click="getVerificationCode" title="看不清?换一张" />
</el-form-item>
</div>
<div class="line">
<el-checkbox v-model="checked" >
<div @click.prevent>
<span>我同意</span><span @click="$emit('showDialog',{isShow:true})" style="color:#328aff">电子科技大学虚拟仿真用户隐私协议</span>
</div>
</el-checkbox>
</div>
<el-button class="submit" type="primary" @click="registerForm">注册</el-button>
</el-form>
</div>
</template>
@ -110,14 +116,13 @@ export default {
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' },
{ pattern: /^.{8,}$/, message: '请输入8位数以上的密码', trigger: 'blur' }
{ pattern: /^.{6,}$/, message: '请输入6位数以上的密码', trigger: 'blur' }
],
rePassword: [
{ required: true, message: '请再次输入密码', trigger: 'blur' },
{ pattern: /^.{8,}$/, message: '请输入8位数以上的密码', trigger: 'blur' }
{ pattern: /^.{6,}$/, message: '请输入6位数以上的密码', trigger: 'blur' }
]
},
checked:false,
provinceList: this.$store.state.provinceList, //
cityList: [], //
schoolList: [],
@ -133,7 +138,21 @@ export default {
methods: {
//
getVerificationCode(){
this.verifyCode = `https://finance.uestc.cn/evaluation/tms/userInfo/getValidateCode?id=${Math.random()}`
// this.$get(this.api.getValidateCode)
axios({
url:this.api.getValidateCode,
methods:'get',
headers: {
"Content-Type": "application/json",
"EngineCode": "j371gy1q1ioeveq2y05l4gjz3",
"EngineSecret": "IgMlZo+KOs8FthII3KnobUoynILH5ELJVqcHNZcs1G2mwrkofR1THw=="
},
responseType: 'arraybuffer',
})
.then(res => {
const bufferUrl = btoa(new Uint8Array(res.data).reduce((data, byte) => data + String.fromCharCode(byte), ''));
this.verifyCode = 'data:image/png;base64,' + bufferUrl;
}).catch(res => {});
},
getProvince(){
this.$get(this.api.queryProvince).then(res => {
@ -157,13 +176,12 @@ export default {
}).catch(res => {});
},
registerForm() {
if(!this.checked) return this.$message.error('请阅读并勾选用户隐私协议')
if(!/^(?![\d]+$)(?![a-zA-Z]+$)(?![^\da-zA-Z]+$)([^\u4e00-\u9fa5\s]){6,20}$/.test(this.regForm.password)) return this.$message.error('请输入8位数以上且包含数字、字母、下划线的密码')
this.$refs.reg.validate(valid => {
if (valid) {
if(this.phoneRepeat) return this.$message.warning('该手机号已存在')
if(this.workNumberReapeat) return this.$message.warning('该学生学号已存在')
if(this.regForm.password !== this.regForm.rePassword) return this.$message.warning('两次输入的密码不一致,请重新输入')
let data = this.regForm
data.account = data.phone
data.uniqueIdentificationAccount = new Date().getTime()
@ -173,7 +191,7 @@ export default {
this.$emit('updateInfo',{username: this.regForm.phone,password: this.regForm.password})
this.$refs.reg.resetFields()
}).catch(res => {
this.$message.error(res)
// this.$message.error(res)
});
} else {
// this.$message.error('');

@ -116,17 +116,8 @@
<div class="meta-title-wrap">
<p class="meta-title"><i class="el-icon-discount"></i> 实验数据及结果分析</p>
</div>
<div class="reportCard_view reportCard_bck mat20" v-if="pattern == 0">
<div class="reportCard_bor mat20">
<div class="flex-between ">
<div>
<div class="flex-between">
<div class="flex-center">
<p class="hr_tag"></p>
<span class="hr_text"> &nbsp;&nbsp;现货盈亏</span>
</div>
</div>
<el-table :data="patternOne.goodsData" :span-method="objectSpanMethod" stripe header-align="center" class="mat10">
<div class="data-wrap">
<el-table :data="goodsData" :span-method="objectSpanMethod" stripe header-align="center" style="flex: 1;margin-right: 10px">
<el-table-column prop="name" label="现货" align="center"></el-table-column>
<el-table-column prop="num" label="数量" align="center"></el-table-column>
<el-table-column prop="time" label="时间" align="center"></el-table-column>
@ -134,18 +125,7 @@
<el-table-column prop="marketValue" label="现货市值" align="center"></el-table-column>
<el-table-column prop="proftAndLoss" label="累计盈亏" align="center"></el-table-column>
</el-table>
</div>
<div class="add_img">
<img src="../../assets/img/add.png" alt="">
</div>
<div>
<div class="flex-between">
<div class="flex-center">
<p class="hr_tag"></p>
<span class="hr_text"> &nbsp;&nbsp;期权盈亏</span>
</div>
</div>
<el-table :data="patternOne.futuresData" :span-method="objectSpanMethod1" stripe header-align="center" class="mat10">
<el-table :data="futuresData" :span-method="objectSpanMethod1" stripe header-align="center" style="flex: 1;margin-right: 10px">
<el-table-column prop="name" label="期权名称" align="center"></el-table-column>
<el-table-column prop="dir" label="交易方向" align="center"></el-table-column>
<el-table-column prop="num" label="数量" align="center"></el-table-column>
@ -154,223 +134,12 @@
<el-table-column prop="marketValue" label="期权市值" align="center"></el-table-column>
<el-table-column prop="proftAndLoss" label="累计盈亏" align="center"></el-table-column>
</el-table>
</div>
<div class="add_img">
<img src="../../assets/img/equal.png" alt="">
</div>
<div>
<div class="flex-between">
<div class="flex-center">
<p class="hr_tag"></p>
<span class="hr_text"> &nbsp;&nbsp;策略总盈亏</span>
</div>
</div>
<el-table :data="patternOne.futuresLoss" stripe header-align="center" class="mat10">
<el-table-column prop="futuresLoss" width="110" label="策略总盈亏" align="center"></el-table-column>
</el-table>
</div>
</div>
<div class="mat20">
<div class="flex-between">
<div class="flex-center">
<p class="hr_tag"></p>
<span class="hr_text"> &nbsp;&nbsp;套期保值率</span>
</div>
</div>
<el-table :data="patternOne.hisPositionData1" stripe header-align="center" class="mat10" >
<el-table-column prop="percent" label="套期保值率" align="center"></el-table-column> </el-table>
</div>
</div>
</div>
<div class="reportCard_bor mat20" v-if="pattern == 1">
<div class="history_content">
<div >
<div class="flex-between">
<div class="flex-center">
<p class="hr_tag"></p>
<span class="hr_text"> &nbsp;&nbsp;现货盈亏情况</span>
</div>
</div>
<div>
<el-table
:data="patternTwo.goodsData"
stripe
header-align="center"
class="mat10"
>
<el-table-column prop="endTime" label="数据时间" width="180" align="center"></el-table-column>
<el-table-column prop="timeForStock" label="持仓时间段" align="center"></el-table-column>
<el-table-column prop="stackName" label="现货" align="center"></el-table-column>
<el-table-column prop="trading" label="头寸" align="center"></el-table-column>
<el-table-column prop="num" label="数量" align="center"></el-table-column>
<el-table-column prop="startPrice" label="启始价格" align="center"></el-table-column>
<el-table-column prop="stockPrice" label="当日价格" align="center"></el-table-column>
<el-table-column prop="stageLoss" label="阶段盈亏" align="center"></el-table-column>
<el-table-column prop="totalLossDto" label="累计盈亏" align="center"></el-table-column>
</el-table>
</div>
</div>
</div>
<div>
<div>
<div class="flex-between">
<div class="flex-center">
<p class="hr_tag"></p>
<span class="hr_text"> &nbsp;&nbsp;期权持仓与盈亏情况</span>
</div>
</div>
<div>
<el-table
:data="patternTwo.hisPositionData"
stripe
header-align="center"
class="mat10"
>
<el-table-column prop="openTime" label="数据时间" width="180" align="center"></el-table-column>
<el-table-column prop="endTime" label="持仓时间段" align="center"></el-table-column>
<el-table-column prop="optionName" label="期权合约名称" align="center"></el-table-column>
<el-table-column prop="trading" label="交易方向" align="center"></el-table-column>
<el-table-column prop="num" label="数量(手)" align="center"></el-table-column>
<el-table-column prop="openPrice" label="启始价格" align="center"></el-table-column>
<el-table-column prop="endPrice" label="当日价格" align="center"></el-table-column>
<el-table-column prop="totalLoss" label="阶段盈亏" align="center"></el-table-column>
<el-table-column prop="delta" label="当日delta" align="center"></el-table-column>
<el-table-column prop="totalLoss" label="累计盈亏" align="center"></el-table-column>
</el-table>
</div>
</div>
<div>
<el-table
:data="patternTwo.hisPositionData1"
stripe
header-align="center"
class="mat10"
>
<el-table-column prop="totalLoss" label="总盈亏" align="center"></el-table-column>
<el-table-column prop="percent" label="套期保值率" align="center"></el-table-column>
</el-table>
</div>
</div>
</div>
<div class="reportCard_view reportCard_bck mat20" v-if="pattern == 2">
<div class="flex-center">
<p class="hr_tag"></p>
<span class="hr_text">实验数据</span>
</div>
<div class="reportCard_bor mat20">
<div class="flex-between ">
<div>
<div class="flex-between">
<div class="flex-center">
<p class="hr_tag"></p>
<span class="hr_text"> &nbsp;&nbsp;现货盈亏</span>
</div>
</div>
<el-table :data="patternThree.goodsData" :span-method="objectSpanMethod" stripe header-align="center" class="mat10">
<el-table-column prop="name" label="现货" align="center"></el-table-column>
<el-table-column prop="num" label="数量" align="center"></el-table-column>
<el-table-column prop="time" label="时间" align="center"></el-table-column>
<el-table-column prop="price" label="价格" align="center"></el-table-column>
<el-table-column prop="marketValue" label="现货市值" align="center"></el-table-column>
<el-table-column prop="proftAndLoss" label="累计盈亏" align="center"></el-table-column>
</el-table>
</div>
<div class="add_img">
<img src="../../assets/img/add.png" alt="">
</div>
<div>
<div class="flex-between">
<div class="flex-center">
<p class="hr_tag"></p>
<span class="hr_text"> &nbsp;&nbsp;期货盈亏</span>
</div>
</div>
<el-table :data="patternThree.futuresData" :span-method="objectSpanMethod1" stripe header-align="center" class="mat10">
<el-table-column prop="name" label="期货名称" align="center"></el-table-column>
<el-table-column prop="dir" label="交易方向" align="center"></el-table-column>
<el-table-column prop="num" label="数量" align="center"></el-table-column>
<el-table-column prop="time" label="时间" align="center"></el-table-column>
<el-table-column prop="price" label="价格" align="center"></el-table-column>
<el-table-column prop="marketValue" label="期货市值" align="center"></el-table-column>
<el-table-column prop="proftAndLoss" label="累计盈亏" align="center"></el-table-column>
</el-table>
</div>
<div class="add_img">
<img src="../../assets/img/equal.png" alt="">
</div>
<div>
<div class="flex-between">
<div class="flex-center">
<p class="hr_tag"></p>
<span class="hr_text"> &nbsp;&nbsp;策略总盈亏</span>
</div>
</div>
<el-table :data="patternThree.futuresLoss" stripe header-align="center" class="mat10">
<el-table-column prop="futuresLoss" width="110" label="策略总盈亏" align="center"></el-table-column>
<div style="width: 150px;">
<el-table :data="futuresLoss" stripe header-align="center">
<el-table-column prop="futuresLoss" label="策略总盈亏" align="center"></el-table-column>
</el-table>
</div>
</div>
<div class="mat20">
<div class="flex-between">
<div class="flex-center">
<p class="hr_tag"></p>
<span class="hr_text"> &nbsp;&nbsp;套期保值率</span>
</div>
</div>
<el-table :data="patternThree.hisPositionData1" stripe header-align="center" class="mat10" >
<el-table-column prop="level" label="套期保值率" align="center"></el-table-column>
</el-table>
</div>
</div>
</div>
<div v-if="pattern == 3">
<div v-for="item in patternFour.reportList" :key="item.id" class="item_wrap">
<div class="select_wrap">
{{item.id + 1}}
</div>
<div class="table_wrap">
<el-table :data="item.tableData" stripe header-align="center" border :span-method="mergeColumn">
<el-table-column prop="arbitrageDirection" align="center" label="套利方向" ></el-table-column>
<el-table-column prop="futureName" align="center" label="合约" ></el-table-column>
<el-table-column prop="transactionTime" align="center" label="开仓时间" ></el-table-column>
<el-table-column align="center" label="开仓方向" >
<template slot-scope="scope">{{scope.row.tradeDirection == 'BUY'?'买入':'卖出'}}</template>
</el-table-column>
<el-table-column align="center" label="开仓价" >
<template slot-scope="scope">
{{scope.row.price}}/
</template>
</el-table-column>
<el-table-column prop="closeTime" align="center" label="平仓时间" ></el-table-column>
<el-table-column prop="closeType" align="center" label="平仓方式" ></el-table-column>
<el-table-column prop="closePrice" align="center" label="平仓价" ></el-table-column>
<el-table-column prop="count" align="center" label="数量" >
<template slot-scope="scope">
{{scope.row.futureName.includes('现货')? `${scope.row.quantity}(吨)`:`${scope.row.quantity}(手)`}}
</template>
</el-table-column>
<el-table-column prop="profit" align="center" label="合约盈亏" ></el-table-column>
<el-table-column prop="closeProfit" align="center" label="持仓成本损益" ></el-table-column>
<el-table-column prop="totalProfit" align="center" label="总盈亏" ></el-table-column>
<el-table-column prop="annualizedRate" align="center" label="年化收益率" ></el-table-column>
</el-table>
<!-- 折线图区域 -->
<div class="chart_wrap">
<div class="chart_one">
<div class="line_wrap">
<div :id="'line_contentOne' + item.id" class="line_content"></div>
</div>
</div>
<div class="chart_two">
<div class="chart_two_title">无套利区间</div>
<div class="line_wrap">
<div :id="'line_contentTwo' + item.id" class="line_content"></div>
</div>
</div>
</div>
</div>
</div>
</div>
<el-input style="margin-top: 20px" v-model="form.analysis" type="textarea" :disabled="true" rows="5"></el-input>
</div>
@ -415,7 +184,6 @@
</template>
<script>
import echarts from 'echarts/lib/echarts';
import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'
export default {
@ -426,7 +194,6 @@
userId: this.$store.state.userId,
studentId: this.$store.state.studentId,
userName: this.$store.state.userName,
pattern:Number(sessionStorage.getItem('pattern')),
form: {
analysis: '',
conclusion: '',
@ -453,29 +220,12 @@
comment: ''
},
signSrc: '',
patternOne:{
goodsData:[],
futuresData:[],
futuresLoss:[],
hisPositionData1:[]
},
patternTwo:{
goodsData:[],
hisPositionData:[],
hisPositionData1:[]
},
patternThree:{
goodsData:[],
futuresData:[],
futuresLoss:[],
hisPositionData1:[]
},
patternFour:{
reportList:[]
},
sjData: [],
infoData: [],
expData: [],
goodsData: [],
futuresData: [],
futuresLoss: [],
}
},
mounted(){
@ -483,33 +233,6 @@
this.getSgin()
},
methods: {
//
mergeColumn({ row, column, rowIndex, columnIndex }){
if(columnIndex == 0 || columnIndex == 11 || columnIndex == 12){
if (rowIndex % 2 === 0) {
return {
rowspan: 2,
colspan: 1
};
} else {
return {
rowspan: 0,
colspan: 0
};
}
}
},
//echart
drawChart(){
this.patternFour.reportList.forEach(item =>{
setTimeout(() => {
let myChart = echarts.init(document.getElementById('line_contentOne' + item.id));
let myChartTwo = echarts.init(document.getElementById('line_contentTwo' + item.id));
myChart.setOption(item.option);
myChartTwo.setOption(item.optionTwo);
}, 500);
})
},
getData(){
let data = {
reportId: this.id,
@ -522,49 +245,12 @@
if(i.includes('steps') && report[i]) steps.push(JSON.parse(report[i]))
}
this.form = report
switch(this.pattern)
{
case 0:
if(report.steps9){
let steps9 = JSON.parse(report.steps9)
this.patternOne.goodsData = steps9.goodsData ? steps9.goodsData: []
this.patternOne.futuresData = steps9.futuresData ? steps9.futuresData: []
this.patternOne.futuresLoss = steps9.futuresLoss ? steps9.futuresLoss: []
this.patternOne.hisPositionData1 = steps9.hisPositionData1 ? steps9.hisPositionData1: []
}
break;
case 1:
if(report.steps9){
let steps9 = JSON.parse(report.steps9)
this.patternTwo.goodsData = steps9.goodsData ? steps9.goodsData: []
this.patternTwo.hisPositionData = steps9.hisPositionData ? steps9.hisPositionData: []
this.patternTwo.hisPositionData1 = steps9.hisPositionData1 ? steps9.hisPositionData1: []
}
break;
case 2:
if(report.steps9){
let steps9 = JSON.parse(report.steps9)
this.patternThree.goodsData = steps9.goodsData ? steps9.goodsData: []
this.patternThree.futuresData = steps9.futuresData ? steps9.futuresData: []
this.patternThree.futuresLoss = steps9.futuresLoss ? steps9.futuresLoss: []
this.patternThree.hisPositionData1 = steps9.hisPositionData1 ? steps9.hisPositionData1: []
}
break;
case 3:
if(report.steps6){
let steps6 = JSON.parse(report.steps6)
console.log(steps6);
this.patternFour.reportList = steps6 ? steps6: []
console.log(this.patternFour.reportList);
this.drawChart()
this.goodsData = steps9.goodsData ? steps9.goodsData: []
this.futuresData = steps9.futuresData ? steps9.futuresData: []
this.futuresLoss = steps9.futuresLoss ? steps9.futuresLoss: []
}
break
}
let score = res.data.score
let answerList = []
@ -694,91 +380,6 @@
</script>
<style lang="scss" scoped>
.chart_two_title{
height: 60px;
line-height: 60px;
width: 100%;
text-align: center;
font-size: 18px;
color: #3D8BF7;
}
.chart_one{
padding: 50px 120px;
box-sizing: border-box;
}
.chart_two{
margin: 20px 40px;
padding: 10px 50px;
border: 3px solid #3D8BF7;
box-sizing: border-box;
}
.chart_wrap{
box-sizing: border-box;
border: 2px solid #3D8BF7;
border-left: none;
}
.line_wrap{
height: 400px;
width: 100%;
background: rgb(248, 245, 245);
.line_content{
width: 100%;
height: 100%;
}
.design_chart_empty{
background: url(../../assets/img/offshelf.png) 58% 50% no-repeat;
background-size: 250px ;
}
}
.item_wrap{
display: flex;
// justify-content: center;
margin-left:60px ;
align-items: center;
padding: 0px 20px;
position: relative;
.table_wrap{
width: 90%;
box-sizing: border-box;
margin-left: 80px;
}
}
.select_wrap{
text-align: center;
width: 80px;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
position: absolute;
box-sizing: border-box;
border: 2px solid #3D8BF7;
}
.mat10{
margin-top: 10px;
margin-bottom: 10px;
}
.reportCard_view {
padding: 20px 40px;
}
.reportCard_bck {
background-color: #f9f9f9;
}
.add_img{
img{
width: 80px;
min-width: 50px;
max-width: 100px;
}
}
.reportCard_bor {
width: 100%;
overflow: auto;
border: 1px solid #b2b2b2;
border-radius: 6px;
padding: 20px 10px;
}
.box{
background-color: #fff;
}
@ -882,6 +483,5 @@
}
/deep/.data-wrap{
display: flex;
}
</style>

@ -1,6 +1,5 @@
<template>
<div class="box">
<el-page-header @back="core.goBack" ></el-page-header>
<!-- 项目介绍与视频导航栏 -->
<div class="nav_wrap">
<div class="introduce" @click="toPreview">项目介绍</div>

@ -9,32 +9,20 @@ export default {
* 用来在菜单中显示文字
*/
locale: 'zh',
/**
* @description 基础url
*/
baseUrl: location.host.includes('116.63.168.79') ? 'http://116.63.168.79' : 'https://finance.uestc.cn',
/**
* @description 基础模式子系统链接
*/
subSystem1: location.host.includes('116.63.168.79') ? 'http://116.63.168.79/kd/#/Dashboard' : 'https://finance.uestc.cn/kd/#/Dashboard',
subSystem1: location.host.includes('116.63.168.79') ? 'http://116.63.168.79/kd/#/Dashboard' : 'http://122.9.154.146/kd/#/Dashboard',
/**
* @description 挑战模式子系统链接
*/
subSystem2: location.host.includes('116.63.168.79') ? 'http://116.63.168.79/kdChallenge/#/Dashboard' : 'https://finance.uestc.cn/kdChallenge/#/Dashboard',
subSystem2: location.host.includes('116.63.168.79') ? 'http://116.63.168.79/kdChallenge/#/Dashboard' : 'http://122.9.154.146/kdChallenge/#/Dashboard',
/**
* @description 期货模式
*/
subSystem3: location.host.includes('116.63.168.79') ? 'http://116.63.168.79/future/#/Dashboard' : 'https://finance.uestc.cn//future/#/Dashboard',
/**
* @description 期货套利模式
*/
subSystem4: location.host.includes('116.63.168.79') ? 'http://116.63.168.79/futureArbitrage/#/Dashboard' : 'https://finance.uestc.cn/futureArbitrage/#/Dashboard',
subSystem3: location.host.includes('116.63.168.79') ? 'http://116.63.168.79/future/#/Dashboard' : 'http://122.9.154.146/future/#/Dashboard',
/**
* @description 专家账号
*/
studentIds: [1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513],
/**
* @description 半个小时未操作自动退出登录时间
*/
autoLogoutTime: 1800000,
studentIds: [1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513]
}

@ -1,21 +1,17 @@
import axios from 'axios';
// let host = 'http://192.168.31.125:9090'//林
// let host = 'http://192.168.31.151:9090'//榕
// let host = 'http://192.168.31.137:9090'//陈
// let host = 'http://192.168.31.205:9090'//杨
// let host = 'http://122.9.154.146'
// let host = 'https://116.63.168.79/'//学校内网
// let host = 'http://192.168.242.218'//学校内网
let host = ''
if(process.env.NODE_ENV === 'development'){
// host = 'http://116.63.168.79'
host = 'https://finance.uestc.cn'
host = 'http://122.9.154.146'
}
export default {
logins: `${host}/liuwanr/userInfo/logins`, //登录
logout: `${host}/liuwanr/userInfo/logout`,//退出登录
resetUserPwd: `${host}/liuwanr/userInfo/resetUserPwd`, //更改密码
isRequiredReset: `${host}/liuwanr/userInfo/isRequiredReset`, //密码是否为默认密码
logins: `${host}/liuwanr/userInfo/logins`, //登录 
getAccountPassword: `${host}/evaluation/tms/userInfo/getAccountPassword`, //获取账号密码
queryToken: `${host}/liuwanr/userInfo/queryToken`,
save: `${host}/evaluation/tms/userInfo/add`, //注册
@ -33,7 +29,6 @@ export default {
queryProvince: `${host}/liuwanr/province/queryProvince`, //查询省份
queryCity: `${host}/liuwanr/city/queryCity`, //查询城市
querySchoolData: `${host}/liuwanr/customer/querySchool`, //根据学校名称查询学校信息
loginSchoolPerson: `${host}/liuwanr/userInfo/loginSchoolPerson`, //校内人员登录认证
findPasswordByEmail: `${host}/evaluation/tms/userInfo/findPasswordByEmail`,
findPasswordByPhone: `${host}/evaluation/tms/userInfo/findPasswordByPhone`,
@ -44,6 +39,7 @@ export default {
getAccessNum:`${host}/evaluation/tms/userInfo/getAccessNum`,//获取项目访问量
getValidateCode:`${host}/evaluation/tms/userInfo/getValidateCode`,//获取图形验证码
examinePassword:`${host}/evaluation/tms/user/examinePassword`,//更换密码
userinfoUpdate:`${host}/evaluation/tms/user/update`,//个人中心信息修改
userinfo:`${host}/evaluation/tms/user/userinfo`,//个人中心信息展示

@ -2,8 +2,6 @@ import config from '@/config'
import store from '@/store'
import api from '@/utils/api'
import {get} from '@/utils/http'
import router from '@/router/index.js';
import { Message } from 'element-ui'
const pad2 = str => ('0' + str).substr(-2)
function fMoney (s, n) {
@ -171,8 +169,6 @@ function toSubSystem(className = '',id = '',classId = '',pattern = ''){
sessionStorage.setItem("kdAssessmentId",id);//竞赛id
sessionStorage.setItem("classId",classId);//班级id
sessionStorage.setItem("userId",store.state.userId);//用户id
sessionStorage.setItem("pattern",pattern);//用户id
// 空为练习,不是空即为考核或者竞赛,
if(sessionStorage.getItem('id') != ''){
//如果班级id不为空,即为考核模式,否则为竞赛模式
let source = ''
@ -194,24 +190,11 @@ function toSubSystem(className = '',id = '',classId = '',pattern = ''){
location.href = pattern === 0 ? config.subSystem1 : config.subSystem2
})
}else{
switch(pattern)
{
case 0:
location.href = config.subSystem1
sessionStorage.setItem("id",1);
break;
case 1:
location.href = config.subSystem2
sessionStorage.setItem("id",2);
break;
case 2:
//如果session中存在model,即为期货,否则为期权
if(sessionStorage.getItem('model')){
location.href = config.subSystem3
sessionStorage.setItem("id",67);
break;
case 3:
location.href = config.subSystem4
sessionStorage.setItem("id",66);
break;
}else{
location.href = pattern === 0 ? config.subSystem1 : config.subSystem2
}
}
}
@ -237,12 +220,6 @@ function logout(){
location.reload()
}
//返回上一页
function goBack(){
router.go(-1)
}
function autoLogout(){
let lastTime = new Date().getTime()
document.onmousedown = () => {
@ -262,7 +239,6 @@ export default{
orderfounder,
projectPermissions,
orderassesmentState,
goBack,
fMoney,
fMoney2,
toDateTime,

@ -37,15 +37,6 @@ axios.interceptors.request.use(config => {
})
return Promise.reject(err);
})
// axios.interceptors.response.use(
// response => {
// consol.log('响应头=>',response)
// if (response.status === 200) {
// return Promise.resolve(response);
// } else {
// return Promise.reject(response);
// }
// })
// 响应拦截器
// axios.interceptors.response.use(

Loading…
Cancel
Save