yujialong 3 years ago
parent 1bf612f841
commit 3dbf213b0a
  1. 15
      src/api/index.js
  2. 21
      src/layouts/header/index.vue
  3. 6
      src/libs/util.js
  4. 192
      src/pages/data/list/index.vue
  5. 55
      src/pages/index/list/index.vue
  6. 36
      src/pages/role/list/index.vue
  7. 16
      src/pages/setting/person/download.vue
  8. 4
      src/pages/setting/person/info.vue
  9. 171
      src/pages/stat/list/index.vue
  10. 34
      src/pages/user/list/index.vue
  11. 2
      src/router/permission.js
  12. 2
      src/setting.js
  13. 33
      src/styles/common.scss

@ -1,9 +1,5 @@
import Setting from '@/setting'
let uploadURL = Setting.upload.apiURL
let host = 'http://39.108.250.202:9000'//
let host1 = 'http://192.168.31.125:9000'//林
let host2 = 'http://192.168.31.140:9000'//7
let host3 = 'http://192.168.31.137:9000'//陈
export default {
// 登录注册
@ -13,8 +9,6 @@ export default {
// 公用接口
queryProvince: `/nakadai/nakadai/province/queryProvince`,
queryCity: `/nakadai/nakadai/city/queryCity`,
queryWorkNumberIsExist:`evaluation/tms/userInfo/queryWorkNumberIsExist`,
queryStaffWorkNumberIsExist:`evaluation/tms/system/queryStaffWorkNumberIsExist`,
querySchool: `/nakadai/nakadai/school/querySchool`,
queryCourseDiscipline: `/nakadai/nakadai/discipline/queryDiscipline`,
queryCourseProfessionalClass: `/nakadai/nakadai/professionalClass/queryProfessionalClass`,
@ -26,15 +20,6 @@ export default {
updateUser:`/users/users/userInfo/updateUser`,
findPasswordByEmail:`/users/users/userAccount/findPasswordByEmail`,
findPasswordByPhone:`/users/users/userAccount/findPasswordByPhone`,
bingEmail:`evaluation/tms/user/bingEmail`,
bindPhone:`evaluation/tms/user/bindPhone`,
// oss文件管理
fileDeletion: `${uploadURL}/oss/manage/fileDeletion`,
fileupload: `${uploadURL}/oss/manage/fileupload`,
getPlayAuth: `${uploadURL}/oss/manage/getPlayAuth`,
removeMoreVideo: `${uploadURL}/oss/manage/removeMoreVideo`,
removeVideo: `${uploadURL}/oss/manage/removeVideo`,
// 用户管理
saveUser: `/users/users/data/user/save`,

@ -1,9 +1,10 @@
<template>
<div class="header">
<a class="logo" @click="toIndex">
<img v-if="isLogin || (isManager && showSetting) || !isUser" src="@/assets/img/logo.png" alt="">
<span v-if="token && isManager && !showSetting">{{schoolName}}</span>
</a>
<div class="inner">
<a class="logo" @click="toIndex">
<img src="@/assets/img/logo.png" alt="">
</a>
<div style="height: 80px;"></div>
<navbar ref="nav"></navbar>
<div class="action" v-if="token">
@ -35,14 +36,14 @@
</div>
<el-dialog title="修改密码" :visible.sync="passwordVisible" :close-on-click-modal="false" @close="closePassword" width="30%">
<el-form ref="passwordForm" label-width="60px">
<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-form-item>
<el-form-item label="新密码">
<el-form-item label="确认新密码">
<el-input type="password" v-model="passwordForm.reNewPassword" placeholder="请确认新密码" @keyup.enter.native="editPassword"></el-input>
</el-form-item>
</el-form>
@ -68,6 +69,7 @@ export default {
isUser: false,
showSetting: true,
id: '',
schoolName: '',
passwordVisible: false,
passwordForm: {
password: '',
@ -108,6 +110,7 @@ export default {
}
this.userName = userAccount.account
this.id = userAccount.id
this.schoolName = res.schoolName
this.setInfo({
avatar: userInfo.userAvatars,
schoolId: userAccount.schoolId,
@ -155,7 +158,7 @@ export default {
}else if(command == 'resetPw'){
this.showPassword()
}else if(command == 'myDownload'){
this.$router.push('/setting/download')
this.$router.push('/setting/download').catch(err => {})
}else{
this.logout()
}
@ -201,7 +204,13 @@ export default {
margin: 0 auto;
}
.logo{
position: absolute;
top: 0;
left: 30px;
width: 180px;
font-size: 28px;
color: #568DF2;
line-height: 80px;
cursor: pointer;
img{
width: 100%;

@ -120,15 +120,15 @@ const util = {
}
},
// 成功提示
successMsg(message,duration = 3000) {
successMsg(message,duration = 1500) {
return Message.success({message,showClose: true,offset: (document.documentElement.clientHeight - 40) / 2,duration})
},
// 警告提示
warningMsg(message,duration = 3000) {
warningMsg(message,duration = 1500) {
return Message.warning({message,showClose: true,offset: (document.documentElement.clientHeight - 40) / 2,duration})
},
// 错误提示
errorMsg(message,duration = 3000) {
errorMsg(message,duration = 1500) {
return Message.error({message,showClose: true,offset: (document.documentElement.clientHeight - 40) / 2,duration})
},
}

@ -1,5 +1,13 @@
<template>
<div class="wrap">
<div class="search">
<div class="input">
<img src="../../../assets/img/search-gray.png" alt="">
<input v-model="keyword" type="text" placeholder="请输入数据表名称">
</div>
<img v-if="keyword" src="../../../assets/img/remove-gray.png" alt="" class="remove" @click="keyword = ''">
</div>
<div class="left">
<el-menu class="menu" ref="type" @open="openType" @select="selectType" unique-opened :default-active="defaultType" :default-openeds="defaultOpenType">
<template v-for="item in typeList">
@ -67,39 +75,42 @@
</el-menu>
</div>
<div class="right">
<div class="block">
<h6 class="title">数据介绍</h6>
<div class="desc">{{introduce}}</div>
<div class="page">
<h6 class="p-title">数据介绍</h6>
<div class="page-content">
<div class="desc">{{introduce}}</div>
<el-table :data="listData" class="table" ref="table" stripe header-align="center" row-key="id">
<el-table-column type="index" width="100" label="序号" align="center"></el-table-column>
<el-table-column prop="showName" label="数据表名称" align="center"></el-table-column>
<el-table-column prop="dataTotal" label="数据总量" align="center"></el-table-column>
<el-table-column prop="dataSize" label="数据大小" align="center">
<template slot-scope="scope">
{{scope.row.dataSize}}M
</template>
</el-table-column>
<el-table-column prop="updateTime" label="更新时间" align="center"></el-table-column>
<el-table-column label="操作" width="220" align="center">
<template slot-scope="scope">
<el-button type="text" @click="preview(scope.row)">预览</el-button>
<el-button type="text" @click="download(scope.row)">下载</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination background @current-change="handleCurrentChange" :current-page="page" layout="total, prev, pager, next" :total="total"></el-pagination>
<el-table :data="listData" class="table" ref="table" stripe header-align="center" row-key="id" highlight-current-row @current-change="previewCurrentChange">
<el-table-column type="index" width="100" label="序号" align="center"></el-table-column>
<el-table-column prop="showName" label="数据表名称" align="center"></el-table-column>
<el-table-column prop="dataTotal" label="数据总量" align="center"></el-table-column>
<el-table-column prop="dataSize" label="数据大小" align="center">
<template slot-scope="scope">
{{scope.row.dataSize}}M
</template>
</el-table-column>
<el-table-column prop="createTime" label="更新时间" align="center"></el-table-column>
<el-table-column label="操作" width="220" align="center">
<template slot-scope="scope">
<el-button type="text" @click="preview(scope.row)">预览</el-button>
<el-button type="text" @click="download(scope.row)">下载</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination background @current-change="handleCurrentChange" :current-page="page" layout="total, prev, pager, next" :total="total"></el-pagination>
</div>
</div>
</div>
<div class="block" v-if="previewHead.length">
<h6 class="title">数据预览</h6>
<el-table :data="previewData" class="table" stripe header-align="center" row-key="id">
<el-table-column type="index" width="100" label="序号" align="center"></el-table-column>
<el-table-column v-for="(item,index) in previewHead" :prop="item.field" :key="index" :label="item.comment" align="center"></el-table-column>
</el-table>
<div class="page" v-if="previewHead.length">
<h6 class="p-title">数据预览</h6>
<div class="page-content">
<el-table :data="previewData" class="table" id="previewTable" stripe header-align="center" row-key="id">
<el-table-column type="index" width="100" label="序号" align="center"></el-table-column>
<el-table-column v-for="(item,index) in previewHead" :prop="item.field" :key="index" :label="item.comment" align="center"></el-table-column>
</el-table>
</div>
</div>
</div>
@ -143,6 +154,8 @@ export default {
data() {
return {
token: util.local.get(Setting.tokenKey),
keyword: '',
searchTimer: null,
typeId: this.$route.query.typeId,
typeList: [],
defaultType: '',
@ -154,9 +167,6 @@ export default {
total: 0,
previewHead: [],
previewData: [],
pagePreview: 1,
pageSizePreview: 10,
totalPreview: 0,
downloadVisible: false,
curRow: {},
checkAllFields: false,
@ -183,6 +193,7 @@ export default {
name: '年频'
},
],
currentRow: null
}
},
computed: {
@ -190,12 +201,21 @@ export default {
'schoolId'
]),
},
watch: {
keyword: function(val) {
clearTimeout(this.searchTimer)
this.searchTimer = setTimeout(() => {
this.getData()
},500)
}
},
mounted() {
this.getType()
if(this.$route.query.download){
this.download({
id: this.$route.query.id,
name: this.$route.query.name
name: this.$route.query.name,
showName: this.$route.query.showName,
})
}
},
@ -203,15 +223,33 @@ export default {
getType(){
this.$post(this.api.getTableByClassification).then(res => {
let typeId = this.typeId
let introduce = ''
res.map(n => {
n.id = String(n.id)
if(typeId && n.id == typeId) introduce = n.introduce
n.children.map(e => {
e.id = String(e.id)
if(typeId && e.id == typeId){
if(e.introduce){
introduce = e.introduce
}else{
introduce = n.introduce
}
}
if(e.children.length && typeId == e.id){
this.defaultOpenType = [n.id,e.id]
}
e.children.map(n => {
n.id = String(n.id)
e.children.map(j => {
if(typeId && j.id == typeId && j.introduce){
if(j.introduce){
introduce = j.introduce
}else if(e.introduce){
introduce = e.introduce
}else{
introduce = n.introduce
}
}
j.id = String(j.id)
})
})
})
@ -221,17 +259,21 @@ export default {
}else{
if(res[0].children.length && res[0].children[0].children.length){
this.defaultType = res[0].children[0].children[0].id
introduce = res[0].children[0].children[0].introduce
}else if(res[0].children.length){
this.defaultType = res[0].children[0].id
if(!introduce) introduce = res[0].children[0].introduce
}else{
this.defaultType = res[0].id
if(!introduce) introduce = res[0].introduce
}
}
this.introduce = introduce
this.getData()
}).catch(res => {})
},
getData(){
this.$post(`${this.api.getIdQueryTable}?categoryId=${this.defaultType}&showName=&pageNum=${this.page}&pageSize=${this.pageSize}&updateTime=`).then(res => {
this.$post(`${this.api.getIdQueryTable}?categoryId=${this.defaultType}&showName=${this.keyword}&pageNum=${this.page}&pageSize=${this.pageSize}&updateTime=`).then(res => {
this.listData = res.list
this.total = res.totalCount
}).catch(res => {})
@ -242,8 +284,26 @@ export default {
this.getData()
},
selectType(index,indexPath){
let introduce = ''
let list = this.typeList
list.map(n => {
if(n.id == index){
introduce = n.introduce
}else{
n.children.map(n => {
if(n.id == index){
introduce = n.introduce
}else{
n.children.map(n => {
if(n.id == index) introduce = n.introduce
})
}
})
}
})
if(!introduce) introduce = list.find(n => n.id == indexPath[0]).introduce
this.defaultType = index
this.introduce = this.typeList.find(n => n.id == indexPath[0]).introduce
this.introduce = introduce
this.previewHead = []
this.previewData = []
this.page = 1
@ -264,12 +324,16 @@ export default {
}
this.selectType(id,indexPath)
},
previewCurrentChange(val){
this.currentRow = val
},
preview(row){
this.$get(`${this.api.previewData}?tableName=${row.name}&tableId=${row.id}`).then(res => {
this.$post(this.api.saveRecord,{
tableId: row.id,
type: 2,
}).then(res => {}).catch(res => {})
let comment = res.comment
let previewHead = []
comment.map(n => {
@ -284,6 +348,10 @@ export default {
}
})
this.previewData = data
this.$nextTick(() => {
document.querySelector('#previewTable').scrollIntoView()
})
}).catch(res => {})
},
checkAllFieldsChange(val) {
@ -390,6 +458,43 @@ export default {
<style lang="scss" scoped>
.wrap{
display: flex;
.search{
z-index: 2;
position: absolute;
top: 20px;
right: 20%;
display: flex;
justify-content: space-between;
align-items: center;
width: 300px;
padding: 7px 20px;
margin: 0 auto;
border-bottom: 2px solid #a5a5a5;
.input{
display: inline-flex;
align-items: center;
margin-right: 20px;
}
input{
width: 195px;
padding-left: 20px;
margin-left: 20px;
font-size: 18px;
color: #999;
background-color: transparent;
border: 0;
border-left: 2px solid #ccc;
&::-webkit-input-placeholder{color: #999}
&::-moz-placeholder{color: #999}
&:-moz-placeholder{color: #999}
&:focus{
outline: none;
}
}
.remove{
cursor: pointer;
}
}
.left{
margin-right: 20px;
@ -407,19 +512,8 @@ export default {
.right{
flex: 1;
max-width: calc(100% - 220px);
.block{
padding: 34px;
.page{
margin-bottom: 20px;
background-color: #fff;
border-radius: 8px;
.title{
padding-left: 11px;
margin-bottom: 20px;
font-size: 17px;
color: $main-color;
line-height: 1.8;
border-left: 6px solid;
}
.desc{
margin-bottom: 30px;
color: #333;

@ -1,19 +1,22 @@
<template>
<div class="wrap" :class="{result: keyword}">
<hr class="shadow" v-if="keyword">
<div class="title" v-if="!keyword">欢迎来到<br>或然数据平台</div>
<div class="search">
<div class="input">
<img v-if="keyword" src="../../../assets/img/search-gray.png" alt="">
<img v-else src="../../../assets/img/search-white.png" alt="">
<input v-model="keyword" type="text" placeholder="请输入关键词">
<div class="search-wrap">
<div class="search">
<div class="input">
<img v-if="keyword" src="../../../assets/img/search-gray.png" alt="">
<img v-else src="../../../assets/img/search-white.png" alt="">
<input v-model="keyword" type="text" placeholder="请输入关键词">
</div>
<img v-if="keyword" src="../../../assets/img/remove-gray.png" alt="" class="remove" @click="keyword = ''">
</div>
<div class="hot" v-if="hotData.length">
<span class="name">热门下载</span>
<ul class="list">
<li v-for="(item,index) in hotData" :key="index" @click="toData(item)">{{item.categoryTwo}}</li>
</ul>
</div>
<img v-if="keyword" src="../../../assets/img/remove-gray.png" alt="" class="remove" @click="keyword = ''">
</div>
<div class="hot" v-if="hotData.length">
<span class="name">热门下载</span>
<ul class="list">
<li v-for="(item,index) in hotData" :key="index" @click="toData(item)">{{item.categoryTwo}}</li>
</ul>
</div>
<template v-if="keyword">
@ -31,7 +34,7 @@
{{scope.row.dataSize}}M
</template>
</el-table-column>
<el-table-column prop="updateTime" label="更新时间" align="center"></el-table-column>
<el-table-column prop="createTime" label="更新时间" align="center"></el-table-column>
<el-table-column label="操作" width="180" align="center">
<template slot-scope="scope">
<el-button type="text" @click="download(scope.row)">下载</el-button>
@ -77,7 +80,7 @@ export default {
}
},
mounted() {
this.token && this.getHot()
this.getHot()
},
methods: {
getData(){
@ -87,7 +90,7 @@ export default {
}).catch(res => {})
},
getHot(){
this.$get(`${this.api.queryDatabaseInfo}?schoolId=${this.schoolId}&startTime=&endTime=`).then(res => {
this.$get(this.api.queryDatabaseInfo).then(res => {
let list = JSON.parse(res.databaseInfo)
list.map(n => {
n.download
@ -113,7 +116,7 @@ export default {
tableId: row.id,
schoolId: this.schoolId,
}).then(res => {
this.$router.push(`/data?download=true&id=${row.id}&name=${row.name}`)
this.$router.push(`/data?download=true&id=${row.id}&name=${row.name}&showName=${row.showName}`)
}).catch(res => {})
}else{
this.$router.push('/login')
@ -128,17 +131,21 @@ export default {
<style lang="scss" scoped>
.wrap{
position: relative;
.title{
margin: 70px 0 130px;
font-size: 50px;
color: #fff;
text-align: center;
}
.search-wrap{
width: 600px;
margin: 0 auto;
}
.search{
display: flex;
justify-content: space-between;
align-items: center;
width: 930px;
padding: 7px 20px;
margin: 0 auto;
border-bottom: 2px solid #fff;
@ -170,15 +177,14 @@ export default {
}
.hot{
display: flex;
justify-content: center;
align-items: center;
width: 930px;
margin: 10px auto 0;
margin: 20px auto 0;
.name{
font-size: 14px;
color: #efefef;
}
.list{
flex: 1;
display: inline-flex;
margin-left: 20px;
li{
@ -192,6 +198,15 @@ export default {
&.result{
padding: 70px 90px 50px;
background-color: #fff;
.shadow{
position: absolute;
top: 0;
left: 0;
width: 100%;
border: 0;
border-bottom: 1px solid rgba(228,228,228,0.5);
box-shadow: 0 0 12px 2px rgba(228,228,228,0.8);
}
.search{
border-bottom-color: #cdcdcd;
input{

@ -1,6 +1,7 @@
<template>
<div>
<div class="page">
<h6 class="p-title bd">角色列表</h6>
<div class="page-content">
<div class="tool">
<ul class="filter">
@ -67,6 +68,7 @@
<script>
import { mapState } from 'vuex'
import util from '@/libs/util'
import Setting from '@/setting'
export default {
name: 'role',
data() {
@ -218,14 +220,32 @@ export default {
}).catch(res => {})
},
handleDelete(row) {
this.$confirm('该角色下已有账号,删除角色会将该角色下的账号一并删除,是否继续删除?', '提示', {
type: 'warning'
}).then(() => {
this.$post(`${this.api.removeRole}/${row.id}`).then(res => {
util.successMsg('删除成功')
this.getData()
}).catch(res => {})
}).catch(() => {})
this.$post(this.api.getUserList,{
createTime: '',
isEnable: '',
endTime: '',
keyWord: '',
pageNum: 1,
pageSize: 1000,
platformId: Setting.platformId,
roleId: row.id
}).then(res => {
let msg = ''
if(res.pageList.total){
msg = '该角色下已有账号,删除角色会将该角色下的账号一并删除,是否继续删除?'
}else{
msg = '此删除操作不可逆,是否确认删除选中项?'
}
this.$confirm(msg, '提示', {
type: 'warning'
}).then(() => {
this.$post(`${this.api.removeRole}/${row.id}`).then(res => {
util.successMsg('删除成功')
this.getData()
}).catch(res => {})
}).catch(() => {})
}).catch(res => {})
},
handleSelectionChange(val) {
this.multipleSelection = val

@ -13,7 +13,11 @@
<el-table-column prop="databaseType" label="数据类型" width="100" align="center"></el-table-column>
<el-table-column prop="databaseName" label="数据表名称" align="center"></el-table-column>
<el-table-column prop="dataTotal" label="数据总量" align="center"></el-table-column>
<el-table-column prop="dataSize" label="数据大小" align="center"></el-table-column>
<el-table-column prop="dataSize" label="数据大小" align="center">
<template slot-scope="scope">
{{scope.row.dataSize}}M
</template>
</el-table-column>
<el-table-column prop="tableUpdateTime" label="更新时间" width="150" align="center"></el-table-column>
<el-table-column prop="downloadTime" label="下载时间" width="150" align="center"></el-table-column>
<el-table-column label="操作" width="180" align="center">
@ -83,13 +87,13 @@ export default {
},
download(row){
this.$get(`${this.api.isDownload}`,{
tableId: row.id,
tableId: row.tableId,
schoolId: this.schoolId,
}).then(res => {
if(res.status != 200) return util.warningMsg(res.message)
let msgObj = util.successMsg('数据正在生成中,请稍等片刻,生成后会自动下载,您可以先访问其他页面。',5000)
axios.get(`${this.api.downloadData}?tableName=${row.tableNme}&table_id=${row.id}&fields=${row.fields}&startTime=${row.startTime ? row.startTime : ''}&endTime=${row.endTime ? row.endTime : ''}&frequency=${row.frequency ? row.frequency : ''}`,{
axios.get(`${this.api.downloadData}?tableName=${row.tableNme}&table_id=${row.tableId}&fields=${row.fields}&startTime=${row.beginTime ? row.beginTime : ''}&endTime=${row.endTime ? row.endTime : ''}&frequency=${row.frequency ? row.frequency : ''}`,{
headers: {
token: this.token
},
@ -99,7 +103,11 @@ export default {
if(res.data.type != 'multipart/form-data') return util.warningMsg('数据总数为零!')
util.downloadFileDirect(`${row.databaseName}.xls`,new Blob([res.data]))
this.$post(`${this.api.saveRecord}?platformUserId=4&tableId=${row.id}&type=1&schoolId=1`).then(res => {}).catch(res => {})
this.$post(this.api.saveRecord,{
tableId: row.tableId,
type: 1,
schoolId: this.schoolId
}).then(res => {}).catch(res => {})
}).catch(res => {
msgObj.close()
})

@ -216,14 +216,14 @@
</el-dialog>
<el-dialog title="更换密码" :visible.sync="passwordVisible" :close-on-click-modal="false" @close="closePassword" width="30%">
<el-form ref="passwordForm" :model="form" label-width="60px">
<el-form ref="passwordForm" :model="form" 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-form-item>
<el-form-item label="新密码">
<el-form-item label="确认新密码">
<el-input type="password" v-model="passwordForm.reNewPassword" placeholder="请确认新密码" @keyup.enter.native="editPassword"></el-input>
</el-form-item>
</el-form>

@ -1,7 +1,6 @@
<template>
<div class="wrap">
<div class="left">
<h6 class="school">{{schoolName}}</h6>
<div class="product" v-for="(item,index) in productList" :key="index">
<p class="product-name">{{item.productName}}</p>
<div class="date">
@ -16,95 +15,96 @@
</div>
</div>
<div class="right">
<div class="block">
<h6 class="title">平台数据统计</h6>
<ul class="stat">
<li>
<p class="people">
<span class="num">{{userCount ? userCount : 0}}</span>
</p>
<p class="text">本校累计用户数量</p>
</li>
<li>
<p class="people">
<span class="num">{{dayCount ? dayCount : 0}}</span>
</p>
<p class="text">平均日访客量</p>
</li>
<li>
<p class="people">
<span class="num">{{schoolCount ? schoolCount : 0}}</span>
</p>
<p class="text">累计下载</p>
</li>
<li>
<p class="people">
<span class="num">{{onlineCunt ? onlineCunt : 0}}</span>
</p>
<p class="text">当前在线人数</p>
</li>
</ul>
</div>
<div class="block">
<div class="flex m-b-20">
<ul class="filter">
<div class="page">
<h6 class="p-title bd">平台数据统计</h6>
<div class="page-content">
<ul class="stat">
<li>
<p class="people">
<span class="num">{{userCount ? userCount : 0}}</span>
</p>
<p class="text">本校累计用户数量</p>
</li>
<li>
<label>查询时间区域</label>
<el-date-picker v-model="date" align="right" unlink-panels type="daterange" start-placeholder="开始日期" end-placeholder="结束日期" format="yyyy-MM-dd" value-format="yyyy-MM-dd" clearable size="small"></el-date-picker>
<p class="people">
<span class="num">{{dayCount ? dayCount : 0}}</span>
</p>
<p class="text">平均日访客量</p>
</li>
<li>
<label>搜索</label>
<el-input placeholder="请输入数据分类/数据库类别" v-model="keyword" suffix-icon="el-icon-search" clearable size="small"></el-input>
<p class="people">
<span class="num">{{schoolCount ? schoolCount : 0}}</span>
</p>
<p class="text">累计下载</p>
</li>
<li>
<p class="people">
<span class="num">{{onlineCunt ? onlineCunt : 0}}</span>
</p>
<p class="text">当前在线人数</p>
</li>
</ul>
</div>
<div class="flex j-between">
<h6 class="title">按数据库统计使用概况</h6>
</div>
<div>
<el-button type="primary" size="small" @click="exportDatabase" v-auth="'/stat/list:数据库统计导出'">导出数据</el-button>
<div class="page">
<h6 class="p-title">按数据库统计使用概况</h6>
<div class="page-content">
<div class="flex j-between m-b-20">
<ul class="filter">
<li>
<label>查询时间区域</label>
<el-date-picker v-model="date" align="right" unlink-panels type="daterange" start-placeholder="开始日期" end-placeholder="结束日期" format="yyyy-MM-dd" value-format="yyyy-MM-dd" clearable size="small"></el-date-picker>
</li>
<li>
<label>搜索</label>
<el-input placeholder="请输入数据分类/数据库类别" v-model="keyword" suffix-icon="el-icon-search" clearable size="small"></el-input>
</li>
</ul>
<div>
<el-button type="primary" size="small" @click="exportDatabase" v-auth="'/stat/list:数据库统计导出'">导出数据</el-button>
</div>
</div>
</div>
<el-table :data="listData" class="table" stripe header-align="center" row-key="id" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="80" align="center"></el-table-column>
<el-table-column type="index" width="100" label="序号" align="center"></el-table-column>
<el-table-column prop="categoryOne" label="数据分类" align="center"></el-table-column>
<el-table-column prop="categoryTwo" label="数据库类别" align="center"></el-table-column>
<el-table-column prop="download" label="下载量" align="center"></el-table-column>
<el-table-column prop="click" label="点击量" align="center"></el-table-column>
</el-table>
<div class="m-t-15 text-center">
<img src="../../../assets/img/arrow.png" class="arrow" :class="{active}" @click="toggleList" alt="">
<el-table :data="listData" class="table" stripe header-align="center" row-key="id" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="80" align="center"></el-table-column>
<el-table-column type="index" width="100" label="序号" align="center"></el-table-column>
<el-table-column prop="categoryOne" label="数据分类" align="center"></el-table-column>
<el-table-column prop="categoryTwo" label="数据库类别" align="center"></el-table-column>
<el-table-column prop="download" label="下载量" align="center"></el-table-column>
<el-table-column prop="click" label="点击量" align="center"></el-table-column>
</el-table>
<div class="m-t-15 text-center">
<img src="../../../assets/img/arrow.png" class="arrow" :class="{active}" @click="toggleList" alt="">
</div>
</div>
</div>
<div class="block">
<div class="flex j-between">
<h6 class="title">按月份统计数据库使用概况</h6>
<div>
<div class="page">
<h6 class="p-title">按月份统计数据库使用概况</h6>
<div class="page-content">
<div class="m-b-20 text-right">
<el-button type="primary" size="small" @click="exportDatabaseByMonth" v-auth="'/stat/list:月份统计导出'">导出数据</el-button>
</div>
</div>
<el-table :data="monthData" class="table" stripe header-align="center" row-key="id" :span-method="objectSpanMethod" @selection-change="handleSelectionChange1">
<el-table-column type="selection" width="80" align="center"></el-table-column>
<el-table-column prop="year" label="年份" align="center"></el-table-column>
<el-table-column prop="type" label="类别" align="center"></el-table-column>
<el-table-column prop="1" label="1月" align="center"></el-table-column>
<el-table-column prop="2" label="2月" align="center"></el-table-column>
<el-table-column prop="3" label="3月" align="center"></el-table-column>
<el-table-column prop="4" label="4月" align="center"></el-table-column>
<el-table-column prop="5" label="5月" align="center"></el-table-column>
<el-table-column prop="6" label="6月" align="center"></el-table-column>
<el-table-column prop="7" label="7月" align="center"></el-table-column>
<el-table-column prop="8" label="8月" align="center"></el-table-column>
<el-table-column prop="9" label="9月" align="center"></el-table-column>
<el-table-column prop="10" label="10月" align="center"></el-table-column>
<el-table-column prop="11" label="11月" align="center"></el-table-column>
<el-table-column prop="12" label="12月" align="center"></el-table-column>
</el-table>
<el-table :data="monthData" class="table" stripe header-align="center" row-key="id" :span-method="objectSpanMethod" @selection-change="handleSelectionChange1">
<el-table-column type="selection" width="80" align="center"></el-table-column>
<el-table-column prop="year" label="年份" align="center"></el-table-column>
<el-table-column prop="type" label="类别" align="center"></el-table-column>
<el-table-column prop="1" label="1月" align="center"></el-table-column>
<el-table-column prop="2" label="2月" align="center"></el-table-column>
<el-table-column prop="3" label="3月" align="center"></el-table-column>
<el-table-column prop="4" label="4月" align="center"></el-table-column>
<el-table-column prop="5" label="5月" align="center"></el-table-column>
<el-table-column prop="6" label="6月" align="center"></el-table-column>
<el-table-column prop="7" label="7月" align="center"></el-table-column>
<el-table-column prop="8" label="8月" align="center"></el-table-column>
<el-table-column prop="9" label="9月" align="center"></el-table-column>
<el-table-column prop="10" label="10月" align="center"></el-table-column>
<el-table-column prop="11" label="11月" align="center"></el-table-column>
<el-table-column prop="12" label="12月" align="center"></el-table-column>
</el-table>
</div>
</div>
</div>
</div>
@ -325,14 +325,8 @@ export default {
display: flex;
.left{
margin-right: 20px;
.school{
width: 200px;
margin-bottom: 15px;
font-size: 20px;
color: #568DF2;
text-align: center;
}
.product{
width: 200px;
padding: 15px;
margin-bottom: 15px;
background-color: #fff;
@ -370,19 +364,8 @@ export default {
}
}
}
.block{
padding: 34px;
.page{
margin-bottom: 20px;
background-color: #fff;
border-radius: 8px;
.title{
padding-left: 11px;
margin-bottom: 20px;
font-size: 17px;
color: $main-color;
line-height: 1.8;
border-left: 6px solid;
}
.arrow{
cursor: pointer;
&.active{

@ -1,6 +1,7 @@
<template>
<div>
<div class="page">
<h6 class="p-title bd">用户列表</h6>
<div class="page-content">
<div class="tool" style="margin-bottom: 0;">
<ul class="filter">
@ -15,7 +16,7 @@
<el-date-picker v-model="date" align="right" unlink-panels type="daterange" start-placeholder="开始日期" end-placeholder="结束日期" format="yyyy-MM-dd" value-format="yyyy-MM-dd" clearable size="small"></el-date-picker>
</li>
<li>
<label>角色</label>
<label style="width: auto;">角色</label>
<el-select v-model="role" placeholder="请选择角色" size="small" clearable class="w-150" @change="initData">
<el-option label="不限" value=""></el-option>
<el-option label="用户" value="0"></el-option>
@ -88,14 +89,16 @@
<el-form-item prop="roleId" label="账号角色">
<el-radio v-model="defaultUser" label="user" disabled>用户</el-radio>
<el-radio-group v-model="form.roleId">
<el-radio v-for="(item,index) in roleList" :key="index" :label="item.id">{{item.roleName}}</el-radio>
<template v-for="(item,index) in roleList">
<el-radio v-if="item.id != '1409424489820102658'" :key="index" :label="item.id" :disabled="item.id == 'user'">{{item.roleName}}</el-radio>
</template>
</el-radio-group>
</el-form-item>
<el-form-item prop="uniqueIdentification" label="唯一标识">
<el-input disabled v-model="form.uniqueIdentification" placeholder="唯一标识"></el-input>
</el-form-item>
<el-form-item prop="phone" label="手机号" v-if="isDetail">
<el-input v-model="form.phone" placeholder="请输入手机号" maxlength="11" disabled></el-input>
<el-input v-model="form.phone" maxlength="11" disabled></el-input>
</el-form-item>
<el-form-item prop="email" label="邮箱">
<el-input v-model="form.email" placeholder="请输入邮箱"></el-input>
@ -211,13 +214,13 @@ export default {
trigger: 'blur'
}
],
phone: [
{
pattern: /^1[3456789]\d{9}$/,
message: '请输入正确的手机号',
trigger: 'blur'
}
],
// phone: [
// {
// pattern: /^1[3456789]\d{9}$/,
// message: '',
// trigger: 'blur'
// }
// ],
email: [
{
pattern: /^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/,
@ -261,7 +264,7 @@ export default {
}
},
date: function(val){
if(val.length){
if(val && val.length){
this.startTime = val[0]
this.endTime = val[1]
}else{
@ -365,7 +368,7 @@ export default {
accountId,
userName: data.userName,
roleId: data.roleId,
phone: data.phone ? data.phone : '',
phone: data.phone ? data.phone : '暂未绑定',
// uniqueIdentification: data.uniqueIdentification,
workNumber: data.workNumber,
email: data.email,
@ -387,8 +390,8 @@ export default {
confirm(){
this.$refs.form.validate((valid) => {
if (valid) {
if(this.accountRepeat) return util.errorMsg('该账号已存在')
if(this.workNumberRepeat) return util.errorMsg('该工号已存在')
if(this.accountRepeat) return util.errorMsg('该账号已存在')
if(this.workNumberRepeat) return util.errorMsg('该学号/工号已存在')
let data = this.form
data.schoolId = data.schoolId ? data.schoolId : this.schoolId
if(!data.userId) data.uniqueIdentification = new Date().getTime()
@ -534,6 +537,9 @@ export default {
li{
width: 30%;
margin-bottom: 16px;
label{
width: 70px;
}
}
}
/deep/.dialog{

@ -19,7 +19,7 @@ router.beforeEach((to, from, next) => {
// 如果是管理员则需要从获取的路由权限里判断当前访问页面是否有权限访问,如果没权限访问则跳转到403
if((mg && atob(decodeURI(mg)) === 'true') || (to.query.mg && atob(decodeURI(to.query.mg)) === 'true')){
if(routes.length){
if(routes.find(n => n.name == toPath) || toPath == '/setting/person'){
if(routes.find(n => n.name == toPath) || toPath == '/setting/person' || toPath == '/setting/download'){
if(!to.query.mg){
next({
path: toPath,

@ -16,7 +16,7 @@ const Setting = {
showProgressBar: true,
// 接口请求地址
// apiBaseURL: env === 'development' ? 'http://192.168.31.216:9000' : 'http://39.108.250.202:9000',
apiBaseURL: env === 'development' ? 'http://39.108.250.202:9000' : 'http://39.108.250.202:9000',
apiBaseURL: env === 'development' ? 'http://192.168.31.216:9000' : 'http://39.108.250.202:9000',
// 接口请求返回错误时,弹窗的持续时间,单位:秒
modalDuration: 3,
// 接口请求返回错误时,弹窗的类型,可选值为 Message 或 Notice

@ -70,17 +70,11 @@
}
.page{
position: relative;
padding: 24px 10px;
background-color: #fff;
border-radius: 8px;
.p-title{
padding-left: 24px;
line-height: 56px;
font-size: 16px;
color: rgba(0, 0, 0, 0.85);
border-bottom: 1px solid rgba(0,0,0,.06);
}
.page-content{
padding: 24px;
padding: 26px 36px 0;
.tool{
display: flex;
justify-content: space-between;
@ -127,6 +121,29 @@
}
}
.p-title{
position: relative;
padding: 4px 0 4px 10px;
margin-left: 20px;
margin-right: 20px;
font-size: 17px;
color: $main-color;
line-height: 1;
border-left: 6px solid;
&.bd{
margin-bottom: 20px;
&:after{
content: '';
position: absolute;
bottom: -14px;
left: -20px;
width: calc(100% + 34px);
height: 1px;
background-color: #ccc;
}
}
}
.pagination {
margin: 20px 0;
text-align: center;

Loading…
Cancel
Save