token改成存sessionStorage里面(保证一个账号只能在一个浏览器的tab页保持登录状态,由此避免子系统的tab页多开)

dev_202412
yujialong 3 months ago
parent b7142db102
commit 961ed45cc3
  1. 28
      src/App.vue
  2. 62
      src/components/quill/index.vue
  3. 2
      src/components/upload/config.js
  4. 6
      src/layouts/header/index.vue
  5. 8
      src/layouts/home/index.vue
  6. 4
      src/layouts/navbar/index.vue
  7. 2
      src/pages/account/login/index.vue
  8. 2
      src/pages/account/redirect/index.vue
  9. 6
      src/pages/activity/details/index.vue
  10. 624
      src/pages/activity/list/index.vue
  11. 414
      src/pages/activity/manage/add/index.vue
  12. 97
      src/pages/activity/manage/manage/matchSignup.vue
  13. 67
      src/pages/activity/manage/manage/notice.vue
  14. 228
      src/pages/activity/manage/manage/noticeDetail.vue
  15. 2
      src/pages/ass/list/index.vue
  16. 512
      src/pages/cityPartner/list/index.vue
  17. 613
      src/pages/course/details/index.vue
  18. 2
      src/pages/course/list/index.vue
  19. 416
      src/pages/devPlatform/list/index.vue
  20. 1624
      src/pages/index/list/index.vue
  21. 2
      src/pages/index/zxy/index.vue
  22. 10
      src/pages/match/details/index.vue
  23. 10
      src/pages/match/list/index.vue
  24. 1034
      src/pages/product/list/index.vue
  25. 2
      src/pages/record/details/index.vue
  26. 2
      src/pages/record/list/index.vue
  27. 2
      src/pages/record/theoryReport/index.vue
  28. 2
      src/pages/screen/index.vue
  29. 94
      src/pages/setting/person/index.vue
  30. 6
      src/pages/station/preview/index.vue
  31. 4
      src/pages/theoryExam/index.vue
  32. 12
      src/pages/touristMatch/list/index.vue
  33. 2
      src/plugins/requests/index.js
  34. 2
      src/router/permission.js
  35. 2
      src/setting.js
  36. 2
      src/store/modules/user.js

@ -1,7 +1,7 @@
<template> <template>
<div id="app"> <div id="app">
<router-view></router-view> <router-view></router-view>
</div> </div>
</template> </template>
<script> <script>
@ -9,17 +9,17 @@ import Setting from "@/setting";
import util from "@/libs/util"; import util from "@/libs/util";
export default { export default {
name: "App", name: "App",
created() { created () {
//localStorage //localStorage
if (util.local.get(Setting.storeKey)) { if (util.local.get(Setting.storeKey)) {
this.$store.replaceState(Object.assign({}, this.$store.state, util.local.get(Setting.storeKey))); this.$store.replaceState(Object.assign({}, this.$store.state, util.local.get(Setting.storeKey)));
}
//vuexlocalStorage
window.addEventListener("beforeunload", () => {
util.local.get(Setting.tokenKey) && util.local.set(Setting.storeKey, this.$store.state);
});
} }
//vuexlocalStorage
window.addEventListener("beforeunload", () => {
util.session.get(Setting.tokenKey) && util.local.set(Setting.storeKey, this.$store.state);
});
}
}; };
</script> </script>

