Compare commits

...

7 Commits

  1. 1
      README.md
  2. 27
      public/index.html
  3. 86
      src/api/index.js
  4. BIN
      src/assets/img/index/customer.jpg
  5. BIN
      src/assets/img/index/customer.png
  6. 31
      src/layouts/footer/index.vue
  7. 96
      src/layouts/header/index.vue
  8. 335
      src/pages/account/login/index.vue
  9. 4
      src/pages/index/list/index.vue
  10. 195
      src/pages/screen/list/index.vue
  11. 103
      src/plugins/requests/index.js
  12. 5
      src/setting.js
  13. 57
      src/store/modules/user.js
  14. 3
      vue.config.js

@ -0,0 +1 @@
# 数据前瞻平台前端

@ -1,13 +1,25 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="keywords" content="数据前瞻,数据平台,金融数据,宏观数据,行业经济数据">
<meta name="description" content="数据前瞻涵盖股票数据,期货数据,债券数据,期权数据,利率数据,公募数据和宏观数据,拥有超40年的历史数据,可为您解读、预测、分析,模拟市场趋势、经济周期和世界事件影响提供必要的数据支持。我们的数据均来源于各大专业财经权威网站和数据官方发布平台,并经过专业的数据分类和整理,可让用户轻松便捷地搜索并批量下载到自己研究所需的数据,极大地减轻自己搜索整理数据的时间,提高研究效率, 从而高效的输出研究成果。"/>
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no">
<link rel="stylesheet" href="//at.alicdn.com/t/font_830376_qzecyukz0s.css">
<title>数据前瞻——海量,真实,易用,动态更新的财经数据库</title>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="keywords" content="数据前瞻,数据平台,金融数据,宏观数据,行业经济数据" />
<meta
name="description"
content="数据前瞻涵盖股票数据,期货数据,债券数据,期权数据,利率数据,公募数据和宏观数据,拥有超40年的历史数据,可为您解读、预测、分析,模拟市场趋势、经济周期和世界事件影响提供必要的数据支持。我们的数据均来源于各大专业财经权威网站和数据官方发布平台,并经过专业的数据分类和整理,可让用户轻松便捷地搜索并批量下载到自己研究所需的数据,极大地减轻自己搜索整理数据的时间,提高研究效率, 从而高效的输出研究成果。"
/>
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<link rel="stylesheet" href="//at.alicdn.com/t/font_830376_qzecyukz0s.css" />
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement('script');
hm.src = 'https://hm.baidu.com/hm.js?26fbe82e56d2f1aeeb09fe697c4434d5';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
<title>数据前瞻——准确、海量、易用的财经数据平台</title>
</head>
<body>
<noscript>
@ -16,5 +28,4 @@
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

