增加停用多页签的功能

省市地区数据更新
master
toesbieya 6 years ago
parent 72ae76bd5f
commit f727314a67
  1. 1
      vue/public/static/json/region-pc.json
  2. 1
      vue/public/static/json/region-pca.json
  3. 1
      vue/public/static/json/region-pcas.json
  4. 6
      vue/src/assets/styles/index.scss
  5. 7
      vue/src/assets/styles/sidebar.scss
  6. 2
      vue/src/assets/styles/tagsView.scss
  7. 6
      vue/src/assets/styles/variables.scss
  8. 11
      vue/src/components/DialogForm/index.vue
  9. 64
      vue/src/components/RegionSelector/Tree.vue
  10. 2
      vue/src/config/index.js
  11. 22
      vue/src/layout/components/Header.vue
  12. 72
      vue/src/layout/components/Navbar/components/SettingDrawer.vue
  13. 4
      vue/src/layout/components/Navbar/index.vue
  14. 2
      vue/src/layout/components/Sidebar/components/SidebarItemContent.vue
  15. 3
      vue/src/layout/index.vue
  16. 30
      vue/src/store/modules/setting.js
  17. 8
      vue/src/store/modules/tagsView.js
  18. 9
      vue/src/views/app/login/LoginForm.vue
  19. 9
      vue/src/views/app/login/RegisterForm.vue
  20. 12
      vue/src/views/system/customer/EditDialog.vue
  21. 15
      vue/src/views/system/customer/index.vue
  22. 12
      vue/src/views/system/supplier/EditDialog.vue
  23. 15
      vue/src/views/system/supplier/index.vue

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -89,7 +89,11 @@ a:hover {
.has-header {
.max-view-height {
height: calc(100vh - #{$headerHeight} - #{$pageViewMargin * 2});
height: calc(100vh - #{$navHeight} - #{$pageViewMargin * 2});
}
&.has-tags-view .max-view-height {
height: calc(100vh - #{$navHeight} - #{$tagsViewHeight} - #{$pageViewMargin * 2});
}
}

@ -37,8 +37,8 @@ $iconSize: 17px;
.sidebar-logo-container {
position: relative;
width: 100%;
height: 50px;
line-height: 50px;
height: $navHeight;
line-height: $navHeight;
text-align: center;
& .sidebar-logo-link {
@ -57,7 +57,7 @@ $iconSize: 17px;
margin: 0;
color: #fff;
font-weight: 600;
line-height: 50px;
line-height: $navHeight;
font-size: 14px;
font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
vertical-align: middle;
@ -126,6 +126,7 @@ $iconSize: 17px;
max-height: 88vh;
margin-bottom: 0.5vh;
overflow-y: auto;
overflow-y: overlay;
}
.el-submenu__title i {

@ -1,5 +1,5 @@
.tags-view-container {
height: 40px;
height: $tagsViewHeight;
background: #f0f0f0;
border-bottom: 1px solid #d8dce5;
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .12), 0 0 3px 0 rgba(0, 0, 0, .04);

@ -44,8 +44,12 @@ $menuHover: #263445;
$subMenuBg: #1f2d3d;
$subMenuHover: #001528;
//侧边栏宽度
$sideBarWidth: 210px;
$headerHeight: 90px;
//头部导航栏高度
$navHeight: 50px;
//头部多页签栏高度
$tagsViewHeight: 40px;
//路由页面的margin
$pageViewMargin: 15px;

@ -2,11 +2,9 @@
<el-dialog
v-drag-dialog
custom-class="dialog-form"
:top="top"
v-bind="$props"
:visible="value"
:width="width"
@close="$emit('close')"
@open="$emit('open')"
v-on="$listeners"
>
<slot slot="title" name="title">{{title}}</slot>
<div class="dialog-form-container">
@ -29,11 +27,12 @@
name: "DialogForm",
components: {LoadingMask},
props: {
value: {type: Boolean, default: false},
value: Boolean,
appendToBody: Boolean,
top: {type: String, default: '50px'},
width: {type: String, default: '30%'},
loading: {type: Boolean, default: true},
title: {type: String, default: ''},
title: String,
}
}
</script>

@ -1,62 +1,79 @@
<template>
<el-dialog
v-drag-dialog
:visible="value"
append-to-body
title="选择行政区域"
width="30%"
top="50px"
@close="closeDialog"
>
<el-scrollbar>
<div>
<el-input :value="value" :readonly="readonly" clearable @clear="$emit('clear')" @focus="dialogVisible=true"/>
<dialog-form
v-drag-dialog
v-model="dialogVisible"
:loading="loading"
append-to-body
title="选择行政区域"
@close="closeDialog"
>
<el-tree
ref="tree"
v-loading="loading"
:data="limit?limitTree:regionTree"
:data="limit ? limitTree : regionTree"
:expand-on-click-node="false"
node-key="id"
@node-click="nodeClick"
>
<span slot-scope="{data}" class="el-tree-node__label">
{{data.name}}
<template v-if="limit">({{data.value}})</template>
{{limit ? data.name + `(${data.value})` : data.name}}
</span>
</el-tree>
</el-scrollbar>
</el-dialog>
</dialog-form>
</div>
</template>
<script>
import {mapState} from 'vuex'
import dialogMixin from "@/mixins/dialogMixin"
import DialogForm from '@/components/DialogForm'
import {createLimitTree, getNodeId} from "@/utils/tree"
export default {
name: "RegionSelector",
mixins: [dialogMixin],
name: "RegionTreeSelector",
components: {DialogForm},
props: {
value: Boolean,
value: String,
readonly: Boolean,
getChildrenOnClick: Boolean,
limit: Boolean,
limitApi: Function
},
data() {
return {
loading: false,
dialogVisible: false,
limitTree: []
}
},
computed: {
...mapState('dataCache', {
regionTree: state => state.regionTree
})
},
methods: {
closeDialog() {
this.dialogVisible = false
},
nodeClick(obj) {
let ids = getNodeId(obj.children)
ids.unshift(obj.id)
this.$emit('select', obj, ids)
const payload = [obj]
if (this.getChildrenOnClick) {
let ids = getNodeId(obj.children)
ids.unshift(obj.id)
payload.push(ids)
}
this.$emit('select', ...payload)
this.closeDialog()
},
init() {
this.loading = true
const hasInit = this.regionTree.length > 0
@ -67,6 +84,7 @@
.finally(() => this.loading = false)
}
},
mounted() {
this.init()
}

@ -31,5 +31,5 @@ module.exports = {
attachmentPrefix: 'https://static.toesbieya.cn/',
//省市地区json数据请求地址
regionDataUrl: '/static/json/region-pca.json'
regionDataUrl: '/static/json/region-pcas.json'
}

@ -6,7 +6,7 @@
@mouseleave="mouseOutside=true"
>
<v-navbar @menu-show="navbarMenuShow=$event"/>
<tags-view @menu-show="tagsViewMenuShow=$event"/>
<tags-view v-if="useTagsView" @menu-show="tagsViewMenuShow=$event"/>
</header>
</template>
@ -28,7 +28,8 @@
},
computed: {
...mapState('setting', {
headerAutoHidden: state => state.headerAutoHidden,
useTagsView: state => state.useTagsView,
headerAutoHidden: state => state.headerAutoHidden
}),
hideHeader() {
return this.mouseOutside
@ -38,6 +39,9 @@
},
},
watch: {
useTagsView(v) {
!v && this.$store.dispatch('tagsView/delAllViews')
},
hideHeader(v) {
this.$store.commit('app/hasHeader', !v)
v ? this.addEvent() : this.removeEvent()
@ -64,20 +68,16 @@
}
</script>
<style lang="scss">
.has-tags-view .header-container {
height: calc(#{$navHeight} + #{$tagsViewHeight});
}
.header-container {
position: relative;
height: $headerHeight;
height: $navHeight;
transition: height .3s ease-in-out;
flex-shrink: 0;
.awake-area {
position: fixed;
top: 0;
width: 100%;
height: 15px;
opacity: 0;
}
&.hide-header {
height: 0;
}

@ -2,67 +2,41 @@
<el-drawer :visible="value" :with-header="false" append-to-body size="300px" @close="$emit('input', false)">
<div class="drawer-container">
<el-divider><h3>个性化设置</h3></el-divider>
<div class="drawer-item">
<span>显示Logo</span>
<el-switch v-model="showLogo" class="drawer-switch"/>
</div>
<div class="drawer-item">
<span>显示面包屑</span>
<el-switch v-model="showBreadcrumb" class="drawer-switch"/>
</div>
<div class="drawer-item">
<span>左侧菜单手风琴效果</span>
<el-switch v-model="sidebarUniqueOpen" class="drawer-switch"/>
</div>
<div class="drawer-item">
<span>左侧菜单折叠</span>
<el-switch v-model="sidebarCollapse" class="drawer-switch"/>
</div>
<div class="drawer-item">
<span>折叠菜单显示上级</span>
<el-switch v-model="sidebarShowParent" class="drawer-switch"/>
</div>
<div class="drawer-item">
<span>左侧菜单自动隐藏</span>
<el-switch v-model="sidebarAutoHidden" class="drawer-switch"/>
</div>
<div class="drawer-item">
<span>头部自动隐藏</span>
<el-switch v-model="headerAutoHidden" class="drawer-switch"/>
</div>
<div class="drawer-item">
<span>显示返回顶部按钮</span>
<el-switch v-model="showBackToTop" class="drawer-switch"/>
<div v-for="{name,key} in settings" :key="key" class="drawer-item">
<span>{{name}}</span>
<el-switch :value="getValue(key)" @input="setValue($event,key)" class="drawer-switch"/>
</div>
</div>
</el-drawer>
</template>
<script>
const states = ['showLogo', 'showBreadcrumb', 'sidebarUniqueOpen', 'sidebarCollapse',
'sidebarAutoHidden', 'sidebarShowParent', 'headerAutoHidden', 'showBackToTop']
function createStateComputed() {
const obj = {}
states.forEach(key => {
obj[key] = {
get() {
return this.$store.state.setting[key]
},
set(v) {
this.$store.commit(`setting/${key}`, v)
}
}
})
return obj
}
const settings = [
{name: '显示logo', key: 'showLogo'},
{name: '显示面包屑', key: 'showBreadcrumb'},
{name: '使用多页签', key: 'useTagsView'},
{name: '侧边栏手风琴效果', key: 'sidebarUniqueOpen'},
{name: '侧边栏折叠', key: 'sidebarCollapse'},
{name: '折叠菜单显示上级', key: 'sidebarShowParent'},
{name: '侧边栏自动隐藏', key: 'sidebarAutoHidden'},
{name: '头部自动隐藏', key: 'headerAutoHidden'},
{name: '显示返回顶部按钮', key: 'showBackToTop'}
]
export default {
name: "SettingDrawer",
props: {
value: Boolean
},
computed: createStateComputed()
data: () => ({settings}),
methods: {
getValue(key) {
return this.$store.state.setting[key]
},
setValue(value, key) {
this.$store.commit(`setting/${key}`, value)
}
}
}
</script>

@ -99,7 +99,7 @@
<style lang="scss">
.navbar {
height: 50px;
height: $navHeight;
overflow: hidden;
position: relative;
background: #fff;
@ -114,7 +114,7 @@
.right-menu {
float: right;
height: 100%;
line-height: 50px;
line-height: $navHeight;
&:focus {
outline: none;

@ -20,7 +20,7 @@
vnodes.push(iconComponent)
if (title) vnodes.push(<span slot="title" class="sidebar-item-content">{(title)}</span>)
if (title) vnodes.push(<span slot="title" class="sidebar-item-content">{title}</span>)
return vnodes
}

@ -1,7 +1,7 @@
<template>
<section class="el-container app-wrapper">
<v-sidebar/>
<section class="el-container main-container" :class="{'has-header':hasHeader}">
<section class="el-container main-container" :class="{'has-header':hasHeader,'has-tags-view':useTagsView}">
<v-header/>
<v-main/>
</section>
@ -32,6 +32,7 @@
hasHeader: state => state.hasHeader
}),
...mapState('setting', {
useTagsView: state => state.useTagsView,
sidebarCollapse: state => state.sidebarCollapse
}),
...mapState('socket', {

@ -7,31 +7,31 @@ import {getLocalPersonalSettings, setLocalPersonalSettings} from "@/utils/localS
const localSettings = getLocalPersonalSettings()
function createMutations(state) {
return Object.keys(state).reduce((mutations, key) => {
mutations[key] = (ref, data) => {
ref[key] = data
setLocalPersonalSettings(ref)
}
return mutations
}, {})
}
const state = {
//是否显示logo
showLogo: true,
//是否显示面包屑
showBreadcrumb: true,
//是否使用多页签
useTagsView: true,
//左侧菜单手风琴效果
sidebarUniqueOpen: true,
//左侧菜单是否折叠
sidebarCollapse: false,
//左侧菜单折叠时,弹出菜单是否显示上级
sidebarShowParent: false,
//是否自动隐藏左侧菜单
sidebarAutoHidden: false,
//是否自动隐藏头部
headerAutoHidden: false,
//是否显示返回顶部按钮
showBackToTop: true,
}
@ -59,6 +59,16 @@ const mutations = {
}
}
function createMutations(state) {
return Object.keys(state).reduce((mutations, key) => {
mutations[key] = (ref, data) => {
ref[key] = data
setLocalPersonalSettings(ref)
}
return mutations
}, {})
}
export default {
namespaced: true,
state,

@ -53,13 +53,9 @@ const actions = {
delOthersViews({state, commit}, view) {
const visitedViews = state.visitedViews.filter(v => v.meta.affix || v.path === view.path)
let cachedViews = []
const index = state.cachedViews.indexOf(view.name)
if (index > -1) {
cachedViews = state.cachedViews.slice(index, index + 1)
}
const name = state.cachedViews.find(name => name === view.name)
commit('visitedViews', visitedViews)
commit('cachedViews', cachedViews)
commit('cachedViews', name ? [name] : [])
},
delAllViews({state, commit}) {
commit('visitedViews', state.visitedViews.filter(tag => tag.meta.affix))

@ -33,7 +33,14 @@
<svg-icon :icon="passwordType === 'password' ? 'eye' : 'eye-open'"/>
</span>
</el-form-item>
<el-button :loading="loading" class="submit-btn" type="primary" @click="login"> </el-button>
<el-button
:loading="loading"
class="submit-btn"
type="primary"
@click="login"
>
{{loading ? '登 录 中...' : '登 录'}}
</el-button>
<div class="flex" style="margin-top: 20px">
<p class="other-ways">
其他方式登录

@ -26,7 +26,14 @@
@keyup.enter.native="register"
/>
</el-form-item>
<el-button :loading="loading" class="submit-btn" type="primary" @click="register"> </el-button>
<el-button
:loading="loading"
class="submit-btn"
type="primary"
@click="register"
>
{{loading ? '注 册 中...' : '注 册'}}
</el-button>
<div class="flex" style="margin-top: 20px">
<p/>
<el-button type="text" @click="login">已有账户登陆</el-button>

@ -12,7 +12,12 @@
<el-input v-model="form.name" :readonly="!canEdit" maxlength="20"/>
</el-form-item>
<el-form-item label="行政区域:" prop="region_name">
<el-input :value="form.region_name" readonly @focus="regionDialog=true"/>
<region-selector
:value="form.region_name"
get-children-on-click
readonly
@select="selectRegion"
/>
</el-form-item>
<el-form-item label="地 址:" prop="address">
<el-input v-model="form.address" :readonly="!canEdit" maxlength="100"/>
@ -44,14 +49,12 @@
<el-button plain size="small" @click="closeDialog"> </el-button>
<el-button v-if="canEdit" size="small" type="primary" @click="confirm"> </el-button>
</template>
<region-selector v-model="regionDialog" @select="selectRegion"/>
</dialog-form>
</template>
<script>
import DialogForm from '@/components/DialogForm'
import RegionSelector from '@/bizComponents/RegionSelector'
import RegionSelector from '@/components/RegionSelector/Tree'
import dialogMixin from "@/mixins/dialogMixin"
import {addCustomer, updateCustomer} from "@/api/system/customer"
import {isEmpty, mergeObj, resetObj} from '@/utils'
@ -72,7 +75,6 @@
data() {
return {
loading: false,
regionDialog: false,
form: {
id: null,
name: null,

@ -5,7 +5,14 @@
<el-input v-model="searchForm.name" clearable maxlength="50"/>
</search-form-item>
<search-form-item label="行政区域:">
<el-input :value="temp.region_name" clearable @clear="clearSidSearch" @focus="regionDialog=true"/>
<region-selector
:value="temp.region_name"
limit
:limit-api="getLimitRegion"
get-children-on-click
@clear="clearSidSearch"
@select="selectRegion"
/>
</search-form-item>
<search-form-item label="地 址:">
<el-input v-model="searchForm.address" clearable maxlength="100"/>
@ -66,14 +73,13 @@
/>
</el-row>
<edit-dialog v-model="editDialog" :data="row" :type="type" @success="success"/>
<region-selector v-model="regionDialog" limit :limit-api="getLimitRegion" @select="selectRegion"/>
</el-card>
</template>
<script>
import SearchForm from "@/components/SearchForm"
import SearchFormItem from "@/components/SearchForm/SearchFormItem"
import RegionSelector from "@/bizComponents/RegionSelector"
import RegionSelector from "@/components/RegionSelector/Tree"
import EditDialog from './EditDialog'
import {delCustomer, getCustomers, getLimitRegion} from "@/api/system/customer"
import {isEmpty} from '@/utils'
@ -101,8 +107,7 @@
region_name: null,
ctime: []
},
editDialog: false,
regionDialog: false
editDialog: false
}
},
computed: {

@ -12,7 +12,12 @@
<el-input v-model="form.name" :readonly="!canEdit" maxlength="20"/>
</el-form-item>
<el-form-item label="行政区域:" prop="region_name">
<el-input :value="form.region_name" readonly @focus="regionDialog=true"/>
<region-selector
:value="form.region_name"
get-children-on-click
readonly
@select="selectRegion"
/>
</el-form-item>
<el-form-item label="地 址:" prop="address">
<el-input v-model="form.address" :readonly="!canEdit" maxlength="100"/>
@ -44,14 +49,12 @@
<el-button plain size="small" @click="closeDialog"> </el-button>
<el-button v-if="canEdit" size="small" type="primary" @click="confirm"> </el-button>
</template>
<region-selector v-model="regionDialog" @select="selectRegion"/>
</dialog-form>
</template>
<script>
import DialogForm from '@/components/DialogForm'
import RegionSelector from '@/bizComponents/RegionSelector'
import RegionSelector from '@/components/RegionSelector/Tree'
import dialogMixin from "@/mixins/dialogMixin"
import {addSupplier, updateSupplier} from "@/api/system/supplier"
import {isEmpty, mergeObj, resetObj} from '@/utils'
@ -72,7 +75,6 @@
data() {
return {
loading: false,
regionDialog: false,
form: {
id: null,
name: null,

@ -5,7 +5,14 @@
<el-input v-model="searchForm.name" clearable maxlength="50"/>
</search-form-item>
<search-form-item label="行政区域:">
<el-input :value="temp.region_name" clearable @clear="clearSidSearch" @focus="regionDialog=true"/>
<region-selector
:value="temp.region_name"
limit
:limit-api="getLimitRegion"
get-children-on-click
@clear="clearSidSearch"
@select="selectRegion"
/>
</search-form-item>
<search-form-item label="地 址:">
<el-input v-model="searchForm.address" clearable maxlength="100"/>
@ -66,14 +73,13 @@
/>
</el-row>
<edit-dialog v-model="editDialog" :data="row" :type="type" @success="success"/>
<region-selector v-model="regionDialog" limit :limit-api="getLimitRegion" @select="selectRegion"/>
</el-card>
</template>
<script>
import SearchForm from "@/components/SearchForm"
import SearchFormItem from "@/components/SearchForm/SearchFormItem"
import RegionSelector from "@/bizComponents/RegionSelector"
import RegionSelector from "@/components/RegionSelector/Tree"
import EditDialog from './EditDialog'
import {delSupplier, getLimitRegion, getSuppliers} from "@/api/system/supplier"
import {isEmpty} from '@/utils'
@ -101,8 +107,7 @@
region_name: null,
ctime: []
},
editDialog: false,
regionDialog: false
editDialog: false
}
},
computed: {

Loading…
Cancel
Save