@ -1,19 +1,11 @@
<template> <template>
<div class="quill" <div class="quill" ref="quill" :class="classes">
ref="quill" <div ref="editor" :style="styles" v-loading="loading"></div>
:class="classes">
<div ref="editor"
:style="styles"
v-loading="loading"></div>
<Upload :max-size="1000" <Upload :max-size="1000" :limit="100" @beforeUpload="beforeUpload" @onSuccess="editorUploadSuccess"
:limit="100" style="display: none">
@beforeUpload="beforeUpload"
@onSuccess="editorUploadSuccess"
style="display: none">
<div slot="trigger"> <div slot="trigger">
<el-button :id="'editorUpload' + index" <el-button :id="'editorUpload' + index" type="primary">点击上传</el-button>
type="primary">点击上传</el-button>
</div> </div>
</Upload> </Upload>
</div> </div>
@ -75,7 +67,7 @@ export default {
const that = this const that = this
return { return {
headers: { headers: {
token: util.local.get(Setting.tokenKey) token: util.session.get(Setting.tokenKey)
}, },
Quill: null, Quill: null,
currentValue: "", currentValue: "",
@ -236,31 +228,33 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.quill-no-border { .quill-no-border {
.ql-toolbar.ql-snow { .ql-toolbar.ql-snow {
border: none; border: none;
border-bottom: 1px solid #e8eaec; border-bottom: 1px solid #e8eaec;
} }
.ql-container.ql-snow { .ql-container.ql-snow {
border: none; border: none;
} }
} }
.else { .else {
.ql-toolbar.ql-snow { .ql-toolbar.ql-snow {
height: 0; height: 0;
overflow: hidden; overflow: hidden;
padding: 0; padding: 0;
border-top: 0; border-top: 0;
} }
} }
/deep/.ql-snow { /deep/.ql-snow {
position: relative; position: relative;
.ql-tooltip {
position: absolute !important; .ql-tooltip {
top: 10px !important; position: absolute !important;
left: 10px !important; top: 10px !important;
transform: translateY(10px); left: 10px !important;
} transform: translateY(10px);
}
} }
</style> </style>

@ -12,7 +12,7 @@ export default async function () {
RE = JSON.parse(RE) RE = JSON.parse(RE)
} else { } else {
Util.local.remove(Setting.storeKey) Util.local.remove(Setting.storeKey)
Util.local.remove(Setting.tokenKey) Util.session.remove(Setting.tokenKey)
Util.errorMsg('登录过期,请重新登录!') Util.errorMsg('登录过期,请重新登录!')
router.replace({ router.replace({
path: '/login' path: '/login'

@ -80,7 +80,7 @@ export default {
isDev: Setting.isDev, isDev: Setting.isDev,
isZj: location.host === '10.60.32.76', // isZj: location.host === '10.60.32.76', //
isSq: Setting.isSq, isSq: Setting.isSq,
token: Util.local.get(Setting.tokenKey), // token token: Util.session.get(Setting.tokenKey), // token
serverToken: Util.local.get('oc_server_token'), // token serverToken: Util.local.get('oc_server_token'), // token
cName: Util.cookies.get('customerName'), cName: Util.cookies.get('customerName'),
isIndex: Setting.whiteList.find(e => e === this.$route.path), // isIndex: Setting.whiteList.find(e => e === this.$route.path), //
@ -102,7 +102,7 @@ export default {
]) ])
}, },
mounted () { mounted () {
if (Util.local.get(Setting.tokenKey)) { if (Util.session.get(Setting.tokenKey)) {
if (this.showHeader) { if (this.showHeader) {
this.getSystemDetail() this.getSystemDetail()
this.getNotice() this.getNotice()
@ -178,7 +178,7 @@ export default {
// //
heartbeatDetection () { heartbeatDetection () {
this.timer = setInterval(async () => { this.timer = setInterval(async () => {
Util.local.get(Setting.tokenKey) ? await this.$get(this.api.heartbeatDetection) : clearInterval(this.timer) Util.session.get(Setting.tokenKey) ? await this.$get(this.api.heartbeatDetection) : clearInterval(this.timer)
}, 58 * 1000) }, 58 * 1000)
}, },

@ -123,7 +123,7 @@ export default {
this.autoLogout() this.autoLogout()
this.noticed || this.getMatchStatus() // 0 this.noticed || this.getMatchStatus() // 0
this.logView || this.getLogStatus() // logViewfalse this.logView || this.getLogStatus() // logViewfalse
util.local.get(Setting.tokenKey) && this.handleRealName() util.session.get(Setting.tokenKey) && this.handleRealName()
}, },
methods: { methods: {
...mapMutations("user", [ ...mapMutations("user", [
@ -146,7 +146,7 @@ export default {
}, },
// () // ()
getMatchStatus () { getMatchStatus () {
util.local.get(Setting.tokenKey) && this.$post(this.api.promptRemoval).then(({ prompt }) => { util.session.get(Setting.tokenKey) && this.$post(this.api.promptRemoval).then(({ prompt }) => {
this.SET_NOTICE() this.SET_NOTICE()
prompt && util.errorMsg(prompt) prompt && util.errorMsg(prompt)
}).catch(res => { }) }).catch(res => { })
@ -164,7 +164,7 @@ export default {
}, },
// //
getLogStatus () { getLogStatus () {
util.local.get(Setting.tokenKey) && this.$get(this.api.logNotification, { util.session.get(Setting.tokenKey) && this.$get(this.api.logNotification, {
platformId: Setting.platformId platformId: Setting.platformId
}).then(({ notification }) => { }).then(({ notification }) => {
if (notification) { if (notification) {
@ -200,7 +200,7 @@ export default {
}; };
setInterval(() => { setInterval(() => {
if (util.local.get(Setting.tokenKey) && (new Date().getTime() - lastTime) > Setting.autoLogoutTime) { if (util.session.get(Setting.tokenKey) && (new Date().getTime() - lastTime) > Setting.autoLogoutTime) {
util.errorMsg("由于您已经有三个小时没有操作,系统自动登出,请重新登录。页面刷新到登录页。"); util.errorMsg("由于您已经有三个小时没有操作,系统自动登出,请重新登录。页面刷新到登录页。");
setTimeout(this.logout, 1500); setTimeout(this.logout, 1500);
} }

@ -30,7 +30,7 @@ export default {
}, },
data () { data () {
return { return {
token: util.local.get(Setting.tokenKey), token: util.session.get(Setting.tokenKey),
isTourist: false, isTourist: false,
active: '/' + this.$route.path.split('/')[1] + '/list', active: '/' + this.$route.path.split('/')[1] + '/list',
// //
@ -169,7 +169,7 @@ export default {
// //
window.open(this.$router.resolve('/screen').href) window.open(this.$router.resolve('/screen').href)
} else { } else {
const token = util.local.get(Setting.tokenKey) const token = util.session.get(Setting.tokenKey)
// //
if (!token && this.loginedMenu.find(e => e.id === id)) { if (!token && this.loginedMenu.find(e => e.id === id)) {
location.reload() location.reload()

@ -393,7 +393,7 @@ export default {
}, },
// //
setLogin () { setLogin () {
Util.local.set(Setting.tokenKey, this.token, Setting.tokenExpires) Util.session.set(Setting.tokenKey, this.token)
this.getOss() this.getOss()
Util.cookies.remove('serverLogin') Util.cookies.remove('serverLogin')
this.reloadIndex() this.reloadIndex()

@ -143,7 +143,7 @@ export default {
}, },
// //
setLogin () { setLogin () {
Util.local.set(Setting.tokenKey, this.token, Setting.tokenExpires) Util.session.set(Setting.tokenKey, this.token)
this.getOss() this.getOss()
Util.cookies.remove('serverLogin') Util.cookies.remove('serverLogin')
this.reloadIndex() this.reloadIndex()

@ -107,7 +107,7 @@ export default {
data () { data () {
return { return {
routes: [], routes: [],
token: util.local.get(Setting.tokenKey), token: util.session.get(Setting.tokenKey),
id: +this.$route.query.id, id: +this.$route.query.id,
end: '', end: '',
status: '', status: '',
@ -316,7 +316,7 @@ export default {
// python // python
toPython () { toPython () {
const form = this.curStage const form = this.curStage
let token = util.local.get(Setting.tokenKey); let token = util.session.get(Setting.tokenKey);
util.cookies.set('assessmentId', '', -1) util.cookies.set('assessmentId', '', -1)
util.cookies.set('startTime', '', -1) util.cookies.set('startTime', '', -1)
util.cookies.set('stopTime', '', -1) util.cookies.set('stopTime', '', -1)
@ -345,7 +345,7 @@ export default {
const { systemId, projectId, cid, stageId } = this.curStage const { systemId, projectId, cid, stageId } = this.curStage
const competitionId = form.id const competitionId = form.id
const teamId = form.competitionRegistration.teamId const teamId = form.competitionRegistration.teamId
let token = util.local.get(Setting.tokenKey); let token = util.session.get(Setting.tokenKey);
if (systemId == 11) { if (systemId == 11) {
// //
location.href = `${Setting.systemPath}/#/index/list?curriculumName=${this.curriculumName}&token=${token}&cid=${cid}&systemId=${systemId}&projectId=${projectId}&competitionId=${competitionId}&stageId=${stageId}&teamId=${teamId}&assessmentId=&classId=&stopTime=&test=true` location.href = `${Setting.systemPath}/#/index/list?curriculumName=${this.curriculumName}&token=${token}&cid=${cid}&systemId=${systemId}&projectId=${projectId}&competitionId=${competitionId}&stageId=${stageId}&teamId=${teamId}&assessmentId=&classId=&stopTime=&test=true`

@ -3,22 +3,16 @@
<div class="search"> <div class="search">
<h6>创业活动</h6> <h6>创业活动</h6>
<div class="input"> <div class="input">
<img src="@/assets/img/search.png" <img src="@/assets/img/search.png" alt="">
alt=""> <input type="text" placeholder="请输入关键词" v-model="keyword">
<input type="text"
placeholder="请输入关键词"
v-model="keyword">
</div> </div>
</div> </div>
<div class="main"> <div class="main">
<div class="center-wrap list-inner"> <div class="center-wrap list-inner">
<ul v-if="token" <ul v-if="token" class="nav">
class="nav"> <li :class="{ active: form.whetherToSignUp === item.id }" v-for="(item, index) in typeList" :key="index"
<li :class="{ active: form.whetherToSignUp === item.id }" @click="changeType(item.id)">{{ item.name }}
v-for="(item, index) in typeList"
:key="index"
@click="changeType(item.id)">{{ item.name }}
</li> </li>
</ul> </ul>
<div class="list-wrap"> <div class="list-wrap">
@ -27,63 +21,55 @@
<div> <div>
<dl> <dl>
<dt>筛选排序</dt> <dt>筛选排序</dt>
<dd v-for="(item, i) in sorts" <dd v-for="(item, i) in sorts" :key="i" :class="{ active: form.filterSort == item.id }"
:key="i" @click="changeSort(item.id)">{{ item.name }}</dd>
:class="{active: form.filterSort == item.id}"
@click="changeSort(item.id)">{{ item.name }}</dd>
</dl> </dl>
</div> </div>
<el-button type="primary" <el-button type="primary" @click="toManage">我的项目</el-button>
@click="toManage">我的项目</el-button>
</div> </div>
<div class="list"> <div class="list">
<template v-if="listData.length"> <template v-if="listData.length">
<ul> <ul>
<li v-for="(item,index) in listData" <li v-for="(item, index) in listData" :key="index" @click="toDetail(item)">
:key="index"
@click="toDetail(item)">
<div class="left"> <div class="left">
<div class="cover"> <div class="cover">
<img :src="item.coverUrl || 'https://huoran.oss-cn-shenzhen.aliyuncs.com/20230515/jpg/1657937339328520192.jpg'" <img
alt=""> :src="item.coverUrl || 'https://huoran.oss-cn-shenzhen.aliyuncs.com/20230515/jpg/1657937339328520192.jpg'"
alt="">
</div> </div>
<div class="info"> <div class="info">
<div class="title">{{ item.projectName }}</div> <div class="title">{{ item.projectName }}</div>
<div class="metas"> <div class="metas">
<div> <div>
<span class="label">报名时间</span><span class="val">{{ item.signUpStartTime}} ~ {{ item.signUpEndTime }}</span> <span class="label">报名时间</span><span class="val">{{ item.signUpStartTime }} ~ {{
item.signUpEndTime }}</span>
</div> </div>
<div> <div>
<span class="label">项目时间</span><span class="val">{{ item.playStartTime}} ~ {{ item.playEndTime }}</span> <span class="label">项目时间</span><span class="val">{{ item.playStartTime }} ~ {{
item.playEndTime }}</span>
</div> </div>
<template v-if="item.initiator"> <template v-if="item.initiator">
<div :class="{'flex-top': item.initiator.split(',').length > 1}"> <div :class="{ 'flex-top': item.initiator.split(',').length > 1 }">
<span class="label">发起方&emsp;</span> <span class="label">发起方&emsp;</span>
<span class="val">{{ item.initiator }}</span> <span class="val">{{ item.initiator }}</span>
</div> </div>
</template> </template>
<div class="m-t-20" <div class="m-t-20" @click.stop="follow(item)">
@click.stop="follow(item)">
<template v-if="item.collectionStatus"> <template v-if="item.collectionStatus">
<img class="m-r-5" <img class="m-r-5" src="@/assets/img/love2.png" alt="">
src="@/assets/img/love2.png"
alt="">
{{ item.collectorsNum }}人关注 {{ item.collectorsNum }}人关注
</template> </template>
<img v-else <img v-else src="@/assets/img/love1.png" alt="">
src="@/assets/img/love1.png"
alt="">
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="right"> <div class="right">
<p class="status" <p class="status"
:class="{wait: item.status == 0,signing: item.status == 2,signed: item.status == 1,playing: item.status == 4,finish: item.status == 3 || item.status == 4}" :class="{ wait: item.status == 0, signing: item.status == 2, signed: item.status == 1, playing: item.status == 4, finish: item.status == 3 || item.status == 4 }"
@click.stop="signup(item)">{{ statusList[item.status] }}</p> @click.stop="signup(item)">{{ statusList[item.status] }}</p>
<p class="end-text" <p class="end-text" v-if="item.end">
v-if="item.end">
距离{{ endList[item.status] }}还有 距离{{ endList[item.status] }}还有
<em>{{ item.end }}</em> <em>{{ item.end }}</em>
</p> </p>
@ -91,20 +77,15 @@
</li> </li>
</ul> </ul>
<div class="pagination"> <div class="pagination">
<el-pagination background <el-pagination background layout="total, prev, pager, next" :total="totals"
layout="total, prev, pager, next" @current-change="handleCurrentChange" :current-page="page" :page-size="pageSize">
:total="totals"
@current-change="handleCurrentChange"
:current-page="page"
:page-size="pageSize">
</el-pagination> </el-pagination>
</div> </div>
</template> </template>
<template v-else> <template v-else>
<div class="empty"> <div class="empty">
<div> <div>
<img src="@/assets/img/none.png" <img src="@/assets/img/none.png" alt="">
alt="">
<p>暂无赛事</p> <p>暂无赛事</p>
</div> </div>
</div> </div>
@ -114,24 +95,15 @@
</div> </div>
</div> </div>
<el-dialog title="报名" <el-dialog title="报名" :visible.sync="signupVisible" :close-on-click-modal="false" width="300px">
:visible.sync="signupVisible"
:close-on-click-modal="false"
width="300px">
<el-form class="dia-form"> <el-form class="dia-form">
<el-form-item> <el-form-item>
<el-input placeholder="请输入4位数大赛邀请码" <el-input placeholder="请输入4位数大赛邀请码" maxlength="4" v-model="invitationCode"></el-input>
maxlength="4"
v-model="invitationCode"></el-input>
</el-form-item> </el-form-item>
</el-form> </el-form>
<span slot="footer" <span slot="footer" class="dialog-footer">
class="dialog-footer"> <el-button size="small" type="primary" @click="signupSubmit">报名</el-button>
<el-button size="small" <el-button size="small" @click="signupVisible = false">取消</el-button>
type="primary"
@click="signupSubmit">报名</el-button>
<el-button size="small"
@click="signupVisible = false">取消</el-button>
</span> </span>
</el-dialog> </el-dialog>
</div> </div>
@ -146,7 +118,7 @@ export default {
data () { data () {
return { return {
timer: null, timer: null,
token: util.local.get(Setting.tokenKey), token: util.session.get(Setting.tokenKey),
statusList: ["待报名", "取消报名", "马上报名", "报名截止", "已结束"], statusList: ["待报名", "取消报名", "马上报名", "报名截止", "已结束"],
endList: ["报名开始", "报名截止", "报名截止", "项目开始", "项目结束"], endList: ["报名开始", "报名截止", "报名截止", "项目开始", "项目结束"],
typeList: [ typeList: [
@ -377,282 +349,314 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.search { .search {
position: relative;
padding: 100px 0 130px;
text-align: center;
background: url(../../../assets/img/activity-bg.jpg) 0 0/100% 100% no-repeat;
h6 {
margin-bottom: 25px;
font-size: 26px;
color: #fff;
}
.input {
position: relative; position: relative;
padding: 100px 0 130px; width: 700px;
text-align: center; margin: 0 auto;
background: url(../../../assets/img/activity-bg.jpg) 0 0/100% 100% no-repeat; }
h6 {
margin-bottom: 25px; img {
font-size: 26px; position: absolute;
color: #fff; top: 19px;
} left: 14px;
.input { }
position: relative;
width: 700px; input {
margin: 0 auto; width: 100%;
} height: 62px;
img { line-height: 62px;
position: absolute; padding: 0 50px;
top: 19px; font-size: 18px;
left: 14px; color: #333;
} border: 0;
input { outline: none;
width: 100%; border-radius: 4px;
height: 62px; }
line-height: 62px;
padding: 0 50px;
font-size: 18px;
color: #333;
border: 0;
outline: none;
border-radius: 4px;
}
} }
.main { .main {
background: url(../../../assets/img/match-bg1.png) (0px 95px) / auto auto no-repeat, background: url(../../../assets/img/match-bg1.png) (0px 95px) / auto auto no-repeat,
url(../../../assets/img/match-bg2.png) (98% bottom) / auto auto no-repeat; url(../../../assets/img/match-bg2.png) (98% bottom) / auto auto no-repeat;
.center-wrap {
width: 1078px; .center-wrap {
} width: 1078px;
}
} }
.filter { .filter {
display: flex;
justify-content: space-between;
width: 100%;
padding: 0 20px;
margin-bottom: 20px;
background-color: #fff;
dl {
display: flex; display: flex;
justify-content: space-between;
width: 100%;
padding: 0 20px;
margin-bottom: 20px;
background-color: #fff;
dl {
display: flex;
align-items: center;
margin: 20px 0;
dt {
color: #333;
font-size: 16px;
font-weight: 600;
white-space: nowrap;
}
dd {
padding: 5px 15px;
color: #6a6a6a;
font-size: 16px;
white-space: nowrap;
cursor: pointer;
border-radius: 4px;
&.active {
color: $main-color;
background-color: #e6f0ff;
}
}
}
}
.select-wrap {
display: inline-flex;
align-items: center; align-items: center;
margin: 0 10px; margin: 20px 0;
.label {
margin-right: 10px; dt {
white-space: nowrap; color: #333;
font-size: 16px;
font-weight: 600;
white-space: nowrap;
} }
.el-select {
width: 130px; dd {
padding: 5px 15px;
color: #6a6a6a;
font-size: 16px;
white-space: nowrap;
cursor: pointer;
border-radius: 4px;
&.active {
color: $main-color;
background-color: #e6f0ff;
}
} }
}
}
.select-wrap {
display: inline-flex;
align-items: center;
margin: 0 10px;
.label {
margin-right: 10px;
white-space: nowrap;
}
.el-select {
width: 130px;
}
} }
.list-inner { .list-inner {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: flex-start; align-items: flex-start;
} }
.nav { .nav {
width: 156px; width: 156px;
text-align: right; text-align: right;
overflow: hidden; overflow: hidden;
background-color: #fff; background-color: #fff;
li {
padding: 0 24px;
font-size: 16px;
color: #666;
line-height: 48px;
border-bottom: 2px solid #f3f6fa;
border-right: 2px solid transparent;
cursor: pointer;
&:before {
content: '';
display: inline-block;
width: 3px;
height: 3px;
margin-right: 10px;
vertical-align: middle;
border-radius: 50%;
background-color: #666;
}
&.active {
color: $main-color;
border-right-color: $main-color;
&:before {
background-color: $main-color;
}
}
}
}
.list-wrap {
width: calc(100% - 180px);
margin-left: 24px;
.list {
li { li {
padding: 0 24px; display: flex;
font-size: 16px; justify-content: space-between;
color: #666; padding: 16px;
line-height: 48px; margin-bottom: 12px;
border-bottom: 2px solid #f3f6fa; transition: all 0.3s;
border-right: 2px solid transparent; cursor: pointer;
cursor: pointer; border-radius: 6px;
&:before { background-color: #fff;
content: '';
display: inline-block; .right {
width: 3px; display: flex;
height: 3px; flex-direction: column;
margin-right: 10px; justify-content: center;
vertical-align: middle; align-items: flex-end;
border-radius: 50%; flex: 1;
background-color: #666;
.status {
max-width: 120px;
padding: 0 23px;
line-height: 34px;
font-size: 14px;
color: #fff;
white-space: nowrap;
background-color: #52c41a;
border-radius: 4px;
@include ellipsis();
&.wait {
background-color: #faad14;
}
&.signing {
background-color: $main-color;
}
&.signed {
background-color: #52c41a;
}
&.playing {
background-color: #f96d6d;
}
&.finish {
background-color: #ccc;
}
}
.btn {
padding: 12px 20px;
color: #fff;
background-color: #cb221c;
border-radius: 4px;
cursor: pointer;
&:hover {
opacity: 0.9;
}
&.disabled {
cursor: not-allowed;
background-color: #969696;
}
}
.end-text {
margin-top: 10px;
color: rgba(0, 0, 0, 0.65);
font-size: 12px;
white-space: nowrap;
em {
font-style: normal;
color: #f00;
}
} }
&.active { }
color: $main-color;
border-right-color: $main-color; &:hover {
&:before { .left {
background-color: $main-color; .info {
.title {
color: $main-color;
} }
}
} }
}
} }
}
.list-wrap { .left {
width: calc(100% - 180px); position: relative;
margin-left: 24px; display: inline-flex;
.list { width: 430px;
li {
.cover {
img {
width: 275px;
height: 175px;
border-radius: 6px;
}
}
.info {
margin-left: 16px;
.title {
margin-bottom: 10px;
font-size: 20px;
font-weight: 500;
color: #0b1d30;
word-break: break-all;
@include mul-ellipsis(2);
}
.metas {
font-size: 14px;
color: #666;
div {
display: flex; display: flex;
justify-content: space-between; align-items: center;
padding: 16px; margin-bottom: 5px;
margin-bottom: 12px;
transition: all 0.3s;
cursor: pointer;
border-radius: 6px;
background-color: #fff;
.right {
display: flex;
flex-direction: column;
justify-content: center;
align-items: flex-end;
flex: 1;
.status {
max-width: 120px;
padding: 0 23px;
line-height: 34px;
font-size: 14px;
color: #fff;
white-space: nowrap;
background-color: #52c41a;
border-radius: 4px;
@include ellipsis();
&.wait {
background-color: #faad14;
}
&.signing {
background-color: $main-color;
}
&.signed {
background-color: #52c41a;
}
&.playing {
background-color: #f96d6d;
}
&.finish {
background-color: #ccc;
}
}
.btn {
padding: 12px 20px;
color: #fff;
background-color: #cb221c;
border-radius: 4px;
cursor: pointer;
&:hover {
opacity: 0.9;
}
&.disabled {
cursor: not-allowed;
background-color: #969696;
}
}
.end-text {
margin-top: 10px;
color: rgba(0, 0, 0, 0.65);
font-size: 12px;
white-space: nowrap;
em {
font-style: normal;
color: #f00;
}
}
}
&:hover { &.flex-top {
.left { align-items: flex-start;
.info {
.title {
color: $main-color;
}
}
}
} }
}
.label,
.val {
font-size: 14px;
color: #666;
white-space: nowrap;
}
.val {
max-width: 350px;
text-overflow: ellipsis;
overflow: hidden;
}
.a-line {
display: block;
}
} }
.left {
position: relative;
display: inline-flex;
width: 430px;
.cover {
img {
width: 275px;
height: 175px;
border-radius: 6px;
}
}
.info { .desc {
margin-left: 16px; font-size: 14px;
.title {
margin-bottom: 10px;
font-size: 20px;
font-weight: 500;
color: #0b1d30;
word-break: break-all;
@include mul-ellipsis(2);
}
.metas {
font-size: 14px;
color: #666;
div {
display: flex;
align-items: center;
margin-bottom: 5px;
&.flex-top {
align-items: flex-start;
}
}
.label,
.val {
font-size: 14px;
color: #666;
white-space: nowrap;
}
.val {
max-width: 350px;
text-overflow: ellipsis;
overflow: hidden;
}
.a-line {
display: block;
}
}
.desc {
font-size: 14px;
}
}
} }
}
} }
}
} }
/deep/.dia-form { /deep/.dia-form {
.w-100 { .w-100 {
width: 100%; width: 100%;
} }
.tips {
display: flex; .tips {
justify-content: center; display: flex;
align-items: center; justify-content: center;
} align-items: center;
}
} }
</style> </style>

@ -1,163 +1,96 @@
<template> <template>
<div> <div>
<breadcrumb v-if="!id" <breadcrumb v-if="!id" :routes.sync="routes" />
:routes.sync="routes" />
<div class="page"> <div class="page">
<div class="page-content"> <div class="page-content">
<el-form label-width="170px" <el-form label-width="170px" label-suffix=":" size="small">
label-suffix=":"
size="small">
<el-form-item label="项目封面(选填)"> <el-form-item label="项目封面(选填)">
<el-upload class="avatar-uploader" <el-upload class="avatar-uploader" accept=".jpg,.png,.jpeg,.gif" :limit="1" :on-exceed="handleExceed"
accept=".jpg,.png,.jpeg,.gif" :before-remove="beforeRemove" :on-remove="handleRemove" :on-error="uploadError" action=""
:limit="1" :http-request="handleRequest">
:on-exceed="handleExceed" <img v-if="form.coverUrl" :src="form.coverUrl" class="avatar">
:before-remove="beforeRemove" <div class="uploader-default" v-else>
:on-remove="handleRemove"
:on-error="uploadError"
action=""
:http-request="handleRequest">
<img v-if="form.coverUrl"
:src="form.coverUrl"
class="avatar">
<div class="uploader-default"
v-else>
<i class="el-icon-plus"></i> <i class="el-icon-plus"></i>
<p>上传封面</p> <p>上传封面</p>
</div> </div>
<div slot="tip" <div slot="tip" class="el-upload__tip">
class="el-upload__tip">
<p>展示宽度为220高度140JPG/PNG/GIF3MB以内</p> <p>展示宽度为220高度140JPG/PNG/GIF3MB以内</p>
</div> </div>
</el-upload> </el-upload>
</el-form-item> </el-form-item>
<el-form-item label="项目封面长图(选填)"> <el-form-item label="项目封面长图(选填)">
<el-upload class="avatar-uploader avatar-uploader-lg" <el-upload class="avatar-uploader avatar-uploader-lg" accept=".jpg,.png,.jpeg,.gif" :limit="1"
accept=".jpg,.png,.jpeg,.gif" :on-exceed="handleExceed" :before-remove="beforeRemove" :on-remove="handleCarouselRemove"
:limit="1" :on-error="uploadError" action="" :http-request="handleRequestLg">
:on-exceed="handleExceed" <img v-if="form.carouselUrl" :src="form.carouselUrl" class="avatar-lg">
:before-remove="beforeRemove" <div class="uploader-default" v-else>
:on-remove="handleCarouselRemove"
:on-error="uploadError"
action=""
:http-request="handleRequestLg">
<img v-if="form.carouselUrl"
:src="form.carouselUrl"
class="avatar-lg">
<div class="uploader-default"
v-else>
<i class="el-icon-plus"></i> <i class="el-icon-plus"></i>
<p>上传封面</p> <p>上传封面</p>
</div> </div>
<div slot="tip" <div slot="tip" class="el-upload__tip">
class="el-upload__tip">
<p>展示宽度为1920高度300JPG/PNG/GIF3MB以内</p> <p>展示宽度为1920高度300JPG/PNG/GIF3MB以内</p>
</div> </div>
</el-upload> </el-upload>
</el-form-item> </el-form-item>
<el-form-item class="req" <el-form-item class="req" label="项目名称">
label="项目名称">
<div class="d-inline-block"> <div class="d-inline-block">
<el-input placeholder="请输入项目名称" <el-input placeholder="请输入项目名称" v-model="form.projectName" clearable></el-input>
v-model="form.projectName"
clearable></el-input>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item class="req" <el-form-item class="req" label="发起方">
label="发起方">
<div class="inline-input"> <div class="inline-input">
<div class="input-wrap" <div class="input-wrap" v-for="(item, index) in sponsorList" :key="index">
v-for="(item,index) in sponsorList" <el-input placeholder="发起方名称" v-model="sponsorList[index]"></el-input>
:key="index"> <i v-if="sponsorList.length > 1" class="remove" @click="delSponsor(index)"></i>
<el-input placeholder="发起方名称" <button v-if="index == 0" class="add-btn" type="button" @click="addSponsor">
v-model="sponsorList[index]"></el-input>
<i v-if="sponsorList.length > 1"
class="remove"
@click="delSponsor(index)"></i>
<button v-if="index == 0"
class="add-btn"
type="button"
@click="addSponsor">
<i class="el-icon-plus"></i> <i class="el-icon-plus"></i>
<span>添加</span> <span>添加</span>
</button> </button>
</div> </div>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item class="req" <el-form-item class="req" label="报名时间">
label="报名时间"> <el-date-picker v-model="signupTime" value-format="yyyy-MM-dd HH:mm:ss" type="datetimerange"
<el-date-picker v-model="signupTime" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
value-format="yyyy-MM-dd HH:mm:ss" :picker-options="pickerOptions"></el-date-picker>
type="datetimerange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
:picker-options="pickerOptions"></el-date-picker>
</el-form-item> </el-form-item>
<el-form-item class="req" <el-form-item class="req" label="项目时间">
label="项目时间"> <el-date-picker v-model="playTime" value-format="yyyy-MM-dd HH:mm:ss" type="datetimerange"
<el-date-picker v-model="playTime" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
value-format="yyyy-MM-dd HH:mm:ss" :picker-options="pickerOptions"></el-date-picker>
type="datetimerange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
:picker-options="pickerOptions"></el-date-picker>
</el-form-item> </el-form-item>
<el-form-item class="req" <el-form-item class="req" label="发布范围">
label="发布范围">
<div> <div>
<el-radio v-model="scope" <el-radio v-model="scope" :label="0" disabled>本校内</el-radio>
:label="0"
disabled>本校内</el-radio>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item class="req" <el-form-item class="req" label="报名人数上限">
label="报名人数上限">
<div class="input-center"> <div class="input-center">
<el-input placeholder="请输入人数" <el-input placeholder="请输入人数" v-model.number="form.maximumNumber" type="number"></el-input>
v-model.number="form.maximumNumber"
type="number"></el-input>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item class="req" <el-form-item class="req" label="报名邀请码">
label="报名邀请码"> <div class="input-center" style="width: 550px;">
<div class="input-center" <el-radio v-model="form.isNeedCode" :label="0">不需要</el-radio>
style="width: 550px;"> <el-radio v-model="form.isNeedCode" :label="1">需要</el-radio>
<el-radio v-model="form.isNeedCode" <el-input style="width: 250px" placeholder="请输入4位邀请码或点击随机生成" v-model="form.invitationCode"
:label="0">不需要</el-radio> :disabled="form.isNeedCode === 0"></el-input>
<el-radio v-model="form.isNeedCode" <el-button v-if="form.isNeedCode === 1" @click="randomInv">随机</el-button>
:label="1">需要</el-radio>
<el-input style="width: 250px"
placeholder="请输入4位邀请码或点击随机生成"
v-model="form.invitationCode"
:disabled="form.isNeedCode === 0"></el-input>
<el-button v-if="form.isNeedCode === 1"
@click="randomInv">随机</el-button>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item class="req" <el-form-item class="req" label="项目详情">
label="项目详情"> <quill ref="quill" :border="true" v-model="form.projectDescribe" :height="400" />
<quill ref="quill"
:border="true"
v-model="form.projectDescribe"
:height="400" />
</el-form-item> </el-form-item>
<el-form-item label="附件"> <el-form-item label="附件">
<Upload :limit="5" <Upload :limit="5" :file-list.sync="form.activityFileList" :changeFileList="false"
:file-list.sync="form.activityFileList" :on-remove="handleAnnexRemove" @onSuccess="uploadAnnexSuccess" />
:changeFileList="false"
:on-remove="handleAnnexRemove"
@onSuccess="uploadAnnexSuccess" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<div class="btns"> <div class="btns">
<el-button @click="save(0)">保存</el-button> <el-button @click="save(0)">保存</el-button>
<el-button type="primary" <el-button type="primary" @click="save(1)">发布</el-button>
@click="save(1)">发布</el-button> <el-button type="danger" @click="preview">预览</el-button>
<el-button type="danger"
@click="preview">预览</el-button>
<el-button @click="back">取消</el-button> <el-button @click="back">取消</el-button>
</div> </div>
</div> </div>
@ -186,7 +119,7 @@ export default {
], ],
id: this.$route.query.id || '', id: this.$route.query.id || '',
headers: { headers: {
token: util.local.get(Setting.tokenKey) token: util.session.get(Setting.tokenKey)
}, },
scope: 0, scope: 0,
form: { form: {
@ -458,169 +391,178 @@ export default {
$upload-width: 220px; $upload-width: 220px;
$upload-height: 140px; $upload-height: 140px;
$upload-lg-height: 150px; $upload-lg-height: 150px;
/deep/ .avatar-uploader { /deep/ .avatar-uploader {
.el-upload { .el-upload {
position: relative; position: relative;
width: $upload-width; width: $upload-width;
height: $upload-height; height: $upload-height;
border: 1px dashed #d9d9d9; border: 1px dashed #d9d9d9;
border-radius: 6px; border-radius: 6px;
cursor: pointer; cursor: pointer;
overflow: hidden; overflow: hidden;
&:hover { &:hover {
border-color: #cb221c; border-color: #cb221c;
} }
.uploader-default { .uploader-default {
display: flex; display: flex;
height: $upload-height; height: $upload-height;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
text-align: center; text-align: center;
background: rgba(0, 0, 0, 0.04); background: rgba(0, 0, 0, 0.04);
i { i {
font-size: 20px; font-size: 20px;
font-weight: bold; font-weight: bold;
color: #8c939d; color: #8c939d;
} }
p { p {
margin-top: 10px; margin-top: 10px;
font-size: 14px; font-size: 14px;
color: rgba(0, 0, 0, 0.65); color: rgba(0, 0, 0, 0.65);
line-height: 1; line-height: 1;
} }
}
} }
}
&.avatar-uploader-lg { &.avatar-uploader-lg {
.el-upload { .el-upload {
width: 100%; width: 100%;
max-width: 960px; max-width: 960px;
height: $upload-lg-height; height: $upload-lg-height;
.uploader-default { .uploader-default {
height: $upload-lg-height; height: $upload-lg-height;
} }
}
} }
}
.avatar { .avatar {
display: block; display: block;
width: $upload-width; width: $upload-width;
height: $upload-height; height: $upload-height;
} }
.avatar-lg { .avatar-lg {
display: block; display: block;
width: 100%; width: 100%;
height: $upload-lg-height; height: $upload-lg-height;
} }
.el-upload__tip { .el-upload__tip {
margin-top: 0; margin-top: 0;
p { p {
font-size: 14px; font-size: 14px;
color: rgba(0, 0, 0, 0.45); color: rgba(0, 0, 0, 0.45);
line-height: 1; line-height: 1;
&:first-child { &:first-child {
margin-bottom: 5px; margin-bottom: 5px;
} }
}
} }
}
} }
/deep/ .d-inline-block { /deep/ .d-inline-block {
width: 216px; width: 216px;
.el-select, .el-select,
.el-input { .el-input {
width: 100%; width: 100%;
} }
} }
.inline-input {
.input-wrap {
display: flex;
align-items: center;
margin-bottom: 10px;
.el-input { .inline-input {
display: inline-block; .input-wrap {
width: 216px; display: flex;
margin-right: 8px; align-items: center;
} margin-bottom: 10px;
.remove { .el-input {
width: 16px; display: inline-block;
height: 16px; width: 216px;
background: url('../../../../assets/img/close.png') 0 0 / cover no-repeat; margin-right: 8px;
cursor: pointer;
}
} }
.add-btn { .remove {
margin-left: 32px; width: 16px;
height: 16px;
background: url('../../../../assets/img/close.png') 0 0 / cover no-repeat;
cursor: pointer;
} }
}
.add-btn {
margin-left: 32px;
}
} }
.add-btn { .add-btn {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
width: 216px; width: 216px;
line-height: 32px; line-height: 32px;
font-size: 14px; font-size: 14px;
color: rgba(0, 0, 0, 0.65); color: rgba(0, 0, 0, 0.65);
background-color: transparent; background-color: transparent;
border: 1px dashed rgba(0, 0, 0, 0.15); border: 1px dashed rgba(0, 0, 0, 0.15);
border-radius: 4px; border-radius: 4px;
cursor: pointer; cursor: pointer;
i { i {
margin-right: 8px; margin-right: 8px;
font-size: 14px; font-size: 14px;
font-weight: bold; font-weight: bold;
} }
} }
.range-check { .range-check {
display: inline-block; display: inline-block;
margin: 0 0 10px 10px; margin: 0 0 10px 10px;
} }
/deep/.range-cas { /deep/.range-cas {
.el-tag { .el-tag {
display: none; display: none;
} }
} }
.input-center { .input-center {
display: flex; display: flex;
align-items: center; align-items: center;
width: 216px; width: 216px;
white-space: nowrap; white-space: nowrap;
.el-input {
margin-right: 5px; .el-input {
} margin-right: 5px;
}
} }
.el-steps { .el-steps {
justify-content: center; justify-content: center;
} }
/deep/.req { /deep/.req {
.el-form-item__label { .el-form-item__label {
&:before { &:before {
content: '*'; content: '*';
margin-right: 5px; margin-right: 5px;
font-size: 18px; font-size: 18px;
vertical-align: middle; vertical-align: middle;
color: #f00; color: #f00;
}
} }
}
} }
.btns { .btns {
display: flex; display: flex;
justify-content: center; justify-content: center;
text-align: center; text-align: center;
} }
</style> </style>

@ -1,90 +1,52 @@
<template> <template>
<!-- 报名人员 --> <!-- 报名人员 -->
<div class="page-content" <div class="page-content" style="padding: 24px">
style="padding: 24px">
<div class="tool"> <div class="tool">
<ul class="filter"> <ul class="filter">
<li> <li>
<label>搜索</label> <label>搜索</label>
<el-input placeholder="请输入姓名/手机号/学号" <el-input placeholder="请输入姓名/手机号/学号" prefix-icon="el-icon-search" v-model="keyword" clearable size="mini"
prefix-icon="el-icon-search" style="width: 250px"></el-input>
v-model="keyword"
clearable
size="mini"
style="width: 250px"></el-input>
</li> </li>
<li> <li>
<label>报名人员状态</label> <label>报名人员状态</label>
<el-select v-model="isDisable" <el-select v-model="isDisable" @change="initData">
@change="initData"> <el-option v-for="(item, i) in statusList" :key="i" :label="item.name" :value="item.id"></el-option>
<el-option v-for="(item, i) in statusList"
:key="i"
:label="item.name"
:value="item.id"></el-option>
</el-select> </el-select>
</li> </li>
</ul> </ul>
<div> <div>
<el-button type="primary" <el-button type="primary" round @click="exportAll">批量导出</el-button>
round
@click="exportAll">批量导出</el-button>
</div> </div>
</div> </div>
<el-table ref="table" <el-table ref="table" :data="listData" class="table" stripe header-align="center"
:data="listData" @selection-change="handleSelectionChange" row-key="id" @sort-change="sortChange">
class="table" <el-table-column type="selection" width="80" align="center" :reserve-selection="true"></el-table-column>
stripe <el-table-column type="index" width="60" label="序号" align="center">
header-align="center"
@selection-change="handleSelectionChange"
row-key="id"
@sort-change="sortChange">
<el-table-column type="selection"
width="80"
align="center"
:reserve-selection="true"></el-table-column>
<el-table-column type="index"
width="60"
label="序号"
align="center">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.$index + (page - 1) * pageSize + 1 }} {{ scope.$index + (page - 1) * pageSize + 1 }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="schoolName" <el-table-column prop="schoolName" label="学校" sortable="custom">
label="学校"
sortable="custom">
</el-table-column> </el-table-column>
<el-table-column prop="username" <el-table-column prop="username" label="学生姓名">
label="学生姓名">
</el-table-column> </el-table-column>
<el-table-column prop="workNumber" <el-table-column prop="workNumber" label="学号">
label="学号">
</el-table-column> </el-table-column>
<el-table-column prop="phone" <el-table-column prop="phone" label="手机号">
label="手机号">
</el-table-column> </el-table-column>
<el-table-column label="操作" <el-table-column label="操作" align="center" width="320">
align="center"
width="320">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="text" <el-button type="text" @click="delData(scope.row)">删除</el-button>
@click="delData(scope.row)">删除</el-button> <el-switch v-model="scope.row.isDisable" :active-text="scope.row.isDisable ? '' : ''" :active-value="0"
<el-switch v-model="scope.row.isDisable" :inactive-value="1" style="margin-left: 5px" @change="switchOff($event, scope.row, scope.$index)"></el-switch>
:active-text="scope.row.isDisable ? '关' : '开'"
:active-value="0"
:inactive-value="1"
style="margin-left: 5px"
@change="switchOff($event,scope.row,scope.$index)"></el-switch>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="pagination"> <div class="pagination">
<el-pagination background <el-pagination background layout="total, prev, pager, next" :total="total" @current-change="handleCurrentChange"
layout="total, prev, pager, next" :current-page="page">
:total="total"
@current-change="handleCurrentChange"
:current-page="page">
</el-pagination> </el-pagination>
</div> </div>
</div> </div>
@ -98,7 +60,7 @@ export default {
name: "matchSignup", name: "matchSignup",
data () { data () {
return { return {
token: util.local.get(Setting.tokenKey), token: util.session.get(Setting.tokenKey),
id: +this.$route.query.id, id: +this.$route.query.id,
isDisable: '', isDisable: '',
statusList: [ statusList: [
@ -212,13 +174,14 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
/deep/.dia-form { /deep/.dia-form {
.w-100 { .w-100 {
width: 100%; width: 100%;
} }
.tips {
display: flex; .tips {
justify-content: center; display: flex;
align-items: center; justify-content: center;
} align-items: center;
}
} }
</style> </style>

@ -1,66 +1,40 @@
<template> <template>
<div class="page-content" <div class="page-content" style="padding: 24px">
style="padding: 24px"> <div class="tool" style="justify-content: flex-end">
<div class="tool" <el-button type="primary" round @click="add">新增</el-button>
style="justify-content: flex-end">
<el-button type="primary"
round
@click="add">新增</el-button>
</div> </div>
<el-table ref="table" <el-table ref="table" :data="listData" class="table" stripe header-align="center"
:data="listData" @selection-change="handleSelectionChange" row-key="id">
class="table" <el-table-column type="index" width="60" label="序号" align="center">
stripe
header-align="center"
@selection-change="handleSelectionChange"
row-key="id">
<el-table-column type="index"
width="60"
label="序号"
align="center">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.$index + (page - 1) * pageSize + 1 }} {{ scope.$index + (page - 1) * pageSize + 1 }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="announcementTitle" <el-table-column prop="announcementTitle" label="标题名称">
label="标题名称">
</el-table-column> </el-table-column>
<el-table-column prop="createTime" <el-table-column prop="createTime" label="创建时间">
label="创建时间">
</el-table-column> </el-table-column>
<el-table-column prop="updateTime" <el-table-column prop="updateTime" label="发布时间">
label="发布时间">
</el-table-column> </el-table-column>
<el-table-column prop="phone" <el-table-column prop="phone" label="状态">
label="状态">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.status ? '已发布' : '草稿' }} {{ scope.row.status ? '已发布' : '草稿' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" <el-table-column label="操作" align="center" width="250">
align="center"
width="250">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="text" <el-button type="text" @click="edit(scope.row)">编辑</el-button>
@click="edit(scope.row)">编辑</el-button> <el-button type="text" @click="del(scope.row)">删除</el-button>
<el-button type="text" <el-switch v-model="scope.row.isOpen" :active-text="scope.row.isOpen ? '' : ''" :active-value="0"
@click="del(scope.row)">删除</el-button> :inactive-value="1" style="margin: 0 10px 0 5px"
<el-switch v-model="scope.row.isOpen" @change="switchOff($event, scope.row, scope.$index)"></el-switch>
:active-text="scope.row.isOpen ? '关' : '开'"
:active-value="0"
:inactive-value="1"
style="margin: 0 10px 0 5px"
@change="switchOff($event,scope.row,scope.$index)"></el-switch>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="pagination"> <div class="pagination">
<el-pagination background <el-pagination background layout="total, prev, pager, next" :total="totals" @current-change="handleCurrentChange"
layout="total, prev, pager, next" :current-page="page">
:total="totals"
@current-change="handleCurrentChange"
:current-page="page">
</el-pagination> </el-pagination>
</div> </div>
</div> </div>
@ -72,7 +46,7 @@ import Setting from "@/setting";
export default { export default {
data () { data () {
return { return {
token: util.local.get(Setting.tokenKey), token: util.session.get(Setting.tokenKey),
id: this.$route.query.id, id: this.$route.query.id,
listData: [], listData: [],
multipleSelection: [], multipleSelection: [],
@ -153,5 +127,4 @@ export default {
}; };
</script> </script>
<style scoped> <style scoped></style>
</style>

@ -1,40 +1,27 @@
<template> <template>
<div> <div>
<el-card shadow="hover" <el-card shadow="hover" style="margin-bottom: 20px">
style="margin-bottom: 20px">
<div class="flex-between"> <div class="flex-between">
<el-page-header @back="back" <el-page-header @back="back" :content="(form.id ? '编辑' : '创建') + '公告'"></el-page-header>
:content="(form.id ? '编辑' : '创建') + '公告'"></el-page-header>
</div> </div>
</el-card> </el-card>
<div class="page"> <div class="page">
<div class="page-content"> <div class="page-content">
<el-form label-width="170px" <el-form label-width="170px" label-suffix=":" size="small">
label-suffix=":"
size="small">
<el-form-item label="公告标题"> <el-form-item label="公告标题">
<div class="d-inline-block"> <div class="d-inline-block">
<el-input placeholder="请输入公告名称" <el-input placeholder="请输入公告名称" v-model="form.announcementTitle" clearable></el-input>
v-model="form.announcementTitle"
clearable></el-input>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="正文"> <el-form-item label="正文">
<quill :border="true" <quill :border="true" v-model="form.announcementText" :height="400" />
v-model="form.announcementText"
:height="400" />
</el-form-item> </el-form-item>
<el-form-item label="附件"> <el-form-item label="附件">
<Upload :limit="5" <Upload :limit="5" :file-list="fileList" :on-remove="handleRemove" @onSuccess="uploadSuccess" />
:file-list="fileList"
:on-remove="handleRemove"
@onSuccess="uploadSuccess" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button v-if="!form.id" <el-button v-if="!form.id" @click="save(0)">草稿</el-button>
@click="save(0)">草稿</el-button> <el-button type="primary" @click="save(1)">发布</el-button>
<el-button type="primary"
@click="save(1)">发布</el-button>
<el-button @click="back">取消</el-button> <el-button @click="back">取消</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -54,7 +41,7 @@ export default {
data () { data () {
return { return {
headers: { headers: {
token: util.local.get(Setting.tokenKey) token: util.session.get(Setting.tokenKey)
}, },
form: { form: {
id: this.$route.query.id, id: this.$route.query.id,
@ -169,133 +156,134 @@ export default {
$upload-width: 220px; $upload-width: 220px;
$upload-height: 140px; $upload-height: 140px;
$upload-lg-height: 150px; $upload-lg-height: 150px;
/deep/ .avatar-uploader { /deep/ .avatar-uploader {
.el-upload { .el-upload {
position: relative; position: relative;
width: $upload-width; width: $upload-width;
height: $upload-height; height: $upload-height;
border: 1px dashed #d9d9d9; border: 1px dashed #d9d9d9;
border-radius: 6px; border-radius: 6px;
cursor: pointer; cursor: pointer;
overflow: hidden; overflow: hidden;
&:hover { &:hover {
border-color: #cb221c; border-color: #cb221c;
} }
.uploader-default { .uploader-default {
display: flex; display: flex;
height: $upload-height; height: $upload-height;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
text-align: center; text-align: center;
background: rgba(0, 0, 0, 0.04); background: rgba(0, 0, 0, 0.04);
i { i {
font-size: 20px; font-size: 20px;
font-weight: bold; font-weight: bold;
color: #8c939d; color: #8c939d;
} }
p { p {
margin-top: 10px; margin-top: 10px;
font-size: 14px; font-size: 14px;
color: rgba(0, 0, 0, 0.65); color: rgba(0, 0, 0, 0.65);
line-height: 1; line-height: 1;
} }
}
} }
}
&.avatar-uploader-lg { &.avatar-uploader-lg {
.el-upload { .el-upload {
width: 100%; width: 100%;
max-width: 960px; max-width: 960px;
height: $upload-lg-height; height: $upload-lg-height;
.uploader-default { .uploader-default {
height: $upload-lg-height; height: $upload-lg-height;
} }
}
} }
}
.avatar { .avatar {
display: block; display: block;
width: $upload-width; width: $upload-width;
height: $upload-height; height: $upload-height;
} }
.avatar-lg { .avatar-lg {
display: block; display: block;
width: 100%; width: 100%;
height: $upload-lg-height; height: $upload-lg-height;
} }
.el-upload__tip { .el-upload__tip {
margin-top: 0; margin-top: 0;
p { p {
font-size: 14px; font-size: 14px;
color: rgba(0, 0, 0, 0.45); color: rgba(0, 0, 0, 0.45);
line-height: 1; line-height: 1;
&:first-child { &:first-child {
margin-bottom: 5px; margin-bottom: 5px;
} }
}
} }
}
} }
/deep/ .d-inline-block { /deep/ .d-inline-block {
width: 216px; width: 216px;
.el-select, .el-select,
.el-input { .el-input {
width: 100%; width: 100%;
} }
} }
.inline-input { .inline-input {
.input-wrap { .input-wrap {
display: flex; display: flex;
align-items: center; align-items: center;
margin-bottom: 10px; margin-bottom: 10px;
.el-input {
display: inline-block;
width: 216px;
margin-right: 8px;
}
.remove { .el-input {
width: 16px; display: inline-block;
height: 16px; width: 216px;
background: url('../../../../assets/img/close.png') 0 0 / cover no-repeat; margin-right: 8px;
cursor: pointer;
}
} }
.add-btn { .remove {
margin-left: 32px; width: 16px;
height: 16px;
background: url('../../../../assets/img/close.png') 0 0 / cover no-repeat;
cursor: pointer;
} }
}
.add-btn {
margin-left: 32px;
}
} }
.add-btn { .add-btn {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
width: 216px; width: 216px;
line-height: 32px; line-height: 32px;
font-size: 14px; font-size: 14px;
color: rgba(0, 0, 0, 0.65); color: rgba(0, 0, 0, 0.65);
background-color: transparent; background-color: transparent;
border: 1px dashed rgba(0, 0, 0, 0.15); border: 1px dashed rgba(0, 0, 0, 0.15);
border-radius: 4px; border-radius: 4px;
cursor: pointer; cursor: pointer;
i { i {
margin-right: 8px; margin-right: 8px;
font-size: 14px; font-size: 14px;
font-weight: bold; font-weight: bold;
} }
} }
</style> </style>

@ -382,7 +382,7 @@ export default {
this.invitationCode = ""; this.invitationCode = "";
}, },
goSubSystem () { goSubSystem () {
const token = Util.local.get(Setting.tokenKey) const token = Util.session.get(Setting.tokenKey)
const classId = this.classId const classId = this.classId
const classItem = this.classList.find(e => e.id == classId) const classItem = this.classList.find(e => e.id == classId)
const row = this.curRow const row = this.curRow

@ -1,267 +1,299 @@
<template> <template>
<div class="wrap index"> <div class="wrap index">
<div class="banner"> <div class="banner">
<h6>城市合伙人招募中</h6> <h6>城市合伙人招募中</h6>
<p class="text">携手共创教育信息化新未来合伙共享产业互联领域新红利</p> <p class="text">携手共创教育信息化新未来合伙共享产业互联领域新红利</p>
</div> </div>
<!-- 关于城市合伙人 --> <!-- 关于城市合伙人 -->
<div class="about"> <div class="about">
<div class="inner"> <div class="inner">
<h6>关于城市合伙人</h6> <h6>关于城市合伙人</h6>
<div class="text">城市合伙人主要为在各地具备高职本科等学校关系资源且在当地能够提供销售售前项目实施交付以及持续增值服务的团队</div> <div class="text">城市合伙人主要为在各地具备高职本科等学校关系资源且在当地能够提供销售售前项目实施交付以及持续增值服务的团队</div>
</div> </div>
</div> </div>
<div class="bg"> <div class="bg">
<!-- 我们提供的支持 --> <!-- 我们提供的支持 -->
<div class="intro"> <div class="intro">
<div class="inner"> <div class="inner">
<h6 class="i-title">我们提供的支持</h6> <h6 class="i-title">我们提供的支持</h6>
<ul class="list"> <ul class="list">
<li> <li>
<h6> <h6>
<img src="@/assets/img/city/sup1.png" alt=""> <img src="@/assets/img/city/sup1.png" alt="">
<span>产品</span> <span>产品</span>
</h6> </h6>
<p class="text">我们会为城市合伙人整合好不同的教育信息化解决方案所需的软件和硬件产品通过教育产业互联网平台和反向供应链为城市合伙人提供利润合适交付便捷质量有保障的产品</p> <p class="text">我们会为城市合伙人整合好不同的教育信息化解决方案所需的软件和硬件产品通过教育产业互联网平台和反向供应链为城市合伙人提供利润合适交付便捷质量有保障的产品</p>
</li> </li>
<li> <li>
<h6> <h6>
<img src="@/assets/img/city/sup2.png" alt=""> <img src="@/assets/img/city/sup2.png" alt="">
<span>培训</span> <span>培训</span>
</h6> </h6>
<p class="text">我们会有专业的培训团队为每一个城市合伙人提供教育信息化产业的创业辅导和专业培训帮助城市合伙人打造一支专业化的商务支持客户成功和售后运营服务的支撑型团队</p> <p class="text">我们会有专业的培训团队为每一个城市合伙人提供教育信息化产业的创业辅导和专业培训帮助城市合伙人打造一支专业化的商务支持客户成功和售后运营服务的支撑型团队</p>
</li> </li>
</ul> </ul>
<h6 class="i-title" style="margin-top: 60px">城市合伙人需要具备的条件</h6> <h6 class="i-title" style="margin-top: 60px">城市合伙人需要具备的条件</h6>
<ul class="list"> <ul class="list">
<li> <li>
<h6> <h6>
<img src="@/assets/img/city/sup3.png" alt=""> <img src="@/assets/img/city/sup3.png" alt="">
<span>业务资源</span> <span>业务资源</span>
</h6> </h6>
<p class="text">城市合伙人要实现业务的快速成功需要在当地具备开展相应业务的客户资源包括但不限于在当地院校的二级学院的资产处实验室的相关领导与老师的关系资源</p> <p class="text">城市合伙人要实现业务的快速成功需要在当地具备开展相应业务的客户资源包括但不限于在当地院校的二级学院的资产处实验室的相关领导与老师的关系资源</p>
</li> </li>
<li> <li>
<h6> <h6>
<img src="@/assets/img/city/sup4.png" alt=""> <img src="@/assets/img/city/sup4.png" alt="">
<span>服务团队</span> <span>服务团队</span>
</h6> </h6>
<p class="text">城市合伙人需要在当地具备独立开展业务和服务的能力因此需要配置最小的地区服务团队包括商务售前运营服务售后技术支持售后培训服务售后客户成功服务客户活动支持服务等</p> <p class="text">城市合伙人需要在当地具备独立开展业务和服务的能力因此需要配置最小的地区服务团队包括商务售前运营服务售后技术支持售后培训服务售后客户成功服务客户活动支持服务等
</li> </p>
</ul> </li>
</div> </ul>
</div>
</div>
<!-- 城市合伙人的收益 -->
<div class="profit">
<div class="inner">
<h6 class="i-title">城市合伙人的收益</h6>
<ul class="list">
<li>
<img src="@/assets/img/city/profit1.png" alt="">
<h6>软件收益</h6>
<p class="text">对平台产品推广获利润分成</p>
</li>
<li>
<img src="@/assets/img/city/profit2.png" alt="">
<h6>续约分成</h6>
<p class="text">客户续约年年享分成</p>
</li>
<li>
<img src="@/assets/img/city/profit3.png" alt="">
<h6>媒体资源共享</h6>
<p class="text">各大主流媒体推广打造自己的引流平台</p>
</li>
</ul>
</div>
</div>
<!-- 业务开展方向 -->
<div class="profit bus">
<div class="inner">
<h6 class="i-title">业务开展方向</h6>
<ul class="list">
<li>
<img src="@/assets/img/city/bus1.png" alt="">
<h6>金融实验室</h6>
<p class="text">依据证券银行等金融机构实景配置相应的软硬件一体环境为高职本科院校的经管学院商学院提供金融实验室的建设解决方案</p>
</li>
<li>
<img src="@/assets/img/city/bus2.png" alt="">
<h6>金融科技实验室 </h6>
<p class="text">将金融交易信贷风控等模型和数据与Python编程相结合为高职侧重编程执行与本科院校侧重模型研究的经管学院和商学院提供金融科技实验的建设解决方案</p>
</li>
<li>
<img src="@/assets/img/city/bus3.png" alt="">
<h6>金融大数据实验室</h6>
<p class="text">通过高频数据与大数据平台结合为高职侧重编程执行与本科院校侧重模型研究的经管学院和商学院提供金融大数据实验室的建设解决方案</p>
</li>
</ul>
</div>
</div>
<!-- 联系 -->
<div class="contact">
<img class="love" src="@/assets/img/love.png" alt="">
</div> </div>
</div>
</div>
<!-- 城市合伙人的收益 -->
<div class="profit">
<div class="inner">
<h6 class="i-title">城市合伙人的收益</h6>
<ul class="list">
<li>
<img src="@/assets/img/city/profit1.png" alt="">
<h6>软件收益</h6>
<p class="text">对平台产品推广获利润分成</p>
</li>
<li>
<img src="@/assets/img/city/profit2.png" alt="">
<h6>续约分成</h6>
<p class="text">客户续约年年享分成</p>
</li>
<li>
<img src="@/assets/img/city/profit3.png" alt="">
<h6>媒体资源共享</h6>
<p class="text">各大主流媒体推广打造自己的引流平台</p>
</li>
</ul>
</div>
</div>
<!-- 业务开展方向 -->
<div class="profit bus">
<div class="inner">
<h6 class="i-title">业务开展方向</h6>
<ul class="list">
<li>
<img src="@/assets/img/city/bus1.png" alt="">
<h6>金融实验室</h6>
<p class="text">依据证券银行等金融机构实景配置相应的软硬件一体环境为高职本科院校的经管学院商学院提供金融实验室的建设解决方案</p>
</li>
<li>
<img src="@/assets/img/city/bus2.png" alt="">
<h6>金融科技实验室 </h6>
<p class="text">将金融交易信贷风控等模型和数据与Python编程相结合为高职侧重编程执行与本科院校侧重模型研究的经管学院和商学院提供金融科技实验的建设解决方案</p>
</li>
<li>
<img src="@/assets/img/city/bus3.png" alt="">
<h6>金融大数据实验室</h6>
<p class="text">通过高频数据与大数据平台结合为高职侧重编程执行与本科院校侧重模型研究的经管学院和商学院提供金融大数据实验室的建设解决方案</p>
</li>
</ul>
</div>
</div> </div>
<!-- 联系 -->
<div class="contact">
<img class="love" src="@/assets/img/love.png" alt="">
</div>
</div>
</template> </template>
<script> <script>
import Setting from '@/setting' import Setting from '@/setting'
import util from '@/libs/util' import util from '@/libs/util'
export default { export default {
name: 'cityPartner', name: 'cityPartner',
data() { data () {
return { return {
token: util.local.get(Setting.tokenKey) token: util.session.get(Setting.tokenKey)
} }
}, },
mounted() {}, mounted () { },
methods: {} methods: {}
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.wrap{ .wrap {
position: relative;
background-color: #fff;
.banner {
height: 350px;
padding: 100px 0 0 180px;
background: url(../../../assets/img/city/banner2.png) top right/auto no-repeat,
url(../../../assets/img/city/banner1.png) 0 0/100% 100% no-repeat;
h6 {
margin-bottom: 30px;
font-size: 42px;
}
.text {
font-size: 16px;
line-height: 30px;
}
}
.i-title {
position: relative; position: relative;
background-color: #fff; margin-bottom: 37px;
.banner { font-size: 30px;
height: 350px; text-align: center;
padding: 100px 0 0 180px; color: #0B1D30;
background: url(../../../assets/img/city/banner2.png) top right/auto no-repeat, }
url(../../../assets/img/city/banner1.png) 0 0/100% 100% no-repeat;
h6 { .inner {
margin-bottom: 30px; width: 1200px;
font-size: 42px; padding: 67px 0;
} margin: 0 auto;
.text { }
font-size: 16px;
line-height: 30px; .bg {
} background: #fff url(../../../assets/img/city/sup-bg.png) 0 0/100% 100% no-repeat;
}
.about {
margin-top: -60px;
.inner {
padding: 40px 0 60px;
text-align: center;
background: url(../../../assets/img/city/about.png) 0 0/100% 100% no-repeat;
} }
.i-title{
position: relative; h6 {
margin-bottom: 37px; margin-bottom: 20px;
font-size: 30px; font-size: 24px;
text-align: center; color: #fff;
color: #0B1D30;
} }
.inner{
width: 1200px; .text {
padding: 67px 0; font-size: 14px;
margin: 0 auto; color: #fff;
} }
.bg { }
background: #fff url(../../../assets/img/city/sup-bg.png) 0 0/100% 100% no-repeat;
.intro {
position: relative;
.i-title {
text-align: left;
} }
.about {
margin-top: -60px; .list {
.inner { display: flex;
padding: 40px 0 60px; justify-content: space-between;
text-align: center;
background: url(../../../assets/img/city/about.png) 0 0/100% 100% no-repeat; li {
} width: 49%;
h6 { padding: 20px 30px;
margin-bottom: 20px; border-radius: 6px;
font-size: 24px; border-left: 3px solid $main-color;
color: #fff; background-color: #fff;
} box-shadow: 0px 5px 20px 0px rgba(98, 117, 163, 0.08);
.text { }
font-size: 14px;
color: #fff; h6 {
} display: flex;
align-items: center;
margin-bottom: 10px;
}
span {
margin-left: 12px;
font-size: 18px;
color: #0B1D30;
}
.text {
font-size: 14px;
color: #757F92;
}
} }
.intro{ }
position: relative;
.i-title { .profit {
text-align: left; .inner {
} background: url(../../../assets/img/city/profit-bg.png) 0 0/100% 100% no-repeat;
.list{
display: flex;
justify-content: space-between;
li{
width: 49%;
padding: 20px 30px;
border-radius: 6px;
border-left: 3px solid $main-color;
background-color: #fff;
box-shadow: 0px 5px 20px 0px rgba(98, 117, 163, 0.08);
}
h6{
display: flex;
align-items: center;
margin-bottom: 10px;
}
span {
margin-left: 12px;
font-size: 18px;
color: #0B1D30;
}
.text{
font-size: 14px;
color: #757F92;
}
}
} }
.profit{
.inner { .list {
background: url(../../../assets/img/city/profit-bg.png) 0 0/100% 100% no-repeat; display: flex;
} flex: 1;
.list {
display: flex; li {
flex: 1; padding: 9px 9px 20px;
li { margin-right: 24px;
padding: 9px 9px 20px; text-align: center;
margin-right: 24px; background-color: #fff;
text-align: center; border-radius: 10px;
background-color: #fff; box-shadow: 0px 5px 20px 0px rgba(98, 117, 163, 0.08);
border-radius: 10px;
box-shadow: 0px 5px 20px 0px rgba(98, 117, 163, 0.08); &:last-child {
&:last-child { margin-right: 0;
margin-right: 0;
}
}
img {
width: 100%;
}
h6 {
margin: 15px 0 10px;
font-size: 18px;
color: #0B1D30;
}
.text {
font-size: 14px;
color: #757F92;
}
} }
}
img {
width: 100%;
}
h6 {
margin: 15px 0 10px;
font-size: 18px;
color: #0B1D30;
}
.text {
font-size: 14px;
color: #757F92;
}
} }
.bus { }
background-color: #F3F6FA;
.inner { .bus {
background: none; background-color: #F3F6FA;
}
.list { .inner {
li { background: none;
padding-bottom: 50px;
.text {
text-align: left;
}
}
img {
width: 366px;
height: 230px;
}
}
} }
.contact {
position: relative; .list {
height: 250px; li {
background: url(../../../assets/img/contact-info.png) center center/auto no-repeat, padding-bottom: 50px;
url(../../../assets/img/contact-bg.png) 0 0/100% 100% no-repeat;
.love { .text {
position: absolute; text-align: left;
top: -45px;
right: 10%;
} }
}
img {
width: 366px;
height: 230px;
}
}
}
.contact {
position: relative;
height: 250px;
background: url(../../../assets/img/contact-info.png) center center/auto no-repeat,
url(../../../assets/img/contact-bg.png) 0 0/100% 100% no-repeat;
.love {
position: absolute;
top: -45px;
right: 10%;
} }
}
} }
</style> </style>

@ -2,116 +2,65 @@
<div class="wrap pb"> <div class="wrap pb">
<breadcrumb :routes.sync="routes" /> <breadcrumb :routes.sync="routes" />
<div class="flex"> <div class="flex">
<div class="cover" <div class="cover" :class="{ 'is-word': showMask1 }">
:class="{'is-word': showMask1}"> <img v-if="coverUrl" :src="coverUrl" alt="" width="100%" height="100%">
<img v-if="coverUrl"
:src="coverUrl"
alt=""
width="100%"
height="100%">
<template v-else-if="iframeSrc"> <template v-else-if="iframeSrc">
<iframe class="inner fileIframe" <iframe class="inner fileIframe" id="fileIframe" :src="iframeSrc" frameborder="0"></iframe>
id="fileIframe"
:src="iframeSrc"
frameborder="0"></iframe>
<template v-if="showMask"> <template v-if="showMask">
<div class="mask" <div class="mask" style="width: 500px;height: 30px;top: 53px;right: 320px"></div>
style="width: 500px;height: 30px;top: 53px;right: 320px"></div> <div class="mask" style="width: 175px;height: 30px;top: 53px;right: 5px"></div>
<div class="mask"
style="width: 175px;height: 30px;top: 53px;right: 5px"></div>
</template> </template>
<template v-if="showMask1"> <template v-if="showMask1">
<div class="word-mask" <div class="word-mask" style="height: 40px;"></div>
style="height: 40px;"></div> <div class="word-mask2" style="top: 55px;left: 28%;width: 44%;height: calc(100% - 80px);"></div>
<div class="word-mask2"
style="top: 55px;left: 28%;width: 44%;height: calc(100% - 80px);"></div>
</template> </template>
<template v-if="showMask2"> <template v-if="showMask2">
<div class="excel-mask1" <div class="excel-mask1" style="height: 48px;"></div>
style="height: 48px;"></div>
</template> </template>
</template> </template>
<div class="pdf inner" <div class="pdf inner" v-else-if="pdfSrc">
v-else-if="pdfSrc">
<p class="arrow"> <p class="arrow">
<span @click="changePdfPage(0)" <span @click="changePdfPage(0)" class="turn el-icon-arrow-left" :class="{ grey: currentPage == 1 }"></span>
class="turn el-icon-arrow-left" {{ currentPage }} / {{ pageCount }}
:class="{grey: currentPage==1}"></span> <span @click="changePdfPage(1)" class="turn el-icon-arrow-right"
{{currentPage}} / {{pageCount}} :class="{ grey: currentPage == pageCount }"></span>
<span @click="changePdfPage(1)"
class="turn el-icon-arrow-right"
:class="{grey: currentPage==pageCount}"></span>
</p> </p>
<pdf class="pdf-wrap" <pdf class="pdf-wrap" :src="pdfSrc" :page="currentPage" @num-pages="pageCount = $event"
:src="pdfSrc" @page-loaded="currentPage = $event" @loaded="loadPdfHandler">
:page="currentPage"
@num-pages="pageCount=$event"
@page-loaded="currentPage=$event"
@loaded="loadPdfHandler">
</pdf> </pdf>
</div> </div>
<div class="inner" <div class="inner" v-else-if="playAuth">
v-else-if="playAuth"> <div class="video_wid" id="player"></div>
<div class="video_wid"
id="player"></div>
</div> </div>
<div class="inner" <div class="inner" v-else-if="videoSrc">
v-else-if="videoSrc"> <video class="video" :key="videoSrc" width="100%" height="100%" autoplay controls>
<video class="video" <source :src="videoSrc" type="video/mp4">
:key="videoSrc"
width="100%"
height="100%"
autoplay
controls>
<source :src="videoSrc"
type="video/mp4">
您的浏览器不支持 video 标签 您的浏览器不支持 video 标签
</video> </video>
</div> </div>
</div> </div>
<div class="catalog"> <div class="catalog">
<div class="list"> <div class="list">
<h4 class="title">{{courseName}}</h4> <h4 class="title">{{ courseName }}</h4>
<div class="desc-wrap"> <div class="desc-wrap">
<div class="desc" <div class="desc" :class="{ active: desShrink }" v-html="description"></div>
:class="{active: desShrink}" <i class="arrow" :class="{ active: desShrink }" v-if="description && description.length > 40">
v-html="description"></div>
<i class="arrow"
:class="{active: desShrink}"
v-if="description && description.length > 40">
</i> </i>
</div> </div>
<div class="chapters"> <div class="chapters">
<template v-if="chapterList && chapterList.length"> <template v-if="chapterList && chapterList.length">
<div class="chapter" <div class="chapter" v-for="(item, index) in chapterList" :key="index">
v-for="(item,index) in chapterList" <div class="chapterName">{{ item.name }}</div>
:key="index"> <div class="section" v-if="item.subsectionList.length">
<div class="chapterName">{{item.name}}</div> <div v-for="(section, i) in item.subsectionList" :key="i" @click="preview(section, item.name)">
<div class="section" <p class="sectionName" :class="{ active: curLink === `${item.name}${section.name}` }">
v-if="item.subsectionList.length"> <img v-if="section.fileType === 'pptx'" src="@/assets/img/exts/ppt.png" alt="">
<div v-for="(section,i) in item.subsectionList" <img v-else-if="section.fileType === 'mp4'" src="@/assets/img/exts/video.png" alt="">
:key="i"
@click="preview(section, item.name)">
<p class="sectionName"
:class="{active: curLink === `${item.name}${section.name}`}">
<img v-if="section.fileType === 'pptx'"
src="@/assets/img/exts/ppt.png"
alt="">
<img v-else-if="section.fileType === 'mp4'"
src="@/assets/img/exts/video.png"
alt="">
<img v-else-if="section.fileType === 'doc' || section.fileType === 'docx'" <img v-else-if="section.fileType === 'doc' || section.fileType === 'docx'"
src="@/assets/img/exts/word.png" src="@/assets/img/exts/word.png" alt="">
alt=""> <img v-else-if="section.fileType === 'txt'" src="@/assets/img/exts/txt.png" alt="">
<img v-else-if="section.fileType === 'txt'" <img v-else-if="section.fileType === 'pdf'" src="@/assets/img/exts/pdf.png" alt="">
src="@/assets/img/exts/txt.png" <img v-else src="@/assets/img/exts/pic.png" alt="">
alt="">
<img v-else-if="section.fileType === 'pdf'"
src="@/assets/img/exts/pdf.png"
alt="">
<img v-else
src="@/assets/img/exts/pic.png"
alt="">
{{ section.name }} {{ section.name }}
</p> </p>
</div> </div>
@ -181,7 +130,7 @@ export default {
}, },
destroyed () { destroyed () {
// //
util.local.get(Setting.tokenKey) && this.$post(this.api.playRecordSave, { util.session.get(Setting.tokenKey) && this.$post(this.api.playRecordSave, {
courseId: this.id, courseId: this.id,
courseType: 1, courseType: 1,
playTime: Math.ceil((Date.now() - this.startTime) / 1000 / 60) playTime: Math.ceil((Date.now() - this.startTime) / 1000 / 60)
@ -240,7 +189,7 @@ export default {
}, },
preview (row, chapterName, showConfirm = 1) { preview (row, chapterName, showConfirm = 1) {
// //
if (!util.local.get(Setting.tokenKey) && !util.local.get('oc_server_token') && showConfirm) { if (!util.session.get(Setting.tokenKey) && !util.local.get('oc_server_token') && showConfirm) {
this.$confirm('请先登录,是否直接前往登录?', "提示", { this.$confirm('请先登录,是否直接前往登录?', "提示", {
type: 'success', type: 'success',
closeOnClickModal: false closeOnClickModal: false
@ -360,289 +309,345 @@ export default {
</script> </script>
<style> <style>
.desc img { .desc img {
width: 100%; width: 100%;
} }
</style> </style>
<style lang="scss" scoped> <style lang="scss" scoped>
$height: 700px; $height: 700px;
.video_wid, .video_wid,
.cover { .cover {
position: relative; position: relative;
width: 76%; width: 76%;
height: $height !important; height: $height !important;
border: 0; border: 0;
} }
.page { .page {
margin: 12px 0; margin: 12px 0;
.intro {
font-size: 16px; .intro {
color: #333; font-size: 16px;
line-height: 24px; color: #333;
} line-height: 24px;
}
} }
.cover { .cover {
flex: 1; flex: 1;
background-color: #252528; background-color: #252528;
img {
border-radius: 8px; img {
} border-radius: 8px;
&.is-word { }
overflow: hidden;
} &.is-word {
overflow: hidden;
}
} }
.fileIframe { .fileIframe {
height: $height !important; height: $height !important;
} }
.video_wid, .video_wid,
.inner { .inner {
width: 100%; width: 100%;
height: 100% !important; height: 100% !important;
border: 0; border: 0;
overflow: auto; overflow: auto;
} }
.cover.is-word { .cover.is-word {
.inner { .inner {
height: calc(100% + 38px) !important; height: calc(100% + 38px) !important;
margin-top: -38px; margin-top: -38px;
} }
} }
.video_wid:focus { .video_wid:focus {
outline: none; outline: none;
} }
.catalog { .catalog {
width: 296px; width: 296px;
padding: 16px; padding: 16px;
margin-left: 12px; margin-left: 12px;
background-color: #252528; background-color: #252528;
.entry {
display: block; .entry {
width: 100%; display: block;
height: 34px; width: 100%;
margin-bottom: 16px; height: 34px;
background: url(../../../assets/img/entry.png) 0 0/100% 100% no-repeat; margin-bottom: 16px;
cursor: pointer; background: url(../../../assets/img/entry.png) 0 0/100% 100% no-repeat;
&:hover { cursor: pointer;
opacity: 0.9;
} &:hover {
opacity: 0.9;
} }
}
} }
.list { .list {
height: calc(700px - 82px); height: calc(700px - 82px);
overflow-y: auto; overflow-y: auto;
.title {
margin-bottom: 11px; .title {
color: #fff; margin-bottom: 11px;
font-size: 16px; color: #fff;
font-size: 16px;
}
.desc-wrap {
position: relative;
.desc {
font-size: 12px;
color: #fff;
line-height: 22px;
@include mul-ellipsis(4);
&.active {
display: block;
overflow: visible;
}
} }
.desc-wrap {
position: relative; .arrow {
.desc { position: absolute;
font-size: 12px; bottom: 2px;
color: #fff; right: 0;
line-height: 22px; display: flex;
@include mul-ellipsis(4); justify-content: space-between;
&.active { width: 46px;
display: block; background-color: #fff;
overflow: visible;
} span {
font-size: 14px;
color: rgba(0, 0, 0, 0.65);
}
img {
width: 16px;
cursor: pointer;
}
&.active {
span {
opacity: 0;
} }
.arrow {
position: absolute; img {
bottom: 2px; transform: rotate(180deg);
right: 0;
display: flex;
justify-content: space-between;
width: 46px;
background-color: #fff;
span {
font-size: 14px;
color: rgba(0, 0, 0, 0.65);
}
img {
width: 16px;
cursor: pointer;
}
&.active {
span {
opacity: 0;
}
img {
transform: rotate(180deg);
}
}
} }
}
} }
.chapters { }
margin-top: 16px;
max-height: calc(100% - 53px); .chapters {
overflow: auto; margin-top: 16px;
max-height: calc(100% - 53px);
overflow: auto;
}
.chapter {
margin-bottom: 20px;
.chapterName {
color: #fff;
font-size: 14px;
} }
.chapter {
margin-bottom: 20px; .section {
.chapterName { padding: 5px 15px;
color: #fff; margin-top: 12px;
font-size: 14px; background-color: #121214;
.sectionName {
margin: 12px 0;
font-size: 12px;
color: #999;
cursor: pointer;
@include ellipsis;
img {
margin-right: 8px;
} }
.section {
padding: 5px 15px; &.active {
margin-top: 12px; color: #fff;
background-color: #121214;
.sectionName {
margin: 12px 0;
font-size: 12px;
color: #999;
cursor: pointer;
@include ellipsis;
img {
margin-right: 8px;
}
&.active {
color: #fff;
}
}
} }
}
} }
}
} }
.el-image-viewer__wrapper { .el-image-viewer__wrapper {
transform: translateY(-10px); transform: translateY(-10px);
transition: transform 0.5s; transition: transform 0.5s;
&.active { &.active {
transform: translateY(0); transform: translateY(0);
} }
} }
.el-image-viewer__close { .el-image-viewer__close {
z-index: 2000; z-index: 2000;
top: 15px; top: 15px;
right: 15px; right: 15px;
&.doc-close {
i { &.doc-close {
color: #000 !important; i {
} color: #000 !important;
} }
}
} }
.list::-webkit-scrollbar { .list::-webkit-scrollbar {
width: 4px; width: 4px;
} }
.list::-webkit-scrollbar-thumb { .list::-webkit-scrollbar-thumb {
border-radius: 10px; border-radius: 10px;
background: rgba(0, 0, 0, 0.06); background: rgba(0, 0, 0, 0.06);
} }
.mask { .mask {
z-index: 9; z-index: 9;
position: absolute; position: absolute;
background-color: rgb(57, 58, 61); background-color: rgb(57, 58, 61);
} }
.word-mask { .word-mask {
z-index: 9; z-index: 9;
position: absolute; position: absolute;
top: 0; top: 0;
right: 0; right: 0;
width: 100%; width: 100%;
background-color: rgb(243, 242, 241); background-color: rgb(243, 242, 241);
} }
.word-mask1 { .word-mask1 {
z-index: 9; z-index: 9;
position: absolute; position: absolute;
top: 0; top: 0;
right: 0; right: 0;
width: 100%; width: 100%;
background-color: #185abd; background-color: #185abd;
} }
.word-mask2 { .word-mask2 {
z-index: 9; z-index: 9;
position: absolute; position: absolute;
background-color: transparent; background-color: transparent;
} }
.excel-mask1 { .excel-mask1 {
z-index: 9; z-index: 9;
position: absolute; position: absolute;
top: 0; top: 0;
left: 20%; left: 20%;
width: 60%; width: 60%;
background-color: #107c41; background-color: #107c41;
} }
/deep/.pdf-dia { /deep/.pdf-dia {
border-radius: 0 !important; border-radius: 0 !important;
.el-dialog__header {
display: none; .el-dialog__header {
} display: none;
.el-dialog__body { }
padding: 0;
} .el-dialog__body {
.el-dialog__headerbtn { padding: 0;
top: 10px; }
.el-dialog__close {
color: #fff; .el-dialog__headerbtn {
font-size: 16px; top: 10px;
}
.el-dialog__close {
color: #fff;
font-size: 16px;
} }
}
} }
.pdf { .pdf {
.arrow { .arrow {
padding: 10px 0; padding: 10px 0;
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
font-size: 16px; font-size: 16px;
color: #fff; color: #fff;
background-color: #333; background-color: #333;
.turn {
margin: 0 10px; .turn {
font-size: 18px; margin: 0 10px;
cursor: pointer; font-size: 18px;
} cursor: pointer;
}
.pdf-wrap {
width: 80%;
margin: 0 auto;
} }
}
.pdf-wrap {
width: 80%;
margin: 0 auto;
}
} }
/deep/.project-dia { /deep/.project-dia {
.el-dialog__body { .el-dialog__body {
padding: 28px 32px; padding: 28px 32px;
} }
} }
.projects { .projects {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
max-height: 400px; max-height: 400px;
overflow: auto; overflow: auto;
li {
display: inline-flex; li {
align-items: center; display: inline-flex;
width: 238px; align-items: center;
padding: 16px; width: 238px;
margin: 0 20px 20px 0; padding: 16px;
background-color: #f6f8fa; margin: 0 20px 20px 0;
border-radius: 16px; background-color: #f6f8fa;
cursor: pointer; border-radius: 16px;
&:hover { cursor: pointer;
span {
color: #007eff; &:hover {
} span {
} color: #007eff;
&:nth-child(3n) { }
margin-right: 0;
}
&.active {
background-color: #f2f7ff;
span {
color: #3988ff;
}
}
} }
span {
max-width: 140px; &:nth-child(3n) {
margin-left: 14px; margin-right: 0;
font-size: 14px;
color: #333;
} }
&.active {
background-color: #f2f7ff;
span {
color: #3988ff;
}
}
}
span {
max-width: 140px;
margin-left: 14px;
font-size: 14px;
color: #333;
}
} }
@media (max-width: 1430px) { @media (max-width: 1430px) {
.wrap { .wrap {
padding: 12px 100px 20px; padding: 12px 100px 20px;
} }
} }
</style> </style>

@ -80,7 +80,7 @@ export default {
data () { data () {
return { return {
timer: null, timer: null,
token: util.local.get(Setting.tokenKey), token: util.session.get(Setting.tokenKey),
isTourist: !!Setting.whiteList.find(e => e === this.$route.path), isTourist: !!Setting.whiteList.find(e => e === this.$route.path),
active: +this.$route.query.active || 0, active: +this.$route.query.active || 0,
tabs: [ tabs: [

@ -1,220 +1,248 @@
<template> <template>
<div class="wrap index"> <div class="wrap index">
<div class="banner"> <div class="banner">
<h6>教育数字化产品开发者平台</h6> <h6>教育数字化产品开发者平台</h6>
<p class="text">与3000所高校共建数字化教育产业未来</p> <p class="text">与3000所高校共建数字化教育产业未来</p>
</div>
<!-- 关于教育产业数字化开发者 -->
<div class="about">
<div class="inner">
<h6>关于教育产业数字化开发者</h6>
<div class="text">教育产业数字化开发者主要指从事高职本科市场相应数字化场景的软件硬件研发与生产的产品开发者</div>
</div>
</div>
<!-- 我们提供的支持 -->
<div class="sup">
<div class="inner">
<h6 class="i-title">我们提供的支持</h6>
<ul class="list">
<li>
<h6>生产力赋能</h6>
<p class="text">公司打造的产业中台将赋能联盟厂家高效地进行软件产品的开发与交付</p>
</li>
<li>
<h6>渠道与运营服务赋能</h6>
<p class="text">公司会为联盟厂家提供公共的渠道支撑和客户获取帮助厂家获得客户成交降低产品厂家的市场压力</p>
</li>
<li>
<h6>创业技术孵化服务</h6>
<p class="text">对于还在创业阶段的产品创业者我司还提供初始的技术外包支撑服务帮助产品创业者最小成本的完成产品的落地</p>
</li>
</ul>
</div>
</div>
<!-- 开发者需要具备的条件 -->
<div class="con">
<div class="inner">
<h6 class="i-title">开发者需要具备的条件</h6>
<ul class="list">
<li>
<img src="@/assets/img/dev/con1.png" alt="">
<h6>产品研发</h6>
<p class="text">具备独立设计开发教育产业数字化产品的能力</p>
</li>
<li>
<img src="@/assets/img/dev/con2.png" alt="">
<h6>产品运维 </h6>
<p class="text">具备独立的产品运维支持的能力</p>
</li>
<li>
<img src="@/assets/img/dev/con3.png" alt="">
<h6>专业服务</h6>
<p class="text">具备对产品内容专业支持的能力</p>
</li>
</ul>
</div>
</div>
<div class="profit">
<div class="item1">开发者受益</div>
<div class="item2">我们将与开发者共享教育产业数字化蓝海的巨大收益</div>
</div>
<!-- 联系 -->
<div class="contact">
<img class="love" src="@/assets/img/love.png" alt="">
</div>
</div> </div>
<!-- 关于教育产业数字化开发者 -->
<div class="about">
<div class="inner">
<h6>关于教育产业数字化开发者</h6>
<div class="text">教育产业数字化开发者主要指从事高职本科市场相应数字化场景的软件硬件研发与生产的产品开发者</div>
</div>
</div>
<!-- 我们提供的支持 -->
<div class="sup">
<div class="inner">
<h6 class="i-title">我们提供的支持</h6>
<ul class="list">
<li>
<h6>生产力赋能</h6>
<p class="text">公司打造的产业中台将赋能联盟厂家高效地进行软件产品的开发与交付</p>
</li>
<li>
<h6>渠道与运营服务赋能</h6>
<p class="text">公司会为联盟厂家提供公共的渠道支撑和客户获取帮助厂家获得客户成交降低产品厂家的市场压力</p>
</li>
<li>
<h6>创业技术孵化服务</h6>
<p class="text">对于还在创业阶段的产品创业者我司还提供初始的技术外包支撑服务帮助产品创业者最小成本的完成产品的落地</p>
</li>
</ul>
</div>
</div>
<!-- 开发者需要具备的条件 -->
<div class="con">
<div class="inner">
<h6 class="i-title">开发者需要具备的条件</h6>
<ul class="list">
<li>
<img src="@/assets/img/dev/con1.png" alt="">
<h6>产品研发</h6>
<p class="text">具备独立设计开发教育产业数字化产品的能力</p>
</li>
<li>
<img src="@/assets/img/dev/con2.png" alt="">
<h6>产品运维 </h6>
<p class="text">具备独立的产品运维支持的能力</p>
</li>
<li>
<img src="@/assets/img/dev/con3.png" alt="">
<h6>专业服务</h6>
<p class="text">具备对产品内容专业支持的能力</p>
</li>
</ul>
</div>
</div>
<div class="profit">
<div class="item1">开发者受益</div>
<div class="item2">我们将与开发者共享教育产业数字化蓝海的巨大收益</div>
</div>
<!-- 联系 -->
<div class="contact">
<img class="love" src="@/assets/img/love.png" alt="">
</div>
</div>
</template> </template>
<script> <script>
import Setting from '@/setting' import Setting from '@/setting'
import util from '@/libs/util' import util from '@/libs/util'
export default { export default {
name: 'cityPartner', name: 'cityPartner',
data() { data () {
return { return {
token: util.local.get(Setting.tokenKey) token: util.session.get(Setting.tokenKey)
} }
}, },
mounted() {}, mounted () { },
methods: {} methods: {}
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.wrap{ .wrap {
position: relative;
background-color: #fff;
.banner {
height: 350px;
padding: 100px 0 0 180px;
background: url(../../../assets/img/dev/banner2.png) (90% 32px)/auto no-repeat,
url(../../../assets/img/dev/banner1.png) 0 0/100% 100% no-repeat;
h6 {
margin-bottom: 30px;
font-size: 42px;
}
.text {
font-size: 16px;
line-height: 30px;
}
}
.i-title {
position: relative; position: relative;
background-color: #fff; margin-bottom: 37px;
.banner { font-size: 30px;
height: 350px; text-align: center;
padding: 100px 0 0 180px; color: #0B1D30;
background: url(../../../assets/img/dev/banner2.png) (90% 32px)/auto no-repeat, }
url(../../../assets/img/dev/banner1.png) 0 0/100% 100% no-repeat;
h6 { .inner {
margin-bottom: 30px; width: 1200px;
font-size: 42px; padding: 67px 0;
} margin: 0 auto;
.text { }
font-size: 16px;
line-height: 30px; .about {
} margin: -60px 0 20px;
.inner {
padding: 40px 0 60px;
text-align: center;
background-color: #fff;
border-radius: 8px;
box-shadow: 0px 5px 20px 0px rgba(98, 117, 163, 0.08);
} }
.i-title{
position: relative; h6 {
margin-bottom: 37px; margin-bottom: 20px;
font-size: 30px; font-size: 24px;
text-align: center; color: #0B1D30;
color: #0B1D30;
} }
.inner{
width: 1200px; .text {
padding: 67px 0; font-size: 14px;
margin: 0 auto; color: #0B1D30;
} }
.about { }
margin: -60px 0 20px;
.inner { .sup {
padding: 40px 0 60px; background: linear-gradient(180deg, #FFFFFF 0%, #F1F6FE 100%);
text-align: center;
background-color: #fff; .list {
border-radius: 8px; display: flex;
box-shadow: 0px 5px 20px 0px rgba(98, 117, 163, 0.08); justify-content: space-between;
}
h6 { li {
margin-bottom: 20px; width: 33%;
font-size: 24px; padding: 140px 50px 50px;
color: #0B1D30; background: url(../../../assets/img/dev/sup1.png) 0 0/100% 100% no-repeat;
&:nth-child(2) {
background-image: url(../../../assets/img/dev/sup2.png);
} }
.text {
font-size: 14px; &:last-child {
color: #0B1D30; margin-right: 0;
background-image: url(../../../assets/img/dev/sup3.png);
} }
}
h6 {
margin: 15px 0 10px;
font-size: 18px;
color: #0B1D30;
}
.text {
font-size: 14px;
color: #757F92;
}
} }
.sup{ }
background: linear-gradient(180deg, #FFFFFF 0%, #F1F6FE 100%);
.list { .con {
display: flex; background: url(../../../assets/img/dev/con-bg.png) 0 0/100% 100% no-repeat;
justify-content: space-between;
li { .list {
width: 33%; display: flex;
padding: 140px 50px 50px; flex: 1;
background: url(../../../assets/img/dev/sup1.png) 0 0/100% 100% no-repeat;
&:nth-child(2) { li {
background-image: url(../../../assets/img/dev/sup2.png); padding-bottom: 40px;
} margin-right: 24px;
&:last-child { background-color: #fff;
margin-right: 0; border-radius: 10px;
background-image: url(../../../assets/img/dev/sup3.png); box-shadow: 0px 5px 20px 0px rgba(98, 117, 163, 0.08);
}
} &:last-child {
h6 { margin-right: 0;
margin: 15px 0 10px;
font-size: 18px;
color: #0B1D30;
}
.text {
font-size: 14px;
color: #757F92;
}
} }
}
img {
width: 100%;
}
h6 {
margin: 15px 24px 10px;
font-size: 18px;
color: #0B1D30;
}
.text {
margin: 0 24px;
font-size: 14px;
color: #757F92;
}
} }
.con{ }
background: url(../../../assets/img/dev/con-bg.png) 0 0/100% 100% no-repeat;
.list { .profit {
display: flex; margin-bottom: 70px;
flex: 1; text-align: center;
li {
padding-bottom: 40px; .item1 {
margin-right: 24px; line-height: 250px;
background-color: #fff; font-size: 30px;
border-radius: 10px; color: #fff;
box-shadow: 0px 5px 20px 0px rgba(98, 117, 163, 0.08); background: url(../../../assets/img/dev/profit-bg1.png) 0 0/100% 100% no-repeat;
&:last-child {
margin-right: 0;
}
}
img {
width: 100%;
}
h6 {
margin: 15px 24px 10px;
font-size: 18px;
color: #0B1D30;
}
.text {
margin: 0 24px;
font-size: 14px;
color: #757F92;
}
}
} }
.profit {
margin-bottom: 70px; .item2 {
text-align: center; width: 70%;
.item1 { margin: -100px auto 0;
line-height: 250px; line-height: 202px;
font-size: 30px; font-size: 30px;
color: #fff; color: #0B1D30;
background: url(../../../assets/img/dev/profit-bg1.png) 0 0/100% 100% no-repeat; background: url(../../../assets/img/dev/profit-bg2.png) 0 0/100% 100% no-repeat;
}
.item2 {
width: 70%;
margin: -100px auto 0;
line-height: 202px;
font-size: 30px;
color: #0B1D30;
background: url(../../../assets/img/dev/profit-bg2.png) 0 0/100% 100% no-repeat;
}
} }
.contact { }
position: relative;
height: 250px; .contact {
background: url(../../../assets/img/contact-info.png) center center/auto no-repeat, position: relative;
url(../../../assets/img/contact-bg.png) 0 0/100% 100% no-repeat; height: 250px;
.love { background: url(../../../assets/img/contact-info.png) center center/auto no-repeat,
position: absolute; url(../../../assets/img/contact-bg.png) 0 0/100% 100% no-repeat;
top: -45px;
right: 10%; .love {
} position: absolute;
top: -45px;
right: 10%;
} }
}
} }
</style> </style>

File diff suppressed because it is too large Load Diff

@ -256,7 +256,7 @@ export default {
name: 'index', name: 'index',
data () { data () {
return { return {
token: util.local.get(Setting.tokenKey), token: util.session.get(Setting.tokenKey),
active: '' active: ''
} }
}, },

@ -627,9 +627,9 @@ export default {
return { return {
routes: [], routes: [],
headers: { headers: {
token: Util.local.get(Setting.tokenKey) token: Util.session.get(Setting.tokenKey)
}, },
token: Util.local.get(Setting.tokenKey), token: Util.session.get(Setting.tokenKey),
id: +this.$route.query.id, id: +this.$route.query.id,
fromOffical: !!this.$route.query.q, // fromOffical: !!this.$route.query.q, //
end: '', end: '',
@ -1668,7 +1668,7 @@ export default {
signup () { signup () {
const { status, form } = this const { status, form } = this
// //
if (Util.local.get(Setting.tokenKey)) { if (Util.session.get(Setting.tokenKey)) {
const { competitionType } = form.completeCompetitionSetup const { competitionType } = form.completeCompetitionSetup
if (status == 4) { // if (status == 4) { //
// 线(handleStatus) // 线(handleStatus)
@ -1761,7 +1761,7 @@ export default {
// python // python
toPython () { toPython () {
const form = this.curStage const form = this.curStage
let token = Util.local.get(Setting.tokenKey); let token = Util.session.get(Setting.tokenKey);
Util.cookies.set('assessmentId', '', -1) Util.cookies.set('assessmentId', '', -1)
Util.cookies.set('startTime', '', -1) Util.cookies.set('startTime', '', -1)
Util.cookies.set('stopTime', '', -1) Util.cookies.set('stopTime', '', -1)
@ -1801,7 +1801,7 @@ export default {
if (method === 1) { if (method === 1) {
window.open(this.$router.resolve(`/theoryExam?competitionId=${form.id}&stageId=${stageId}&teamId=${teamId}`).href, 'theory') window.open(this.$router.resolve(`/theoryExam?competitionId=${form.id}&stageId=${stageId}&teamId=${teamId}`).href, 'theory')
} else { } else {
let token = Util.local.get(Setting.tokenKey); let token = Util.session.get(Setting.tokenKey);
if (systemId == 11) { if (systemId == 11) {
// //
location.href = `${Setting.systemPath}/#/index/list?curriculumName=${this.curriculumName}&token=${token}&cid=${cid}&systemId=${systemId}&projectId=${projectId}&competitionId=${competitionId}&stageId=${stageId}&teamId=${teamId}&assessmentId=&classId=&stopTime=&test=true` location.href = `${Setting.systemPath}/#/index/list?curriculumName=${this.curriculumName}&token=${token}&cid=${cid}&systemId=${systemId}&projectId=${projectId}&competitionId=${competitionId}&stageId=${stageId}&teamId=${teamId}&assessmentId=&classId=&stopTime=&test=true`

@ -340,11 +340,11 @@ export default {
data () { data () {
return { return {
headers: { headers: {
token: Util.local.get(Setting.tokenKey) token: Util.session.get(Setting.tokenKey)
}, },
fromOffical: !!this.$route.query.q, // fromOffical: !!this.$route.query.q, //
timer: null, timer: null,
token: Util.local.get(Setting.tokenKey), token: Util.session.get(Setting.tokenKey),
statusList: ["待报名", "取消报名", "马上报名", "报名截止", "进入初赛", "已结束"], statusList: ["待报名", "取消报名", "马上报名", "报名截止", "进入初赛", "已结束"],
endList: ["报名开始", "报名截止", "报名截止", "竞赛开始", "竞赛结束", ""], endList: ["报名开始", "报名截止", "报名截止", "竞赛开始", "竞赛结束", ""],
typeList: [ typeList: [
@ -982,7 +982,7 @@ export default {
const { status, id } = item const { status, id } = item
const { competitionType } = item const { competitionType } = item
// //
if (Util.local.get(Setting.tokenKey)) { if (Util.session.get(Setting.tokenKey)) {
this.curItem = item this.curItem = item
if (status == 4) { // if (status == 4) { //
// 线(handleStatus) // 线(handleStatus)
@ -1078,7 +1078,7 @@ export default {
// python // python
toPython () { toPython () {
const form = this.curItem.curStage const form = this.curItem.curStage
let token = Util.local.get(Setting.tokenKey); let token = Util.session.get(Setting.tokenKey);
Util.cookies.set('assessmentId', '', -1) Util.cookies.set('assessmentId', '', -1)
Util.cookies.set('classId', '', -1) Util.cookies.set('classId', '', -1)
Util.cookies.set('startTime', '', -1) Util.cookies.set('startTime', '', -1)
@ -1121,7 +1121,7 @@ export default {
window.open(this.$router.resolve(`/theoryExam?competitionId=${form.id}&stageId=${stageId}&teamId=${teamId}`).href, 'theory') window.open(this.$router.resolve(`/theoryExam?competitionId=${form.id}&stageId=${stageId}&teamId=${teamId}`).href, 'theory')
this.choosing = false this.choosing = false
} else { } else {
let token = Util.local.get(Setting.tokenKey) let token = Util.session.get(Setting.tokenKey)
if (systemId == 11) { if (systemId == 11) {
// //
location.href = `${Setting.systemPath}/#/index/list?curriculumName=${this.curriculumName}&token=${token}&cid=${cid}&systemId=${systemId}&projectId=${projectId}&competitionId=${competitionId}&stageId=${stageId}&teamId=${teamId}&assessmentId=&classId=&stopTime=&test=true` location.href = `${Setting.systemPath}/#/index/list?curriculumName=${this.curriculumName}&token=${token}&cid=${cid}&systemId=${systemId}&projectId=${projectId}&competitionId=${competitionId}&stageId=${stageId}&teamId=${teamId}&assessmentId=&classId=&stopTime=&test=true`

File diff suppressed because it is too large Load Diff

@ -64,7 +64,7 @@ export default {
page: +this.$route.query.page || 1, page: +this.$route.query.page || 1,
pageSize: 10, pageSize: 10,
multipleSelection: [], multipleSelection: [],
token: util.local.get(Setting.tokenKey), token: util.session.get(Setting.tokenKey),
} }
}, },
components: { components: {

@ -93,7 +93,7 @@ export default {
name: '考核' name: '考核'
}, },
], ],
token: Util.local.get(Setting.tokenKey), token: Util.session.get(Setting.tokenKey),
}; };
}, },
created () { created () {

@ -275,7 +275,7 @@ export default {
reportId: this.$route.query.reportId, reportId: this.$route.query.reportId,
fromTheory: this.$route.query.theory, // fromTheory: this.$route.query.theory, //
matchName: this.$route.query.matchName, // matchName: this.$route.query.matchName, //
token: Util.local.get(Setting.tokenKey), token: Util.session.get(Setting.tokenKey),
title: "实验报告", title: "实验报告",
form: { form: {
className: "", className: "",

@ -354,7 +354,7 @@ import Setting from '@/setting'
export default { export default {
data () { data () {
return { return {
token: Util.local.get(Setting.tokenKey), token: Util.session.get(Setting.tokenKey),
time: 2, time: 2,
times: [ times: [
{ {

@ -3,31 +3,22 @@
<div class="left"> <div class="left">
<div class="inner"> <div class="inner">
<div class="text-center"> <div class="text-center">
<img :src="avatar" <img :src="avatar" class="avatar" />
class="avatar" /> <el-upload :headers="{ token }" :action="this.api.uploadUserAvatars" name="file" :limit="10"
<el-upload :headers="{token}" :show-file-list="false" :on-success="changeAvatar">
:action="this.api.uploadUserAvatars" <el-button type="text" size="small">点击更换头像</el-button>
name="file"
:limit="10"
:show-file-list="false"
:on-success="changeAvatar">
<el-button type="text"
size="small">点击更换头像</el-button>
</el-upload> </el-upload>
</div> </div>
<ul class="menu"> <ul class="menu">
<li v-for="item in typeList" <li v-for="item in typeList" :key="item.index" :class="{ active: item.index == active }">
:key="item.index"
:class="{active: item.index == active}">
{{ item.title }} {{ item.title }}
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
<div class="right"> <div class="right">
<info ref="info" <info ref="info" @updateStatus="updateStatus"></info>
@updateStatus="updateStatus"></info>
</div> </div>
</div> </div>
</template> </template>
@ -40,7 +31,7 @@ import util from '@/libs/util'
export default { export default {
data () { data () {
return { return {
token: util.local.get(Setting.tokenKey), token: util.session.get(Setting.tokenKey),
typeList: [ typeList: [
{ {
index: '1', index: '1',
@ -94,39 +85,46 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.main .wrap { .main .wrap {
display: flex; display: flex;
width: $min-width; width: $min-width;
padding: 12px 0 0; padding: 12px 0 0;
.left {
margin-right: 12px; .left {
background-color: #fff; margin-right: 12px;
box-shadow: 2px 0px 6px 0px #eeeeee; background-color: #fff;
.inner { box-shadow: 2px 0px 6px 0px #eeeeee;
width: 170px;
padding: 20px 0; .inner {
} width: 170px;
.avatar { padding: 20px 0;
width: 80px; }
height: 80px;
border-radius: 50%; .avatar {
} width: 80px;
.menu { height: 80px;
margin-top: 32px; border-radius: 50%;
li {
padding: 0 20px;
color: #303133;
font-size: 14px;
line-height: 38px;
cursor: pointer;
&.active {
color: #fff;
background-color: #006eff;
}
}
}
} }
.right {
flex: 1; .menu {
margin-top: 32px;
li {
padding: 0 20px;
color: #303133;
font-size: 14px;
line-height: 38px;
cursor: pointer;
&.active {
color: #fff;
background-color: #006eff;
}
}
} }
}
.right {
flex: 1;
}
} }
</style> </style>

@ -432,7 +432,7 @@ export default {
}, },
destroyed () { destroyed () {
// //
Util.local.get(Setting.tokenKey) && this.courseId && this.$post(this.api.playRecordSave, { Util.session.get(Setting.tokenKey) && this.courseId && this.$post(this.api.playRecordSave, {
courseId: this.courseId, courseId: this.courseId,
courseType: 0, courseType: 0,
playTime: Math.ceil((Date.now() - this.startTime) / 1000 / 60) playTime: Math.ceil((Date.now() - this.startTime) / 1000 / 60)
@ -899,7 +899,7 @@ export default {
// python // python
toPython (projectId) { toPython (projectId) {
const id = this.systemIds const id = this.systemIds
let token = Util.local.get(Setting.tokenKey); let token = Util.session.get(Setting.tokenKey);
Util.cookies.set('assessmentId', '', -1) Util.cookies.set('assessmentId', '', -1)
Util.cookies.set('classId', '', -1) Util.cookies.set('classId', '', -1)
Util.cookies.set('startTime', '', -1) Util.cookies.set('startTime', '', -1)
@ -940,7 +940,7 @@ export default {
this.curProject = curProject.projectId this.curProject = curProject.projectId
} }
const { systemId } = curProject const { systemId } = curProject
let token = Util.local.get(Setting.tokenKey) let token = Util.session.get(Setting.tokenKey)
this.third = curProject.type === 2 ? (curProject.systemId === 28 ? 'low' : 'ai') : '' this.third = curProject.type === 2 ? (curProject.systemId === 28 ? 'low' : 'ai') : ''
if (systemId == 11) { if (systemId == 11) {
// //

@ -174,9 +174,9 @@ export default {
numToLetter: Util.numToLetter, numToLetter: Util.numToLetter,
arabicToChinese: Util.arabicToChinese, arabicToChinese: Util.arabicToChinese,
headers: { headers: {
token: Util.local.get(Setting.tokenKey) token: Util.session.get(Setting.tokenKey)
}, },
token: Util.local.get(Setting.tokenKey), token: Util.session.get(Setting.tokenKey),
paperId: +this.$route.query.paperId, // id paperId: +this.$route.query.paperId, // id
cid: +this.$route.query.cid, cid: +this.$route.query.cid,
mallId: +this.$route.query.mallId || '', mallId: +this.$route.query.mallId || '',

@ -273,7 +273,7 @@ export default {
data () { data () {
return { return {
timer: null, timer: null,
token: Util.local.get(Setting.tokenKey), token: Util.session.get(Setting.tokenKey),
fromOffical: !!this.$route.query.q, // fromOffical: !!this.$route.query.q, //
statusList: ["待报名", "取消报名", "马上报名", "报名截止", "进入初赛", "已结束"], statusList: ["待报名", "取消报名", "马上报名", "报名截止", "进入初赛", "已结束"],
endList: ["报名开始", "报名截止", "报名截止", "竞赛开始", "竞赛结束", ""], endList: ["报名开始", "报名截止", "报名截止", "竞赛开始", "竞赛结束", ""],
@ -409,7 +409,7 @@ export default {
sequence: form.sequence || null, sequence: form.sequence || null,
keyWord: this.keyword keyWord: this.keyword
} }
this.$post(this.api[Util.local.get(Setting.tokenKey) ? 'competitionAfterLogin' : 'notLoggedInBeforeStudentEvents'], data).then(async ({ data }) => { this.$post(this.api[Util.session.get(Setting.tokenKey) ? 'competitionAfterLogin' : 'notLoggedInBeforeStudentEvents'], data).then(async ({ data }) => {
const list = data.records const list = data.records
let result = [] let result = []
// 4 // 4
@ -486,7 +486,7 @@ export default {
total = startTime - now total = startTime - now
break break
} else if (now >= startTime && now <= endTime) { // } else if (now >= startTime && now <= endTime) { //
if ((item.whetherToSignUp === 0 || !Util.local.get(Setting.tokenKey)) && (e.method !== 2 || this.offlineCanEntry(e))) this.$set(item, 'stageName', e.count ? '已提交' : '进入' + e.stageName) // if ((item.whetherToSignUp === 0 || !Util.session.get(Setting.tokenKey)) && (e.method !== 2 || this.offlineCanEntry(e))) this.$set(item, 'stageName', e.count ? '已提交' : '进入' + e.stageName) //
this.$set(item, 'endText', '阶段结束') this.$set(item, 'endText', '阶段结束')
curStage = e curStage = e
total = endTime - now total = endTime - now
@ -734,7 +734,7 @@ export default {
const { status, id } = item const { status, id } = item
const { competitionType } = item const { competitionType } = item
// //
if (Util.local.get(Setting.tokenKey)) { if (Util.session.get(Setting.tokenKey)) {
this.curItem = item this.curItem = item
if (status == 4) { // if (status == 4) { //
// //
@ -798,7 +798,7 @@ export default {
// python // python
toPython () { toPython () {
const form = this.curItem.curStage const form = this.curItem.curStage
let token = Util.local.get(Setting.tokenKey); let token = Util.session.get(Setting.tokenKey);
Util.cookies.set('assessmentId', '', -1) Util.cookies.set('assessmentId', '', -1)
Util.cookies.set('startTime', '', -1) Util.cookies.set('startTime', '', -1)
Util.cookies.set('stopTime', '', -1) Util.cookies.set('stopTime', '', -1)
@ -841,7 +841,7 @@ export default {
window.open(this.$router.resolve(`/theoryExam?competitionId=${form.id}&stageId=${stageId}&teamId=${teamId}`).href, 'theory') window.open(this.$router.resolve(`/theoryExam?competitionId=${form.id}&stageId=${stageId}&teamId=${teamId}`).href, 'theory')
this.choosing = false this.choosing = false
} else { } else {
let token = Util.local.get(Setting.tokenKey) let token = Util.session.get(Setting.tokenKey)
if (systemId == 11) { if (systemId == 11) {
// //
location.href = `${Setting.systemPath}/#/index/list?curriculumName=${this.curriculumName}&token=${token}&cid=${cid}&systemId=${systemId}&projectId=${projectId}&competitionId=${competitionId}&stageId=${stageId}&teamId=${teamId}&assessmentId=&classId=&stopTime=&test=true` location.href = `${Setting.systemPath}/#/index/list?curriculumName=${this.curriculumName}&token=${token}&cid=${cid}&systemId=${systemId}&projectId=${projectId}&competitionId=${competitionId}&stageId=${stageId}&teamId=${teamId}&assessmentId=&classId=&stopTime=&test=true`

@ -15,7 +15,7 @@ service.defaults.headers.post["Content-Type"] = "application/json;charset=UTF-8"
// 请求拦截器 // 请求拦截器
service.interceptors.request.use(config => { service.interceptors.request.use(config => {
Util.getToken(); Util.getToken();
let token = Util.local.get(Setting.tokenKey) let token = Util.session.get(Setting.tokenKey)
if (token) config.headers.token = token if (token) config.headers.token = token
return config return config
}, err => { }, err => {

@ -6,7 +6,7 @@ const whiteList = Setting.whiteList // 白名单
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {
const officalTag = from.query.q && !to.query.q ? ((to.fullPath.includes('?') ? '&' : '?') + `q=${Date.now()}`) : '' // 安财赛事专用标识 const officalTag = from.query.q && !to.query.q ? ((to.fullPath.includes('?') ? '&' : '?') + `q=${Date.now()}`) : '' // 安财赛事专用标识
document.title = to.path === '/screenShow' || to.path === '/screenShowPro' ? '安徽省绿色食品全产业链数据可视化看板' : Setting.titleSuffix + '-' + to.meta.title document.title = to.path === '/screenShow' || to.path === '/screenShowPro' ? '安徽省绿色食品全产业链数据可视化看板' : Setting.titleSuffix + '-' + to.meta.title
const role = util.local.get(Setting.tokenKey); const role = util.session.get(Setting.tokenKey);
if (!role && !whiteList.includes(to.path)) { if (!role && !whiteList.includes(to.path)) {
next('/login' + officalTag) next('/login' + officalTag)
} else if (role && to.path === '/login') { } else if (role && to.path === '/login') {

@ -31,7 +31,7 @@ if (isDev) {
host = "http://118.31.167.228/"; // 测试服 host = "http://118.31.167.228/"; // 测试服
// host = 'https://www.occupationlab.com/' // 正式服 // host = 'https://www.occupationlab.com/' // 正式服
const ip = localStorage.getItem('localIp') const ip = localStorage.getItem('localIp')
const ips = ['http://192.168.31.217:9000/', 'http://192.168.31.51:9000/', 'http://118.31.167.228/'] const ips = ['http://192.168.31.217:9000/', 'http://192.168.31.51:9000/', 'https://www.occupationlab.com/']
host = ips[+ip] host = ips[+ip]
// host = 'http://192.168.31.51:9000/' // host = 'http://192.168.31.51:9000/'
} else if (isSq) { } else if (isSq) {

@ -88,7 +88,7 @@ export default {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
post(api.logout).then(() => { post(api.logout).then(() => {
util.local.remove(Setting.storeKey) util.local.remove(Setting.storeKey)
util.local.remove(Setting.tokenKey) util.session.remove(Setting.tokenKey)
util.local.remove('oc_server_token') util.local.remove('oc_server_token')
util.local.remove('oc_server_store') util.local.remove('oc_server_store')
util.cookies.remove('customerName') util.cookies.remove('customerName')

Loading…
Cancel
Save