@ -3,12 +3,13 @@ const host = Setting.apiBaseURL
export default {
// 登录注册
logins: `users/users/user/login`,
verification:`${host}users/users/user/captcha`,
logins: `users/users/user/login`,
verification: `${host}users/users/user/captcha`,
sendPhoneVerificationCode: `users/users/user/sendPhoneVerificationCode`,
getToken: `users/users/user/getToken`,
getOtherAccountByPhone: `users/users/user/getOtherAccountByPhone`,
unbindAccounts: `users/users/user/unbindAccounts`,
logout: `users/users/user/logout`,
// 加密货币
market: `/topic/market`,
@ -29,70 +30,69 @@ export default {
// 个人中心
uploadUserAvatars: `${host}users/users/userAccount/updateUserAvatars`,
userInfo:`users/users/userInfo/getUserInfo`,
updateUser:`users/users/userInfo/updateUser`,
findPasswordByEmail:`users/users/userAccount/findPasswordByEmail`,
findPasswordByPhone:`users/users/userAccount/findPasswordByPhone`,
userInfo: `users/users/userInfo/getUserInfo`,
updateUser: `users/users/userInfo/updateUser`,
findPasswordByEmail: `users/users/userAccount/findPasswordByEmail`,
findPasswordByPhone: `users/users/userAccount/findPasswordByPhone`,
// 用户管理
saveUser: `users/users/data/user/save`,
getDetailByAccount: `occupationlab/occupationlab/architecture/getDetailByAccount`,
getUserList: `users/users/data/user/getUserList`,
getUserTotalBySchoolId: `users/users/data/user/getUserTotalBySchoolId`,
checkAccount:`occupationlab/occupationlab/architecture/checkWorkNumOrAccount`,
getDetail:`users/users/data/user/getDetail`,
modifyUser:`users/users/data/user/modify`,
export_failure:`${host}users/users/data/user/export_failure`,
uploadFile:`${host}users/users/data/user/uploadFile`,
deleteUser:`users/users/data/user/delete`,
checkAccount: `occupationlab/occupationlab/architecture/checkWorkNumOrAccount`,
getDetail: `users/users/data/user/getDetail`,
modifyUser: `users/users/data/user/modify`,
export_failure: `${host}users/users/data/user/export_failure`,
uploadFile: `${host}users/users/data/user/uploadFile`,
deleteUser: `users/users/data/user/delete`,
resetPwd: `users/users/userAccount/resetPwd`,
sendPhoneOrEmailCode: `users/users/userAccount/sendPhoneOrEmailCode`,
unbindMobilePhone: `users/users/userAccount/unbindMobilePhone`,
bindPhoneOrEmail: `users/users/userAccount/bindPhoneOrEmail`,
examinePassword: `users/users/userAccount/examinePassword`,
isClient: `${host}users/users/user/isClient`,
deleteProfile: `users/users/userInfo/deleteProfile`,
checkEmailOrPhone: `occupationlab/occupationlab/architecture/checkEmailOrPhone`,
accountIsDisabled: `users/users/user/accountIsDisabled`,
userTemplate: `http://121.37.12.51/template/%E6%95%B0%E6%8D%AE%E5%B9%B3%E5%8F%B0%E7%94%A8%E6%88%B7%E5%AF%BC%E5%85%A5%E6%A8%A1%E6%9D%BF.xlsx`,
// 角色管理
batchRemove:`users/users/role/batchRemove`,
getRole:`users/users/role/obtainDetails`,
getName:`data/data/role/getName`,
listRole:`users/users/role/list`,
removeRole:`data/data/role/remove`,
saveOrUpdate:`users/users/role/saveOrUpdate`,
getPermissions:`users/users/user-role/getUserRolesPermissionMenu`,
batchRemove: `users/users/role/batchRemove`,
getRole: `users/users/role/obtainDetails`,
getName: `data/data/role/getName`,
listRole: `users/users/role/list`,
removeRole: `data/data/role/remove`,
saveOrUpdate: `users/users/role/saveOrUpdate`,
getPermissions: `users/users/user-role/getUserRolesPermissionMenu`,
// 权限菜单管理
doAssign:`data/data/permission/doAssign`,
queryAllMenus:`users/users/permission/queryAllMenus`,
savePer:`users/users/user-role/rolePermissionService`,
toAssign:`data/data/permission/toAssign`,
doAssign: `data/data/permission/doAssign`,
queryAllMenus: `users/users/permission/queryAllMenus`,
savePer: `users/users/user-role/rolePermissionService`,
toAssign: `data/data/permission/toAssign`,
// 表展示
getIdQueryTable:`data/data/table/getIdQueryTable`,
getTableByClassification:`data/data/table/getTableByClassification`,
getTableByCondition:`data/data/table/getTableByCondition`,
downloadData:`${host}data/data/download`,
previewData:`data/data/preview`,
visualPreview:`data/data/visualPreview`,
downloadRecord:`data/data/myDownload/downloadRecord`,
getDownloadRecord:`data/data/myDownload/getDownloadRecord`,
downloadAgain:`data/data/downloadAgain`,
isDownload:`data/data/product/isDownload`,
getTableTime:`data/data/tableTime/getTableTime`,
getIdQueryTable: `data/data/table/getIdQueryTable`,
getTableByClassification: `data/data/table/getTableByClassification`,
getTableByCondition: `data/data/table/getTableByCondition`,
downloadData: `${host}data/data/download`,
previewData: `data/data/preview`,
visualPreview: `data/data/visualPreview`,
downloadRecord: `data/data/myDownload/downloadRecord`,
getDownloadRecord: `data/data/myDownload/getDownloadRecord`,
downloadAgain: `data/data/downloadAgain`,
isDownload: `data/data/product/isDownload`,
getTableTime: `data/data/tableTime/getTableTime`,
getLevel: `data/data/category/getLevel`,
multipleTablePreview: `data/data/multipleTablePreview`,
// 数据操作记录
queryAccumulate:`data/data/dataRecord/queryAccumulate`,
queryDatabaseInfo:`data/data/dataRecord/queryDatabaseInfo`,
queryDatabaseInfoByMonth:`data/data/dataRecord/queryDatabaseInfoByMonth`,
saveRecord:`data/data/dataRecord/saveRecord`,
databaseInfoExport:`${host}data/data/dataRecord/databaseInfoExport`,
databaseInfoByMonthExport:`${host}data/data/dataRecord/databaseInfoByMonthExport`,
onlineNumber:`data/data/dataRecord/onlineNumber`,
getProductInfoBySchoolId:`data/data/product/getProductInfoBySchoolId`,
queryAccumulate: `data/data/dataRecord/queryAccumulate`,
queryDatabaseInfo: `data/data/dataRecord/queryDatabaseInfo`,
queryDatabaseInfoByMonth: `data/data/dataRecord/queryDatabaseInfoByMonth`,
saveRecord: `data/data/dataRecord/saveRecord`,
databaseInfoExport: `${host}data/data/dataRecord/databaseInfoExport`,
databaseInfoByMonthExport: `${host}data/data/dataRecord/databaseInfoByMonthExport`,
onlineNumber: `data/data/dataRecord/onlineNumber`,
getProductInfoBySchoolId: `data/data/product/getProductInfoBySchoolId`,
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

@ -9,22 +9,23 @@
<div class="footer">
<div class="info">
<!-- <span class="m-r-20">客服邮箱service@huorantech.cn</span> -->
<span>联系人孙经理 18565785395</span>
<span>联系人金经理 15218726836</span>
</div>
<div class="copyright">
<span>© Copyright 2021 Dataforward 数据前瞻</span>
<a href="https://beian.miit.gov.cn/#/Integrated/index" target="_blank">粤ICP备20072679号</a>
<a href="https://beian.miit.gov.cn/#/Integrated/index"
target="_blank">粤ICP备20072679号</a>
</div>
</div>
</template>
<script>
export default {
data() {
data () {
return {
};
},
mounted(){
mounted () {
},
methods: {
@ -33,31 +34,31 @@ export default {
};
</script>
<style lang="scss" scoped>
.footer{
.footer {
padding: 17px 0 9px;
text-align: center;
background-color: #0F1D2E;
.info{
background-color: #0f1d2e;
.info {
margin-bottom: 7px;
font-size: 14px;
line-height: 20px;
color: #D7DFE7;
color: #d7dfe7;
}
.copyright{
.copyright {
font-size: 12px;
text-align: center;
line-height: 17px;
span{
span {
margin-right: 20px;
color: #757F8A;
color: #757f8a;
}
a{
color:#757F8A;
a {
color: #757f8a;
font-size: 12px;
&:hover{
&:hover {
color: #c7c7c7;
}
}
}
}
}
</style>

@ -11,7 +11,7 @@
<el-dropdown class="user-wrap" @command="userCommand">
<div class="user">
<el-avatar :size="40" :src="avatar"></el-avatar>
<span class="username">{{userName}}</span>
<span class="username">{{ userName }}</span>
</div>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="person" v-if="!isCustomer">个人资料</el-dropdown-item>
@ -29,16 +29,19 @@
</div>
</div>
<el-dialog title="修改密码" :visible.sync="passwordVisible" :close-on-click-modal="false" :append-to-body="true" @close="closePassword" width="30%">
<el-dialog title="修改密码" :visible.sync="passwordVisible" :close-on-click-modal="false" :append-to-body="true"
@close="closePassword" width="30%">
<el-form ref="passwordForm" label-width="82px">
<el-form-item label="原密码">
<el-input type="password" v-model="passwordForm.password" placeholder="请输入原密码"></el-input>
</el-form-item>
<el-form-item label="新密码">
<el-input type="password" v-model="passwordForm.newPassword" placeholder="请输入新密码" @keyup.enter.native="editPassword"></el-input>
<el-input type="password" v-model="passwordForm.newPassword" placeholder="请输入新密码"
@keyup.enter.native="editPassword"></el-input>
</el-form-item>
<el-form-item label="确认新密码">
<el-input type="password" v-model="passwordForm.reNewPassword" placeholder="请确认新密码" @keyup.enter.native="editPassword"></el-input>
<el-input type="password" v-model="passwordForm.reNewPassword" placeholder="请确认新密码"
@keyup.enter.native="editPassword"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
@ -54,7 +57,7 @@ import { mapState, mapMutations, mapActions } from 'vuex'
import Setting from '@/setting'
import util from '@/libs/util'
export default {
data() {
data () {
return {
token: util.local.get(Setting.tokenKey),
isLogin: this.$route.path == '/login',
@ -79,7 +82,7 @@ export default {
'routes'
])
},
mounted() {
mounted () {
// ,store,,
if (this.customer) {
let customer = atob(decodeURI(this.customer)) == 'false' ? false : true
@ -104,7 +107,7 @@ export default {
'setInfo', 'logout', 'setManager', 'setCustomer'
]),
//
getUserInfo() {
getUserInfo () {
this.$get(this.api.userInfo).then(res => {
let userInfo = res.userInfo ? res.userInfo : {}
let userAccount = res.userAccount
@ -114,16 +117,12 @@ export default {
avatar: userInfo.userAvatars,
userName: userInfo.userName
})
//
userInfo.userName || this.$get(this.api.isClient).then(res => {
res.customerName && this.setInfo({userName: res.customerName})
}).catch(res => {})
}).catch(err => { })
},
hideSetting() {
hideSetting () {
this.showSetting = false
},
toIndex() {
toIndex () {
//
if (this.$route.path === '/index/list') {
location.reload()
@ -132,11 +131,11 @@ export default {
this.showSetting = true
}
},
toLogin() {
toLogin () {
window.open(this.$router.resolve('/login').href)
},
//
toManager() {
toManager () {
let routes = this.routes
if (routes.length) {
let route = this.$router.resolve({
@ -154,7 +153,7 @@ export default {
util.warningMsg('该角色未开放模块,请联系管理员')
}
},
userCommand(command) {
userCommand (command) {
if (command == 'person') {
this.$router.push('/setting/person').catch(err => { })
} else if (command == 'resetPw') {
@ -165,10 +164,10 @@ export default {
this.logout()
}
},
showPassword() {
showPassword () {
this.passwordVisible = true
},
editPassword() {
editPassword () {
if (!this.passwordForm.password) return util.warningMsg('请输入原密码')
if (!this.passwordForm.newPassword) return util.warningMsg('请输入新密码')
if (!this.passwordForm.reNewPassword) return util.warningMsg('请确认新密码')
@ -183,7 +182,7 @@ export default {
this.passwordVisible = false
}).catch(err => { })
},
closePassword() {
closePassword () {
this.passwordForm = {
password: '',
newPassword: '',
@ -195,7 +194,8 @@ export default {
</script>
<style lang="scss" scoped>
$height: 64px;
.header{
.header {
z-index: 10;
position: fixed;
top: 0;
@ -204,7 +204,8 @@ $height: 64px;
height: $height;
background-color: #fff;
box-shadow: 0px 0px 6px 0px rgba(178, 178, 178, 0.32);
.inner{
.inner {
display: flex;
justify-content: space-between;
align-items: center;
@ -212,7 +213,8 @@ $height: 64px;
padding: 0 80px 0 10px;
margin: 0 auto;
}
.logo{
.logo {
position: absolute;
top: 0;
left: 80px;
@ -222,7 +224,7 @@ $height: 64px;
cursor: pointer;
}
.search{
.search {
z-index: 2;
position: absolute;
top: 0;
@ -236,42 +238,59 @@ $height: 64px;
padding: 7px 20px;
margin: 0 auto;
background-color: #fff;
input{
input {
width: 195px;
margin-left: 10px;
font-size: 14px;
color: #333;
background-color: transparent;
border: 0;
&::-webkit-input-placeholder{color: #999}
&::-moz-placeholder{color: #999}
&:-moz-placeholder{color: #999}
&:focus{
&::-webkit-input-placeholder {
color: #999
}
&::-moz-placeholder {
color: #999
}
&:-moz-placeholder {
color: #999
}
&:focus {
outline: none;
}
}
.remove{
.remove {
cursor: pointer;
}
.search-icon{
.search-icon {
width: 18px;
}
}
.action{
.action {
display: inline-flex;
align-items: center;
.icon{
.icon {
cursor: pointer;
}
.user-wrap {
display: inline-flex;
align-items: center;
.user{
.user {
display: inline-flex;
align-items: center;
cursor: pointer;
.username{
.username {
margin-left: 10px;
color: #000;
font-size: 16px;
@ -279,14 +298,17 @@ $height: 64px;
}
}
}
.login{
.login {
display: inline-flex;
align-items: center;
cursor: pointer;
&:hover{
&:hover {
opacity: .9;
}
span{
span {
margin-left: 5px;
color: #666;
font-size: 14px;

@ -4,20 +4,16 @@
<div class="form">
<h6 class="title">欢迎使用请登录</h6>
<ul class="tab">
<li v-for="(item,index) in tabList" :key="index" :class="{active: form.distinguish == item.id}" @click="typeClick(item)">{{item.label}}</li>
<li v-for="(item, index) in tabList" :key="index" :class="{ active: form.distinguish == item.id }"
@click="typeClick(item)">{{ item.label }}</li>
</ul>
<el-form :model="form" :rules="rules" ref="form" style="margin-top: 20px">
<!-- 学号工号 -->
<div v-show="!form.distinguish">
<el-form-item class="school-select" prop="schoolId">
<label class="label school"></label>
<el-select v-model="form.schoolId" clearable filterable placeholder="请选择学校">
<el-option v-for="(item, i) in schoolList" :key="i" :label="item.schoolName" :value="item.schoolId"></el-option>
</el-select>
</el-form-item>
<div v-show="!form.distinguish && !verCodeLogin" class="items">
<el-form-item class="flex-1" prop="workNumber">
<label class="label account"></label>
<el-input v-model.trim="form.workNumber" :placeholder="'请输入学号/工号'" @keyup.enter.native="submit"></el-input>
<el-input v-model.trim="form.workNumber" placeholder="请输入学号/工号/手机号/邮箱"
@keyup.enter.native="submit"></el-input>
</el-form-item>
</div>
<!-- 手机号登录 -->
@ -25,7 +21,7 @@
<label class="label account"></label>
<el-input v-model.trim="form.account" placeholder="请输入账号" @keyup.enter.native="submit"></el-input>
</el-form-item>
<template v-if="form.distinguish === 2">
<template v-if="verCodeLogin">
<el-form-item prop="account">
<label class="label account"></label>
<el-input v-model.trim="form.account" placeholder="请输入手机号/邮箱" @keyup.enter.native="submit"></el-input>
@ -33,36 +29,30 @@
<el-form-item prop="code">
<label class="label code"></label>
<div class="ver-code">
<el-input v-model="form.code" placeholder="请输入验证码" maxlength="6" @keyup.enter.native="submit"></el-input>
<el-button type="text" @click="sendPhoneCodeLogin" :disabled="phoneDisabledLogin">{{ phoneBtnTextLogin }}
<el-input v-model="form.code" placeholder="请输入验证码" maxlength="6"
@keyup.enter.native="submit"></el-input>
<el-button type="text" @click="sendPhoneCodeLogin" :disabled="phoneDisabledLogin">{{ phoneBtnTextLogin
}}
</el-button>
</div>
</el-form-item>
</template>
<template v-if="form.distinguish !== 2">
<template v-else>
<el-form-item prop="password">
<label class="password label"></label>
<el-input
type="password"
placeholder="请输入密码"
v-model.trim="form.password"
@keyup.enter.native="submit"
>
<el-input type="password" placeholder="请输入密码" v-model.trim="form.password" @keyup.enter.native="submit">
</el-input>
</el-form-item>
<el-form-item prop="code">
<label class="label code"></label>
<el-input
placeholder="请输入验证码"
v-model.trim="form.code"
@keyup.enter.native="submit"
>
<el-input placeholder="请输入验证码" v-model.trim="form.code" @keyup.enter.native="submit">
</el-input>
<img @click="getVerImg" :src="verificationIMG" class="ver-img" alt="">
</el-form-item>
</template>
<div v-show="!form.distinguish" class="default-check">
<el-checkbox v-model="setDefault">设置为默认学校</el-checkbox>
<div class="bottom">
<el-link :underline="false" type="primary" @click="switchType">{{ verCodeLogin ? '密码' : '验证码' }}登录</el-link>
<el-link :underline="false" type="primary" @click="toAccount">没有账号点击申请</el-link>
</div>
<el-button class="submit" type="primary" @click="submit">登录</el-button>
</el-form>
@ -78,7 +68,9 @@
<el-form-item label="验证码">
<div class="ver-code">
<el-input v-model="phoneCode" placeholder="请输入验证码" maxlength="6"></el-input>
<el-button style="top: 1px" type="text" @click="sendPhoneCode(1)" :disabled="binding === '' || phoneDisabled">{{phoneBtnText}}</el-button>
<el-button style="top: 1px" type="text" @click="sendPhoneCode(1)"
:disabled="binding === '' || phoneDisabled">{{
phoneBtnText }}</el-button>
</div>
</el-form-item>
</el-form>
@ -87,16 +79,18 @@
<el-button size="small" type="primary" @click="phoneSubmit"> </el-button>
</span>
</el-dialog>
<el-dialog title="请选择您要登录的用户" :visible.sync="userVisible" :close-on-click-modal="false" custom-class="user-dia" width="500px">
<el-dialog title="请选择您要登录的用户" :visible.sync="userVisible" :close-on-click-modal="false" custom-class="user-dia"
width="500px">
<p class="tips">该手机号已绑定以下用户信息</p>
<ul class="users">
<li :class="{isEnable: !user.isEnable}" v-for="(user, i) in users" :key="i" @click="chooseUser(user)">
<span>{{ user.schoolName }}{{ user.userName }}{{ user.workNumber }}{{ user.isEnable ? '' : '(已禁用)'}}</span>
<li :class="{ isEnable: !user.isEnable }" v-for="(user, i) in users" :key="i" @click="chooseUser(user)">
<span>{{ user.schoolName }}{{ user.userName }}{{ user.workNumber }}{{ user.isEnable ? '' : '(已禁用)' }}</span>
<i class="el-icon-right"></i>
</li>
</ul>
</el-dialog>
<el-dialog :visible.sync="infoVisible" :close-on-click-modal="false" :show-close="false" custom-class="info-dia" width="400px">
<el-dialog :visible.sync="infoVisible" :close-on-click-modal="false" :show-close="false" custom-class="info-dia"
width="400px">
<div class="info-header">
<i class="el-icon-warning"></i>
提示
@ -131,41 +125,35 @@ import util from '@/libs/util'
import Setting from '@/setting'
import vFooter from '@/layouts/footer'
export default {
data: function() {
data: function () {
return {
tabList: [
{
id: 0,
label: '学号/工号登录'
label: '学生/老师登录'
}, {
id: 1,
label: '学校管理员登录'
}, {
id: 2,
label: '手机号/邮箱'
}
],
setDefault: !!util.local.get(schoolIdKey), // id
verificationIMG: '',
schoolList: [],
form: {
schoolId: '',
workNumber: '',
account: '',
account: '', //
password: '',
code: '', //
random: '', //
distinguish: 0, // ,1,2
type: 2, // 0-> 1-> 2->
platform: Setting.platformId
platform: Setting.platformId,
distinguish: 0,
},
rules: {
schoolId: [{ required: true, message: "请选择学校", trigger: "change" }],
workNumber: [{ required: true, message: "请输入学生学号", trigger: "blur" }],
workNumber: [{ required: true, message: "请输入学号/工号/手机号/邮箱", trigger: "blur" }],
account: [{ required: false, message: "请输入账号", trigger: "blur" }],
password: [{ required: true, message: "请输入密码", trigger: "blur" }],
code: [{ required: true, message: "请输入验证码", trigger: "blur" }]
},
verCodeLogin: false,
phoneDisabledLogin: false,
phoneTimerLogin: null,
phoneBtnTextLogin: '发送验证码',
@ -186,9 +174,8 @@ export default {
infos: []
};
},
components: {vHead,vFooter},
mounted(){
this.getSchool()
components: { vHead, vFooter },
mounted () {
this.getVerImg()
},
methods: {
@ -198,24 +185,20 @@ export default {
...mapActions('user', [
'login', 'setCustomer'
]),
// id
setSchool(list) {
this.schoolList = list
// id
const schoolId = util.local.get(schoolIdKey)
if (schoolId) this.form.schoolId = schoolId
},
//
getSchool() {
this.$get(this.api.querySchool, {
provinceId: '',
cityId: ''
}).then(({ list }) => {
this.setSchool(list)
}).catch(res => {})
//
handleRule () {
const type = this.form.distinguish
const rules = this.rules
rules.workNumber[0].required = !type && !this.verCodeLogin
rules.account[0].required = (!type && this.verCodeLogin) || type
this.rules.account[0].message = type ?
'请输入账号' :
this.verCodeLogin ?
'请输入手机号/邮箱' :
'请输入学号/工号/手机号/邮箱'
},
//
typeClick(tab) {
typeClick (tab) {
const { id } = tab
const form = this.form
//
@ -231,24 +214,17 @@ export default {
platform: form.platform
}
this.$refs.form.clearValidate()
//
const rules = this.rules
rules.schoolId[0].required = id === 0
rules.workNumber[0].required = id === 0
rules.account[0].required = !!id
this.rules.account[0].message = id === 1 ?
'请输入账号' :
'请输入手机号/邮箱'
this.handleRule()
},
//
chooseUser(user) {
chooseUser (user) {
user.isEnable && this.$post(`${this.api.getToken}?id=${user.id}`).then(({ data }) => {
this.token = data.token
this.setLogin()
}).catch(res => {})
}).catch(res => { })
},
//
setLogin() {
setLogin () {
util.local.set(Setting.tokenKey, this.token, Setting.tokenExpires)
//
this.$get(this.api.isClient).then(res => {
@ -259,28 +235,24 @@ export default {
userName
})
window.opener && window.opener.location.reload() //
util.local.set(Setting.storeKey,this.$store.state)
}).catch(res => {})
util.local.set(Setting.storeKey, this.$store.state)
}).catch(res => { })
// schoolId
this.$post(this.api.getSchoolIdByToken).then(res => {
this.SET_INFO(res)
}).catch(res => {})
}).catch(res => { })
// +1
this.$post(this.api.saveRecord,{
this.$post(this.api.saveRecord, {
type: 3,
}).then(res => {}).catch(res => {})
}).then(res => { }).catch(res => { })
util.successMsg('登录成功')
this.$router.replace('/index')
},
submit() {
submit () {
this.$refs.form.validate(valid => {
if (valid) {
const form = JSON.parse(JSON.stringify(this.form))
const { distinguish } = form
if (!form.distinguish && this.setDefault) util.local.set(schoolIdKey, form.schoolId) //
if (util.local.get(schoolIdKey) && !this.setDefault) util.local.remove(schoolIdKey) // id
if (distinguish) form.schoolId = ''
if (!distinguish) form.distinguish = 1
if (this.verCodeLogin) form.distinguish = 2
this.$post(this.api.logins, form).then(({ status, data, message }) => {
//
if (status == 30001) {
@ -288,33 +260,33 @@ export default {
this.getVerImg()
form.code = ''
} else if (status == 200) {
const accounts = data.userAccounts
//
if (data instanceof Array) {
//
if (data.length === 1) {
this.chooseUser(data[0])
} else {
this.users = data
if (accounts instanceof Array) {
this.users = accounts
this.userVisible = true
}
} else {
this.token = data.token
this.setLogin()
}
} else {
form.code = ''
util.errorMsg(message)
}
}).catch(res => {})
}).catch(res => {
this.getVerImg()
form.code = ''
})
}
})
},
getVerImg(){
this.form.random = Math.floor(Math.random()*999999999)
this.verificationIMG = this.api.verification+'?random='+`${this.form.random}`
getVerImg () {
this.form.random = Math.floor(Math.random() * 999999999)
this.verificationIMG = this.api.verification + '?random=' + `${this.form.random}`
},
//
verifyPhone(phone) {
verifyPhone (phone) {
if (!phone) {
this.$message.error("请输入手机号")
return false
@ -326,8 +298,19 @@ export default {
return true
},
//
switchType () {
this.verCodeLogin = !this.verCodeLogin
this.$refs.form.clearValidate()
this.handleRule()
},
//
toAccount () {
this.accountVisible = true
},
//
phoneCountdownLogin() {
phoneCountdownLogin () {
let count = 60
if (!this.phoneTimerLogin) {
this.phoneDisabledLogin = true
@ -345,28 +328,28 @@ export default {
}
},
//
sendPhoneCodeLogin() {
sendPhoneCodeLogin () {
const phone = this.form.account
if (!this.verifyPhone(phone)) return false
this.$post(`${this.api.sendPhoneVerificationCode}?phoneOrEmail=${phone}&loginOrBind=0&platform=${Setting.platformId}`).then(({ message }) => {
util.successMsg(message)
this.phoneCountdownLogin()
}).catch(res => {})
}).catch(res => { })
},
//
bindPhone() {
bindPhone () {
this.infoVisible = false
this.binding = true
this.sendPhoneCode(1)
},
//
unbindPhone() {
unbindPhone () {
this.infoVisible = false
this.binding = false
this.sendPhoneCode(0)
},
//
phoneChange() {
phoneChange () {
this.$post(`${this.api.getOtherAccountByPhone}?phone=${this.phone}&platform=${Setting.platformId}`).then(({ userAccounts }) => {
const list = userAccounts
if (list) {
@ -380,29 +363,29 @@ export default {
} else {
this.binding = true
}
}).catch(res => {})
}).catch(res => { })
},
phoneCountdown(){
phoneCountdown () {
let count = 60
if(!this.phoneTimer){
if (!this.phoneTimer) {
this.phoneDisabled = true
this.phoneTimer = setInterval(() => {
console.log('倒计时中')
if(count > 0){
if (count > 0) {
count--
this.phoneBtnText = `${count}秒后重试`
}else{
} else {
this.phoneDisabled = false
clearInterval(this.phoneTimer)
this.phoneTimer = null
this.phoneBtnText = `发送验证码`
}
},1000)
}, 1000)
}
},
//
sendPhoneCode(bind) {
sendPhoneCode (bind) {
const { phone } = this
if (!this.verifyPhone(phone)) return false
//
@ -418,16 +401,16 @@ export default {
} else {
util.errorMsg(message)
}
}).catch(res => {})
}).catch(res => { })
} else {
this.$post(`${this.api.sendPhoneVerificationCode}?phoneOrEmail=${phone}&loginOrBind=1&platform=${Setting.platformId}`).then(({ message }) => {
util.successMsg(message)
this.phoneCountdown()
}).catch(res => {})
}).catch(res => { })
}
},
//
unbind() {
unbind () {
const { password, platform, schoolId, type, workNumber } = this.form
this.$post(this.api.unbindAccounts, {
accountIds: this.accountIds,
@ -441,10 +424,10 @@ export default {
}).then(({ data }) => {
this.token = data.token
this.setLogin()
}).catch(res => {})
}).catch(res => { })
},
//
phoneSubmit() {
phoneSubmit () {
const { phone, phoneCode } = this
if (!this.verifyPhone(phone)) return false
if (!phoneCode) return util.warningMsg('请输入验证码')
@ -462,7 +445,7 @@ export default {
}).then(({ token }) => {
this.token = token
this.setLogin()
}).catch(res => {})
}).catch(res => { })
} else {
this.unbind()
}
@ -474,82 +457,99 @@ export default {
<style scoped lang="scss">
.wrap {
min-height: 100%;
background-color: #F3F6FA;
background-color: #f3f6fa;
}
.ver-code {
position: relative;
.el-button {
position: absolute;
top: 10px;
right: 10px;
}
}
.login{
.login {
min-height: calc(100vh - 70px);
padding-top: calc((100vh - 611px) / 2);
background: url(../../../assets/img/shapes/shape1.png) (0 123px)/auto no-repeat,
url(../../../assets/img/shapes/shape2.png) (35px 238px)/auto no-repeat,
url(../../../assets/img/shapes/shape3.png) (0 485px)/auto no-repeat,
url(../../../assets/img/shapes/shape4.png) (right 50%)/auto no-repeat,
url(../../../assets/img/shapes/shape5.png) (right 80%)/auto no-repeat,
url(../../../assets/img/shapes/shape6.png) (right bottom)/auto no-repeat;
.tab{
background: url(../../../assets/img/shapes/shape1.png) (0 123px) / auto no-repeat,
url(../../../assets/img/shapes/shape2.png) (35px 238px) / auto no-repeat,
url(../../../assets/img/shapes/shape3.png) (0 485px) / auto no-repeat,
url(../../../assets/img/shapes/shape4.png) (right 50%) / auto no-repeat,
url(../../../assets/img/shapes/shape5.png) (right 80%) / auto no-repeat,
url(../../../assets/img/shapes/shape6.png) (right bottom) / auto no-repeat;
.tab {
display: flex;
justify-content: space-between;
justify-content: space-around;
align-items: center;
margin-bottom: 24px;
border-bottom: 2px solid #E1E6F2;
li{
border-bottom: 2px solid #e1e6f2;
li {
padding: 18px 0;
margin-bottom: -1px;
font-size: 16px;
color: #555;
cursor: pointer;
border-bottom: 4px solid transparent;
&:last-child{
&:last-child {
margin-right: 0;
}
&.active{
color: $main-color;;
&.active {
color: $main-color;
border-bottom-color: $main-color;
}
}
}
.items {
display: flex;
align-items: center;
}
.form{
.form {
width: 436px;
padding: 38px 38px 60px;
margin: 0 auto 0;
border-radius: 6px;
background-color: #fff;
.title{
.title {
margin-bottom: 25px;
font-size: 26px;
color: #0B1D30;
color: #0b1d30;
letter-spacing: 4px;
}
}
/deep/.el-form-item{
/deep/.el-form-item {
margin-bottom: 20px;
}
/deep/.el-input__inner{
/deep/.el-input__inner {
position: relative;
height: 52px;
padding: 0 20px 0 34px;
line-height: 50px;
background-color: #FBFBFB;
border: 1px solid #E1E6F2;
background-color: #fbfbfb;
border: 1px solid #e1e6f2;
border-radius: 4px !important;
}
.default-check {
text-align: right;
.bottom {
display: flex;
justify-content: space-between;
}
.el-select {
width: 100%;
}
.label {
z-index: 1;
position: absolute;
@ -559,33 +559,40 @@ export default {
height: 18px;
background: url(../../../assets/img/login/account.png) 0 0/100% 100% no-repeat;
}
.school{
.school {
background-image: url(../../../assets/img/login/school.png);
}
.workNumber{
.workNumber {
width: 17px;
background-image: url(../../../assets/img/login/workNumber.png);
}
.password{
.password {
top: 18px;
background-image: url(../../../assets/img/login/password.png);
}
.code{
.code {
top: 18px;
background-image: url(../../../assets/img/login/code.png);
}
.ver-img{
.ver-img {
position: absolute;
top: 1px;
right: 1px;
}
/deep/.el-form-item__error{
/deep/.el-form-item__error {
top: 105%;
left: auto;
right: 0;
color: #FFA94E;
color: #ffa94e;
}
.submit{
.submit {
width: 100%;
height: 48px;
margin-top: 30px;
@ -597,31 +604,37 @@ export default {
border: 0;
}
}
.copyright{
.copyright {
padding: 18px 0;
font-size: 12px;
text-align: center;
background-color: #F3F6FA;
a{
color:#B1B4B8;
background-color: #f3f6fa;
a {
color: #b1b4b8;
font-size: 12px;
&:hover{
opacity: .8;
&:hover {
opacity: 0.8;
}
}
}
.tips {
margin: 0 0 10px 5px;
font-size: 14px;
text-align: center;
color: #666;
}
/deep/.user-dia {
.tips {
margin-bottom: 20px;
text-align: center;
color: #666;
}
.users {
li {
display: flex;
@ -633,27 +646,33 @@ export default {
font-size: 14px;
background-color: #ebeef5;
cursor: pointer;
&.isEnable {
color: #c0c4cc;
background-color: #f5f7fa;
cursor: not-allowed;
}
&:last-child {
margin-bottom: 0;
}
&:hover {
background-color: #d3e0ff;
}
i {
font-size: 16px;
}
}
}
}
/deep/.info-dia {
.el-dialog__header {
border-bottom: 0;
}
.info-header {
position: absolute;
top: 20px;
@ -662,38 +681,46 @@ export default {
font-size: 16px;
color: #333;
}
.el-icon-warning {
margin-right: 10px;
color: #e6a23c;
font-size: 24px;
}
.info-wrap {
padding: 10px 33px;
}
.users {
max-height: 125px;
margin-top: 20px;
overflow: auto;
li {
margin: 5px;
font-size: 14px;
color: #333;
}
}
.info-footer {
display: flex;
justify-content: space-between;
// align-items: center;
margin-top: 20px;
}
.el-button {
width: 142px;
}
.unbind {
white-space: normal;
line-height: 1.6;
}
}
@media (max-height: 680px) {
.wrap .login {
padding: 40px 0;

@ -238,7 +238,7 @@
<div class="popup wechat-popup">
<p class="tips">微信扫码添加职站售前咨询</p>
<p class="des">提供付费咨询及解决方案</p>
<img width="150" src="@/assets/img/index/customer.jpg" alt="">
<img width="150" src="@/assets/img/index/customer.png" alt="">
</div>
<div class="item tel"></div>
<div class="popup tel-popup">
@ -249,7 +249,7 @@
</div>
<div class="text">
<p class="title">售前咨询</p>
<p class="tel-num" style="margin-bottom: 5px"></p>
<p class="tel-num" style="margin-bottom: 5px">老师</p>
<p class="tel-num">18019930142</p>
</div>
</div>

@ -1,7 +1,10 @@
<template>
<div class="wrap">
<!-- 全屏 -->
<img class="full" src="@/assets/img/screen/full.png" alt="" @click="fullScreen">
<img class="full"
src="@/assets/img/screen/full.png"
alt=""
@click="fullScreen">
<!--header-->
<div class="header">
<div class="bg_header">
@ -34,10 +37,13 @@
<i class="b_r_line"></i>
</div>
<div class="main_title">
<img src="@/assets/img/screen/t_1.png" alt="">
<img src="@/assets/img/screen/t_1.png"
alt="">
中国宏观杠杆率
</div>
<div id="chart1" class="chart" style="height: 280px;"></div>
<div id="chart1"
class="chart"
style="height: 280px;"></div>
</div>
<div class="item">
<div class="t_line_box">
@ -57,10 +63,13 @@
<i class="b_r_line"></i>
</div>
<div class="main_title">
<img src="@/assets/img/screen/t_2.png" alt="">
<img src="@/assets/img/screen/t_2.png"
alt="">
新增信贷数据
</div>
<div id="chart5" class="chart t_btn9" style="height: 280px;"></div>
<div id="chart5"
class="chart t_btn9"
style="height: 280px;"></div>
</div>
<div class="item">
<div class="t_line_box">
@ -80,7 +89,8 @@
<i class="b_r_line"></i>
</div>
<div class="main_title">
<img src="@/assets/img/screen/t_7.png" alt="">
<img src="@/assets/img/screen/t_7.png"
alt="">
{{ goodsSell.length ? goodsSell[0].operation_time.substr(0, 4) : 2021 }}年商品零售价格指数
</div>
<div class="main_table">
@ -93,10 +103,13 @@
</thead>
</table>
</div>
<div class="main_table" ref="tableWrap" style="height: 196px;margin-top: 0;overflow: auto">
<div class="main_table"
ref="tableWrap"
style="height: 196px;margin-top: 0;overflow: auto">
<table>
<tbody>
<tr v-for="(item, i) in goodsSell" :key="i">
<tr v-for="(item, i) in goodsSell"
:key="i">
<td width="70%">{{ item.hct }}</td>
<td>{{ item.rcpi }}</td>
</tr>
@ -106,7 +119,8 @@
</div>
</div>
<div class="middle">
<div class="item" style="height: 350px">
<div class="item"
style="height: 350px">
<!--左上边框-->
<div class="t_line_box">
<i class="t_l_line"></i>
@ -128,31 +142,38 @@
<i class="b_r_line"></i>
</div>
<div class="main_title">
<img src="@/assets/img/screen/t_3.png" alt="">
加密货币行情
<img src="@/assets/img/screen/t_3.png"
alt="">
中国GDP年率报告
</div>
<div class="main_table">
<table>
<thead>
<tr>
<th width="30%">币种</th>
<th width="25%">最新价</th>
<th width="25%">24H成交量</th>
<th>24H涨跌</th>
<th width="50%">时间</th>
<th width="50%">年率</th>
</tr>
</thead>
</table>
</div>
<div class="main_table"
ref="gdpList"
style="max-height: 260px;margin-top: 0;overflow: auto;">
<table>
<tbody>
<tr v-for="(item, i) in cryptoList" :key="i">
<td>{{ item.currencyPair }}</td>
<td>${{ item.amount }}</td>
<td>{{ parseInt(item.total) }}M</td>
<td><p :class="['percent', {fall: item.percent < 0}]">{{ (item.percent * 100).toFixed(2) }}%</p></td>
<template v-for="(item, i) in gdps">
<tr v-if="item.value != '0'"
:key="i">
<td width="50%">{{ item.date_index }}</td>
<td width="50%">${{ item.value }}</td>
</tr>
</template>
</tbody>
</table>
</div>
</div>
<div class="item" style="height: 520px;">
<div class="item"
style="height: 520px;">
<!--左上边框-->
<div class="t_line_box">
<i class="t_l_line"></i>
@ -174,15 +195,24 @@
<i class="b_r_line"></i>
</div>
<div class="main_title">
<img src="@/assets/img/screen/t_3.png" alt="">
<img src="@/assets/img/screen/t_3.png"
alt="">
主要央行利率
</div>
<div class="earth">
<img class="lbx" src="@/assets/img/screen/lbx.png" alt="">
<img class="jt" src="@/assets/img/screen/jt.png" alt="">
<img class="map" src="@/assets/img/screen/map.png" alt="">
<img class="lbx"
src="@/assets/img/screen/lbx.png"
alt="">
<img class="jt"
src="@/assets/img/screen/jt.png"
alt="">
<img class="map"
src="@/assets/img/screen/map.png"
alt="">
</div>
<div class="chart" id="chart7" style="height: 500px"></div>
<div class="chart"
id="chart7"
style="height: 500px"></div>
</div>
</div>
<div class="right">
@ -208,10 +238,13 @@
<i class="b_r_line"></i>
</div>
<div class="main_title">
<img src="@/assets/img/screen/t_4.png" alt="">
<img src="@/assets/img/screen/t_4.png"
alt="">
全国税收收入
</div>
<div id="chart3" class="echart t_btn7" style="height: 280px;"></div>
<div id="chart3"
class="echart t_btn7"
style="height: 280px;"></div>
</div>
<div class="item">
<!--左上边框-->
@ -235,10 +268,12 @@
<i class="b_r_line"></i>
</div>
<div class="main_title">
<img src="@/assets/img/screen/t_5.png" alt="">
<img src="@/assets/img/screen/t_5.png"
alt="">
央行货币当局资产负债
</div>
<div id="chart4" style="height: 280px;"></div>
<div id="chart4"
style="height: 280px;"></div>
</div>
<div class="item">
<div class="t_line_box">
@ -258,10 +293,13 @@
<i class="b_r_line"></i>
</div>
<div class="main_title">
<img src="@/assets/img/screen/t_7.png" alt="">
<img src="@/assets/img/screen/t_7.png"
alt="">
以美元计算进口年率
</div>
<div id="chart6" class="chart" style="height: 270px;"></div>
<div id="chart6"
class="chart"
style="height: 270px;"></div>
</div>
</div>
</div>
@ -276,34 +314,41 @@ import SockJS from 'sockjs-client'
import Stomp from 'stompjs'
import map from './map'
export default {
data() {
data () {
return {
stompClientMarket: null,
stompClient: null,
goodsSell: [],
cryptoList: []
cryptoList: [],
gdps: []
}
},
mounted() {
this.connect()
mounted () {
this.getList()
this.renderChart()
this.renderMap()
},
methods: {
// gdp
getList () {
this.$get(`${this.api.visualPreview}?tableName=hg_zg_gm_zhongguogdpnianlvbaogao&tableId=17`).then(({ comment, data }) => {
this.gdps = data
}).catch(res => { })
},
//
getCrypto() {
getCrypto () {
this.$get(`${this.api.getTopList}`).then(res => {
this.userCount = res.totalCount
}).catch(res => {})
}).catch(res => { })
},
// websocket
connect() {
connect () {
const socket = new SockJS(`${Setting.cryptoBaseURL}currency/websocket`) //广
// STOMP
this.stompClientMarket = new Stomp.over(socket)
this.stompClientMarket.debug = null
var this_ = this
this.stompClientMarket.connect({}, function(event) {
this.stompClientMarket.connect({}, function (event) {
//
if (this_.subObjMarket == null) {
this_.subscribeMarket()
@ -314,7 +359,7 @@ export default {
});
},
//
subscribeMarket() {
subscribeMarket () {
const this_ = this
this.subObjMarket = this.stompClientMarket.subscribe(
this_.api.market,
@ -333,11 +378,11 @@ export default {
}
);
},
disconnect() {
disconnect () {
this.stompClient && this.stompClient.disconnect()
},
//
fullScreen() {
fullScreen () {
//
if (document.fullscreenElement ||
document.mozFullScreenElement ||
@ -358,10 +403,10 @@ export default {
}
},
//
renderChart() {
renderChart () {
const animateChart = (chart, option, data, num = 6) => {
//
if (option.dataZoom[0].endValue == data.length ) {
if (option.dataZoom[0].endValue == data.length) {
option.dataZoom[0].endValue = num
option.dataZoom[0].startValue = 0
}
@ -393,7 +438,7 @@ export default {
},
legend: {
data: comment.map(e => e.comment),
textStyle:{
textStyle: {
color: '#fff'
},
top: '8%'
@ -414,7 +459,7 @@ export default {
endValue: 6 // 6
}
],
color: ['#6188e9','#9032f3','#a57de3','#4BF0FF','#44AFF0','#4E82FF','#584BFF','#BE4DFF','#F845F1'],
color: ['#6188e9', '#9032f3', '#a57de3', '#4BF0FF', '#44AFF0', '#4E82FF', '#584BFF', '#BE4DFF', '#F845F1'],
xAxis: {
type: 'category',
boundaryGap: ['20%', '20%'],
@ -450,7 +495,7 @@ export default {
setInterval(function () {
animateChart(chart[0], option, series)
}, 1500)
}).catch(res => {})
}).catch(res => { })
//
this.$get(`${this.api.visualPreview}?tableName=hg_zg_jr_quanguoshuishoushouru&tableId=33`).then(res => {
@ -488,10 +533,10 @@ export default {
}
}
},
color: ['#4BF0FF','#44AFF0','#4E82FF','#584BFF','#BE4DFF','#F845F1'],
color: ['#4BF0FF', '#44AFF0', '#4E82FF', '#584BFF', '#BE4DFF', '#F845F1'],
legend: {
data: ['税收收入合计'],
textStyle:{
textStyle: {
color: '#fff'
},
top: '8%'
@ -533,7 +578,7 @@ export default {
setInterval(function () {
animateChart(chart[1], option, data)
}, 1500)
}).catch(res => {})
}).catch(res => { })
//
this.$get(`${this.api.previewData}?tableName=hg_zg_jr_guojilvyouwaihuishourugoucheng&tableId=52`).then(res => {
@ -574,7 +619,7 @@ export default {
//[0, 360]
// startAngle: 0,
//
radius : '45%',
radius: '45%',
//
center: ['50%', '65%'],
//
@ -583,7 +628,7 @@ export default {
// roseType: 'radius',
// false
// avoidLabelOverlap: false,
color: ['#065aab', '#066eab', '#0682ab', '#0696ab', '#06a0ab','#06b4ab','#06c8ab','#06dcab','#06f0ab'],
color: ['#065aab', '#066eab', '#0682ab', '#0696ab', '#06a0ab', '#06b4ab', '#06c8ab', '#06dcab', '#06f0ab'],
label: {
normal: {
show: true,
@ -605,7 +650,7 @@ export default {
data: series
}]
})
}).catch(res => {})
}).catch(res => { })
//
this.$get(`${this.api.previewData}?tableName=hg_zg_jr_yanghanghuobidangjuzichanfuzhai&tableId=55`).then(res => {
@ -765,7 +810,7 @@ export default {
setInterval(function () {
animateChart(chart[3], option, data, 3)
}, 1500)
}).catch(res => {})
}).catch(res => { })
//
this.$get(`${this.api.previewData}?tableName=hg_zg_jr_shangpinlingshoujiagezhishu&tableId=60`).then(res => {
@ -779,7 +824,7 @@ export default {
})
})
this.goodsSell = [...goodsSell, ...goodsSell]
}).catch(res => {})
}).catch(res => { })
//
this.$get(`${this.api.previewData}?tableName=hg_zg_jr_xinzengxindaishuju&tableId=34`).then(res => {
@ -925,7 +970,7 @@ export default {
setInterval(function () {
animateChart(chart[4], option, data, 3)
}, 1500)
}).catch(res => {})
}).catch(res => { })
//
this.$get(`${this.api.visualPreview}?tableName=hg_zg_my_yimeiyuanjisuanjinkounianlv&tableId=22`).then(res => {
@ -1030,7 +1075,7 @@ export default {
setInterval(function () {
animateChart(chart[5], option, data)
}, 1500)
}).catch(res => {})
}).catch(res => { })
this.scrollTable()
@ -1042,20 +1087,20 @@ export default {
})
},
//
async renderMap() {
async renderMap () {
// idname
const param = [
{tableId: 2, tableName: 'll_yh_usa'},
{tableId: 3, tableName: 'll_yh_euro'},
{tableId: 4, tableName: 'll_yh_newzealand'},
{tableId: 5, tableName: 'll_yh_china'},
{tableId: 6, tableName: 'll_yh_switzerland'},
{tableId: 7, tableName: 'll_yh_english'},
{tableId: 8, tableName: 'll_yh_australia'},
{tableId: 9, tableName: 'll_yh_japan'},
{tableId: 10, tableName: 'll_yh_russia'},
{tableId: 11, tableName: 'll_yh_india'},
{tableId: 12, tableName: 'll_yh_brazil'}
{ tableId: 2, tableName: 'll_yh_usa' },
{ tableId: 3, tableName: 'll_yh_euro' },
{ tableId: 4, tableName: 'll_yh_newzealand' },
{ tableId: 5, tableName: 'll_yh_china' },
{ tableId: 6, tableName: 'll_yh_switzerland' },
{ tableId: 7, tableName: 'll_yh_english' },
{ tableId: 8, tableName: 'll_yh_australia' },
{ tableId: 9, tableName: 'll_yh_japan' },
{ tableId: 10, tableName: 'll_yh_russia' },
{ tableId: 11, tableName: 'll_yh_india' },
{ tableId: 12, tableName: 'll_yh_brazil' }
]
this.$post(this.api.multipleTablePreview, param).then(res => {
//
@ -1210,14 +1255,18 @@ export default {
index = -1
}
}, 2000)
}).catch(res => {})
}).catch(res => { })
},
//
scrollTable() {
scrollTable () {
const dom = this.$refs.tableWrap
const dom1 = this.$refs.gdpList
setInterval(() => {
dom.scrollTop += 1
if (dom.clientHeight + dom.scrollTop === dom.scrollHeight) dom.scrollTop = 0
dom1.scrollTop += 1
if (dom1.clientHeight + dom1.scrollTop === dom1.scrollHeight) dom1.scrollTop = 0
}, 30)
}
}
@ -1225,5 +1274,5 @@ export default {
</script>
<style lang="scss" scoped>
@import "../../../styles/page/screen.scss";
@import '../../../styles/page/screen.scss';
</style>

@ -1,5 +1,5 @@
import axios from 'axios'
import util from '@/libs/util'
import Util from '@/libs/util'
import router from '@/router/index'
import Setting from '@/setting'
import store from '@/store'
@ -18,43 +18,50 @@ let check = true
let checkTimer = null
// 检测账号是否被禁用,如果禁用则提示并退出登录
function checkDisabled () {
const token = util.local.get(Setting.tokenKey)
const token = Util.local.get(Setting.tokenKey)
if (!token) return false
check = false
axios.get(baseURL + api.accountIsDisabled + '?token=' + token, {
token: util.local.get(Setting.tokenKey),
token: Util.local.get(Setting.tokenKey),
headers: {
token
}
}).then(res => {
if (res.data) {
util.errorMsg('账号被禁用,已强制退出,有疑问请联系管理员')
if (res.data.code === 401) {
Util.local.remove(Setting.storeKey)
Util.local.remove(Setting.tokenKey)
Util.errorMsg(res.data.msg.includes('顶') ? '您的账号已在其他设备登录,您已被迫下线!' : '登录过期,请重新登录!')
setTimeout(() => {
location.reload()
}, 1500)
} else if (res.data) {
Util.errorMsg('账号被禁用,已强制退出,有疑问请联系管理员')
setTimeout(() => {
store.dispatch('user/logout')
}, 1500)
}
}).catch(res => {})
}).catch(res => { })
}
// 请求拦截器
service.interceptors.request.use(config => {
let token = util.local.get(Setting.tokenKey)
if(token) config.headers.token = token
let token = Util.local.get(Setting.tokenKey)
if (token) config.headers.token = token
let storeSchoolId = store.state.user.schoolId
let routeSchoolId = router.app._route.query.schoolId
if(routeSchoolId) routeSchoolId = atob(decodeURI(routeSchoolId))
if (routeSchoolId) routeSchoolId = atob(decodeURI(routeSchoolId))
// 如果store里没有schoolId,则取url里的schoolId,从用户跳转到后台的时候因为加载顺序的问题会出现这个情况,所以要做这个处理
if(storeSchoolId || routeSchoolId) config.headers.schoolId = storeSchoolId ? storeSchoolId : routeSchoolId
if (storeSchoolId || routeSchoolId) config.headers.schoolId = storeSchoolId ? storeSchoolId : routeSchoolId
clearTimeout(checkTimer)
check && checkDisabled()
checkTimer = setTimeout(() => {
check = true
}, 2000)
return config
},err => {
util.errorMsg({
}, err => {
Util.errorMsg({
message: '退出登陆',
onClose: function () {
router.push({name: '/login'})
router.push({ name: '/login' })
}
})
return Promise.reject(err)
@ -64,12 +71,26 @@ service.interceptors.request.use(config => {
service.interceptors.response.use(
response => {
const res = response.data
if(res.status == 200) {
return Promise.resolve(res).catch(e => {})
}else if(res.status == 30001) {
return Promise.resolve(res).catch(e => {})
}else if(!res.status){
return Promise.resolve(res).catch(e => {})
if (res.status == 200) {
return Promise.resolve(res).catch(e => { })
} else if (res.code === 401) {
// 账号互踢
if (!logouted) {
Util.local.remove(Setting.storeKey)
Util.local.remove(Setting.tokenKey)
Util.errorMsg(res.msg.includes('顶') ? '您的账号已在其他设备登录,您已被迫下线!' : '登录过期,请重新登录!')
setTimeout(() => {
router.replace({
path: '/login'
})
logouted = 0
}, 1500)
logouted = 1
}
} else if (res.status == 30001) {
return Promise.resolve(res).catch(e => { })
} else if (!res.status) {
return Promise.resolve(res).catch(e => { })
} else if (res.status === 10008) {
Message.error({
message: res.message,
@ -77,8 +98,8 @@ service.interceptors.response.use(
duration: 1500
})
return Promise.reject(res)
}else {
util.errorMsg(res.message)
} else {
Util.errorMsg(res.message)
res.message === '该账号无权限!' && setTimeout(() => {
store.dispatch('user/logout')
}, 1500)
@ -93,9 +114,9 @@ service.interceptors.response.use(
// 未登录则跳转登录页面,并携带当前页面的路径
// 在登录成功后返回当前页面,这一步需要在登录页操作。
case 401:
util.local.remove(Setting.storeKey)
util.local.remove(Setting.tokenKey)
util.errorMsg('登录过期,请重新登录')
Util.local.remove(Setting.storeKey)
Util.local.remove(Setting.tokenKey)
Util.errorMsg('登录过期,请重新登录')
setTimeout(() => {
router.replace({
path: '/login'
@ -103,16 +124,16 @@ service.interceptors.response.use(
}, 1000)
break
case 500:
util.errorMsg('网络错误')
Util.errorMsg('网络错误')
break
// 403 token过期
// 登录过期对用户进行提示
// 清除本地token和清空vuex中token对象
// 跳转登录页面
case 403:
util.local.remove(Setting.storeKey)
util.local.remove(Setting.tokenKey)
util.errorMsg('登录过期,请重新登录')
Util.local.remove(Setting.storeKey)
Util.local.remove(Setting.tokenKey)
Util.errorMsg('登录过期,请重新登录')
// 清除token
// store.commit('loginSuccess', null);
// 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面
@ -127,11 +148,11 @@ service.interceptors.response.use(
break
// 404请求不存在
case 404:
util.errorMsg('网络请求不存在!')
Util.errorMsg('网络请求不存在!')
break
// 其他错误,直接抛出错误提示
default:
util.errorMsg(error.response.data.message)
Util.errorMsg(error.response.data.message)
Promise.reject(res)
}
return Promise.reject(error.response)
@ -139,9 +160,9 @@ service.interceptors.response.use(
}
);
function get(url, params){
return new Promise((resolve, reject) =>{
service.get(url, {params: params}).then(res => {
function get (url, params) {
return new Promise((resolve, reject) => {
service.get(url, { params: params }).then(res => {
resolve(res)
}).catch(err => {
reject(err)
@ -149,9 +170,9 @@ function get(url, params){
})
}
function post(url, params){
return new Promise((resolve, reject) =>{
service.post(url,params).then(res => {
function post (url, params) {
return new Promise((resolve, reject) => {
service.post(url, params).then(res => {
resolve(res)
}).catch(err => {
reject(err.data)
@ -159,8 +180,8 @@ function post(url, params){
})
}
function del(url, params){
return new Promise((resolve, reject) =>{
function del (url, params) {
return new Promise((resolve, reject) => {
service.delete(url, {
params
}).then(res => {
@ -171,8 +192,8 @@ function del(url, params){
})
}
function put(url, params){
return new Promise((resolve, reject) =>{
function put (url, params) {
return new Promise((resolve, reject) => {
service.put(url, {
params
}).then(res => {
@ -182,4 +203,4 @@ function put(url, params){
})
})
}
export { get,post,del,put }
export { get, post, del, put }

@ -11,7 +11,8 @@ const url = location.host
const dev = process.env.NODE_ENV === 'development' // 本地
let host = `${location.origin}/`
if (dev) {
host = 'http://121.37.12.51/'
host = 'https://www.dataforward.cn/'
// host = 'http://192.168.31.51:9000/'
}
const Setting = {
@ -52,7 +53,7 @@ const Setting = {
/**
* 默认密码
*/
initialPassword: '111aaa',
initialPassword: '1122aa',
/**
* 所属平台1->职站 2->数据平台 3->中台
*/

@ -9,7 +9,7 @@
import Setting from '@/setting'
import util from '@/libs/util'
import {post,get,del,put} from '@/plugins/requests/index.js'
import { post, get } from '@/plugins/requests/index.js'
import api from '@/api'
/**
@ -27,9 +27,9 @@ export default {
},
mutations: {
SET_INFO: (state, info) => {
if(info.avatar) state.avatar = info.avatar
if(info.schoolId) state.schoolId = info.schoolId
if(info.userName) state.userName = info.userName
if (info.avatar) state.avatar = info.avatar
if (info.schoolId) state.schoolId = info.schoolId
if (info.userName) state.userName = info.userName
},
SET_AVATAR: (state, avatar) => {
state.avatar = avatar
@ -45,10 +45,10 @@ export default {
},
},
actions: {
login({ state,commit }, userInfo) {
login ({ state, commit }, userInfo) {
const { account, password, code, random, distinguish } = userInfo
return new Promise((resolve, reject) => {
post(api.logins,{
post(api.logins, {
account,
password,
code,
@ -57,27 +57,20 @@ export default {
type: 2, // 平台端区分:0->教师端 1->学生端 2->无端
platform: Setting.platformId, // 所属平台id(1.职站 2.数据平台 3.中台)
}).then(res => {
if(res.status == 200){
util.local.set(Setting.tokenKey,res.data.token,43200000)
if (res.status == 200) {
util.local.set(Setting.tokenKey, res.data.token, 43200000)
util.successMsg('登录成功')
get(api.isClient).then(res => {
commit('SET_CUSTOMER',res.customer)
const userName = res.customerName
userName && commit('SET_INFO', {
userName
})
}).catch(res => {})
post(api.getSchoolIdByToken).then(res => {
commit('SET_INFO',res)
}).catch(res => {})
commit('SET_INFO', res)
}).catch(res => { })
setTimeout(() => {
// 登录次数+1
post(api.saveRecord,{
post(api.saveRecord, {
type: 3,
}).then(res => {}).catch(res => {})
},3000)
}).then(res => { }).catch(res => { })
}, 3000)
resolve()
}else{
} else {
util.errorMsg(res.message)
reject(res)
}
@ -86,25 +79,29 @@ export default {
})
})
},
logout({ commit, state, dispatch }) {
logout ({ commit, state, dispatch }) {
return new Promise((resolve, reject) => {
post(api.logout).then(() => {
util.local.remove(Setting.storeKey)
util.local.remove(Setting.tokenKey)
location.reload()
resolve()
}).catch(error => {
reject(error)
})
})
},
setAvatar({ state,commit },avatar) {
commit('SET_AVATAR',avatar)
setAvatar ({ state, commit }, avatar) {
commit('SET_AVATAR', avatar)
},
setInfo({ state,commit },info) {
commit('SET_INFO',info)
setInfo ({ state, commit }, info) {
commit('SET_INFO', info)
},
setManager({ state,commit },isManager) {
commit('SET_MANAGER',isManager)
setManager ({ state, commit }, isManager) {
commit('SET_MANAGER', isManager)
},
setCustomer({ state,commit },isCustomer) {
commit('SET_CUSTOMER',isCustomer)
setCustomer ({ state, commit }, isCustomer) {
commit('SET_CUSTOMER', isCustomer)
},
}
}

@ -14,5 +14,6 @@ module.exports = {
  assetsDir: Setting.assetsDir,
devServer: {
port: 8092
}
},
productionSourceMap: false,
}
Loading…
Cancel
Save