国内标准页面开发

This commit is contained in:
宋伟佳
2021-05-25 13:56:31 +08:00
parent 336b73ea61
commit 9b782e0e1b
14 changed files with 64 additions and 1819 deletions
+4 -4
View File
@@ -21,25 +21,25 @@ const data = [
component: 'Layout',
redirect: 'noRedirect',
name: 'PersonnelManagement',
meta: { title: '人员', icon: 'users-cog', permissions: ['admin'] },
meta: { title: '标准法规部', icon: 'users-cog', permissions: ['admin'] },
children: [
{
path: 'userManagement',
name: 'UserManagement',
component: '@/views/personnelManagement/userManagement/index',
meta: { title: '用户管理' },
meta: { title: '动态&资料' },
},
{
path: 'roleManagement',
name: 'RoleManagement',
component: '@/views/personnelManagement/roleManagement/index',
meta: { title: '角色管理' },
meta: { title: '国内标准法规' },
},
{
path: 'menuManagement',
name: 'MenuManagement',
component: '@/views/personnelManagement/menuManagement/index',
meta: { title: '菜单管理', badge: 'New' },
meta: { title: '海外标准法规', badge: 'New' },
},
],
},
+4 -4
View File
@@ -21,25 +21,25 @@ const data = [
component: 'Layout',
redirect: 'noRedirect',
name: 'PersonnelManagement',
meta: { title: '人员', icon: 'users-cog', permissions: ['admin'] },
meta: { title: '标准法规部', icon: 'users-cog', permissions: ['admin'] },
children: [
{
path: 'userManagement',
name: 'UserManagement',
component: '@/views/personnelManagement/userManagement/index',
meta: { title: '用户管理' },
meta: { title: '动态&资料' },
},
{
path: 'roleManagement',
name: 'RoleManagement',
component: '@/views/personnelManagement/roleManagement/index',
meta: { title: '角色管理' },
meta: { title: '国内标准法规' },
},
{
path: 'menuManagement',
name: 'MenuManagement',
component: '@/views/personnelManagement/menuManagement/index',
meta: { title: '菜单管理', badge: 'New' },
meta: { title: '海外标准法规', badge: 'New' },
},
],
},
+4 -60
View File
@@ -1,70 +1,14 @@
<!-- 滚动通知组件 -->
<template>
<div class="vab-ad">
<el-carousel
v-if="adList"
height="30px"
direction="vertical"
:autoplay="true"
:interval="3000"
indicator-position="none"
>
<el-carousel-item v-for="(item, index) in adList" :key="index">
<el-tag type="warning">通知</el-tag>
<a target="_blank" :href="item.url">{{ item.title }}</a>
</el-carousel-item>
</el-carousel>
</div>
<div class="vab-ad"></div>
</template>
<script>
import { getList } from '@/api/ad'
export default {
name: 'VabAd',
data() {
return {
nodeEnv: process.env.NODE_ENV,
adList: [],
}
},
created() {
this.fetchData()
},
methods: {
async fetchData() {
// const { data } = await getList()
const data = [
{
title: '这是我们项目的模板',
url:
'https://chu1204505056.gitee.io/admin-pro?hmsr=homeAd&hmpl=&hmcu=&hmkw=&hmci=',
},
{
title: '这个是模板的滚动文字组件',
url:
'https://chu1204505056.gitee.io/admin-plus?hmsr=homeAd&hmpl=&hmcu=&hmkw=&hmci=',
},
{
title: '这个可以用作通知',
url:
'https://chu1204505056.gitee.io/admin-plus?hmsr=homeAd&hmpl=&hmcu=&hmkw=&hmci=',
},
]
this.adList = data
},
return {}
},
methods: {},
}
</script>
<style lang="scss" scoped>
.vab-ad {
height: 30px;
padding-right: $base-padding;
padding-left: $base-padding;
margin-bottom: -20px;
line-height: 30px;
cursor: pointer;
a {
color: #999;
}
}
</style>
<style lang="scss" scoped></style>
@@ -78,9 +78,6 @@
.vab-keel {
margin: $base-padding;
}
.app-main-height {
min-height: $base-app-main-height;
}
.footer-copyright {
min-height: 55px;
+1 -3
View File
@@ -1,10 +1,8 @@
<template>
<el-dropdown @command="handleCommand">
<span class="avatar-dropdown">
<!--<el-avatar class="user-avatar" :src="avatar"></el-avatar>-->
<img class="user-avatar" :src="avatar" alt="" />
<div class="user-name">
{{ username }}
<span>您好,{{ username }}</span>
<i class="el-icon-arrow-down el-icon--right"></i>
</div>
</span>
@@ -1,53 +1,16 @@
<template>
<span :title="isFullscreen ? '退出全屏' : '进入全屏'">
<vab-icon
:icon="[
'fas',
isFullscreen ? 'compress-arrows-alt' : 'expand-arrows-alt',
]"
@click="click"
></vab-icon>
</span>
<div></div>
</template>
<script>
import screenfull from 'screenfull'
export default {
name: 'VabFullScreenBar',
data() {
return {
isFullscreen: false,
}
},
mounted() {
this.init()
},
beforeDestroy() {
this.destroy()
},
methods: {
click() {
if (!screenfull.isEnabled) {
this.$baseMessage('开启全屏失败', 'error')
return false
}
screenfull.toggle()
this.$emit('refresh')
},
change() {
this.isFullscreen = screenfull.isFullscreen
},
init() {
if (screenfull.isEnabled) {
screenfull.on('change', this.change)
}
},
destroy() {
if (screenfull.isEnabled) {
screenfull.off('change', this.change)
}
},
return {}
},
mounted() {},
beforeDestroy() {},
methods: {},
}
</script>
<style lang="scss" scoped></style>
@@ -1,31 +1,5 @@
<template>
<a
href="https://github.com/chuzhixin/vue-admin-beautiful"
target="_blank"
class="github-corner"
aria-label="View source on Github"
>
<svg
width="80"
height="80"
viewBox="0 0 250 250"
class="github-color"
aria-hidden="true"
>
<path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z" />
<path
d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2"
fill="currentColor"
style="transform-origin: 130px 106px"
class="octo-arm"
/>
<path
d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z"
fill="currentColor"
class="octo-body"
/>
</svg>
</a>
<div></div>
</template>
<script>
export default {
@@ -33,43 +7,4 @@
}
</script>
<style lang="scss" scoped>
.github-corner {
position: absolute;
top: 0;
right: 0;
z-index: $base-z-index - 3;
.octo-arm {
animation: octocat-wave 560ms ease-in-out infinite;
}
&:hover {
.octo-arm {
animation: octocat-wave 560ms ease-in-out infinite;
}
}
.github-color {
color: #fff;
fill: $base-color-blue;
}
}
@keyframes octocat-wave {
0%,
100% {
transform: rotate(0);
}
20%,
60% {
transform: rotate(-25deg);
}
40%,
80% {
transform: rotate(100deg);
}
}
</style>
<style lang="scss" scoped></style>
+6 -6
View File
@@ -17,12 +17,12 @@
<vab-error-log />
<vab-full-screen-bar @refresh="refreshRoute" />
<vab-theme-bar class="hidden-xs-only" />
<vab-icon
title="重载所有路由"
:pulse="pulse"
:icon="['fas', 'redo']"
@click="refreshRoute"
/>
<!-- <vab-icon-->
<!-- title="重载所有路由"-->
<!-- :pulse="pulse"-->
<!-- :icon="['fas', 'redo']"-->
<!-- @click="refreshRoute"-->
<!-- />-->
<vab-avatar />
<!-- <vab-icon
title="退出系统"
+5 -286
View File
@@ -1,297 +1,16 @@
<template>
<div id="tabs-bar-container" class="tabs-bar-container">
<el-tabs
v-model="tabActive"
type="card"
class="tabs-content"
@tab-click="handleTabClick"
@tab-remove="handleTabRemove"
>
<el-tab-pane
v-for="item in visitedRoutes"
:key="item.path"
:label="item.meta.title"
:name="item.path"
:closable="!isAffix(item)"
></el-tab-pane>
</el-tabs>
<el-dropdown @command="handleCommand">
<span style="cursor: pointer">
更多操作
<i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown" class="tabs-more">
<!-- <el-dropdown-item command="refreshRoute">
<vab-icon :icon="['fas', 'circle-notch']" />
刷新
</el-dropdown-item> -->
<el-dropdown-item command="closeOtherstabs">
<vab-icon :icon="['fas', 'times-circle']" />
关闭其他
</el-dropdown-item>
<el-dropdown-item command="closeLefttabs">
<vab-icon :icon="['fas', 'arrow-alt-circle-left']"></vab-icon>
关闭左侧
</el-dropdown-item>
<el-dropdown-item command="closeRighttabs">
<vab-icon :icon="['fas', 'arrow-alt-circle-right']"></vab-icon>
关闭右侧
</el-dropdown-item>
<el-dropdown-item command="closeAlltabs">
<vab-icon :icon="['fas', 'ban']"></vab-icon>
关闭全部
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
<div id="tabs-bar-container" class="tabs-bar-container"></div>
</template>
<script>
import path from 'path'
import { mapGetters } from 'vuex'
export default {
name: 'VabTabsBar',
data() {
return {
affixtabs: [],
tabActive: '',
}
},
computed: {
...mapGetters({
visitedRoutes: 'tabsBar/visitedRoutes',
routes: 'routes/routes',
}),
},
watch: {
$route: {
handler(route) {
this.inittabs()
this.addtabs()
let tabActive = ''
this.visitedRoutes.forEach((item, index) => {
if (item.path === this.$route.path) {
tabActive = item.path
}
})
this.tabActive = tabActive
},
immediate: true,
},
},
mounted() {
//console.log(this.visitedRoutes);
},
methods: {
async handleTabRemove(tabActive) {
let view
this.visitedRoutes.forEach((item, index) => {
if (tabActive == item.path) {
view = item
}
})
const { visitedRoutes } = await this.$store.dispatch(
'tabsBar/delRoute',
view
)
if (this.isActive(view)) {
this.toLastTag(visitedRoutes, view)
}
},
handleTabClick(tab) {
const route = this.visitedRoutes.filter((item, index) => {
if (tab.index == index) return item
})[0]
if (this.$route.path !== route.path) {
this.$router.push({
path: route.path,
query: route.query,
fullPath: route.fullPath,
})
} else {
return false
}
},
isActive(route) {
return route.path === this.$route.path
},
isAffix(tag) {
return tag.meta && tag.meta.affix
},
filterAffixtabs(routes, basePath = '/') {
let tabs = []
routes.forEach((route) => {
if (route.meta && route.meta.affix) {
const tagPath = path.resolve(basePath, route.path)
tabs.push({
fullPath: tagPath,
path: tagPath,
name: route.name,
meta: { ...route.meta },
})
}
if (route.children) {
const temptabs = this.filterAffixtabs(route.children, route.path)
if (temptabs.length >= 1) {
tabs = [...tabs, ...temptabs]
}
}
})
return tabs
},
inittabs() {
const affixtabs = (this.affixtabs = this.filterAffixtabs(this.routes))
for (const tag of affixtabs) {
if (tag.name) {
this.$store.dispatch('tabsBar/addVisitedRoute', tag)
}
}
},
addtabs() {
const { name } = this.$route
if (name) {
this.$store.dispatch('tabsBar/addVisitedRoute', this.$route)
}
return false
},
handleCommand(command) {
switch (command) {
case 'refreshRoute':
this.refreshRoute()
break
case 'closeOtherstabs':
this.closeOtherstabs()
break
case 'closeLefttabs':
this.closeLefttabs()
break
case 'closeRighttabs':
this.closeRighttabs()
break
case 'closeAlltabs':
this.closeAlltabs()
break
}
},
async refreshRoute() {
this.$baseEventBus.$emit('reloadrouter-view')
},
async closeSelectedTag(view) {
const { visitedRoutes } = await this.$store.dispatch(
'tabsBar/delRoute',
view
)
if (this.isActive(view)) {
this.toLastTag(visitedRoutes, view)
}
},
async closeOtherstabs() {
const view = await this.toThisTag()
await this.$store.dispatch('tabsBar/delOthersRoutes', view)
},
async closeLefttabs() {
const view = await this.toThisTag()
await this.$store.dispatch('tabsBar/delLeftRoutes', view)
},
async closeRighttabs() {
const view = await this.toThisTag()
await this.$store.dispatch('tabsBar/delRightRoutes', view)
},
async closeAlltabs() {
const view = await this.toThisTag()
const { visitedRoutes } = await this.$store.dispatch(
'tabsBar/delAllRoutes'
)
if (this.affixtabs.some((tag) => tag.path === view.path)) {
return
}
this.toLastTag(visitedRoutes, view)
},
toLastTag(visitedRoutes, view) {
const latestView = visitedRoutes.slice(-1)[0]
if (latestView) {
this.$router.push(latestView)
} else {
this.$router.push('/')
}
},
async toThisTag() {
const view = this.visitedRoutes.filter((item, index) => {
if (item.path === this.$route.fullPath) {
return item
}
})[0]
if (this.$route.path !== view.path) this.$router.push(view)
return view
},
return {}
},
mounted() {},
methods: {},
}
</script>
<style lang="scss" scoped>
.tabs-bar-container {
position: relative;
box-sizing: border-box;
display: flex;
align-content: center;
align-items: center;
justify-content: space-between;
height: $base-tabs-bar-height;
padding-right: $base-padding;
padding-left: $base-padding;
user-select: none;
background: $base-color-white;
border-top: 1px solid #f6f6f6;
::v-deep {
.fold-unfold {
margin-right: $base-padding;
}
}
.tabs-content {
width: calc(100% - 90px);
height: $base-tag-item-height;
::v-deep {
.el-tabs__nav-next,
.el-tabs__nav-prev {
height: $base-tag-item-height;
line-height: $base-tag-item-height;
}
.el-tabs__header {
border-bottom: 0;
.el-tabs__nav {
border: 0;
}
.el-tabs__item {
box-sizing: border-box;
height: $base-tag-item-height;
margin-right: 5px;
line-height: $base-tag-item-height;
border: 1px solid $base-border-color;
border-radius: $base-border-radius;
transition: padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1) !important;
&.is-active {
border: 1px solid $base-color-blue;
}
}
}
}
}
.more {
display: flex;
align-content: center;
align-items: center;
cursor: pointer;
}
}
</style>
<style lang="scss" scoped></style>
+5 -248
View File
@@ -1,259 +1,16 @@
<template>
<span v-if="themeBar">
<vab-icon
title="主题配置"
:icon="['fas', 'palette']"
@click="handleOpenThemeBar"
/>
<div class="theme-bar-setting">
<div @click="handleOpenThemeBar">
<vab-icon :icon="['fas', 'palette']" />
<p>主题配置</p>
</div>
<div @click="handleGetCode">
<vab-icon :icon="['fas', 'laptop-code']"></vab-icon>
<p>拷贝源码</p>
</div>
</div>
<el-drawer
title="主题配置"
:visible.sync="drawerVisible"
direction="rtl"
append-to-body
size="470px"
>
<el-scrollbar style="height: 94vh; overflow: hidden">
<div class="el-drawer__body">
<el-form ref="form" :model="theme" label-position="top">
<el-form-item label="主题">
<el-radio-group v-model="theme.name">
<el-radio-button label="default">默认</el-radio-button>
<el-radio-button label="green">绿荫草场</el-radio-button>
<el-radio-button label="glory">荣耀典藏</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="布局">
<el-radio-group v-model="theme.layout">
<el-radio-button label="vertical">纵向布局</el-radio-button>
<el-radio-button label="horizontal">横向布局</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="头部">
<el-radio-group v-model="theme.header">
<el-radio-button label="fixed">固定头部</el-radio-button>
<el-radio-button label="noFixed">不固定头部</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="多标签">
<el-radio-group v-model="theme.tabsBar">
<el-radio-button label="true">开启</el-radio-button>
<el-radio-button label="false">不开启</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSaveTheme">
保存
</el-button>
</el-form-item>
</el-form>
</div>
</el-scrollbar>
</el-drawer>
</span>
<div></div>
</template>
<script>
import variables from '@/styles/variables.scss'
import { mapActions, mapGetters } from 'vuex'
import { layout as defaultLayout } from '@/config'
export default {
name: 'VabThemeBar',
data() {
return {
drawerVisible: false,
theme: {
name: 'default',
layout: '',
header: 'fixed',
tabsBar: '',
},
}
},
computed: {
...mapGetters({
layout: 'settings/layout',
header: 'settings/header',
tabsBar: 'settings/tabsBar',
themeBar: 'settings/themeBar',
}),
},
created() {
this.$baseEventBus.$on('theme', () => {
this.handleOpenThemeBar()
})
const theme = localStorage.getItem('vue-admin-beautiful-theme')
if (null !== theme) {
this.theme = JSON.parse(theme)
this.handleSetTheme()
} else {
this.theme.layout = this.layout
this.theme.header = this.header
this.theme.tabsBar = this.tabsBar
}
},
methods: {
...mapActions({
changeLayout: 'settings/changeLayout',
changeHeader: 'settings/changeHeader',
changeTabsBar: 'settings/changeTabsBar',
}),
handleIsMobile() {
return document.body.getBoundingClientRect().width - 1 < 992
},
handleOpenThemeBar() {
this.drawerVisible = true
},
handleSetTheme() {
let { name, layout, header, tabsBar } = this.theme
localStorage.setItem(
'vue-admin-beautiful-theme',
`{
"name":"${name}",
"layout":"${layout}",
"header":"${header}",
"tabsBar":"${tabsBar}"
}`
)
if (!this.handleIsMobile()) this.changeLayout(layout)
this.changeHeader(header)
this.changeTabsBar(tabsBar)
document.getElementsByTagName(
'body'
)[0].className = `vue-admin-beautiful-theme-${name}`
this.drawerVisible = false
},
handleSaveTheme() {
this.handleSetTheme()
},
handleSetDfaultTheme() {
let { name } = this.theme
document
.getElementsByTagName('body')[0]
.classList.remove(`vue-admin-beautiful-theme-${name}`)
localStorage.removeItem('vue-admin-beautiful-theme')
this.$refs['form'].resetFields()
Object.assign(this.$data, this.$options.data())
this.changeHeader(defaultLayout)
this.theme.name = 'default'
this.theme.layout = this.layout
this.theme.header = this.header
this.theme.tabsBar = this.tabsBar
this.drawerVisible = false
location.reload()
},
handleGetCode() {
const url =
'https://github.com/chuzhixin/vue-admin-beautiful/tree/master/src/views'
let path = this.$route.path + '/index.vue'
if (path === '/vab/menu1/menu1-1/menu1-1-1/index.vue') {
path = '/vab/nested/menu1/menu1-1/menu1-1-1/index.vue'
}
if (path === '/vab/icon/awesomeIcon/index.vue') {
path = '/vab/icon/index.vue'
}
if (path === '/vab/icon/remixIcon/index.vue') {
path = '/vab/icon/remixIcon.vue'
}
if (path === '/vab/icon/colorfulIcon/index.vue') {
path = '/vab/icon/colorfulIcon.vue'
}
if (path === '/vab/table/comprehensiveTable/index.vue') {
path = '/vab/table/index.vue'
}
if (path === '/vab/table/inlineEditTable/index.vue') {
path = '/vab/table/inlineEditTable.vue'
}
window.open(url + path)
},
return {}
},
computed: {},
methods: {},
}
</script>
<style lang="scss" scoped>
@mixin right-bar {
position: fixed;
right: 0;
z-index: $base-z-index;
width: 60px;
min-height: 60px;
text-align: center;
cursor: pointer;
background: $base-color-blue;
border-radius: $base-border-radius;
> div {
padding-top: 10px;
border-bottom: 0 !important;
&:hover {
opacity: 0.9;
}
& + div {
border-top: 1px solid $base-color-white;
}
p {
padding: 0;
margin: 0;
font-size: $base-font-size-small;
line-height: 30px;
color: $base-color-white;
}
}
}
.theme-bar-setting {
@include right-bar;
top: calc((100vh - 110px) / 2);
::v-deep {
svg:not(:root).svg-inline--fa {
display: block;
margin-right: auto;
margin-left: auto;
color: $base-color-white;
}
.svg-icon {
display: block;
margin-right: auto;
margin-left: auto;
font-size: 20px;
color: $base-color-white;
fill: $base-color-white;
}
}
}
.el-drawer__body {
padding: 20px;
}
</style>
<style lang="scss">
.el-drawer__wrapper {
outline: none !important;
* {
outline: none !important;
}
}
.vab-color-picker {
.el-color-dropdown__link-btn {
display: none;
}
}
</style>
<style lang="scss" scoped></style>
+12 -12
View File
@@ -37,17 +37,17 @@ export const constantRoutes = [
]
export const asyncRoutes = [
// {
// path: '/',
// component: Home,
// meta: {
// title: '首页',
// icon: 'home',
// affix: true,
// },
// },
{
path: '/',
component: Home,
meta: {
title: '首页',
icon: 'home',
affix: true,
},
},
{
path: '/index',
component: Layout,
redirect: 'index',
children: [
@@ -302,21 +302,21 @@ export const asyncRoutes = [
name: 'UserManagement',
component: () =>
import('@/views/personnelManagement/userManagement/index'),
meta: { title: '用户管理' },
meta: { title: '动态&资料' },
},
{
path: 'roleManagement',
name: 'RoleManagement',
component: () =>
import('@/views/personnelManagement/roleManagement/index'),
meta: { title: '角色管理' },
meta: { title: '国内标准法规' },
},
{
path: 'menuManagement',
name: 'MenuManagement',
component: () =>
import('@/views/personnelManagement/menuManagement/index'),
meta: { title: '菜单管理', badge: 'New' },
meta: { title: '海外标准法规', badge: 'New' },
},
],
},
-1
View File
@@ -181,7 +181,6 @@
margin-top: 1.3vh;
line-height: 5.2vh;
background: rgba(182, 213, 255, 0.22);
border: 1px solid #ddd;
}
}
</style>
+12 -944
View File
@@ -1,958 +1,26 @@
<!-- 更新日志组件 -->
<!-- 标准发布 -->
<template>
<div class="index-container">
<el-row :gutter="20">
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<el-alert v-if="noticeList[0]" :closable="noticeList[0].closable">
<div
style="display: flex; align-items: center; justify-content: center"
>
<a
target="_blank"
href="https://github.com/chuzhixin/vue-admin-beautiful"
>
<img
style="margin-right: 10px"
src="https://img.shields.io/github/stars/chuzhixin/vue-admin-beautiful?style=flat-square&label=Stars&logo=github"
/>
</a>
<p v-html="noticeList[0].title"></p>
</div>
</el-alert>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="6" :xl="6">
<el-card shadow="never">
<div slot="header">
<span>访问量</span>
</div>
<vab-chart
:autoresize="true"
theme="vab-echarts-theme"
:options="fwl"
/>
<div class="bottom">
<span>
日均访问量:
<vab-count
:start-val="config1.startVal"
:end-val="config1.endVal"
:duration="config1.duration"
:separator="config1.separator"
:prefix="config1.prefix"
:suffix="config1.suffix"
:decimals="config1.decimals"
/>
</span>
</div>
</el-card>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="6" :xl="6">
<el-card shadow="never">
<div slot="header">
<span>授权数</span>
</div>
<vab-chart
:autoresize="true"
theme="vab-echarts-theme"
:options="sqs"
/>
<div class="bottom">
<span>
总授权数:
<vab-count
:start-val="config2.startVal"
:end-val="config2.endVal"
:duration="config2.duration"
:separator="config2.separator"
:prefix="config2.prefix"
:suffix="config2.suffix"
:decimals="config2.decimals"
/>
</span>
</div>
</el-card>
</el-col>
<el-col
v-for="(item, index) in iconList"
:key="index"
:xs="12"
:sm="6"
:md="3"
:lg="3"
:xl="3"
>
<router-link :to="item.link" target="_blank">
<el-card class="icon-panel" shadow="never">
<vab-icon
:style="{ color: item.color }"
:icon="['fas', item.icon]"
></vab-icon>
<p>{{ item.title }}</p>
</el-card>
</router-link>
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="11" :xl="11">
<el-card class="card" shadow="never">
<div slot="header">
<span>依赖信息</span>
<div style="float: right">部署时间:{{ updateTime }}</div>
</div>
<div class="bottom-btn">
<el-popover placement="top" width="250" trigger="hover">
<p>
这是一个付费群谢谢您愿意支持开源加群获取详细文档群内提供vue-admin-beautiful-template基础模板
</p>
<el-image :src="require('@/assets/ewm.png')"></el-image>
<a slot="reference" target="_blank">
<el-button type="primary">QQ讨论群</el-button>
</a>
</el-popover>
<a @click="handleChangeTheme">
<el-button type="danger">修改主题和布局</el-button>
</a>
<a
target="_blank"
href="https://github.com/chuzhixin/vue-admin-beautiful"
>
<el-button type="warning">
github下载源码点star实时更新
</el-button>
</a>
<a
target="_blank"
href="https://gitee.com/chu1204505056/vue-admin-beautiful"
>
<el-button type="warning">码云下载源码点star</el-button>
</a>
<el-popover placement="top" width="250" trigger="hover">
<p>谢谢您愿意支持开源加群获取文档群内提供基础模板</p>
<el-image :src="require('@/assets/ewm.png')"></el-image>
<a slot="reference" target="_blank">
<el-button type="warning">文档</el-button>
</a>
</el-popover>
</div>
<table class="table">
<tr>
<td>@vue/cli版本</td>
<td>{{ devDependencies['@vue/cli-service'] }}</td>
<td>vue版本</td>
<td>{{ dependencies['vue'] }}</td>
</tr>
<tr>
<td>vuex版本</td>
<td>{{ dependencies['vuex'] }}</td>
<td>vue-router版本</td>
<td>{{ dependencies['vue-router'] }}</td>
</tr>
<tr>
<td>element-ui版本</td>
<td>{{ dependencies['element-ui'] }}</td>
<td>axios版本</td>
<td>{{ dependencies['axios'] }}</td>
</tr>
<tr>
<td>eslint版本</td>
<td>{{ devDependencies['eslint'] }}</td>
<td>prettier版本</td>
<td>{{ devDependencies['prettier'] }}</td>
</tr>
<tr>
<td>sass版本</td>
<td>{{ devDependencies['sass'] }}</td>
<td>mockjs版本</td>
<td>{{ dependencies['mockjs'] }}</td>
</tr>
<tr>
<td>zx-layouts版本</td>
<td>{{ dependencies['zx-layouts'] }}</td>
<td>lodash版本</td>
<td>{{ dependencies['lodash'] }}</td>
</tr>
</table>
</el-card>
<el-card shadow="never">
<div slot="header">
<span>其他信息</span>
</div>
<div style="text-align: center">
<vab-colorful-icon style="font-size: 140px" icon-class="vab" />
<h1 style="font-size: 30px">vue-admin-beautiful</h1>
</div>
<div v-for="(item, index) in noticeList" :key="index">
<el-alert
v-if="index !== 0"
:title="item.title"
:type="item.type"
:closable="item.closable"
></el-alert>
<br />
</div>
<el-alert :closable="false" :title="userAgent" type="info"></el-alert>
<br />
</el-card>
<plan></plan>
<version-information></version-information>
</el-col>
<el-col :xs="24" :sm="24" :md="13" :lg="13" :xl="13">
<el-card class="card" shadow="never">
<div slot="header">
<span>更新日志</span>
</div>
<el-timeline :reverse="reverse">
<el-timeline-item
v-for="(activity, index) in activities"
:key="index"
:timestamp="activity.timestamp"
:color="activity.color"
>
{{ activity.content }}
</el-timeline-item>
</el-timeline>
</el-card>
</el-col>
</el-row>
<div class="home-page">
<h3>首页</h3>
</div>
</template>
<script>
import VabChart from '@/plugins/echarts'
import { dependencies, devDependencies } from '../../../package.json'
import { getList } from '@/api/changeLog'
import { getNoticeList } from '@/api/notice'
import { getRepos, getStargazers } from '@/api/github'
import Plan from './components/Plan'
import VersionInformation from './components/VersionInformation'
export default {
name: 'Index',
components: {
VabChart,
Plan,
VersionInformation,
},
components: {},
mixins: [],
data() {
return {
timer: 0,
updateTime: process.env.VUE_APP_UPDATE_TIME,
nodeEnv: process.env.NODE_ENV,
dependencies: dependencies,
devDependencies: devDependencies,
config1: {
startVal: 0,
endVal: this.$baseLodash.random(20000, 60000),
decimals: 0,
prefix: '',
suffix: '',
separator: ',',
duration: 8000,
},
config2: {
startVal: 0,
endVal: this.$baseLodash.random(1000, 20000),
decimals: 0,
prefix: '',
suffix: '',
separator: ',',
duration: 8000,
},
config3: {
startVal: 0,
endVal: this.$baseLodash.random(1000, 20000),
decimals: 0,
prefix: '',
suffix: '',
separator: ',',
duration: 8000,
},
//访问量
fwl: {
grid: {
top: '4%',
left: '2%',
right: '4%',
bottom: '0%',
containLabel: true,
},
xAxis: [
{
type: 'category',
boundaryGap: false,
data: [],
axisTick: {
alignWithLabel: true,
},
},
],
yAxis: [
{
type: 'value',
},
],
series: [
{
name: '访问量',
type: 'line',
data: [],
smooth: true,
areaStyle: {},
},
],
},
//授权数
sqs: {
grid: {
top: '4%',
left: '2%',
right: '4%',
bottom: '0%',
containLabel: true,
},
xAxis: [
{
type: 'category',
/*boundaryGap: false,*/
data: ['0时', '4时', '8时', '12时', '16时', '20时', '24时'],
axisTick: {
alignWithLabel: true,
},
},
],
yAxis: [
{
type: 'value',
},
],
series: [
{
name: '授权数',
type: 'bar',
barWidth: '60%',
data: [10, 52, 20, 33, 39, 33, 22],
},
],
},
//词云
cy: {
grid: {
top: '4%',
left: '2%',
right: '4%',
bottom: '0%',
},
series: [
{
type: 'wordCloud',
gridSize: 15,
sizeRange: [12, 40],
rotationRange: [0, 0],
width: '100%',
height: '100%',
textStyle: {
normal: {
color() {
const arr = [
'#5470c6',
'#91cc75',
'#fac858',
'#ee6666',
'#73c0de',
'#975FE5',
]
let index = Math.floor(Math.random() * arr.length)
return arr[index]
},
},
},
data: [
{
name: 'vue-admin-beautiful',
value: 15000,
},
{
name: 'element',
value: 10081,
},
{
name: 'beautiful',
value: 9386,
},
{
name: 'vue',
value: 6500,
},
{
name: 'chuzhixin',
value: 6000,
},
{
name: 'good',
value: 4500,
},
{
name: 'success',
value: 3800,
},
{
name: 'never',
value: 3000,
},
{
name: 'boy',
value: 2500,
},
{
name: 'girl',
value: 2300,
},
{
name: 'github',
value: 2000,
},
{
name: 'hbuilder',
value: 1900,
},
{
name: 'dcloud',
value: 1800,
},
{
name: 'china',
value: 1700,
},
{
name: '1204505056',
value: 1600,
},
{
name: '972435319',
value: 1500,
},
{
name: 'young',
value: 1200,
},
{
name: 'old',
value: 1100,
},
{
name: 'vuex',
value: 900,
},
{
name: 'router',
value: 800,
},
{
name: 'money',
value: 700,
},
{
name: 'qingdao',
value: 800,
},
{
name: 'yantai',
value: 9000,
},
{
name: 'author is very cool',
value: 9200,
},
],
},
],
},
//更新日志
reverse: true,
activities: [],
noticeList: [],
//其他信息
userAgent: navigator.userAgent,
//卡片图标
iconList: [
{
icon: 'video',
title: '视频播放器',
link: '/vab/player',
color: '#ffc069',
},
{
icon: 'table',
title: '表格',
link: '/vab/table/comprehensiveTable',
color: '#5cdbd3',
},
{
icon: 'laptop-code',
title: '源码',
link: 'https://github.com/chuzhixin/vue-admin-beautiful',
color: '#b37feb',
},
{
icon: 'book',
title: '书籍',
link: '',
color: '#69c0ff',
},
{
icon: 'bullhorn',
title: '公告',
link: '',
color: '#ff85c0',
},
{
icon: 'gift',
title: '礼物',
link: '',
color: '#ffd666',
},
{
icon: 'balance-scale-left',
title: '公平的世界',
link: '',
color: '#ff9c6e',
},
{
icon: 'coffee',
title: '休息一下',
link: '',
color: '#95de64',
},
],
}
},
created() {
this.fetchData()
},
beforeDestroy() {
clearInterval(this.timer)
},
mounted() {
let base = +new Date(2020, 1, 1)
let oneDay = 24 * 3600 * 1000
let date = []
let data = [Math.random() * 1500]
let now = new Date(base)
const addData = (shift) => {
now = [now.getFullYear(), now.getMonth() + 1, now.getDate()].join('/')
date.push(now)
data.push(this.$baseLodash.random(20000, 60000))
if (shift) {
date.shift()
data.shift()
}
now = new Date(+new Date(now) + oneDay)
}
for (let i = 1; i < 6; i++) {
addData()
}
addData(true)
this.fwl.xAxis[0].data = date
this.fwl.series[0].data = data
this.timer = setInterval(() => {
addData(true)
this.fwl.xAxis[0].data = date
this.fwl.series[0].data = data
}, 3000)
},
methods: {
handleClick(e) {
this.$baseMessage(`点击了${e.name},这里可以写跳转`)
},
handleZrClick(e) {},
handleChangeTheme() {
this.$baseEventBus.$emit('theme')
},
async fetchData() {
// const { data } = await getList()
const data = [
{
content:
'在github上获得了第一个star,感恩一位名叫Bequiet2014的github用户',
timestamp: '2020-03-23',
},
{
content: '增加更换主题功能',
timestamp: '2020-04-10',
},
{
content: '大幅精简代码',
timestamp: '2020-04-14',
},
{
content: '修复群友反馈的bug',
timestamp: '2020-04-16',
},
{
content: '剔除maptalks',
timestamp: '2020-04-17',
},
{
content:
'换行符统一修改为lf 支持苹果 linux windows协同开发 强制开启最严格eslint规则 不要哭 严格是有好处的',
timestamp: '2020-04-17',
},
{
content: '彻底完成手机端适配,记录这一天熬夜到了晚上三点',
timestamp: '2020-04-18',
},
{
content:
'删除babel-polyfill 提高打包速度 减少压缩体积(放弃ie是这个项目做出的最伟大的决定)',
timestamp: '2020-04-18',
},
{
content: '源码精简至800k',
timestamp: '2020-04-19',
},
{
content: '添加视频播放器组件',
timestamp: '2020-04-20',
},
{
content: '修复路由懒加载 完善主题配色',
timestamp: '2020-04-22',
},
{
content: '修复全局axios拦截 加快动画展示效果 修改登录页样式',
timestamp: '2020-04-24',
},
{
content: '简化权限与登录逻辑 更新mockServer',
timestamp: '2020-04-25',
},
{
content:
'优化登录退出逻辑 代码更清晰 退出不再重载网页 改为重载路由形式',
timestamp: '2020-04-26',
},
{
content: '无端的指责只会让我更加努力 修复sidebar 简化permission',
timestamp: '2020-04-28',
},
{
content: '又是一个深夜 实现了表格增删改查的一键生成',
timestamp: '2020-04-30',
},
{
content: '大幅优化tagsview标签动画',
timestamp: '2020-05-02',
},
{
content: '三种图标组件实现mock模拟分页',
timestamp: '2020-05-03',
},
{
content: '添加了markdown编辑器组件',
timestamp: '2020-05-04',
},
{
content: '添加stylelint-plus自动规整排序样式',
timestamp: '2020-05-06',
},
{
content: '添加商城模板',
timestamp: '2020-05-12',
},
{
content: 'github标星超过1000 感恩',
timestamp: '2020-05-13',
},
{
content: '添加验证码组件',
timestamp: '2020-05-14',
},
{
content: '修复横向菜单bug',
timestamp: '2020-05-16',
},
{
content: '又被人骂了 挺好的 让我下定决心重写了tabsBar',
timestamp: '2020-05-20',
},
{
content: '仿ant-design 添加雪花屏',
timestamp: '2020-05-26',
},
{
content: '添加人员管理模块',
timestamp: '2020-06-02',
},
{
content: 'github标星超过2000 感恩',
timestamp: '2020-06-03',
},
{
content: '添加炫酷地图组件',
timestamp: '2020-06-11',
},
{
content: '抽离更多公共配置,框架使用更顺手',
timestamp: '2020-06-19',
},
{
content: '彻底完成了tabsBar多标签页的重构',
timestamp: '2020-06-22',
},
{
content: '感恩github标星过3.0K 祝大家端午节快乐',
timestamp: '2020-06-25',
},
{
content: '彻底重构了SideBar与TopBar 大幅精简dom渲染逻辑 全球首发',
timestamp: '2020-06-25',
},
{
content: '添加菜单管理',
timestamp: '2020-07-7',
},
{
content: '首次采用sass-loader 9.0写法,感谢github用户 shaonialife',
timestamp: '2020-07-7',
},
{
content: '添加vue-amap组件',
timestamp: '2020-07-11',
},
{
content: '修改zx-layouts引入方式',
timestamp: '2020-07-15',
},
{
content:
'记录这一天vue-admin-beautiful在插件市场、百度已花费超过1万元广告费用,希望一切都值得',
timestamp: '2020-07-18',
},
{
content: '主题配置添加绿荫草场、荣耀典藏、暗黑之子模式',
timestamp: '2020-07-18',
},
{
content: '全局axios请求全面支持Status Code拦截处理',
timestamp: '2020-07-29',
},
{
content: '重构全局loadding加载代码',
timestamp: '2020-07-31',
},
{
content: '升级stylelint自动排序功能',
timestamp: '2020-08-25',
},
{
content: '修复视频播放器组件重载路由失效的bug',
timestamp: '2020-09-03',
},
{
content: '修复极个别情况image-loader打包报错',
timestamp: '2020-09-18',
},
{
content:
'全网首个基于vue3.0开发的admin框架已发布,具体请访问github',
timestamp: '2020-09-22',
},
{
content: '完善路由后端渲染方案,弃用之前写法',
timestamp: '2020-09-30',
},
{
content: '大版本迭代,请关注github tag',
timestamp: '2020-09-30',
},
/* {
content:
"面对自称加拿大华人的捕蛇者说作者laike9m的发帖诋毁,和人身攻击,本想去知乎找他理论,可奈何他的知乎已经由于经常发布错误言论被官方封号了https://www.zhihu.com/people/laike9m,既然自己都不是中国人了,就不要妄加揣测国产的开源项目了,一切都交给时间吧,后来我释怀了,laike9m、Cruii这群人不止是抹黑我的框架,甚至还去抹黑中国民营企业的佼佼者华为,充满了无奈啊,也许只有发布这样的言论,他们的目的才能达到把 https://github.com/evil-huawei/evil-huawei",
timestamp: "2020-10-01",
}, */
{
content: '凌晨两点,我累了,移除无用组件,精简package',
timestamp: '2020-10-02',
},
{
content: '富文本编辑器支持精细化配置',
timestamp: '2020-10-20',
},
{
content: '公共布局支持自动导出',
timestamp: '2020-10-23',
},
{
content: '遮罩添加高斯模糊',
timestamp: '2020-10-25',
},
{
content: 'vue3.0 + element-plus版本正式上线',
timestamp: '2020-12-5',
},
{
content: '完成首页重构,跟进echarts 5.0',
timestamp: '2020-12-7',
},
{
content: '更新sass版本至最新',
timestamp: '2021-1-7',
},
{
content: '更新vue-echarts版本至最新,options变更为option',
timestamp: '2021-2-23',
},
{
content:
'开源版品牌名升级为vue-admin-beautiful-pro,付费版vue2.x品牌升级为Admin Pro,付费版vue3.x品牌名升级为Admin Plus',
timestamp: '最近更新',
},
]
data.map((item, index) => {
if (index === data.length - 1) {
item.color = '#0bbd87'
}
})
this.activities = data
// const res = await getNoticeList()
const noticeData = [
{
title:
'温馨提示:集成版虽功能丰富,但冗余依赖过多,建议开发时使用基础版进行开发 Vab Admin Plusvue3.0 + element-plus)已发布,欢迎体验:<a target="_blank" href="https://chu1204505056.gitee.io/admin-plus/?hmsr=homeAd&hmpl=&hmcu=&hmkw=&hmci=#/index">Vab Admin Plus</a>',
closable: false,
type: 'success',
},
{
title:
'作者寄语:感谢Star,感恩相遇,愿世间美好与我们环环相扣,加油!屏幕前的我们,打破桎梏,坚守初心。其实人生改变命运的机会并没有太多,我们并不是不优秀,我们也并不是一无是处,我们也希望驻足山巅被众人仰望,也许我们缺少的只是一个机会,缺少的只是生命中的导师,我希望这个框架帮助到更多的人,希望有一天,我们面试的时候不再胆怯,希望有一天别人看到的不仅仅是你的努力,还有你的功成名就,出人头地。',
closable: false,
type: 'warning',
},
{
title:
'随笔:我一直在寻找开源的真谛,我一直再想什么是开源,我一开始觉得免费就是开源,好像又不是。我理解的开源是:你也开源,我也开源,大家一起贡献,相互帮助。我最担心的事情是:我一个小人物,去伺候一众的伸手党,我想,这不是开源该有的氛围。我还太年轻,不懂什么是格局,我只知道,无私的帮助他人,能给我带来快乐,却不能给我带来收入,当然,有时候,快乐对我来说就已经足够了。可惜我是一个人,没有精力帮助到每一个人,可惜这个世界需要赚钱,才能过上平凡的生活,可惜了我的梦想,这个物欲横流的时代,理想主义的我们,即使内心坚决如铁,也似乎寸步难行。',
closable: false,
type: 'success',
},
]
this.noticeList = noticeData
/* getRepos({
token: "1061286824f978ea3cf98b7b8ea26fe27ba7cea1",
}).then((res) => {
const per_page = Math.ceil(res.data.stargazers_count / 100);
alert(per_page);
getStargazers({
token: "1061286824f978ea3cf98b7b8ea26fe27ba7cea1",
page: 1,
per_page: res.per_page,
}).then((res) => {
alert(JSON.stringify(res));
});
}); */
},
return {}
},
computed: {},
watch: {},
mounted() {},
methods: {},
}
</script>
<style lang="scss" scoped>
.index-container {
padding: 0 !important;
margin: 0 !important;
background: #f5f7f8 !important;
::v-deep {
.el-alert {
padding: $base-padding;
&--info.is-light {
min-height: 82px;
padding: $base-padding;
margin-bottom: 15px;
color: #909399;
background-color: $base-color-white;
border: 1px solid #ebeef5;
}
}
.el-card__body {
.echarts {
width: 100%;
height: 115px;
}
}
}
.card {
::v-deep {
.el-card__body {
.echarts {
width: 100%;
height: 305px;
}
}
}
}
.bottom {
padding-top: 20px;
margin-top: 5px;
color: #595959;
text-align: left;
border-top: 1px solid $base-border-color;
}
.table {
width: 100%;
color: #666;
border-collapse: collapse;
background-color: #fff;
td {
position: relative;
min-height: 20px;
padding: 9px 15px;
font-size: 14px;
line-height: 20px;
border: 1px solid #e6e6e6;
&:nth-child(odd) {
width: 20%;
text-align: right;
background-color: #f7f7f7;
}
}
}
.icon-panel {
height: 117px;
text-align: center;
cursor: pointer;
svg {
font-size: 40px;
}
p {
margin-top: 10px;
}
}
.bottom-btn {
button {
margin: 5px 10px 15px 0;
}
}
.home-page {
}
</style>
@@ -1,150 +1,15 @@
<template>
<div class="roleManagement-container">
<el-divider content-position="left">
演示环境仅做基础功能展示若想实现不同角色的真实菜单配置需将settings.js路由加载模式改为all模式由后端全面接管路由渲染与权限控制
</el-divider>
<vab-query-form>
<vab-query-form-left-panel :span="12">
<el-button icon="el-icon-plus" type="primary" @click="handleEdit">
添加
</el-button>
<el-button icon="el-icon-delete" type="danger" @click="handleDelete">
批量删除
</el-button>
</vab-query-form-left-panel>
<vab-query-form-right-panel :span="12">
<el-form :inline="true" :model="queryForm" @submit.native.prevent>
<el-form-item>
<el-input
v-model.trim="queryForm.permission"
placeholder="请输入查询条件"
clearable
/>
</el-form-item>
<el-form-item>
<el-button icon="el-icon-search" type="primary" @click="queryData">
查询
</el-button>
</el-form-item>
</el-form>
</vab-query-form-right-panel>
</vab-query-form>
<el-table
v-loading="listLoading"
:data="list"
:element-loading-text="elementLoadingText"
@selection-change="setSelectRows"
>
<el-table-column show-overflow-tooltip type="selection"></el-table-column>
<el-table-column
show-overflow-tooltip
prop="id"
label="id"
></el-table-column>
<el-table-column
show-overflow-tooltip
prop="permission"
label="权限码"
></el-table-column>
<el-table-column show-overflow-tooltip label="操作" width="200">
<template #default="{ row }">
<el-button type="text" @click="handleEdit(row)">编辑</el-button>
<el-button type="text" @click="handleDelete(row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
background
:current-page="queryForm.pageNo"
:page-size="queryForm.pageSize"
:layout="layout"
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
></el-pagination>
<edit ref="edit" @fetch-data="fetchData"></edit>
<h3>主题</h3>
</div>
</template>
<script>
import { getList, doDelete } from '@/api/roleManagement'
import Edit from './components/RoleManagementEdit'
export default {
name: 'RoleManagement',
components: { Edit },
data() {
return {
list: null,
listLoading: true,
layout: 'total, sizes, prev, pager, next, jumper',
total: 0,
selectRows: '',
elementLoadingText: '正在加载...',
queryForm: {
pageNo: 1,
pageSize: 10,
permission: '',
},
}
},
created() {
this.fetchData()
},
methods: {
setSelectRows(val) {
this.selectRows = val
},
handleEdit(row) {
if (row.id) {
this.$refs['edit'].showEdit(row)
} else {
this.$refs['edit'].showEdit()
}
},
handleDelete(row) {
if (row.id) {
this.$baseConfirm('你确定要删除当前项吗', null, async () => {
const { msg } = await doDelete({ ids: row.id })
this.$baseMessage(msg, 'success')
this.fetchData()
})
} else {
if (this.selectRows.length > 0) {
const ids = this.selectRows.map((item) => item.id).join()
this.$baseConfirm('你确定要删除选中项吗', null, async () => {
const { msg } = await doDelete({ ids })
this.$baseMessage(msg, 'success')
this.fetchData()
})
} else {
this.$baseMessage('未选中任何行', 'error')
return false
}
}
},
handleSizeChange(val) {
this.queryForm.pageSize = val
this.fetchData()
},
handleCurrentChange(val) {
this.queryForm.pageNo = val
this.fetchData()
},
queryData() {
this.queryForm.pageNo = 1
this.fetchData()
},
async fetchData() {
this.listLoading = true
const { data, totalCount } = await getList(this.queryForm)
this.list = data
this.total = totalCount
setTimeout(() => {
this.listLoading = false
}, 300)
},
return {}
},
methods: {},
}
</script>