Merge branch 'master' of http://git.hivekion.com:3000/xiaoguangbin/AnalysisSystemForRadionuclide_vue
BIN
public/images/top-nav/abnormal-alarm-active.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
public/images/top-nav/abnormal-alarm.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
public/images/top-nav/log-manage-active.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
public/images/top-nav/log-manage.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
public/images/top-nav/setting-active.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
public/images/top-nav/setting.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
public/images/top-nav/spectrum-analysis-active.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
public/images/top-nav/spectrum-analysis.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
public/images/top-nav/station-operation-active.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
public/images/top-nav/station-operation.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
BIN
public/images/top-nav/web-statistics-active.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
public/images/top-nav/web-statistics.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
src/assets/fonts/BOOKOS.ttf
Normal file
BIN
src/assets/fonts/MicrogrammaDMedExt.ttf
Normal file
BIN
src/assets/images/content/bg.jpg
Normal file
After Width: | Height: | Size: 150 KiB |
BIN
src/assets/images/content/bottom.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
src/assets/images/content/left.png
Normal file
After Width: | Height: | Size: 1022 B |
BIN
src/assets/images/content/right.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
src/assets/images/content/top.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
src/assets/images/global/add.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/assets/images/global/delete.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
src/assets/images/global/edit.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
src/assets/images/global/reset-pwd.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
src/assets/images/global/search.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
src/assets/images/global/select-down.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
src/assets/images/header/avatar.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/assets/images/header/bg.png
Normal file
After Width: | Height: | Size: 128 KiB |
BIN
src/assets/images/header/close.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/assets/images/header/notice.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/assets/images/header/split-line.png
Normal file
After Width: | Height: | Size: 992 B |
Before Width: | Height: | Size: 8.7 KiB After Width: | Height: | Size: 14 KiB |
|
@ -1,172 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
||||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="293px" height="293px" viewBox="0 0 293 293" enable-background="new 0 0 293 293" xml:space="preserve"> <image id="image0" width="293" height="293" x="0" y="0"
|
|
||||||
href="data:image/png;base64,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
|
|
||||||
OjAwP26CAAAAAABJRU5ErkJggg==" />
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 13 KiB |
67
src/components/CustomModal/index.vue
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
<template>
|
||||||
|
<a-modal v-bind="$attrs" v-model="visible" :title="title">
|
||||||
|
<slot></slot>
|
||||||
|
<template slot="footer">
|
||||||
|
<a-space class="operators" :size="20">
|
||||||
|
<a-button type="success" @click="onSave" :loading="confirmLoading">Save</a-button>
|
||||||
|
<a-button type="warn" @click="onCancel">Cancel</a-button>
|
||||||
|
</a-space>
|
||||||
|
</template>
|
||||||
|
</a-modal>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
value: {
|
||||||
|
type: Boolean
|
||||||
|
},
|
||||||
|
okHandler: {
|
||||||
|
type: Function
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
type: String
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
visible: this.value,
|
||||||
|
confirmLoading: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
visible(val) {
|
||||||
|
this.$emit('input', val)
|
||||||
|
},
|
||||||
|
value(val) {
|
||||||
|
this.visible = val
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
async onSave() {
|
||||||
|
if (this.okHandler instanceof Function) {
|
||||||
|
try {
|
||||||
|
this.confirmLoading = true
|
||||||
|
await this.okHandler()
|
||||||
|
this.visible = false
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error)
|
||||||
|
} finally {
|
||||||
|
this.confirmLoading = false
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.visible = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onCancel() {
|
||||||
|
this.visible = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.operators {
|
||||||
|
.ant-btn {
|
||||||
|
width: 92px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
40
src/components/CustomSelect/index.vue
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
<template>
|
||||||
|
<a-select v-bind="$attrs" v-model="innerValue" show-arrow>
|
||||||
|
<img slot="suffixIcon" src="@/assets/images/global/select-down.png" alt="" />
|
||||||
|
</a-select>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
value: {
|
||||||
|
type: [String, Number, Array],
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
innerValue: this.value
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
value () {
|
||||||
|
this.innerValue = this.value
|
||||||
|
},
|
||||||
|
innerValue () {
|
||||||
|
this.$emit('input', this.innerValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.ant-select {
|
||||||
|
.ant-select-arrow-icon {
|
||||||
|
transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
|
||||||
|
}
|
||||||
|
&-open {
|
||||||
|
.ant-select-arrow-icon {
|
||||||
|
transform: rotate(180deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
87
src/components/CustomTable/index.vue
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
<template>
|
||||||
|
<a-table
|
||||||
|
v-bind="$attrs"
|
||||||
|
:data-source="list"
|
||||||
|
:columns="columns"
|
||||||
|
:size="size"
|
||||||
|
:row-key="rowKey"
|
||||||
|
:loading="loading"
|
||||||
|
:pagination="pagination"
|
||||||
|
:customRow="customRow"
|
||||||
|
@change="handleTableChange"
|
||||||
|
>
|
||||||
|
<!-- 处理 scopedSlots -->
|
||||||
|
<template v-for="slotName of scopedSlotsKeys" :slot="slotName" slot-scope="text, record, index">
|
||||||
|
<slot :name="slotName" :text="text" :record="record" :index="index"></slot>
|
||||||
|
</template>
|
||||||
|
</a-table>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import {cloneDeep} from 'lodash'
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
list: {
|
||||||
|
type: Array,
|
||||||
|
default: () => []
|
||||||
|
},
|
||||||
|
columns: {
|
||||||
|
type: Array,
|
||||||
|
default: () => []
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
type: String,
|
||||||
|
default: 'middle'
|
||||||
|
},
|
||||||
|
rowKey: {
|
||||||
|
type: String,
|
||||||
|
default: 'id'
|
||||||
|
},
|
||||||
|
loading: {
|
||||||
|
type: Boolean
|
||||||
|
},
|
||||||
|
pagination: {
|
||||||
|
type: Object
|
||||||
|
},
|
||||||
|
selectedRowKeys: {
|
||||||
|
type: Array
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
innerSelectedRowKeys: cloneDeep(this.selectedRowKeys)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// 实现单击选中/反选功能
|
||||||
|
customRow(record) {
|
||||||
|
return {
|
||||||
|
class: this.innerSelectedRowKeys.includes(record.id) ? 'ant-table-row-selected' : '',
|
||||||
|
on: {
|
||||||
|
click: () => {
|
||||||
|
if (this.innerSelectedRowKeys.includes(record.id)) {
|
||||||
|
this.innerSelectedRowKeys = []
|
||||||
|
} else {
|
||||||
|
this.innerSelectedRowKeys = [record.id]
|
||||||
|
}
|
||||||
|
this.$emit('update:selectedRowKeys', this.innerSelectedRowKeys)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
handleTableChange(pagination, filters, sorter) {
|
||||||
|
this.$emit('change', pagination, filters, sorter)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
selectedRowKeys () {
|
||||||
|
this.innerSelectedRowKeys = cloneDeep(this.selectedRowKeys)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
scopedSlotsKeys() {
|
||||||
|
return Object.keys(this.$scopedSlots)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang=""></style>
|
87
src/components/SearchForm/index.vue
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
<template>
|
||||||
|
<div class="search-form">
|
||||||
|
<a-form-model ref="form" :model="formModel" v-bind="$attrs" @keyup.enter.native="onSearch">
|
||||||
|
<a-row :gutter="20">
|
||||||
|
<a-col v-for="(item, index) in items" :key="index" :span="item.span || 6">
|
||||||
|
<a-form-model-item :label="item.label" :prop="item.name" :labelCol="item.labelCol">
|
||||||
|
<component :is="item.type" v-bind="item.props" v-model="formModel[item.name]" v-on="item.on"></component>
|
||||||
|
</a-form-model-item>
|
||||||
|
</a-col>
|
||||||
|
<a-button class="search-btn" type="primary" @click="onSearch">
|
||||||
|
<img src="@/assets/images/global/search.png" alt="" />
|
||||||
|
search
|
||||||
|
</a-button>
|
||||||
|
<slot name="additional"></slot>
|
||||||
|
</a-row>
|
||||||
|
</a-form-model>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { cloneDeep } from 'lodash'
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
items: {
|
||||||
|
type: Array,
|
||||||
|
default: () => []
|
||||||
|
},
|
||||||
|
value: {
|
||||||
|
type: Object,
|
||||||
|
default: () => ({})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
formModel: cloneDeep(this.value)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
onSearch() {
|
||||||
|
this.$emit('search', this.formModel)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
value(val) {
|
||||||
|
this.formModel = val
|
||||||
|
},
|
||||||
|
formModel: {
|
||||||
|
handler(val) {
|
||||||
|
this.$emit('input', val)
|
||||||
|
},
|
||||||
|
deep: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.search-form {
|
||||||
|
height: 50px;
|
||||||
|
padding: 10px;
|
||||||
|
border-top: 1px solid rgba(12, 235, 201, 0.3);
|
||||||
|
border-bottom: 1px solid rgba(12, 235, 201, 0.3);
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
::v-deep .ant-form-item {
|
||||||
|
display: flex;
|
||||||
|
margin-bottom: 0;
|
||||||
|
.ant-form-item-label,
|
||||||
|
.ant-form-item-control {
|
||||||
|
line-height: 32px;
|
||||||
|
}
|
||||||
|
.ant-form-item-label {
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
.ant-form-item-control-wrapper {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-btn {
|
||||||
|
img {
|
||||||
|
width: 16px;
|
||||||
|
height: 17px;
|
||||||
|
margin-right: 9px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -1,24 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<global-layout @dynamicRouterShow="dynamicRouterShow">
|
<global-layout @dynamicRouterShow="dynamicRouterShow">
|
||||||
<!-- update-begin- author:sunjianlei --- date:20191009 --- for: 提升右键菜单的层级 -->
|
<div>
|
||||||
<contextmenu :itemList="menuItemList" :visible.sync="menuVisible" style="z-index: 9999;" @select="onMenuSelect"/>
|
|
||||||
<!-- update-end- author:sunjianlei --- date:20191009 --- for: 提升右键菜单的层级 -->
|
|
||||||
<a-tabs
|
|
||||||
@contextmenu.native="e => onContextmenu(e)"
|
|
||||||
v-if="multipage"
|
|
||||||
:active-key="activePage"
|
|
||||||
class="tab-layout-tabs"
|
|
||||||
style="height:52px"
|
|
||||||
:hide-add="true"
|
|
||||||
type="editable-card"
|
|
||||||
@change="changePage"
|
|
||||||
@tabClick="tabCallBack"
|
|
||||||
@edit="editPage">
|
|
||||||
<a-tab-pane :id="page.fullPath" :key="page.fullPath" v-for="page in pageList" :closable="!(page.meta.title=='首页')">
|
|
||||||
<span slot="tab" :pagekey="page.fullPath">{{ page.meta.title }}</span>
|
|
||||||
</a-tab-pane>
|
|
||||||
</a-tabs>
|
|
||||||
<div style="margin: 12px 12px 0;">
|
|
||||||
<!-- update-begin-author:taoyan date:20201221 for:此处删掉transition标签 不知道为什么加上后 页面路由切换的时候即1及菜单切到2及菜单的时候 两个菜单页面会同时出现300-500秒左右 -->
|
<!-- update-begin-author:taoyan date:20201221 for:此处删掉transition标签 不知道为什么加上后 页面路由切换的时候即1及菜单切到2及菜单的时候 两个菜单页面会同时出现300-500秒左右 -->
|
||||||
<keep-alive v-if="multipage">
|
<keep-alive v-if="multipage">
|
||||||
<router-view v-if="reloadFlag"/>
|
<router-view v-if="reloadFlag"/>
|
||||||
|
@ -43,7 +25,7 @@
|
||||||
import { CACHE_INCLUDED_ROUTES } from '@/store/mutation-types'
|
import { CACHE_INCLUDED_ROUTES } from '@/store/mutation-types'
|
||||||
import registerApps from "@/qiankun";
|
import registerApps from "@/qiankun";
|
||||||
|
|
||||||
const indexKey = '/dashboard/analysis'
|
const indexKey = '/station-operation'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'TabLayout',
|
name: 'TabLayout',
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<div class="top">
|
<div class="top">
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<a href="/">
|
<a href="/">
|
||||||
<img src="~@/assets/logo.svg" class="logo" alt="logo">
|
<img src="~@/assets/logo.png" class="logo" alt="logo">
|
||||||
<span class="title">Jeecg Boot</span>
|
<span class="title">Jeecg Boot</span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
158
src/components/menu/CustomTopMenu.vue
Normal file
|
@ -0,0 +1,158 @@
|
||||||
|
<template>
|
||||||
|
<div class="custom-top-menu">
|
||||||
|
<a-menu mode="horizontal" v-model="selectedKeys" @click="onMenuSelect">
|
||||||
|
<a-menu-item v-for="(menu, index) in menus" :key="menu.name" :class="{ 'is-last': index === menus.length - 1}">
|
||||||
|
<img
|
||||||
|
v-show="menu.name === selectedKeys[0]"
|
||||||
|
class="menu-logo"
|
||||||
|
:src="'/images/top-nav/' + menu.meta.icon + '-active.png'"
|
||||||
|
alt=""
|
||||||
|
/>
|
||||||
|
<img
|
||||||
|
v-show="menu.name !== selectedKeys[0]"
|
||||||
|
class="menu-logo"
|
||||||
|
:src="'/images/top-nav/' + menu.meta.icon + '.png'"
|
||||||
|
alt=""
|
||||||
|
/>
|
||||||
|
<span v-html="menu.meta.title.split(' ').join('<br>')"></span>
|
||||||
|
<img v-if="index !== menus.length - 1" class="split-line" src="@/assets/images/header/split-line.png" alt="">
|
||||||
|
</a-menu-item>
|
||||||
|
</a-menu>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
menus: {
|
||||||
|
type: Array,
|
||||||
|
default: () => []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
selectedKeys: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
const currTopMenu = this.findTopMenuByRouteName(this.menuItems, this.$route.name)
|
||||||
|
this.selectedKeys = [currTopMenu.name]
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
onMenuSelect({ key }) {
|
||||||
|
const childPath = this.getChildrenPath(this.menuItems.find(menu => menu.name === key))
|
||||||
|
this.$router.push(childPath)
|
||||||
|
},
|
||||||
|
getChildrenPath(menuItem) {
|
||||||
|
if (menuItem.children) {
|
||||||
|
return this.getChildrenPath(menuItem.children[0])
|
||||||
|
}
|
||||||
|
return menuItem.path
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据路由查找一级路由列表
|
||||||
|
* @param {Array} menus
|
||||||
|
* @param {String} routeName
|
||||||
|
*/
|
||||||
|
findTopMenuByRouteName(menus, routeName) {
|
||||||
|
for (const menu of menus) {
|
||||||
|
if (menu.name === routeName) {
|
||||||
|
return menu
|
||||||
|
} else if (menu.children) {
|
||||||
|
const find = this.findTopMenuByRouteName(menu.children, routeName)
|
||||||
|
if (find) {
|
||||||
|
return menu
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
$route(route) {
|
||||||
|
const currTopMenu = this.findTopMenuByRouteName(this.menuItems, route.name)
|
||||||
|
this.selectedKeys = [currTopMenu.name]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
menuItems() {
|
||||||
|
return this.menus.filter(item => !item.hidden)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.custom-top-menu {
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
.ant-menu {
|
||||||
|
background: transparent;
|
||||||
|
height: 100% !important;
|
||||||
|
color: #0cecca !important;
|
||||||
|
font-size: 16px;
|
||||||
|
&-item {
|
||||||
|
color: #0cecca !important;
|
||||||
|
border-bottom: 0 !important;
|
||||||
|
height: 100%;
|
||||||
|
padding: 0 30px;
|
||||||
|
padding-right: 0;
|
||||||
|
font-family: MicrogrammaD-MediExte;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
line-height: normal;
|
||||||
|
&-selected,
|
||||||
|
&-active {
|
||||||
|
background-color: rgba(9, 255, 212, 0.3) !important;
|
||||||
|
color: #fff !important;
|
||||||
|
border-color: rgba(5, 255, 184, 0.46);
|
||||||
|
}
|
||||||
|
.split-line {
|
||||||
|
margin-left: 30px;
|
||||||
|
}
|
||||||
|
&.is-last {
|
||||||
|
padding-right: 30px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.menu-logo {
|
||||||
|
height: 40px;
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<style lang="less">
|
||||||
|
.ant-menu-submenu-popup {
|
||||||
|
.ant-menu {
|
||||||
|
height: 73px;
|
||||||
|
background-color: #0c3d43 !important;
|
||||||
|
&-item {
|
||||||
|
color: #0cecca !important;
|
||||||
|
border-bottom: 0 !important;
|
||||||
|
height: 100% !important;
|
||||||
|
padding: 0 30px !important;
|
||||||
|
padding-right: 0 !important;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
font-family: MicrogrammaD-MediExte;
|
||||||
|
font-size: 16px !important;
|
||||||
|
display: inline-flex !important;
|
||||||
|
align-items: center;
|
||||||
|
line-height: normal !important;
|
||||||
|
margin-bottom: 0;
|
||||||
|
margin-top: 0 !important;
|
||||||
|
&-selected,
|
||||||
|
&-active {
|
||||||
|
background-color: rgba(9, 255, 212, 0.3) !important;
|
||||||
|
color: #fff !important;
|
||||||
|
border-color: rgba(5, 255, 184, 0.46);
|
||||||
|
}
|
||||||
|
.split-line {
|
||||||
|
margin-left: 30px;
|
||||||
|
}
|
||||||
|
&.is-last {
|
||||||
|
padding-right: 30px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -4,42 +4,12 @@
|
||||||
v-if="!headerBarFixed"
|
v-if="!headerBarFixed"
|
||||||
:class="[fixedHeader && 'ant-header-fixedHeader', sidebarOpened ? 'ant-header-side-opened' : 'ant-header-side-closed', ]"
|
:class="[fixedHeader && 'ant-header-fixedHeader', sidebarOpened ? 'ant-header-side-opened' : 'ant-header-side-closed', ]"
|
||||||
:style="{ padding: '0' }">
|
:style="{ padding: '0' }">
|
||||||
|
|
||||||
<div v-if="mode === 'sidemenu'" class="header" :class="theme">
|
|
||||||
<a-icon
|
|
||||||
v-if="device==='mobile'"
|
|
||||||
class="trigger"
|
|
||||||
:type="collapsed ? 'menu-fold' : 'menu-unfold'"
|
|
||||||
@click="toggle"></a-icon>
|
|
||||||
<a-icon
|
|
||||||
v-else
|
|
||||||
class="trigger"
|
|
||||||
:type="collapsed ? 'menu-unfold' : 'menu-fold'"
|
|
||||||
@click="toggle"/>
|
|
||||||
|
|
||||||
<span v-if="device === 'desktop'">欢迎进入 Jeecg-Boot 企业级低代码平台</span>
|
|
||||||
<span v-else>Jeecg-Boot</span>
|
|
||||||
|
|
||||||
<user-menu :theme="theme"/>
|
|
||||||
</div>
|
|
||||||
<!-- 顶部导航栏模式 -->
|
<!-- 顶部导航栏模式 -->
|
||||||
<div v-else :class="['top-nav-header-index', theme]">
|
<div :class="['top-nav-header-index', theme]">
|
||||||
<div class="header-index-wide">
|
<div class="header-index-wide">
|
||||||
<div class="header-index-left" :style="topMenuStyle.headerIndexLeft">
|
<div class="header-index-left" :style="topMenuStyle.headerIndexLeft">
|
||||||
<logo class="top-nav-header" :show-title="device !== 'mobile'" :style="topMenuStyle.topNavHeader"/>
|
<logo class="top-nav-header" />
|
||||||
<div v-if="device !== 'mobile'" :style="topMenuStyle.topSmenuStyle">
|
<custom-top-menu :menus="menus"></custom-top-menu>
|
||||||
<s-menu
|
|
||||||
mode="horizontal"
|
|
||||||
:menu="menus"
|
|
||||||
:theme="theme"
|
|
||||||
@updateMenuTitle="handleUpdateMenuTitle"
|
|
||||||
></s-menu>
|
|
||||||
</div>
|
|
||||||
<a-icon
|
|
||||||
v-else
|
|
||||||
class="trigger"
|
|
||||||
:type="collapsed ? 'menu-fold' : 'menu-unfold'"
|
|
||||||
@click="toggle"></a-icon>
|
|
||||||
</div>
|
</div>
|
||||||
<user-menu class="header-index-right" :theme="theme" :style="topMenuStyle.headerIndexRight"/>
|
<user-menu class="header-index-right" :theme="theme" :style="topMenuStyle.headerIndexRight"/>
|
||||||
</div>
|
</div>
|
||||||
|
@ -50,16 +20,16 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import UserMenu from '../tools/UserMenu'
|
import UserMenu from '../tools/UserMenu'
|
||||||
import SMenu from '../menu/'
|
|
||||||
import Logo from '../tools/Logo'
|
import Logo from '../tools/Logo'
|
||||||
import { mixin } from '@/utils/mixin.js'
|
import { mixin } from '@/utils/mixin.js'
|
||||||
|
import CustomTopMenu from '../menu/CustomTopMenu.vue'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'GlobalHeader',
|
name: 'GlobalHeader',
|
||||||
components: {
|
components: {
|
||||||
UserMenu,
|
UserMenu,
|
||||||
SMenu,
|
|
||||||
Logo,
|
Logo,
|
||||||
|
CustomTopMenu
|
||||||
},
|
},
|
||||||
mixins: [mixin],
|
mixins: [mixin],
|
||||||
props: {
|
props: {
|
||||||
|
@ -150,11 +120,7 @@
|
||||||
this.topMenuStyle.headerIndexRight = {}
|
this.topMenuStyle.headerIndexRight = {}
|
||||||
this.topMenuStyle.headerIndexLeft = {}
|
this.topMenuStyle.headerIndexLeft = {}
|
||||||
} else {
|
} else {
|
||||||
let rightWidth = '400px'
|
this.topMenuStyle.headerIndexRight = { 'white-space': 'nowrap' }
|
||||||
this.topMenuStyle.topNavHeader = { 'min-width': '165px' }
|
|
||||||
this.topMenuStyle.topSmenuStyle = { 'width': 'calc(100% - 165px)' }
|
|
||||||
this.topMenuStyle.headerIndexRight = { 'min-width': rightWidth, 'white-space': 'nowrap' }
|
|
||||||
this.topMenuStyle.headerIndexLeft = { 'width': `calc(100% - ${rightWidth})` }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -218,10 +184,42 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.ant-layout-header {
|
.ant-layout-header {
|
||||||
height: @height;
|
line-height: unset;
|
||||||
line-height: @height;
|
height: 73px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* update_end author:scott date:20190220 for: 缩小首页布局顶部的高度*/
|
/* update_end author:scott date:20190220 for: 缩小首页布局顶部的高度*/
|
||||||
|
|
||||||
|
.top-nav-header-index {
|
||||||
|
background: url(~@/assets/images/header/bg.png) no-repeat;
|
||||||
|
background-size: 100% 120%;
|
||||||
|
height: 100%;
|
||||||
|
background-color: transparent !important;
|
||||||
|
.header-index-wide {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-index-left {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-index-right {
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
color: #fff;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.top-nav-header {
|
||||||
|
height: 100%;
|
||||||
|
padding-top: 6px;
|
||||||
|
margin-right: 60px;
|
||||||
|
width: initial !important;
|
||||||
|
img {
|
||||||
|
width: 284px;
|
||||||
|
height: 60px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
|
@ -1,59 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<a-layout class="layout" :class="[device]">
|
<a-layout class="layout" :class="[device]">
|
||||||
|
|
||||||
<template v-if="layoutMode === 'sidemenu'">
|
|
||||||
<a-drawer
|
|
||||||
v-if="device === 'mobile'"
|
|
||||||
:wrapClassName="'drawer-sider ' + navTheme"
|
|
||||||
placement="left"
|
|
||||||
@close="() => this.collapsed = false"
|
|
||||||
:closable="false"
|
|
||||||
:visible="collapsed"
|
|
||||||
width="200px"
|
|
||||||
>
|
|
||||||
<side-menu
|
|
||||||
mode="inline"
|
|
||||||
v-if="device === 'mobile'"
|
|
||||||
:menus="menus"
|
|
||||||
@menuSelect="menuSelect"
|
|
||||||
@updateMenuTitle="handleUpdateMenuTitle"
|
|
||||||
:theme="navTheme"
|
|
||||||
:collapsed="false"
|
|
||||||
:collapsible="true"></side-menu>
|
|
||||||
</a-drawer>
|
|
||||||
|
|
||||||
<side-menu
|
|
||||||
v-show="device === 'desktop'"
|
|
||||||
mode="inline"
|
|
||||||
:menus="menus"
|
|
||||||
@menuSelect="myMenuSelect"
|
|
||||||
@updateMenuTitle="handleUpdateMenuTitle"
|
|
||||||
:theme="navTheme"
|
|
||||||
:collapsed="collapsed"
|
|
||||||
:collapsible="true"></side-menu>
|
|
||||||
</template>
|
|
||||||
<!-- 下次优化这些代码 -->
|
|
||||||
<template v-else>
|
|
||||||
<a-drawer
|
|
||||||
v-if="device === 'mobile'"
|
|
||||||
:wrapClassName="'drawer-sider ' + navTheme"
|
|
||||||
placement="left"
|
|
||||||
@close="() => this.collapsed = false"
|
|
||||||
:closable="false"
|
|
||||||
:visible="collapsed"
|
|
||||||
width="200px"
|
|
||||||
>
|
|
||||||
<side-menu
|
|
||||||
mode="inline"
|
|
||||||
:menus="menus"
|
|
||||||
@menuSelect="menuSelect"
|
|
||||||
@updateMenuTitle="handleUpdateMenuTitle"
|
|
||||||
:theme="navTheme"
|
|
||||||
:collapsed="false"
|
|
||||||
:collapsible="true"></side-menu>
|
|
||||||
</a-drawer>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<a-layout
|
<a-layout
|
||||||
:class="[layoutMode, `content-width-${contentWidth}`]"
|
:class="[layoutMode, `content-width-${contentWidth}`]"
|
||||||
:style="{ paddingLeft: fixSiderbar && isDesktop() ? `${sidebarOpened ? 200 : 80}px` : '0' }">
|
:style="{ paddingLeft: fixSiderbar && isDesktop() ? `${sidebarOpened ? 200 : 80}px` : '0' }">
|
||||||
|
@ -67,16 +13,31 @@
|
||||||
@toggle="toggle"
|
@toggle="toggle"
|
||||||
@updateMenuTitle="handleUpdateMenuTitle"
|
@updateMenuTitle="handleUpdateMenuTitle"
|
||||||
/>
|
/>
|
||||||
|
<div class="global-content">
|
||||||
|
<div class="top-border">
|
||||||
|
<img src="@/assets/images/content/top.png" alt="">
|
||||||
|
</div>
|
||||||
|
<div class="content-main">
|
||||||
|
<div class="left-border">
|
||||||
|
<img src="@/assets/images/content/left.png" alt="">
|
||||||
|
</div>
|
||||||
<!-- layout content -->
|
<!-- layout content -->
|
||||||
<a-layout-content :style="{ height: '100%', paddingTop: fixedHeader ? '59px' : '0' }">
|
<a-layout-content>
|
||||||
|
<div class="sub-menus" v-if="currentChildrenMenus && currentChildrenMenus.length">
|
||||||
|
<s-menu :menu="currentChildrenMenus" mode="horizontal" theme="light"></s-menu>
|
||||||
|
</div>
|
||||||
|
<div class="real-content" :class="currentChildrenMenus.length? 'has-submenu': ''">
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
|
</div>
|
||||||
</a-layout-content>
|
</a-layout-content>
|
||||||
|
<div class="right-border">
|
||||||
<!-- layout footer -->
|
<img src="@/assets/images/content/left.png" alt="">
|
||||||
<a-layout-footer style="padding: 0px">
|
</div>
|
||||||
<global-footer/>
|
</div>
|
||||||
</a-layout-footer>
|
<div class="bottom-border">
|
||||||
|
<img src="@/assets/images/content/bottom.png" alt="">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</a-layout>
|
</a-layout>
|
||||||
|
|
||||||
<!-- update-start---- author:os_chengtgen -- date:20190830 -- for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ---- -->
|
<!-- update-start---- author:os_chengtgen -- date:20190830 -- for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ---- -->
|
||||||
|
@ -92,6 +53,7 @@
|
||||||
import { triggerWindowResizeEvent } from '@/utils/util'
|
import { triggerWindowResizeEvent } from '@/utils/util'
|
||||||
import { mapActions, mapState } from 'vuex'
|
import { mapActions, mapState } from 'vuex'
|
||||||
import { mixin, mixinDevice } from '@/utils/mixin.js'
|
import { mixin, mixinDevice } from '@/utils/mixin.js'
|
||||||
|
import SMenu from '../menu/index'
|
||||||
// update-start---- author:os_chengtgen -- date:20190830 -- for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ------
|
// update-start---- author:os_chengtgen -- date:20190830 -- for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ------
|
||||||
// import SettingDrawer from '@/components/setting/SettingDrawer'
|
// import SettingDrawer from '@/components/setting/SettingDrawer'
|
||||||
// 注释这个因为在个人设置模块已经加载了SettingDrawer页面
|
// 注释这个因为在个人设置模块已经加载了SettingDrawer页面
|
||||||
|
@ -103,6 +65,7 @@
|
||||||
SideMenu,
|
SideMenu,
|
||||||
GlobalHeader,
|
GlobalHeader,
|
||||||
GlobalFooter,
|
GlobalFooter,
|
||||||
|
SMenu
|
||||||
// update-start---- author:os_chengtgen -- date:20190830 -- for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ------
|
// update-start---- author:os_chengtgen -- date:20190830 -- for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ------
|
||||||
// // SettingDrawer
|
// // SettingDrawer
|
||||||
// 注释这个因为在个人设置模块已经加载了SettingDrawer页面
|
// 注释这个因为在个人设置模块已经加载了SettingDrawer页面
|
||||||
|
@ -123,7 +86,12 @@
|
||||||
mainRouters: state => state.permission.addRouters,
|
mainRouters: state => state.permission.addRouters,
|
||||||
// 后台菜单
|
// 后台菜单
|
||||||
permissionMenuList: state => state.user.permissionList
|
permissionMenuList: state => state.user.permissionList
|
||||||
})
|
}),
|
||||||
|
|
||||||
|
// 当前页面子路由
|
||||||
|
currentChildrenMenus () {
|
||||||
|
return this.findSubMenus(this.$route.name)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
sidebarOpened(val) {
|
sidebarOpened(val) {
|
||||||
|
@ -148,6 +116,22 @@
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
...mapActions(['setSidebar']),
|
...mapActions(['setSidebar']),
|
||||||
|
/**
|
||||||
|
* 根据路由名查找二级路由列表
|
||||||
|
* @param {Array} menus
|
||||||
|
* @param {String} routeName
|
||||||
|
*/
|
||||||
|
findSubMenus(routeName) {
|
||||||
|
for (const menu of this.menus) {
|
||||||
|
if (menu.children) {
|
||||||
|
const find = menu.children.find(child => child.name === routeName || child.children && child.children.find(item => item.name === routeName))
|
||||||
|
if (find) {
|
||||||
|
return menu.children
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return []
|
||||||
|
},
|
||||||
toggle() {
|
toggle() {
|
||||||
this.collapsed = !this.collapsed
|
this.collapsed = !this.collapsed
|
||||||
this.setSidebar(!this.collapsed)
|
this.setSidebar(!this.collapsed)
|
||||||
|
@ -327,22 +311,13 @@
|
||||||
.header, .top-nav-header-index {
|
.header, .top-nav-header-index {
|
||||||
|
|
||||||
.user-wrapper {
|
.user-wrapper {
|
||||||
float: right;
|
width: 140px;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
margin-left: 30px;
|
||||||
.action {
|
.action {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
padding: 0 14px;
|
padding: 0 10px;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
transition: all .3s;
|
|
||||||
|
|
||||||
height: 70%;
|
|
||||||
line-height: 46px;
|
|
||||||
|
|
||||||
&.action-full {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background: rgba(255, 255, 255, 0.3);
|
background: rgba(255, 255, 255, 0.3);
|
||||||
}
|
}
|
||||||
|
@ -450,7 +425,6 @@
|
||||||
margin: auto;
|
margin: auto;
|
||||||
padding: 0 20px 0 0;
|
padding: 0 20px 0 0;
|
||||||
display: flex;
|
display: flex;
|
||||||
height: 59px;
|
|
||||||
|
|
||||||
.ant-menu.ant-menu-horizontal {
|
.ant-menu.ant-menu-horizontal {
|
||||||
border: none;
|
border: none;
|
||||||
|
@ -463,17 +437,10 @@
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
||||||
.logo.top-nav-header {
|
.logo.top-nav-header {
|
||||||
width: 165px;
|
|
||||||
height: 64px;
|
|
||||||
position: relative;
|
position: relative;
|
||||||
line-height: 64px;
|
|
||||||
transition: all .3s;
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
img {
|
img {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
height: 32px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
|
@ -488,8 +455,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.header-index-right {
|
.header-index-right {
|
||||||
float: right;
|
|
||||||
height: 59px;
|
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
.action:hover {
|
.action:hover {
|
||||||
background-color: rgba(0, 0, 0, 0.05);
|
background-color: rgba(0, 0, 0, 0.05);
|
||||||
|
@ -696,4 +661,112 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.sub-menus {
|
||||||
|
margin-bottom: 16px;
|
||||||
|
.ant-menu {
|
||||||
|
font-size: 16px;
|
||||||
|
background: rgba(12, 235, 201, .05);
|
||||||
|
border-bottom: none;
|
||||||
|
height: 40px;
|
||||||
|
line-height: normal;
|
||||||
|
padding-top: 5px;
|
||||||
|
.ant-menu-item {
|
||||||
|
background: rgba(58, 236, 240, .22) !important;
|
||||||
|
border-bottom: none !important;
|
||||||
|
margin-right: 10px;
|
||||||
|
height: 30px;
|
||||||
|
line-height: 30px;
|
||||||
|
padding: 0 15px;
|
||||||
|
position: relative;
|
||||||
|
> a {
|
||||||
|
color: #c9f6f6;
|
||||||
|
font-weight: bold;
|
||||||
|
font-family: BookmanOldStyle;
|
||||||
|
}
|
||||||
|
&-active,
|
||||||
|
&-selected {
|
||||||
|
> a {
|
||||||
|
color: #2affdf !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::before,
|
||||||
|
&::after {
|
||||||
|
border-color: #0cecca !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&::before,
|
||||||
|
&::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
border: 2px solid #569e9e;
|
||||||
|
width: 7px;
|
||||||
|
height: 30px;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
&::before {
|
||||||
|
left: 0;
|
||||||
|
border-right: 0;
|
||||||
|
}
|
||||||
|
&::after {
|
||||||
|
right: 0;
|
||||||
|
border-left: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.global-content {
|
||||||
|
width: 100%;
|
||||||
|
height: calc(100% - 73px);
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
.content-main {
|
||||||
|
display: flex;
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
.ant-layout-content {
|
||||||
|
flex: 1;
|
||||||
|
margin-top: 34px;
|
||||||
|
margin-bottom: 34px;
|
||||||
|
.real-content {
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden auto;
|
||||||
|
}
|
||||||
|
.has-submenu {
|
||||||
|
height: calc(100% - 56px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.top-border {
|
||||||
|
position: absolute;
|
||||||
|
top: 11px;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
img {
|
||||||
|
width: 100%;
|
||||||
|
height: 21px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.bottom-border {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 6px;
|
||||||
|
img {
|
||||||
|
width: 100%;
|
||||||
|
height: 21px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.left-border {
|
||||||
|
width: 3px;
|
||||||
|
height: 100%;
|
||||||
|
margin-left: 12px;
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
.right-border {
|
||||||
|
width: 3px;
|
||||||
|
height: 100%;
|
||||||
|
margin-right: 14px;
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
|
@ -26,7 +26,7 @@ export default {
|
||||||
console.log('this.$route.matched', this.$route.matched)
|
console.log('this.$route.matched', this.$route.matched)
|
||||||
|
|
||||||
this.breadList = []
|
this.breadList = []
|
||||||
this.breadList.push({ name: 'dashboard-analysis', path: '/dashboard/analysis', meta: { title: '首页' } })
|
this.breadList.push({ name: 'dashboard-analysis', path: '/station-operation', meta: { title: '首页' } })
|
||||||
|
|
||||||
this.name = this.$route.name
|
this.name = this.$route.name
|
||||||
this.$route.matched.forEach((item) => {
|
this.$route.matched.forEach((item) => {
|
||||||
|
|
|
@ -68,7 +68,7 @@
|
||||||
</template>
|
</template>
|
||||||
<span @click="fetchNotice" class="header-notice">
|
<span @click="fetchNotice" class="header-notice">
|
||||||
<a-badge :count="msgTotal">
|
<a-badge :count="msgTotal">
|
||||||
<a-icon style="font-size: 16px; padding: 4px" type="bell" />
|
<img src="@/assets/images/header/notice.png" alt="">
|
||||||
</a-badge>
|
</a-badge>
|
||||||
</span>
|
</span>
|
||||||
<show-announcement ref="ShowAnnouncement" @ok="modalFormOk"></show-announcement>
|
<show-announcement ref="ShowAnnouncement" @ok="modalFormOk"></show-announcement>
|
||||||
|
|
|
@ -1,13 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="logo">
|
<div class="logo">
|
||||||
<router-link :to="routerLinkTo">
|
<router-link :to="routerLinkTo">
|
||||||
|
<img src="~@/assets/logo.png" alt="logo">
|
||||||
<!-- update-begin- author:sunjianlei --- date:20190814 --- for: logo颜色根据主题颜色变化 -->
|
|
||||||
<img v-if="navTheme === 'dark'" src="~@/assets/logo-white.png" alt="logo">
|
|
||||||
<img v-else src="~@/assets/logo.svg" alt="logo">
|
|
||||||
<!-- update-begin- author:sunjianlei --- date:20190814 --- for: logo颜色根据主题颜色变化 -->
|
|
||||||
|
|
||||||
<h1 v-if="showTitle">{{ title }}</h1>
|
|
||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -21,7 +15,7 @@
|
||||||
props: {
|
props: {
|
||||||
title: {
|
title: {
|
||||||
type: String,
|
type: String,
|
||||||
default: 'Jeecg-Boot Pro',
|
default: '',
|
||||||
required: false
|
required: false
|
||||||
},
|
},
|
||||||
showTitle: {
|
showTitle: {
|
||||||
|
|
|
@ -1,41 +1,9 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="user-wrapper" :class="theme">
|
<div class="user-wrapper" :class="theme">
|
||||||
<!-- update_begin author:zhaoxin date:20191129 for: 做头部菜单栏导航 -->
|
|
||||||
<!-- update-begin author:sunjianlei date:20191@20 for: 解决全局样式冲突的问题 -->
|
|
||||||
<span class="action" @click="showClick">
|
|
||||||
<a-icon type="search"></a-icon>
|
|
||||||
</span>
|
|
||||||
<!-- update-begin author:sunjianlei date:20200219 for: 菜单搜索改为动态组件,在手机端呈现出弹出框 -->
|
|
||||||
<component :is="searchMenuComp" v-show="searchMenuVisible || isMobile()" class="borders" :visible="searchMenuVisible" title="搜索菜单" :footer="null" @cancel="searchMenuVisible=false">
|
|
||||||
<a-select
|
|
||||||
class="search-input"
|
|
||||||
showSearch
|
|
||||||
:showArrow="false"
|
|
||||||
placeholder="搜索菜单"
|
|
||||||
optionFilterProp="children"
|
|
||||||
:filterOption="filterOption"
|
|
||||||
:open="isMobile()?true:null"
|
|
||||||
:getPopupContainer="(node) => node.parentNode"
|
|
||||||
:style="isMobile()?{width: '100%',marginBottom:'50px'}:{}"
|
|
||||||
@change="searchMethods"
|
|
||||||
@blur="hiddenClick"
|
|
||||||
>
|
|
||||||
<a-select-option v-for="(site,index) in searchMenuOptions" :key="index" :value="site.id">{{site.meta.title}}</a-select-option>
|
|
||||||
</a-select>
|
|
||||||
</component>
|
|
||||||
<!-- update-end author:sunjianlei date:20200219 for: 菜单搜索改为动态组件,在手机端呈现出弹出框 -->
|
|
||||||
<!-- update-end author:sunjianlei date:20191220 for: 解决全局样式冲突的问题 -->
|
|
||||||
<!-- update_end author:zhaoxin date:20191129 for: 做头部菜单栏导航 -->
|
|
||||||
<span class="action">
|
|
||||||
<a class="logout_title" target="_blank" href="http://doc.jeecg.com">
|
|
||||||
<a-icon type="question-circle-o"></a-icon>
|
|
||||||
</a>
|
|
||||||
</span>
|
|
||||||
<header-notice class="action"/>
|
<header-notice class="action"/>
|
||||||
<a-dropdown>
|
<a-dropdown>
|
||||||
<span class="action action-full ant-dropdown-link user-dropdown-menu">
|
<span class="action action-full ant-dropdown-link user-dropdown-menu">
|
||||||
<a-avatar class="avatar" size="small" :src="getAvatar()"/>
|
<img src="@/assets/images/header/avatar.png" alt="">
|
||||||
<span v-if="isDesktop()">欢迎您,{{ nickname() }}</span>
|
|
||||||
</span>
|
</span>
|
||||||
<a-menu slot="overlay" class="user-dropdown-menu-wrapper">
|
<a-menu slot="overlay" class="user-dropdown-menu-wrapper">
|
||||||
<a-menu-item key="0">
|
<a-menu-item key="0">
|
||||||
|
@ -66,23 +34,11 @@
|
||||||
<a-icon type="sync"/>
|
<a-icon type="sync"/>
|
||||||
<span>清理缓存</span>
|
<span>清理缓存</span>
|
||||||
</a-menu-item>
|
</a-menu-item>
|
||||||
<!-- <a-menu-item key="2" disabled>
|
|
||||||
<a-icon type="setting"/>
|
|
||||||
<span>测试</span>
|
|
||||||
</a-menu-item>
|
|
||||||
<a-menu-divider/>
|
|
||||||
<a-menu-item key="3">
|
|
||||||
<a href="javascript:;" @click="handleLogout">
|
|
||||||
<a-icon type="logout"/>
|
|
||||||
<span>退出登录</span>
|
|
||||||
</a>
|
|
||||||
</a-menu-item>-->
|
|
||||||
</a-menu>
|
</a-menu>
|
||||||
</a-dropdown>
|
</a-dropdown>
|
||||||
<span class="action">
|
<span class="action">
|
||||||
<a class="logout_title" href="javascript:;" @click="handleLogout">
|
<a class="logout_title" href="javascript:;" @click="handleLogout">
|
||||||
<a-icon type="logout"/>
|
<img src="@/assets/images/header/close.png" alt="">
|
||||||
<span v-if="isDesktop()"> 退出登录</span>
|
|
||||||
</a>
|
</a>
|
||||||
</span>
|
</span>
|
||||||
<user-password ref="userPassword"></user-password>
|
<user-password ref="userPassword"></user-password>
|
||||||
|
|
|
@ -11,7 +11,7 @@ export const asyncRouterMap = [
|
||||||
name: 'dashboard',
|
name: 'dashboard',
|
||||||
component: TabLayout,
|
component: TabLayout,
|
||||||
meta: { title: '首页' },
|
meta: { title: '首页' },
|
||||||
redirect: '/dashboard/analysis',
|
redirect: '/station-operation',
|
||||||
children: [
|
children: [
|
||||||
|
|
||||||
// // dashboard
|
// // dashboard
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
export default {
|
export default {
|
||||||
primaryColor: '#1890FF', // primary color of ant design
|
primaryColor: '#1890FF', // primary color of ant design
|
||||||
navTheme: 'light', // theme for nav menu
|
navTheme: 'light', // theme for nav menu
|
||||||
layout: 'sidemenu', // nav menu position: sidemenu or topmenu
|
layout: 'topmenu', // nav menu position: sidemenu or topmenu
|
||||||
contentWidth: 'Fixed', // layout of content: Fluid or Fixed, only works when layout is topmenu
|
contentWidth: 'Fixed', // layout of content: Fluid or Fixed, only works when layout is topmenu
|
||||||
fixedHeader: false, // sticky header
|
fixedHeader: false, // sticky header
|
||||||
fixSiderbar: false, // sticky siderbar
|
fixSiderbar: false, // sticky siderbar
|
||||||
|
|
|
@ -47,8 +47,13 @@ import '@/assets/less/JAreaLinkage.less'
|
||||||
import VueAreaLinkage from 'vue-area-linkage'
|
import VueAreaLinkage from 'vue-area-linkage'
|
||||||
import '@/components/jeecg/JVxeTable/install'
|
import '@/components/jeecg/JVxeTable/install'
|
||||||
import '@/components/JVxeCells/install'
|
import '@/components/JVxeCells/install'
|
||||||
|
import './style.less'
|
||||||
//表单验证
|
//表单验证
|
||||||
import { rules } from '@/utils/rules'
|
import { rules } from '@/utils/rules'
|
||||||
|
|
||||||
|
import CustomSelect from '@/components/CustomSelect'
|
||||||
|
import CustomTable from '@/components/CustomTable'
|
||||||
|
|
||||||
Vue.prototype.rules = rules
|
Vue.prototype.rules = rules
|
||||||
Vue.config.productionTip = false
|
Vue.config.productionTip = false
|
||||||
Vue.use(Storage, config.storageOptions)
|
Vue.use(Storage, config.storageOptions)
|
||||||
|
@ -62,6 +67,8 @@ Vue.use(preview)
|
||||||
Vue.use(vueBus);
|
Vue.use(vueBus);
|
||||||
Vue.use(JeecgComponents);
|
Vue.use(JeecgComponents);
|
||||||
Vue.use(VueAreaLinkage);
|
Vue.use(VueAreaLinkage);
|
||||||
|
Vue.component('custom-select', CustomSelect)
|
||||||
|
Vue.component('custom-table', CustomTable)
|
||||||
|
|
||||||
SSO.init(() => {
|
SSO.init(() => {
|
||||||
main()
|
main()
|
||||||
|
|
9
src/mixins/FormMixin.js
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
export default {
|
||||||
|
watch: {
|
||||||
|
visible(val) {
|
||||||
|
if(val && this.$refs.form) {
|
||||||
|
this.$refs.form.resetFields()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -22,7 +22,8 @@ export const JeecgListMixin = {
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
pageSizeOptions: ['10', '20', '30'],
|
pageSizeOptions: ['10', '20', '30'],
|
||||||
showTotal: (total, range) => {
|
showTotal: (total, range) => {
|
||||||
return range[0] + "-" + range[1] + " 共" + total + "条"
|
const { current, pageSize } = this.ipagination
|
||||||
|
return `共 ${total} 条记录 第 ${current} / ${Math.ceil(total / pageSize)} 页`
|
||||||
},
|
},
|
||||||
showQuickJumper: true,
|
showQuickJumper: true,
|
||||||
showSizeChanger: true,
|
showSizeChanger: true,
|
||||||
|
@ -80,6 +81,8 @@ export const JeecgListMixin = {
|
||||||
if (arg === 1) {
|
if (arg === 1) {
|
||||||
this.ipagination.current = 1;
|
this.ipagination.current = 1;
|
||||||
}
|
}
|
||||||
|
this.onClearSelected()
|
||||||
|
|
||||||
var params = this.getQueryParams();//查询条件
|
var params = this.getQueryParams();//查询条件
|
||||||
this.loading = true;
|
this.loading = true;
|
||||||
getAction(this.url.list, params).then((res) => {
|
getAction(this.url.list, params).then((res) => {
|
||||||
|
|
|
@ -16,7 +16,7 @@ export const SYS_BUTTON_AUTH = 'SYS_BUTTON_AUTH'
|
||||||
export const ENCRYPTED_STRING = 'ENCRYPTED_STRING'
|
export const ENCRYPTED_STRING = 'ENCRYPTED_STRING'
|
||||||
export const ENHANCE_PRE = 'enhance_'
|
export const ENHANCE_PRE = 'enhance_'
|
||||||
export const UI_CACHE_DB_DICT_DATA = 'UI_CACHE_DB_DICT_DATA'
|
export const UI_CACHE_DB_DICT_DATA = 'UI_CACHE_DB_DICT_DATA'
|
||||||
export const INDEX_MAIN_PAGE_PATH = '/dashboard/analysis'
|
export const INDEX_MAIN_PAGE_PATH = '/station-operation'
|
||||||
export const OAUTH2_LOGIN_PAGE_PATH = '/oauth2-app/login'
|
export const OAUTH2_LOGIN_PAGE_PATH = '/oauth2-app/login'
|
||||||
export const TENANT_ID = 'TENANT_ID'
|
export const TENANT_ID = 'TENANT_ID'
|
||||||
export const ONL_AUTH_FIELDS = 'ONL_AUTH_FIELDS'
|
export const ONL_AUTH_FIELDS = 'ONL_AUTH_FIELDS'
|
||||||
|
|
473
src/style.less
Normal file
|
@ -0,0 +1,473 @@
|
||||||
|
// 重置样式
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: MicrogrammaD-MediExte;
|
||||||
|
src: url(~@/assets/fonts/MicrogrammaDMedExt.ttf);
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: BookmanOldStyle;
|
||||||
|
src: url(~@/assets/fonts/BOOKOS.ttf);
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-layout {
|
||||||
|
background: url(~@/assets/images/content/bg.jpg) center center no-repeat;
|
||||||
|
background-size: cover;
|
||||||
|
height: 100vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
@modalBg: #022024;
|
||||||
|
|
||||||
|
// 卡片样式
|
||||||
|
.ant-card {
|
||||||
|
background-color: transparent;
|
||||||
|
.ant-card-body {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 表格样式
|
||||||
|
.ant-table {
|
||||||
|
color: #ade6ee;
|
||||||
|
&-thead {
|
||||||
|
tr {
|
||||||
|
th {
|
||||||
|
background-color: #126b82 !important;
|
||||||
|
color: #fff;
|
||||||
|
padding: 6px 8px !important;
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&-tbody {
|
||||||
|
tr {
|
||||||
|
background-color: #06282a;
|
||||||
|
&:nth-child(2n) {
|
||||||
|
background-color: #08373a;
|
||||||
|
}
|
||||||
|
td {
|
||||||
|
padding: 10px 8px !important;
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
&:hover {
|
||||||
|
td {
|
||||||
|
background-color: transparent !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&.ant-table-row-selected {
|
||||||
|
td {
|
||||||
|
background-color: #0d4e5c !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&-placeholder {
|
||||||
|
background-color: transparent;
|
||||||
|
border-top: none;
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
&-selected {
|
||||||
|
background-color: 0d4e5c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 表格下的分页器
|
||||||
|
.ant-table-pagination {
|
||||||
|
float: none !important;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 表单样式
|
||||||
|
@antFormSelector: .ant-form;
|
||||||
|
@{antFormSelector} {
|
||||||
|
&-item {
|
||||||
|
&-label {
|
||||||
|
> label {
|
||||||
|
color: #5b9cba;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&-horizontal {
|
||||||
|
@{antFormSelector} {
|
||||||
|
&-item {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@formInputBgColor: #03353f;
|
||||||
|
@formInputBorderColor: #0b8c82;
|
||||||
|
// 输入框样式
|
||||||
|
.ant-input {
|
||||||
|
background-color: @formInputBgColor !important;
|
||||||
|
border-color: @formInputBorderColor !important;
|
||||||
|
border-radius: 0;
|
||||||
|
color: #fff;
|
||||||
|
&::placeholder {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
&:focus {
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 单选样式
|
||||||
|
.ant-radio {
|
||||||
|
&-wrapper {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 下拉框样式
|
||||||
|
.ant-select {
|
||||||
|
color: #fff !important;
|
||||||
|
&-selection {
|
||||||
|
background-color: @formInputBgColor !important;
|
||||||
|
border-color: @formInputBorderColor !important;
|
||||||
|
border-radius: 0;
|
||||||
|
box-shadow: none !important;
|
||||||
|
&__placeholder {
|
||||||
|
color: #fff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
&--multiple {
|
||||||
|
.ant-select-selection__choice {
|
||||||
|
background: transparent;
|
||||||
|
color: #fff;
|
||||||
|
border: 1px solid #0b8c82;
|
||||||
|
&__remove {
|
||||||
|
color: #fff !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&-dropdown {
|
||||||
|
background-color: transparent;
|
||||||
|
padding-top: 7px;
|
||||||
|
|
||||||
|
@borderColor: #0da397;
|
||||||
|
&-content {
|
||||||
|
border: 1px solid @borderColor;
|
||||||
|
overflow: visible !important;
|
||||||
|
&::before {
|
||||||
|
position: absolute;
|
||||||
|
top: -6px;
|
||||||
|
left: 20px;
|
||||||
|
content: '';
|
||||||
|
width: 12px;
|
||||||
|
height: 12px;
|
||||||
|
border: 1px solid #0da397;
|
||||||
|
background: #03353f;
|
||||||
|
transform: rotate(45deg) skew(14deg, 14deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&-menu {
|
||||||
|
background: #03353f;
|
||||||
|
padding: 0;
|
||||||
|
position: relative;
|
||||||
|
&-item {
|
||||||
|
color: #fff;
|
||||||
|
font-family: Arial;
|
||||||
|
border: 0;
|
||||||
|
background-color: transparent !important;
|
||||||
|
padding: 4px 14px;
|
||||||
|
&:hover {
|
||||||
|
background-color: #055565 !important;
|
||||||
|
}
|
||||||
|
&-selected {
|
||||||
|
color: #0cebc9;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
&-disabled {
|
||||||
|
color: #476d74 !important;
|
||||||
|
&:hover {
|
||||||
|
background-color: transparent !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&--multiple {
|
||||||
|
// 多选
|
||||||
|
color: #000;
|
||||||
|
.ant-select-dropdown {
|
||||||
|
&-menu-item {
|
||||||
|
padding-left: 35px;
|
||||||
|
.anticon-check {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
line-height: 18px;
|
||||||
|
left: 13px;
|
||||||
|
border: 1px solid #0a544e !important;
|
||||||
|
color: transparent !important;
|
||||||
|
background-color: #03353f;
|
||||||
|
}
|
||||||
|
&-selected {
|
||||||
|
.anticon-check {
|
||||||
|
background: #00e9fe;
|
||||||
|
border-color: #00e9fe;
|
||||||
|
color: #000 !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 下拉框打开时的样式
|
||||||
|
&-open {
|
||||||
|
.ant-select {
|
||||||
|
&-selection {
|
||||||
|
background-color: #055565 !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 下拉菜单
|
||||||
|
.ant-dropdown {
|
||||||
|
&-menu {
|
||||||
|
background: #03353f;
|
||||||
|
padding: 0;
|
||||||
|
position: relative;
|
||||||
|
&-item {
|
||||||
|
color: #fff;
|
||||||
|
font-family: Arial;
|
||||||
|
border: 0;
|
||||||
|
background-color: transparent !important;
|
||||||
|
padding: 4px 14px;
|
||||||
|
&:hover {
|
||||||
|
background-color: #055565 !important;
|
||||||
|
}
|
||||||
|
&-selected {
|
||||||
|
color: #0cebc9;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
&-disabled {
|
||||||
|
color: #476d74 !important;
|
||||||
|
&:hover {
|
||||||
|
background-color: transparent !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 树形下拉样式
|
||||||
|
.ant-select-tree {
|
||||||
|
color: #fff !important;
|
||||||
|
.ant-select-tree-node-content-wrapper {
|
||||||
|
color: #fff !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 树形结构
|
||||||
|
.ant-tree {
|
||||||
|
}
|
||||||
|
|
||||||
|
// 按钮
|
||||||
|
.ant-btn {
|
||||||
|
border-radius: 0;
|
||||||
|
font-family: Arial;
|
||||||
|
span {
|
||||||
|
text-shadow: 0px 1px 0px #000;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-success {
|
||||||
|
// 自定义warn样式
|
||||||
|
background-color: #08a7cf !important;
|
||||||
|
color: #fff !important;
|
||||||
|
border-color: #08a7cf !important;
|
||||||
|
&:hover {
|
||||||
|
background-color: #08a7cf !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&-warn {
|
||||||
|
// 自定义warn样式
|
||||||
|
background-color: #b98326 !important;
|
||||||
|
color: #fff !important;
|
||||||
|
border-color: #b98326 !important;
|
||||||
|
&:hover {
|
||||||
|
background-color: #b98326 !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 空状态
|
||||||
|
.ant-empty {
|
||||||
|
background-color: transparent;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 分页器样式
|
||||||
|
.ant-pagination {
|
||||||
|
&,
|
||||||
|
&-item a {
|
||||||
|
color: #ade6ee;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-item {
|
||||||
|
width: 26px;
|
||||||
|
height: 26px !important;
|
||||||
|
line-height: 26px !important;
|
||||||
|
border-radius: 50%;
|
||||||
|
&-active {
|
||||||
|
background-color: #00bded;
|
||||||
|
a {
|
||||||
|
color: #fff !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-pagination-item-link {
|
||||||
|
color: #00bded;
|
||||||
|
}
|
||||||
|
&-disabled {
|
||||||
|
.ant-pagination-item-link {
|
||||||
|
color: #9ca2a6 !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-select {
|
||||||
|
&-selection {
|
||||||
|
border: none;
|
||||||
|
box-shadow: none;
|
||||||
|
background-color: transparent !important;
|
||||||
|
color: #ade6ee;
|
||||||
|
&-selected-value {
|
||||||
|
height: 26px;
|
||||||
|
line-height: 26px;
|
||||||
|
}
|
||||||
|
.ant-select-arrow {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.ant-select-selection__rendered::after {
|
||||||
|
content: '';
|
||||||
|
margin-left: 18px;
|
||||||
|
border: 6px solid transparent;
|
||||||
|
border-top-width: 8px;
|
||||||
|
border-bottom-width: 8px;
|
||||||
|
border-top-color: #00bded;
|
||||||
|
visibility: visible;
|
||||||
|
transform: translateY(8px);
|
||||||
|
transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
|
||||||
|
transform-origin: 50% 25%;
|
||||||
|
}
|
||||||
|
&-open {
|
||||||
|
.ant-select-selection__rendered::after {
|
||||||
|
transform: translateY(6px) rotate(180deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&-options {
|
||||||
|
&-quick-jumper {
|
||||||
|
input {
|
||||||
|
background-color: #011927;
|
||||||
|
border: 1px solid #00cbfe;
|
||||||
|
width: 70px !important;
|
||||||
|
border-radius: 0;
|
||||||
|
color: #ade6ee;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 弹窗样式
|
||||||
|
.ant-modal {
|
||||||
|
&-content {
|
||||||
|
border-radius: 0;
|
||||||
|
border: 1px solid #0c6a66;
|
||||||
|
background-color: @modalBg;
|
||||||
|
}
|
||||||
|
&-header {
|
||||||
|
background-color: #0c817b;
|
||||||
|
padding: 0 20px;
|
||||||
|
border-radius: 0;
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
&-title {
|
||||||
|
font-family: MicrogrammaD-MediExte;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #fff;
|
||||||
|
height: 40px;
|
||||||
|
line-height: 40px;
|
||||||
|
}
|
||||||
|
&-close {
|
||||||
|
color: #fff !important;
|
||||||
|
&-x {
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
line-height: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&-body {
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
|
&-footer {
|
||||||
|
border-top: none;
|
||||||
|
text-align: center;
|
||||||
|
padding-bottom: 22px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 确认弹窗样式
|
||||||
|
.ant-modal-confirm {
|
||||||
|
&-title,
|
||||||
|
&-content {
|
||||||
|
color: #fff !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 通知样式
|
||||||
|
.ant-message {
|
||||||
|
&-notice {
|
||||||
|
&-content {
|
||||||
|
background-color: @modalBg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 抽屉
|
||||||
|
.ant-drawer {
|
||||||
|
&-content {
|
||||||
|
background-color: @modalBg;
|
||||||
|
}
|
||||||
|
&-body {
|
||||||
|
> div {
|
||||||
|
background-color: transparent !important;
|
||||||
|
border: none !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 警告提示
|
||||||
|
.ant-alert {
|
||||||
|
&-info {
|
||||||
|
background-color: @modalBg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 滚动条
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
width: 6px;
|
||||||
|
height: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-track {
|
||||||
|
background-color: #011b1f;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb {
|
||||||
|
background-color: #007f9a;
|
||||||
|
}
|
|
@ -89,7 +89,7 @@ export function generateIndexRouter(data) {
|
||||||
//component: () => import('@/components/layouts/BasicLayout'),
|
//component: () => import('@/components/layouts/BasicLayout'),
|
||||||
component: resolve => require(['@/components/layouts/TabLayout'], resolve),
|
component: resolve => require(['@/components/layouts/TabLayout'], resolve),
|
||||||
meta: { title: '首页' },
|
meta: { title: '首页' },
|
||||||
redirect: '/dashboard/analysis',
|
redirect: '/station-operation',
|
||||||
children: [
|
children: [
|
||||||
...generateChildRouters(data)
|
...generateChildRouters(data)
|
||||||
]
|
]
|
||||||
|
|
15
src/views/system/DataBase.vue
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
DATABASE
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
|
||||||
|
</style>
|
|
@ -1,392 +1,280 @@
|
||||||
<template>
|
<template>
|
||||||
<a-card :bordered="false">
|
<a-card :bordered="false">
|
||||||
|
<!-- 搜索栏 -->
|
||||||
<!-- 查询区域 -->
|
<search-form :items="formItems" v-model="queryParam" @search="searchQuery">
|
||||||
<div class="table-page-search-wrapper">
|
<a-space style="float: right" class="btn-group" slot="additional">
|
||||||
<a-form layout="inline" @keyup.enter.native="searchQuery">
|
<a-button @click="handleAdd" type="primary">
|
||||||
<a-row :gutter="24">
|
<img src="@/assets/images/global/add.png" alt="" />
|
||||||
|
Add
|
||||||
<a-col :md="6" :sm="12">
|
|
||||||
<a-form-item label="账号">
|
|
||||||
<!--<a-input placeholder="请输入账号查询" v-model="queryParam.username"></a-input>-->
|
|
||||||
<j-input placeholder="输入账号模糊查询" v-model="queryParam.username"></j-input>
|
|
||||||
</a-form-item>
|
|
||||||
</a-col>
|
|
||||||
|
|
||||||
<a-col :md="6" :sm="8">
|
|
||||||
<a-form-item label="性别">
|
|
||||||
<a-select v-model="queryParam.sex" placeholder="请选择性别">
|
|
||||||
<a-select-option value="">请选择</a-select-option>
|
|
||||||
<a-select-option value="1">男</a-select-option>
|
|
||||||
<a-select-option value="2">女</a-select-option>
|
|
||||||
</a-select>
|
|
||||||
</a-form-item>
|
|
||||||
</a-col>
|
|
||||||
|
|
||||||
|
|
||||||
<template v-if="toggleSearchStatus">
|
|
||||||
<a-col :md="6" :sm="8">
|
|
||||||
<a-form-item label="真实名字">
|
|
||||||
<a-input placeholder="请输入真实名字" v-model="queryParam.realname"></a-input>
|
|
||||||
</a-form-item>
|
|
||||||
</a-col>
|
|
||||||
|
|
||||||
<a-col :md="6" :sm="8">
|
|
||||||
<a-form-item label="手机号码">
|
|
||||||
<a-input placeholder="请输入手机号码查询" v-model="queryParam.phone"></a-input>
|
|
||||||
</a-form-item>
|
|
||||||
</a-col>
|
|
||||||
|
|
||||||
<a-col :md="6" :sm="8">
|
|
||||||
<a-form-item label="用户状态">
|
|
||||||
<a-select v-model="queryParam.status" placeholder="请选择">
|
|
||||||
<a-select-option value="">请选择</a-select-option>
|
|
||||||
<a-select-option value="1">正常</a-select-option>
|
|
||||||
<a-select-option value="2">冻结</a-select-option>
|
|
||||||
</a-select>
|
|
||||||
</a-form-item>
|
|
||||||
</a-col>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<a-col :md="6" :sm="8">
|
|
||||||
<span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
|
|
||||||
<a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
|
|
||||||
<a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
|
|
||||||
<a @click="handleToggleSearch" style="margin-left: 8px">
|
|
||||||
{{ toggleSearchStatus ? '收起' : '展开' }}
|
|
||||||
<a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
|
|
||||||
</a>
|
|
||||||
</span>
|
|
||||||
</a-col>
|
|
||||||
|
|
||||||
</a-row>
|
|
||||||
</a-form>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- 操作按钮区域 -->
|
|
||||||
<div class="table-operator" style="border-top: 5px">
|
|
||||||
<a-button @click="handleAdd" type="primary" icon="plus" >添加用户</a-button>
|
|
||||||
<a-button type="primary" icon="download" @click="handleExportXls('用户信息')">导出</a-button>
|
|
||||||
<a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
|
|
||||||
<a-button type="primary" icon="import">导入</a-button>
|
|
||||||
</a-upload>
|
|
||||||
<j-third-app-button biz-type="user" :selected-row-keys="selectedRowKeys" syncToApp syncToLocal @sync-finally="onSyncFinally"/>
|
|
||||||
<a-button type="primary" icon="hdd" @click="recycleBinVisible=true">回收站</a-button>
|
|
||||||
<a-dropdown v-if="selectedRowKeys.length > 0">
|
|
||||||
<a-menu slot="overlay" @click="handleMenuClick">
|
|
||||||
<a-menu-item key="1">
|
|
||||||
<a-icon type="delete" @click="batchDel"/>
|
|
||||||
删除
|
|
||||||
</a-menu-item>
|
|
||||||
<a-menu-item key="2">
|
|
||||||
<a-icon type="lock" @click="batchFrozen('2')"/>
|
|
||||||
冻结
|
|
||||||
</a-menu-item>
|
|
||||||
<a-menu-item key="3">
|
|
||||||
<a-icon type="unlock" @click="batchFrozen('1')"/>
|
|
||||||
解冻
|
|
||||||
</a-menu-item>
|
|
||||||
</a-menu>
|
|
||||||
<a-button style="margin-left: 8px">
|
|
||||||
批量操作
|
|
||||||
<a-icon type="down"/>
|
|
||||||
</a-button>
|
</a-button>
|
||||||
</a-dropdown>
|
<a-button @click="handleEdit" type="primary">
|
||||||
<j-super-query :fieldList="superQueryFieldList" @handleSuperQuery="handleSuperQuery"/>
|
<img src="@/assets/images/global/edit.png" alt="" />
|
||||||
</div>
|
Edit
|
||||||
|
</a-button>
|
||||||
<!-- table区域-begin -->
|
<a-button @click="onDel" type="primary">
|
||||||
|
<img src="@/assets/images/global/delete.png" alt="" />
|
||||||
|
Delete
|
||||||
|
</a-button>
|
||||||
|
<a-button @click="handleReset" type="primary">
|
||||||
|
<img src="@/assets/images/global/reset-pwd.png" alt="" />
|
||||||
|
Reset pwd
|
||||||
|
</a-button>
|
||||||
|
</a-space>
|
||||||
|
</search-form>
|
||||||
|
<!-- 搜索栏结束 -->
|
||||||
|
<!-- 列表 -->
|
||||||
<div>
|
<div>
|
||||||
<div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
|
<custom-table
|
||||||
<i class="anticon anticon-info-circle ant-alert-icon"></i>已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
|
|
||||||
<a style="margin-left: 24px" @click="onClearSelected">清空</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<a-table
|
|
||||||
ref="table"
|
|
||||||
bordered
|
|
||||||
size="middle"
|
size="middle"
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
:columns="columns"
|
:columns="columns"
|
||||||
:dataSource="dataSource"
|
:list="dataSource"
|
||||||
:pagination="ipagination"
|
:pagination="ipagination"
|
||||||
:loading="loading"
|
:loading="loading"
|
||||||
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
|
@change="handleTableChange"
|
||||||
@change="handleTableChange">
|
:selectedRowKeys.sync="selectedRowKeys"
|
||||||
|
>
|
||||||
<template slot="avatarslot" slot-scope="text, record, index">
|
<template slot="index" slot-scope="{ index }">
|
||||||
<div class="anty-img-wrap">
|
{{ index + 1 }}
|
||||||
<a-avatar shape="square" :src="getAvatarView(record.avatar)" icon="user"/>
|
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
</custom-table>
|
||||||
<span slot="action" slot-scope="text, record">
|
|
||||||
<a @click="handleEdit(record)" >编辑</a>
|
|
||||||
|
|
||||||
<a-divider type="vertical" />
|
|
||||||
|
|
||||||
<a-dropdown>
|
|
||||||
<a class="ant-dropdown-link">
|
|
||||||
更多 <a-icon type="down"/>
|
|
||||||
</a>
|
|
||||||
<a-menu slot="overlay">
|
|
||||||
<a-menu-item>
|
|
||||||
<a href="javascript:;" @click="handleDetail(record)">详情</a>
|
|
||||||
</a-menu-item>
|
|
||||||
|
|
||||||
<a-menu-item>
|
|
||||||
<a href="javascript:;" @click="handleChangePassword(record.username)">密码</a>
|
|
||||||
</a-menu-item>
|
|
||||||
|
|
||||||
<a-menu-item>
|
|
||||||
<a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
|
|
||||||
<a>删除</a>
|
|
||||||
</a-popconfirm>
|
|
||||||
</a-menu-item>
|
|
||||||
|
|
||||||
<a-menu-item v-if="record.status==1">
|
|
||||||
<a-popconfirm title="确定冻结吗?" @confirm="() => handleFrozen(record.id,2,record.username)">
|
|
||||||
<a>冻结</a>
|
|
||||||
</a-popconfirm>
|
|
||||||
</a-menu-item>
|
|
||||||
|
|
||||||
<a-menu-item v-if="record.status==2">
|
|
||||||
<a-popconfirm title="确定解冻吗?" @confirm="() => handleFrozen(record.id,1,record.username)">
|
|
||||||
<a>解冻</a>
|
|
||||||
</a-popconfirm>
|
|
||||||
</a-menu-item>
|
|
||||||
|
|
||||||
</a-menu>
|
|
||||||
</a-dropdown>
|
|
||||||
</span>
|
|
||||||
|
|
||||||
|
|
||||||
</a-table>
|
|
||||||
</div>
|
</div>
|
||||||
<!-- table区域-end -->
|
<!-- 列表结束 -->
|
||||||
|
<!-- 新增/编辑 账号 -->
|
||||||
<user-modal ref="modalForm" @ok="modalFormOk"></user-modal>
|
<custom-modal :title="isAdd ? 'Add' : 'Edit'" v-model="visible" :width="475" :okHandler="onSubmit">
|
||||||
|
<a-form-model
|
||||||
<password-modal ref="passwordmodal" @ok="passwordModalOk"></password-modal>
|
ref="form"
|
||||||
|
layout="horizontal"
|
||||||
<sys-user-agent-modal ref="sysUserAgentModal"></sys-user-agent-modal>
|
:model="accountModel"
|
||||||
|
:rules="rules"
|
||||||
<!-- 用户回收站 -->
|
:labelCol="{ style: { width: '80px' } }"
|
||||||
<user-recycle-bin-modal :visible.sync="recycleBinVisible" @ok="modalFormOk"/>
|
:wrapperCol="{ style: { width: '300px' } }"
|
||||||
|
autocomplete="off"
|
||||||
|
>
|
||||||
|
<a-form-model-item label="User" prop="username">
|
||||||
|
<a-input v-model="accountModel.username"></a-input>
|
||||||
|
</a-form-model-item>
|
||||||
|
<a-form-model-item label="Name">
|
||||||
|
<a-input type="text" v-model="accountModel.realname"></a-input>
|
||||||
|
</a-form-model-item>
|
||||||
|
<a-form-model-item label="Role">
|
||||||
|
<custom-select :options="roleOptions" mode="multiple" v-model="accountModel.selectedroles"></custom-select>
|
||||||
|
</a-form-model-item>
|
||||||
|
<a-form-model-item label="E-Mail">
|
||||||
|
<a-input v-model="accountModel.email"></a-input>
|
||||||
|
</a-form-model-item>
|
||||||
|
<a-form-model-item label="Phone">
|
||||||
|
<a-input v-model="accountModel.phone"></a-input>
|
||||||
|
</a-form-model-item>
|
||||||
|
</a-form-model>
|
||||||
|
</custom-modal>
|
||||||
|
<!-- 新增/编辑 账号结束 -->
|
||||||
</a-card>
|
</a-card>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import UserModal from './modules/UserModal'
|
|
||||||
import PasswordModal from './modules/PasswordModal'
|
|
||||||
import {putAction,getFileAccessHttpUrl} from '@/api/manage';
|
|
||||||
import {frozenBatch} from '@/api/api'
|
|
||||||
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
|
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
|
||||||
import SysUserAgentModal from "./modules/SysUserAgentModal";
|
import SearchForm from '@/components/SearchForm'
|
||||||
import JInput from '@/components/jeecg/JInput'
|
import CustomModal from '@/components/CustomModal'
|
||||||
import UserRecycleBinModal from './modules/UserRecycleBinModal'
|
import { queryall, addUser, editUser, changePassword } from '@/api/api'
|
||||||
import JSuperQuery from '@/components/jeecg/JSuperQuery'
|
import { cloneDeep } from 'lodash'
|
||||||
import JThirdAppButton from '@/components/jeecgbiz/thirdApp/JThirdAppButton'
|
import FormMixin from '@/mixins/FormMixin'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "UserList",
|
name: 'UserList',
|
||||||
mixins: [JeecgListMixin],
|
mixins: [JeecgListMixin, FormMixin],
|
||||||
components: {
|
components: {
|
||||||
JThirdAppButton,
|
SearchForm,
|
||||||
SysUserAgentModal,
|
CustomModal
|
||||||
UserModal,
|
|
||||||
PasswordModal,
|
|
||||||
JInput,
|
|
||||||
UserRecycleBinModal,
|
|
||||||
JSuperQuery
|
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
description: '这是用户管理页面',
|
queryParam: {
|
||||||
queryParam: {},
|
role: undefined
|
||||||
recycleBinVisible: false,
|
},
|
||||||
columns: [
|
columns: [
|
||||||
/*{
|
{
|
||||||
title: '#',
|
title: 'NO',
|
||||||
dataIndex: '',
|
align: 'center',
|
||||||
key:'rowIndex',
|
width: 100,
|
||||||
width:60,
|
scopedSlots: {
|
||||||
align:"center",
|
customRender: 'index'
|
||||||
customRender:function (t,r,index) {
|
|
||||||
return parseInt(index)+1;
|
|
||||||
}
|
}
|
||||||
},*/
|
},
|
||||||
{
|
{
|
||||||
title: '用户账号',
|
title: 'USER',
|
||||||
align: "center",
|
align: 'center',
|
||||||
dataIndex: 'username',
|
dataIndex: 'username',
|
||||||
width: 120,
|
width: 100
|
||||||
sorter: true
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '用户姓名',
|
title: 'NAME',
|
||||||
align: "center",
|
align: 'center',
|
||||||
width: 100,
|
width: 100,
|
||||||
dataIndex: 'realname',
|
dataIndex: 'realname'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '头像',
|
title: 'ROLE',
|
||||||
align: "center",
|
align: 'center',
|
||||||
width: 120,
|
|
||||||
dataIndex: 'avatar',
|
|
||||||
scopedSlots: {customRender: "avatarslot"}
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
title: '性别',
|
|
||||||
align: "center",
|
|
||||||
width: 80,
|
|
||||||
dataIndex: 'sex_dictText',
|
|
||||||
sorter: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '生日',
|
|
||||||
align: "center",
|
|
||||||
width: 100,
|
width: 100,
|
||||||
dataIndex: 'birthday'
|
dataIndex: 'roleCode'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '手机号码',
|
title: 'PHONE',
|
||||||
align: "center",
|
align: 'center',
|
||||||
width: 100,
|
width: 100,
|
||||||
dataIndex: 'phone'
|
dataIndex: 'phone'
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '部门',
|
|
||||||
align: "center",
|
|
||||||
width: 180,
|
|
||||||
dataIndex: 'orgCodeTxt'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '负责部门',
|
|
||||||
align: "center",
|
|
||||||
width: 180,
|
|
||||||
dataIndex: 'departIds_dictText'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '状态',
|
|
||||||
align: "center",
|
|
||||||
width: 80,
|
|
||||||
dataIndex: 'status_dictText'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '操作',
|
|
||||||
dataIndex: 'action',
|
|
||||||
scopedSlots: {customRender: 'action'},
|
|
||||||
align: "center",
|
|
||||||
width: 170
|
|
||||||
}
|
}
|
||||||
|
|
||||||
],
|
|
||||||
superQueryFieldList: [
|
|
||||||
{ type: 'input', value: 'username', text: '用户账号', },
|
|
||||||
{ type: 'input', value: 'realname', text: '用户姓名', },
|
|
||||||
{ type: 'select', value: 'sex', dbType: 'int', text: '性别', dictCode: 'sex' },
|
|
||||||
],
|
],
|
||||||
url: {
|
url: {
|
||||||
syncUser: "/act/process/extActProcess/doSyncUser",
|
list: '/sys/user/list',
|
||||||
list: "/sys/user/list",
|
delete: '/sys/user/delete'
|
||||||
delete: "/sys/user/delete",
|
|
||||||
deleteBatch: "/sys/user/deleteBatch",
|
|
||||||
exportXlsUrl: "/sys/user/exportXls",
|
|
||||||
importExcelUrl: "sys/user/importExcel",
|
|
||||||
},
|
},
|
||||||
|
roleOptions: [],
|
||||||
|
visible: false,
|
||||||
|
isAdd: false,
|
||||||
|
accountModel: {},
|
||||||
|
rules: {
|
||||||
|
username: [{ required: true, message: 'Please Enter User' }]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.getRoles()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
customRow(record) {
|
||||||
|
return {
|
||||||
|
class: this.selectedRowKeys.includes(record.id) ? 'ant-table-row-selected' : '',
|
||||||
|
on: {
|
||||||
|
click: () => {
|
||||||
|
if (this.selectedRowKeys.includes(record.id)) {
|
||||||
|
this.selectedRowKeys = []
|
||||||
|
} else {
|
||||||
|
this.selectedRowKeys = [record.id]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async getRoles() {
|
||||||
|
try {
|
||||||
|
const res = await queryall()
|
||||||
|
if (res.success) {
|
||||||
|
this.roleOptions = res.result.map(item => {
|
||||||
|
return {
|
||||||
|
label: item.roleName,
|
||||||
|
value: item.id
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
handleAdd() {
|
||||||
|
this.visible = true
|
||||||
|
this.isAdd = true
|
||||||
|
this.accountModel = {}
|
||||||
|
},
|
||||||
|
handleEdit() {
|
||||||
|
if (this.selectedRowKeys && this.selectedRowKeys.length) {
|
||||||
|
this.visible = true
|
||||||
|
this.isAdd = false
|
||||||
|
const find = this.dataSource.find(item => item.id === this.selectedRowKeys[0])
|
||||||
|
this.accountModel = cloneDeep(find)
|
||||||
|
} else {
|
||||||
|
this.$message.warn('Please select an item you want to edit')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// 提交
|
||||||
|
async onSubmit() {
|
||||||
|
await this.$refs.form.validate()
|
||||||
|
const request = this.isAdd ? addUser : editUser
|
||||||
|
const { success, message } = await request(this.accountModel)
|
||||||
|
if (success) {
|
||||||
|
this.$message.success(`${this.isAdd ? 'Add' : 'Edit'} Success`)
|
||||||
|
this.loadData()
|
||||||
|
} else {
|
||||||
|
this.$message.error(`${this.isAdd ? 'Add' : 'Edit'} Fail`)
|
||||||
|
throw new Error(message)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onDel() {
|
||||||
|
if (this.selectedRowKeys && this.selectedRowKeys.length) {
|
||||||
|
this.$confirm({
|
||||||
|
title: 'Do you want to delete this item?',
|
||||||
|
okText: 'OK',
|
||||||
|
cancelText: 'Cancel',
|
||||||
|
onOk: () => {
|
||||||
|
this.handleDelete(this.selectedRowKeys[0])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
this.$message.warn('Please select an item you want to delete')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
handleReset() {
|
||||||
|
if (this.selectedRowKeys && this.selectedRowKeys.length) {
|
||||||
|
const find = this.dataSource.find(item => item.id === this.selectedRowKeys[0])
|
||||||
|
this.$confirm({
|
||||||
|
title: 'Do you want to reset password?',
|
||||||
|
okText: 'OK',
|
||||||
|
cancelText: 'Cancel',
|
||||||
|
onOk: async () => {
|
||||||
|
const { success, message } = await changePassword({
|
||||||
|
username: find.username
|
||||||
|
})
|
||||||
|
if(success) {
|
||||||
|
this.$message.success('Reset Success')
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.$message.error('Reset Fail')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
this.$message.warn('Please select an item you want to reset password')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
importExcelUrl: function(){
|
formItems() {
|
||||||
return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
|
return [
|
||||||
}
|
{
|
||||||
|
type: 'a-input',
|
||||||
|
label: 'User',
|
||||||
|
name: 'username',
|
||||||
|
span: 4
|
||||||
},
|
},
|
||||||
methods: {
|
{
|
||||||
getAvatarView: function (avatar) {
|
type: 'a-input',
|
||||||
return getFileAccessHttpUrl(avatar)
|
label: 'Name',
|
||||||
|
name: 'realname',
|
||||||
|
span: 4
|
||||||
},
|
},
|
||||||
|
{
|
||||||
batchFrozen: function (status) {
|
type: 'custom-select',
|
||||||
if (this.selectedRowKeys.length <= 0) {
|
label: 'Role',
|
||||||
this.$message.warning('请选择一条记录!');
|
name: 'role',
|
||||||
return false;
|
span: 4,
|
||||||
} else {
|
props: {
|
||||||
let ids = "";
|
options: this.roleOptions
|
||||||
let that = this;
|
|
||||||
let isAdmin = false;
|
|
||||||
that.selectionRows.forEach(function (row) {
|
|
||||||
if (row.username == 'admin') {
|
|
||||||
isAdmin = true;
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
if (isAdmin) {
|
|
||||||
that.$message.warning('管理员账号不允许此操作,请重新选择!');
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
that.selectedRowKeys.forEach(function (val) {
|
]
|
||||||
ids += val + ",";
|
|
||||||
});
|
|
||||||
that.$confirm({
|
|
||||||
title: "确认操作",
|
|
||||||
content: "是否" + (status == 1 ? "解冻" : "冻结") + "选中账号?",
|
|
||||||
onOk: function () {
|
|
||||||
frozenBatch({ids: ids, status: status}).then((res) => {
|
|
||||||
if (res.success) {
|
|
||||||
that.$message.success(res.message);
|
|
||||||
that.loadData();
|
|
||||||
that.onClearSelected();
|
|
||||||
} else {
|
|
||||||
that.$message.warning(res.message);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
handleMenuClick(e) {
|
|
||||||
if (e.key == 1) {
|
|
||||||
this.batchDel();
|
|
||||||
} else if (e.key == 2) {
|
|
||||||
this.batchFrozen(2);
|
|
||||||
} else if (e.key == 3) {
|
|
||||||
this.batchFrozen(1);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
handleFrozen: function (id, status, username) {
|
|
||||||
let that = this;
|
|
||||||
//TODO 后台校验管理员角色
|
|
||||||
if ('admin' == username) {
|
|
||||||
that.$message.warning('管理员账号不允许此操作!');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
frozenBatch({ids: id, status: status}).then((res) => {
|
|
||||||
if (res.success) {
|
|
||||||
that.$message.success(res.message);
|
|
||||||
that.loadData();
|
|
||||||
} else {
|
|
||||||
that.$message.warning(res.message);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
handleChangePassword(username) {
|
|
||||||
this.$refs.passwordmodal.show(username);
|
|
||||||
},
|
|
||||||
passwordModalOk() {
|
|
||||||
//TODO 密码修改完成 不需要刷新页面,可以把datasource中的数据更新一下
|
|
||||||
},
|
|
||||||
onSyncFinally({isToLocal}) {
|
|
||||||
// 同步到本地时刷新下数据
|
|
||||||
if (isToLocal) {
|
|
||||||
this.loadData()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style scoped>
|
<style scoped lang="less">
|
||||||
@import '~@assets/less/common.less'
|
@import '~@assets/less/common.less';
|
||||||
|
.btn-group {
|
||||||
|
img {
|
||||||
|
margin-right: 12px;
|
||||||
|
height: 18px;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
|
@ -127,7 +127,7 @@ export default {
|
||||||
},
|
},
|
||||||
//登录成功
|
//登录成功
|
||||||
loginSuccess () {
|
loginSuccess () {
|
||||||
this.$router.push({ path: "/dashboard/analysis" }).catch(()=>{
|
this.$router.push({ path: "/station-operation" }).catch(()=>{
|
||||||
console.log('登录跳转首页出错,这个错误从哪里来的')
|
console.log('登录跳转首页出错,这个错误从哪里来的')
|
||||||
})
|
})
|
||||||
this.$notification.success({
|
this.$notification.success({
|
||||||
|
|
|
@ -183,7 +183,7 @@ export const JeecgThirdLoginMixin = {
|
||||||
// update-begin- author:sunjianlei --- date:20190812 --- for: 登录成功后不解除禁用按钮,防止多次点击
|
// update-begin- author:sunjianlei --- date:20190812 --- for: 登录成功后不解除禁用按钮,防止多次点击
|
||||||
// this.loginBtn = false
|
// this.loginBtn = false
|
||||||
// update-end- author:sunjianlei --- date:20190812 --- for: 登录成功后不解除禁用按钮,防止多次点击
|
// update-end- author:sunjianlei --- date:20190812 --- for: 登录成功后不解除禁用按钮,防止多次点击
|
||||||
this.$router.push({ path: "/dashboard/analysis" }).catch(()=>{
|
this.$router.push({ path: "/station-operation" }).catch(()=>{
|
||||||
console.log('登录跳转首页出错,这个错误从哪里来的')
|
console.log('登录跳转首页出错,这个错误从哪里来的')
|
||||||
})
|
})
|
||||||
this.$notification.success({
|
this.$notification.success({
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
const CompressionPlugin = require("compression-webpack-plugin")
|
const CompressionPlugin = require('compression-webpack-plugin')
|
||||||
|
|
||||||
function resolve(dir) {
|
function resolve(dir) {
|
||||||
return path.join(__dirname, dir)
|
return path.join(__dirname, dir)
|
||||||
|
@ -68,7 +68,6 @@ module.exports = {
|
||||||
.use()
|
.use()
|
||||||
.loader('babel-loader')
|
.loader('babel-loader')
|
||||||
.end()
|
.end()
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
css: {
|
css: {
|
||||||
|
@ -76,11 +75,12 @@ module.exports = {
|
||||||
less: {
|
less: {
|
||||||
modifyVars: {
|
modifyVars: {
|
||||||
/* less 变量覆盖,用于自定义 ant design 主题 */
|
/* less 变量覆盖,用于自定义 ant design 主题 */
|
||||||
'primary-color': '#1890FF',
|
'primary-color': '#1397a3',
|
||||||
'link-color': '#1890FF',
|
'link-color': '#1397a3',
|
||||||
'border-radius-base': '4px',
|
'border-radius-base': '4px',
|
||||||
|
'text-color': '#fff'
|
||||||
},
|
},
|
||||||
javascriptEnabled: true,
|
javascriptEnabled: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -111,7 +111,7 @@ module.exports = {
|
||||||
target: 'http://localhost:8080',
|
target: 'http://localhost:8080',
|
||||||
ws: false,
|
ws: false,
|
||||||
changeOrigin: true
|
changeOrigin: true
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|