Compare commits

..

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

  1. 1
      README.md
  2. 45
      public/index.html
  3. 88
      src/api/index.js
  4. BIN
      src/assets/img/index/customer.jpg
  5. BIN
      src/assets/img/index/customer.png
  6. 83
      src/layouts/footer/index.vue
  7. 314
      src/layouts/header/index.vue
  8. 1173
      src/pages/account/login/index.vue
  9. 4
      src/pages/index/list/index.vue
  10. 2243
      src/pages/screen/list/index.vue
  11. 313
      src/plugins/requests/index.js
  12. 149
      src/setting.js
  13. 177
      src/store/modules/user.js
  14. 3
      vue.config.js

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

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

@ -3,13 +3,12 @@ const host = Setting.apiBaseURL
export default { export default {
// 登录注册 // 登录注册
logins: `users/users/user/login`, logins: `users/users/user/login`,
verification: `${host}users/users/user/captcha`, verification:`${host}users/users/user/captcha`,
sendPhoneVerificationCode: `users/users/user/sendPhoneVerificationCode`, sendPhoneVerificationCode: `users/users/user/sendPhoneVerificationCode`,
getToken: `users/users/user/getToken`, getToken: `users/users/user/getToken`,
getOtherAccountByPhone: `users/users/user/getOtherAccountByPhone`, getOtherAccountByPhone: `users/users/user/getOtherAccountByPhone`,
unbindAccounts: `users/users/user/unbindAccounts`, unbindAccounts: `users/users/user/unbindAccounts`,
logout: `users/users/user/logout`,
// 加密货币 // 加密货币
market: `/topic/market`, market: `/topic/market`,
@ -30,69 +29,70 @@ export default {
// 个人中心 // 个人中心
uploadUserAvatars: `${host}users/users/userAccount/updateUserAvatars`, uploadUserAvatars: `${host}users/users/userAccount/updateUserAvatars`,
userInfo: `users/users/userInfo/getUserInfo`, userInfo:`users/users/userInfo/getUserInfo`,
updateUser: `users/users/userInfo/updateUser`, updateUser:`users/users/userInfo/updateUser`,
findPasswordByEmail: `users/users/userAccount/findPasswordByEmail`, findPasswordByEmail:`users/users/userAccount/findPasswordByEmail`,
findPasswordByPhone: `users/users/userAccount/findPasswordByPhone`, findPasswordByPhone:`users/users/userAccount/findPasswordByPhone`,
// 用户管理 // 用户管理
saveUser: `users/users/data/user/save`, saveUser: `users/users/data/user/save`,
getDetailByAccount: `occupationlab/occupationlab/architecture/getDetailByAccount`, getDetailByAccount: `occupationlab/occupationlab/architecture/getDetailByAccount`,
getUserList: `users/users/data/user/getUserList`, getUserList: `users/users/data/user/getUserList`,
getUserTotalBySchoolId: `users/users/data/user/getUserTotalBySchoolId`, getUserTotalBySchoolId: `users/users/data/user/getUserTotalBySchoolId`,
checkAccount: `occupationlab/occupationlab/architecture/checkWorkNumOrAccount`, checkAccount:`occupationlab/occupationlab/architecture/checkWorkNumOrAccount`,
getDetail: `users/users/data/user/getDetail`, getDetail:`users/users/data/user/getDetail`,
modifyUser: `users/users/data/user/modify`, modifyUser:`users/users/data/user/modify`,
export_failure: `${host}users/users/data/user/export_failure`, export_failure:`${host}users/users/data/user/export_failure`,
uploadFile: `${host}users/users/data/user/uploadFile`, uploadFile:`${host}users/users/data/user/uploadFile`,
deleteUser: `users/users/data/user/delete`, deleteUser:`users/users/data/user/delete`,
resetPwd: `users/users/userAccount/resetPwd`, resetPwd: `users/users/userAccount/resetPwd`,
sendPhoneOrEmailCode: `users/users/userAccount/sendPhoneOrEmailCode`, sendPhoneOrEmailCode: `users/users/userAccount/sendPhoneOrEmailCode`,
unbindMobilePhone: `users/users/userAccount/unbindMobilePhone`, unbindMobilePhone: `users/users/userAccount/unbindMobilePhone`,
bindPhoneOrEmail: `users/users/userAccount/bindPhoneOrEmail`, bindPhoneOrEmail: `users/users/userAccount/bindPhoneOrEmail`,
examinePassword: `users/users/userAccount/examinePassword`, examinePassword: `users/users/userAccount/examinePassword`,
isClient: `${host}users/users/user/isClient`,
deleteProfile: `users/users/userInfo/deleteProfile`, deleteProfile: `users/users/userInfo/deleteProfile`,
checkEmailOrPhone: `occupationlab/occupationlab/architecture/checkEmailOrPhone`, checkEmailOrPhone: `occupationlab/occupationlab/architecture/checkEmailOrPhone`,
accountIsDisabled: `users/users/user/accountIsDisabled`, 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`, 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`, batchRemove:`users/users/role/batchRemove`,
getRole: `users/users/role/obtainDetails`, getRole:`users/users/role/obtainDetails`,
getName: `data/data/role/getName`, getName:`data/data/role/getName`,
listRole: `users/users/role/list`, listRole:`users/users/role/list`,
removeRole: `data/data/role/remove`, removeRole:`data/data/role/remove`,
saveOrUpdate: `users/users/role/saveOrUpdate`, saveOrUpdate:`users/users/role/saveOrUpdate`,
getPermissions: `users/users/user-role/getUserRolesPermissionMenu`, getPermissions:`users/users/user-role/getUserRolesPermissionMenu`,
// 权限菜单管理 // 权限菜单管理
doAssign: `data/data/permission/doAssign`, doAssign:`data/data/permission/doAssign`,
queryAllMenus: `users/users/permission/queryAllMenus`, queryAllMenus:`users/users/permission/queryAllMenus`,
savePer: `users/users/user-role/rolePermissionService`, savePer:`users/users/user-role/rolePermissionService`,
toAssign: `data/data/permission/toAssign`, toAssign:`data/data/permission/toAssign`,
// 表展示 // 表展示
getIdQueryTable: `data/data/table/getIdQueryTable`, getIdQueryTable:`data/data/table/getIdQueryTable`,
getTableByClassification: `data/data/table/getTableByClassification`, getTableByClassification:`data/data/table/getTableByClassification`,
getTableByCondition: `data/data/table/getTableByCondition`, getTableByCondition:`data/data/table/getTableByCondition`,
downloadData: `${host}data/data/download`, downloadData:`${host}data/data/download`,
previewData: `data/data/preview`, previewData:`data/data/preview`,
visualPreview: `data/data/visualPreview`, visualPreview:`data/data/visualPreview`,
downloadRecord: `data/data/myDownload/downloadRecord`, downloadRecord:`data/data/myDownload/downloadRecord`,
getDownloadRecord: `data/data/myDownload/getDownloadRecord`, getDownloadRecord:`data/data/myDownload/getDownloadRecord`,
downloadAgain: `data/data/downloadAgain`, downloadAgain:`data/data/downloadAgain`,
isDownload: `data/data/product/isDownload`, isDownload:`data/data/product/isDownload`,
getTableTime: `data/data/tableTime/getTableTime`, getTableTime:`data/data/tableTime/getTableTime`,
getLevel: `data/data/category/getLevel`, getLevel: `data/data/category/getLevel`,
multipleTablePreview: `data/data/multipleTablePreview`, multipleTablePreview: `data/data/multipleTablePreview`,
// 数据操作记录 // 数据操作记录
queryAccumulate: `data/data/dataRecord/queryAccumulate`, queryAccumulate:`data/data/dataRecord/queryAccumulate`,
queryDatabaseInfo: `data/data/dataRecord/queryDatabaseInfo`, queryDatabaseInfo:`data/data/dataRecord/queryDatabaseInfo`,
queryDatabaseInfoByMonth: `data/data/dataRecord/queryDatabaseInfoByMonth`, queryDatabaseInfoByMonth:`data/data/dataRecord/queryDatabaseInfoByMonth`,
saveRecord: `data/data/dataRecord/saveRecord`, saveRecord:`data/data/dataRecord/saveRecord`,
databaseInfoExport: `${host}data/data/dataRecord/databaseInfoExport`, databaseInfoExport:`${host}data/data/dataRecord/databaseInfoExport`,
databaseInfoByMonthExport: `${host}data/data/dataRecord/databaseInfoByMonthExport`, databaseInfoByMonthExport:`${host}data/data/dataRecord/databaseInfoByMonthExport`,
onlineNumber: `data/data/dataRecord/onlineNumber`, onlineNumber:`data/data/dataRecord/onlineNumber`,
getProductInfoBySchoolId: `data/data/product/getProductInfoBySchoolId`, getProductInfoBySchoolId:`data/data/product/getProductInfoBySchoolId`,
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

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

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

@ -11,84 +11,83 @@ const url = location.host
const dev = process.env.NODE_ENV === 'development' // 本地 const dev = process.env.NODE_ENV === 'development' // 本地
let host = `${location.origin}/` let host = `${location.origin}/`
if (dev) { if (dev) {
host = 'https://www.dataforward.cn/' host = 'http://121.37.12.51/'
// host = 'http://192.168.31.51:9000/'
} }
const Setting = { const Setting = {
/** /**
* 基础配置 * 基础配置
* */ * */
// 网页标题的后缀 // 网页标题的后缀
titleSuffix: '数据前瞻', titleSuffix: '数据前瞻',
// 路由模式,可选值为 history 或 hash // 路由模式,可选值为 history 或 hash
routerMode: 'hash', routerMode: 'hash',
// 页面切换时,是否显示模拟的进度条 // 页面切换时,是否显示模拟的进度条
showProgressBar: true, showProgressBar: true,
/** /**
* 接口地址 * 接口地址
* 测试http://121.37.12.51 * 测试http://121.37.12.51
* 正式https://www.dataforward.cn * 正式https://www.dataforward.cn
* */ * */
// apiBaseURL: env === 'development' ? 'http://192.168.31.151:9000' : 'http://121.37.12.51', // apiBaseURL: env === 'development' ? 'http://192.168.31.151:9000' : 'http://121.37.12.51',
apiBaseURL: host, apiBaseURL: host,
// 加密货币接口地址 // 加密货币接口地址
cryptoBaseURL: `http://159.138.53.111/`, cryptoBaseURL: `http://159.138.53.111/`,
// 接口请求返回错误时,弹窗的持续时间,单位:秒 // 接口请求返回错误时,弹窗的持续时间,单位:秒
modalDuration: 3, modalDuration: 3,
// 接口请求返回错误时,弹窗的类型,可选值为 Message 或 Notice // 接口请求返回错误时,弹窗的类型,可选值为 Message 或 Notice
errorModalType: 'Message', errorModalType: 'Message',
// Cookies 默认保存时间,单位:天 // Cookies 默认保存时间,单位:天
cookiesExpires: 1, cookiesExpires: 1,
// 长时间未操作,自动退出登录时间 // 长时间未操作,自动退出登录时间
autoLogoutTime: 3600000, autoLogoutTime: 3600000,
/** /**
* localStorage里保存的token的key * localStorage里保存的token的key
*/ */
tokenKey: 'data_token', tokenKey: 'data_token',
/** /**
* localStorage里保存的vuex的key * localStorage里保存的vuex的key
*/ */
storeKey: 'data_store', storeKey: 'data_store',
/** /**
* 默认密码 * 默认密码
*/ */
initialPassword: '1122aa', initialPassword: '111aaa',
/** /**
* 所属平台1->职站 2->数据平台 3->中台 * 所属平台1->职站 2->数据平台 3->中台
*/ */
platformId: 2, platformId: 2,
/** /**
* 平台端区分0->教师端 1->学生端 2->无端 * 平台端区分0->教师端 1->学生端 2->无端
*/ */
platformType: 2, platformType: 2,
/** /**
* 多语言配置 * 多语言配置
* */ * */
i18n: { i18n: {
// 默认语言 // 默认语言
default: 'zh', default: 'zh',
// 是否根据用户电脑配置自动设置语言(仅第一次有效) // 是否根据用户电脑配置自动设置语言(仅第一次有效)
auto: false auto: false
}, },
/** /**
* 布局配置 * 布局配置
* */ * */
layout: { layout: {
}, },
/** /**
* 功能配置 * 功能配置
* */ * */
// 相同路由,不同参数间进行切换,是否强力更新 // 相同路由,不同参数间进行切换,是否强力更新
sameRouteForceUpdate: false, sameRouteForceUpdate: false,
// 是否使用动态路由 // 是否使用动态路由
dynamicRoute: true, dynamicRoute: true,
// 文件上传 // 文件上传
upload: { upload: {
apiURL: 'http://8.134.8.197:8001', apiURL: 'http://8.134.8.197:8001',
maxSize: 30, maxSize: 30,
}, },
}; };
export default Setting; export default Setting;

@ -9,99 +9,102 @@
import Setting from '@/setting' import Setting from '@/setting'
import util from '@/libs/util' import util from '@/libs/util'
import { post, get } from '@/plugins/requests/index.js' import {post,get,del,put} from '@/plugins/requests/index.js'
import api from '@/api' import api from '@/api'
/** /**
* 用户信息 * 用户信息
* */ * */
export default { export default {
namespaced: true, namespaced: true,
state: { state: {
avatar: 'https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png', avatar: 'https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png',
schoolId: '', schoolId: '',
userName: '', userName: '',
isManager: false, isManager: false,
isCustomer: false, isCustomer: false,
logView: false // 是否查询过日志状态,如果有,则不再调接口 logView: false // 是否查询过日志状态,如果有,则不再调接口
},
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
}, },
SET_AVATAR: (state, avatar) => { mutations: {
state.avatar = avatar 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
},
SET_AVATAR: (state, avatar) => {
state.avatar = avatar
},
SET_MANAGER: (state, isManager) => {
state.isManager = isManager
},
SET_CUSTOMER: (state, isCustomer) => {
state.isCustomer = isCustomer
},
SET_LOG: (state) => {
state.logView = true
},
}, },
SET_MANAGER: (state, isManager) => { actions: {
state.isManager = isManager login({ state,commit }, userInfo) {
}, const { account, password, code, random, distinguish } = userInfo
SET_CUSTOMER: (state, isCustomer) => { return new Promise((resolve, reject) => {
state.isCustomer = isCustomer post(api.logins,{
}, account,
SET_LOG: (state) => { password,
state.logView = true code,
}, random,
}, distinguish,
actions: { type: 2, // 平台端区分:0->教师端 1->学生端 2->无端
login ({ state, commit }, userInfo) { platform: Setting.platformId, // 所属平台id(1.职站 2.数据平台 3.中台)
const { account, password, code, random, distinguish } = userInfo }).then(res => {
return new Promise((resolve, reject) => { if(res.status == 200){
post(api.logins, { util.local.set(Setting.tokenKey,res.data.token,43200000)
account, util.successMsg('登录成功')
password, get(api.isClient).then(res => {
code, commit('SET_CUSTOMER',res.customer)
random, const userName = res.customerName
distinguish, userName && commit('SET_INFO', {
type: 2, // 平台端区分:0->教师端 1->学生端 2->无端 userName
platform: Setting.platformId, // 所属平台id(1.职站 2.数据平台 3.中台) })
}).then(res => { }).catch(res => {})
if (res.status == 200) { post(api.getSchoolIdByToken).then(res => {
util.local.set(Setting.tokenKey, res.data.token, 43200000) commit('SET_INFO',res)
util.successMsg('登录成功') }).catch(res => {})
post(api.getSchoolIdByToken).then(res => { setTimeout(() => {
commit('SET_INFO', res) // 登录次数+1
}).catch(res => { }) post(api.saveRecord,{
setTimeout(() => { type: 3,
// 登录次数+1 }).then(res => {}).catch(res => {})
post(api.saveRecord, { },3000)
type: 3, resolve()
}).then(res => { }).catch(res => { }) }else{
}, 3000) util.errorMsg(res.message)
resolve() reject(res)
} else { }
util.errorMsg(res.message) }).catch(error => {
reject(res) reject(error)
} })
}).catch(error => { })
reject(error) },
}) logout({ commit, state, dispatch }) {
}) return new Promise((resolve, reject) => {
}, util.local.remove(Setting.storeKey)
logout ({ commit, state, dispatch }) { util.local.remove(Setting.tokenKey)
return new Promise((resolve, reject) => { location.reload()
post(api.logout).then(() => { resolve()
util.local.remove(Setting.storeKey) })
util.local.remove(Setting.tokenKey) },
location.reload() setAvatar({ state,commit },avatar) {
resolve() commit('SET_AVATAR',avatar)
}).catch(error => { },
reject(error) setInfo({ state,commit },info) {
}) commit('SET_INFO',info)
}) },
}, setManager({ state,commit },isManager) {
setAvatar ({ state, commit }, avatar) { commit('SET_MANAGER',isManager)
commit('SET_AVATAR', avatar) },
}, setCustomer({ state,commit },isCustomer) {
setInfo ({ state, commit }, info) { commit('SET_CUSTOMER',isCustomer)
commit('SET_INFO', info) },
}, }
setManager ({ state, commit }, isManager) {
commit('SET_MANAGER', isManager)
},
setCustomer ({ state, commit }, isCustomer) {
commit('SET_CUSTOMER', isCustomer)
},
}
} }

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