feat: 团队管理
This commit is contained in:
parent
46e291ec5c
commit
23991a6ab2
4
ui/package-lock.json
generated
4
ui/package-lock.json
generated
@ -2028,7 +2028,7 @@
|
|||||||
},
|
},
|
||||||
"node_modules/escape-html": {
|
"node_modules/escape-html": {
|
||||||
"version": "1.0.3",
|
"version": "1.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-10.0.3.tgz",
|
||||||
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
|
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
|
||||||
},
|
},
|
||||||
"node_modules/escape-string-regexp": {
|
"node_modules/escape-string-regexp": {
|
||||||
@ -7283,7 +7283,7 @@
|
|||||||
},
|
},
|
||||||
"escape-html": {
|
"escape-html": {
|
||||||
"version": "1.0.3",
|
"version": "1.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-10.0.3.tgz",
|
||||||
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
|
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
|
||||||
},
|
},
|
||||||
"escape-string-regexp": {
|
"escape-string-regexp": {
|
||||||
|
|||||||
41
ui/src/components/content-container/LayoutContent.vue
Normal file
41
ui/src/components/content-container/LayoutContent.vue
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<template>
|
||||||
|
<el-scrollbar>
|
||||||
|
<div class="content-container">
|
||||||
|
<div class="content-container__header mb-10" v-if="slots.header || header">
|
||||||
|
<slot name="header">
|
||||||
|
<span>{{ header }}</span>
|
||||||
|
</slot>
|
||||||
|
</div>
|
||||||
|
<div class="content-container__main">
|
||||||
|
<slot></slot>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-scrollbar>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { useSlots } from 'vue'
|
||||||
|
defineOptions({ name: 'LayoutContent' })
|
||||||
|
const slots = useSlots()
|
||||||
|
defineProps({
|
||||||
|
header: String
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scope>
|
||||||
|
.content-container {
|
||||||
|
transition: 0.3s;
|
||||||
|
|
||||||
|
.content-container__header {
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 18px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.content-container__main {
|
||||||
|
background-color: var(--app-view-bg-color);
|
||||||
|
border-radius: 6px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
min-height: calc(100vh - var(--app-header-height) - 69px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@ -30,12 +30,4 @@ const props = withDefaults(
|
|||||||
const isIconfont = computed(() => props.iconName?.includes('app-'))
|
const isIconfont = computed(() => props.iconName?.includes('app-'))
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped></style>
|
||||||
.app-icon {
|
|
||||||
line-height: 1em;
|
|
||||||
svg {
|
|
||||||
height: 1em;
|
|
||||||
width: 1em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|||||||
@ -114,5 +114,25 @@ export const iconMap: any = {
|
|||||||
)
|
)
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
'app-add-users': {
|
||||||
|
iconReader: () => {
|
||||||
|
return h('i', [
|
||||||
|
h(
|
||||||
|
'svg',
|
||||||
|
{
|
||||||
|
viewBox: '0 0 1024 1024',
|
||||||
|
version: '1.1',
|
||||||
|
xmlns: 'http://www.w3.org/2000/svg'
|
||||||
|
},
|
||||||
|
[
|
||||||
|
h('path', {
|
||||||
|
d: 'M 892 772 h -80 v -80 c 0 -4.4 -3.6 -8 -8 -8 h -48 c -4.4 0 -8 3.6 -8 8 v 80 h -80 c -4.4 0 -8 3.6 -8 8 v 48 c 0 4.4 3.6 8 8 8 h 80 v 80 c 0 4.4 3.6 8 8 8 h 48 c 4.4 0 8 -3.6 8 -8 v -80 h 80 c 4.4 0 8 -3.6 8 -8 v -48 c 0 -4.4 -3.6 -8 -8 -8 Z M 373.5 498.4 c -0.9 -8.7 -1.4 -17.5 -1.4 -26.4 c 0 -15.9 1.5 -31.4 4.3 -46.5 c 0.7 -3.6 -1.2 -7.3 -4.5 -8.8 c -13.6 -6.1 -26.1 -14.5 -36.9 -25.1 c -25.8 -25.2 -39.7 -59.3 -38.7 -95.4 c 0.9 -32.1 13.8 -62.6 36.3 -85.6 c 24.7 -25.3 57.9 -39.1 93.2 -38.7 c 31.9 0.3 62.7 12.6 86 34.4 c 7.9 7.4 14.7 15.6 20.4 24.4 c 2 3.1 5.9 4.4 9.3 3.2 c 17.6 -6.1 36.2 -10.4 55.3 -12.4 c 5.6 -0.6 8.8 -6.6 6.3 -11.6 c -32.5 -64.3 -98.9 -108.7 -175.7 -109.9 c -110.8 -1.7 -203.2 89.2 -203.2 200 c 0 62.8 28.9 118.8 74.2 155.5 c -31.8 14.7 -61.1 35 -86.5 60.4 c -54.8 54.7 -85.8 126.9 -87.8 204 c -0.1 4.5 3.5 8.2 8 8.2 h 56.1 c 4.3 0 7.9 -3.4 8 -7.7 c 1.9 -58 25.4 -112.3 66.7 -153.5 c 29.4 -29.4 65.4 -49.8 104.7 -59.7 c 3.8 -1.1 6.4 -4.8 5.9 -8.8 Z M 824 472 c 0 -109.4 -87.9 -198.3 -196.9 -200 C 516.3 270.3 424 361.2 424 472 c 0 62.8 29 118.8 74.2 155.5 c -31.7 14.7 -60.9 34.9 -86.4 60.4 C 357 742.6 326 814.8 324 891.8 c -0.1 4.5 3.5 8.2 8 8.2 h 56 c 4.3 0 7.9 -3.4 8 -7.7 c 1.9 -58 25.4 -112.3 66.7 -153.5 C 505.8 695.7 563 672 624 672 c 110.4 0 200 -89.5 200 -200 Z m -109.5 90.5 C 690.3 586.7 658.2 600 624 600 s -66.3 -13.3 -90.5 -37.5 C 509 538 495.7 505.4 496 470.7 c 0.3 -32.8 13.4 -64.5 36.3 -88 c 24 -24.6 56.1 -38.3 90.4 -38.7 c 33.9 -0.3 66.8 12.9 91 36.6 c 24.8 24.3 38.4 56.8 38.4 91.4 c -0.1 34.2 -13.4 66.3 -37.6 90.5 Z',
|
||||||
|
fill: 'currentColor'
|
||||||
|
})
|
||||||
|
]
|
||||||
|
)
|
||||||
|
])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,11 +2,13 @@ import { type App } from 'vue'
|
|||||||
import AppIcon from './icons/AppIcon.vue'
|
import AppIcon from './icons/AppIcon.vue'
|
||||||
import LoginLayout from './login-layout/index.vue'
|
import LoginLayout from './login-layout/index.vue'
|
||||||
import LoginContainer from './login-container/index.vue'
|
import LoginContainer from './login-container/index.vue'
|
||||||
|
import LayoutContent from './content-container/LayoutContent.vue'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
install(app: App) {
|
install(app: App) {
|
||||||
app.component(AppIcon.name, AppIcon)
|
app.component(AppIcon.name, AppIcon)
|
||||||
app.component(LoginLayout.name, LoginLayout)
|
app.component(LoginLayout.name, LoginLayout)
|
||||||
app.component(LoginContainer.name, LoginContainer)
|
app.component(LoginContainer.name, LoginContainer)
|
||||||
|
app.component(LayoutContent.name, LayoutContent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,52 +0,0 @@
|
|||||||
<template>
|
|
||||||
<el-scrollbar>
|
|
||||||
<div class="content-container">
|
|
||||||
<div class="content-container__header" v-if="slots.header || header">
|
|
||||||
<slot name="header">
|
|
||||||
<back-button :path="backPath" :name="backName" :to="backTo" v-if="showBack"></back-button>
|
|
||||||
<span>{{ header }}</span>
|
|
||||||
</slot>
|
|
||||||
</div>
|
|
||||||
<slot></slot>
|
|
||||||
</div>
|
|
||||||
</el-scrollbar>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup>
|
|
||||||
import { computed, useSlots } from 'vue';
|
|
||||||
import BackButton from '@/components/back-button/index.vue';
|
|
||||||
defineOptions({ name: 'LayoutContent' });
|
|
||||||
const slots = useSlots();
|
|
||||||
const prop = defineProps({
|
|
||||||
header: String,
|
|
||||||
backPath: String,
|
|
||||||
backName: String,
|
|
||||||
backTo: [Object, String],
|
|
||||||
});
|
|
||||||
|
|
||||||
const showBack = computed(() => {
|
|
||||||
const { backPath, backName, backTo } = prop;
|
|
||||||
return backPath || backName || backTo;
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
@use '@/styles/common/mixins.scss' as *;
|
|
||||||
@use '@/styles/common/variables.scss' as *;
|
|
||||||
|
|
||||||
.content-container {
|
|
||||||
transition: 0.3s;
|
|
||||||
color: var(--el-text-color-primary);
|
|
||||||
padding: $view-padding;
|
|
||||||
|
|
||||||
.content-container__header {
|
|
||||||
font-weight: 500;
|
|
||||||
padding-bottom: $view-padding;
|
|
||||||
font-size: 20px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
span {
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@ -1,32 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="content-container__main">
|
|
||||||
<div class="content-container__toolbar" v-if="slots.toolbar">
|
|
||||||
<slot name="toolbar"></slot>
|
|
||||||
</div>
|
|
||||||
<slot></slot>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup>
|
|
||||||
import { useSlots } from 'vue';
|
|
||||||
defineOptions({ name: 'LayoutContentMain' });
|
|
||||||
const slots = useSlots();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
@use '@/styles/common/mixins.scss' as *;
|
|
||||||
@use '@/styles/common/variables.scss' as *;
|
|
||||||
|
|
||||||
.content-container__main {
|
|
||||||
background-color: #ffffff;
|
|
||||||
padding: $view-padding;
|
|
||||||
border-radius: 4px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
min-height: calc(100vh - 210px);
|
|
||||||
|
|
||||||
.content-container__toolbar {
|
|
||||||
@include flex-row(space-between, center);
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-if="!menu.meta || !menu.meta.hidden">
|
<div v-if="!menu.meta || !menu.meta.hidden" class="sidebar-item">
|
||||||
<el-menu-item ref="subMenu" :index="menu.path" popper-class="sidebar-popper">
|
<el-menu-item ref="subMenu" :index="menu.path" popper-class="sidebar-popper">
|
||||||
<template #title>
|
<template #title>
|
||||||
<AppIcon v-if="menu.meta && menu.meta.icon" :iconName="menu.meta.icon" />
|
<AppIcon v-if="menu.meta && menu.meta.icon" :iconName="menu.meta.icon" />
|
||||||
@ -10,11 +10,23 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { RouteRecordRaw } from 'vue-router'
|
import { type RouteRecordRaw } from 'vue-router'
|
||||||
|
|
||||||
defineProps<{
|
defineProps<{
|
||||||
menu: RouteRecordRaw
|
menu: RouteRecordRaw
|
||||||
}>()
|
}>()
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss"></style>
|
<style scoped lang="scss">
|
||||||
|
.sidebar-item {
|
||||||
|
.el-menu-item {
|
||||||
|
padding-left: 30px !important;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-menu-item.is-active {
|
||||||
|
color: var(--el-menu-active-color);
|
||||||
|
background: var(--el-color-primary-light-9);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
@ -60,7 +60,7 @@
|
|||||||
</el-input>
|
</el-input>
|
||||||
<el-button
|
<el-button
|
||||||
size="large"
|
size="large"
|
||||||
class="send-email-button ml-1"
|
class="send-email-button ml-10"
|
||||||
@click="sendEmail"
|
@click="sendEmail"
|
||||||
:loading="loading"
|
:loading="loading"
|
||||||
>获取验证码</el-button
|
>获取验证码</el-button
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="top-bar-container flex-between">
|
<div class="top-bar-container flex-between border-b">
|
||||||
<div class="flex-center h-full">
|
<div class="flex-center h-full">
|
||||||
<div class="app-title-container flex-center">
|
<div class="app-title-container flex-center">
|
||||||
<div class="app-title-icon"></div>
|
<div class="app-title-icon"></div>
|
||||||
<div class="app-title-text ml-1">{{ defaultTitle }}</div>
|
<div class="app-title-text ml-10">{{ defaultTitle }}</div>
|
||||||
</div>
|
</div>
|
||||||
<el-divider direction="vertical" class="line" />
|
<el-divider direction="vertical" class="line" />
|
||||||
<TopMenu></TopMenu>
|
<TopMenu></TopMenu>
|
||||||
@ -20,13 +20,12 @@ const defaultTitle = import.meta.env.VITE_APP_TITLE
|
|||||||
</script>
|
</script>
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.top-bar-container {
|
.top-bar-container {
|
||||||
border-bottom: 1px solid var(--el-border-color);
|
|
||||||
height: var(--app-header-height);
|
height: var(--app-header-height);
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
padding: var(--app-header-padding);
|
padding: var(--app-header-padding);
|
||||||
|
|
||||||
.app-title-container {
|
.app-title-container {
|
||||||
margin-right: 30px;
|
margin-right: 20px;
|
||||||
.app-title-icon {
|
.app-title-icon {
|
||||||
background-image: url('@/assets/logo.png');
|
background-image: url('@/assets/logo.png');
|
||||||
background-size: 100% 100%;
|
background-size: 100% 100%;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="main-layout h-full flex">
|
<div class="main-layout h-full flex">
|
||||||
<div class="sidebar-container"><Sidebar /></div>
|
<div class="sidebar-container border-r"><Sidebar /></div>
|
||||||
<div class="view-container">
|
<div class="view-container">
|
||||||
<AppMain />
|
<AppMain />
|
||||||
</div>
|
</div>
|
||||||
@ -15,6 +15,9 @@ import { Sidebar, AppMain } from '../components'
|
|||||||
transition: width 0.28s;
|
transition: width 0.28s;
|
||||||
width: var(--sidebar-width);
|
width: var(--sidebar-width);
|
||||||
background-color: var(--sidebar-bg-color);
|
background-color: var(--sidebar-bg-color);
|
||||||
border-right: 1px solid var(--el-border-color);
|
}
|
||||||
|
.view-container {
|
||||||
|
width: 100%;
|
||||||
|
padding: var(--app-view-padding);
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -4,7 +4,8 @@ import {
|
|||||||
createWebHistory,
|
createWebHistory,
|
||||||
type NavigationGuardNext,
|
type NavigationGuardNext,
|
||||||
type RouteLocationNormalized,
|
type RouteLocationNormalized,
|
||||||
type RouteRecordRaw
|
type RouteRecordRaw,
|
||||||
|
type RouteRecordName
|
||||||
} from 'vue-router'
|
} from 'vue-router'
|
||||||
import { useUserStore } from '@/stores/user'
|
import { useUserStore } from '@/stores/user'
|
||||||
import { store } from '@/stores'
|
import { store } from '@/stores'
|
||||||
@ -51,14 +52,14 @@ router.beforeEach(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
export const getChildRouteListByPathAndName = (path: string, name: string) => {
|
export const getChildRouteListByPathAndName = (path: string, name?: RouteRecordName | null | undefined) => {
|
||||||
return getChildRouteList(routes, path, name)
|
return getChildRouteList(routes, path, name)
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getChildRouteList: (
|
export const getChildRouteList: (
|
||||||
routeList: Array<RouteRecordRaw>,
|
routeList: Array<RouteRecordRaw>,
|
||||||
path: string,
|
path: string,
|
||||||
name: string
|
name?: RouteRecordName | null | undefined
|
||||||
) => Array<RouteRecordRaw> = (routeList, path, name) => {
|
) => Array<RouteRecordRaw> = (routeList, path, name) => {
|
||||||
for (let index = 0; index < routeList.length; index++) {
|
for (let index = 0; index < routeList.length; index++) {
|
||||||
const route = routeList[index]
|
const route = routeList[index]
|
||||||
|
|||||||
@ -74,23 +74,27 @@ ul {
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mt-1 {
|
.mt-10 {
|
||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ml-1 {
|
.ml-10 {
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
}
|
}
|
||||||
.mr-1 {
|
.mr-10 {
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
}
|
}
|
||||||
.mb-1 {
|
.mb-10 {
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
.mb-2 {
|
.mb-20 {
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.p-15 {
|
||||||
|
padding: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
.flex {
|
.flex {
|
||||||
display: flex;
|
display: flex;
|
||||||
}
|
}
|
||||||
@ -107,173 +111,24 @@ ul {
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建表单
|
.align-center {
|
||||||
.create-catalog-container {
|
text-align: center;
|
||||||
height: 100%;
|
}
|
||||||
margin-top: -20px;
|
.align-right {
|
||||||
.padding-top-30 {
|
text-align: right;
|
||||||
padding-top: 30px;
|
|
||||||
}
|
|
||||||
.padding-top-40 {
|
|
||||||
padding-top: 40px;
|
|
||||||
}
|
|
||||||
// 表单外套
|
|
||||||
.form-div {
|
|
||||||
text-align: center;
|
|
||||||
margin: 0 auto;
|
|
||||||
width: 80%;
|
|
||||||
min-width: 300px;
|
|
||||||
form {
|
|
||||||
.el-form-item {
|
|
||||||
margin-bottom: 28px;
|
|
||||||
}
|
|
||||||
label {
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 400;
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 22px;
|
|
||||||
color: #1f2329;
|
|
||||||
flex: none;
|
|
||||||
order: 0;
|
|
||||||
flex-grow: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 删除按钮样式
|
|
||||||
.delete-button-class {
|
|
||||||
cursor: pointer;
|
|
||||||
color: #646a73;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 添加按钮样式
|
|
||||||
.add-button-class {
|
|
||||||
cursor: pointer;
|
|
||||||
border: 0 solid;
|
|
||||||
//width: 105px;
|
|
||||||
height: 22px;
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 400;
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 22px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
letter-spacing: -0.1px;
|
|
||||||
color: #3370ff;
|
|
||||||
.span-class {
|
|
||||||
vertical-align: 2px;
|
|
||||||
color: #3370ff;
|
|
||||||
padding-left: 5px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
button {
|
|
||||||
height: 32px;
|
|
||||||
min-width: 80px;
|
|
||||||
}
|
|
||||||
.save-btn {
|
|
||||||
background-color: #3370ff;
|
|
||||||
}
|
|
||||||
.cancel-btn {
|
|
||||||
}
|
|
||||||
|
|
||||||
// 下方操作按钮区域
|
|
||||||
.footer {
|
|
||||||
border-top: 1px solid var(--el-border-color);
|
|
||||||
padding: 24px 0px 0px 0px;
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
flex-direction: row;
|
|
||||||
align-items: center;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
margin: 0px -50px 0px;
|
|
||||||
|
|
||||||
.footer-form {
|
|
||||||
min-width: 400px;
|
|
||||||
}
|
|
||||||
.footer-center {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer-btn {
|
|
||||||
margin: 0px 80px 0px;
|
|
||||||
text-align: right;
|
|
||||||
flex-direction: row;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
justify-content: flex-end;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.description {
|
|
||||||
padding-left: 15px;
|
|
||||||
font-size: smaller;
|
|
||||||
color: #606266;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 自定义弹出框样式
|
.border-b {
|
||||||
.custom-dialog {
|
border-bottom: 1px solid var(--el-border-color);
|
||||||
//标题样式
|
}
|
||||||
.el-dialog__header {
|
.border-r {
|
||||||
padding: 24px !important;
|
border-right: 1px solid var(--el-border-color);
|
||||||
}
|
|
||||||
//关闭按钮样式
|
|
||||||
.el-dialog__headerbtn .el-dialog__close {
|
|
||||||
height: auto !important;
|
|
||||||
color: #646a73 !important;
|
|
||||||
font-size: x-large !important;
|
|
||||||
}
|
|
||||||
.el-dialog__headerbtn .el-dialog__close:hover {
|
|
||||||
background: rgba(31, 35, 41, 0.1) !important;
|
|
||||||
border-radius: 4px !important;
|
|
||||||
}
|
|
||||||
//内容间距
|
|
||||||
.el-dialog__body {
|
|
||||||
padding: 0px 24px 0px 24px;
|
|
||||||
}
|
|
||||||
.el-dialog__footer {
|
|
||||||
padding-bottom: 29px !important;
|
|
||||||
}
|
|
||||||
//下方按钮
|
|
||||||
.footer-btn {
|
|
||||||
button {
|
|
||||||
height: 32px;
|
|
||||||
min-width: 80px;
|
|
||||||
}
|
|
||||||
.save-btn {
|
|
||||||
background-color: #3370ff;
|
|
||||||
}
|
|
||||||
.cancel-btn {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.custom-radio-group.el-radio-group {
|
.border-b-light {
|
||||||
border: 1px solid #bbbfc4;
|
border-bottom: 1px solid var(--el-border-color-lighter);
|
||||||
border-radius: 5px;
|
}
|
||||||
height: 30px;
|
|
||||||
label {
|
.main-calc-height {
|
||||||
border: 0px solid;
|
height: calc(100vh - 125px);
|
||||||
padding: 2px 10px 2px 4px;
|
|
||||||
}
|
|
||||||
.el-radio-button__inner {
|
|
||||||
padding: 4px;
|
|
||||||
border: 0px;
|
|
||||||
border-radius: 5px;
|
|
||||||
}
|
|
||||||
.el-radio-button {
|
|
||||||
height: auto;
|
|
||||||
}
|
|
||||||
.el-radio-button is-active {
|
|
||||||
height: auto;
|
|
||||||
}
|
|
||||||
.el-radio-button__original-radio:checked + .el-radio-button__inner {
|
|
||||||
color: #3370ff;
|
|
||||||
border: 0;
|
|
||||||
box-shadow: 0 0 0 0;
|
|
||||||
background: rgba(51, 112, 255, 0.1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,3 +1,6 @@
|
|||||||
|
:root {
|
||||||
|
--el-menu-item-height: 45px;
|
||||||
|
}
|
||||||
.el-avatar {
|
.el-avatar {
|
||||||
--el-avatar-bg-color: var(--el-color-primary);
|
--el-avatar-bg-color: var(--el-color-primary);
|
||||||
--el-avatar-size-small: 33px;
|
--el-avatar-size-small: 33px;
|
||||||
|
|||||||
@ -2,15 +2,14 @@
|
|||||||
--el-color-primary: rgba(51, 112, 255, 1);
|
--el-color-primary: rgba(51, 112, 255, 1);
|
||||||
--app-layout-bg-color: #f3f5f6;
|
--app-layout-bg-color: #f3f5f6;
|
||||||
--app-base-text-color: rgba(31, 35, 41, 1);
|
--app-base-text-color: rgba(31, 35, 41, 1);
|
||||||
--app-base-text-font-size: 14px;
|
--app-view-padding: 15px;
|
||||||
--app-base-text-hover-color: rgba(51, 112, 255, 1);
|
--app-view-bg-color: #ffffff;
|
||||||
--app-base-text-hover-bg-color: rgba(51, 112, 255, 0.1);
|
--hover-bg-color: #fafafa;
|
||||||
--app-base-action-text-color: var(--app-base-text-hover-color);
|
|
||||||
/** header 组件 */
|
/** header 组件 */
|
||||||
--app-header-height: 56px;
|
--app-header-height: 56px;
|
||||||
--app-header-padding: 0 20px;
|
--app-header-padding: 0 20px;
|
||||||
--app-header-bg-color: #ffffff;
|
--app-header-bg-color: #ffffff;
|
||||||
/** sidebar 组件 */
|
/** sidebar 组件 */
|
||||||
--sidebar-bg-color: #ffffff;
|
--sidebar-bg-color: #ffffff;
|
||||||
--sidebar-width: 200px;
|
--sidebar-width: 220px;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<login-layout>
|
<login-layout>
|
||||||
<LoginContainer>
|
<LoginContainer>
|
||||||
<h3 class="mb-2">忘记密码</h3>
|
<h3 class="mb-20">忘记密码</h3>
|
||||||
<el-form
|
<el-form
|
||||||
class="register-form"
|
class="register-form"
|
||||||
ref="resetPasswordFormRef"
|
ref="resetPasswordFormRef"
|
||||||
@ -34,7 +34,7 @@
|
|||||||
</el-input>
|
</el-input>
|
||||||
<el-button
|
<el-button
|
||||||
size="large"
|
size="large"
|
||||||
class="send-email-button ml-1"
|
class="send-email-button ml-10"
|
||||||
@click="sendEmail"
|
@click="sendEmail"
|
||||||
:loading="loading"
|
:loading="loading"
|
||||||
>获取验证码</el-button
|
>获取验证码</el-button
|
||||||
@ -45,7 +45,7 @@
|
|||||||
<el-button type="primary" class="login-submit-button w-full" @click="checkCode"
|
<el-button type="primary" class="login-submit-button w-full" @click="checkCode"
|
||||||
>立即验证</el-button
|
>立即验证</el-button
|
||||||
>
|
>
|
||||||
<div class="operate-container mt-1">
|
<div class="operate-container mt-10">
|
||||||
<el-button
|
<el-button
|
||||||
class="register"
|
class="register"
|
||||||
@click="router.push('/login')"
|
@click="router.push('/login')"
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<login-layout>
|
<login-layout>
|
||||||
<LoginContainer>
|
<LoginContainer>
|
||||||
<h3 class="mb-2">注册</h3>
|
<h3 class="mb-20">注册</h3>
|
||||||
<el-form class="register-form" :model="registerForm" :rules="rules" ref="registerFormRef">
|
<el-form class="register-form" :model="registerForm" :rules="rules" ref="registerFormRef">
|
||||||
<el-form-item prop="username">
|
<el-form-item prop="username">
|
||||||
<el-input
|
<el-input
|
||||||
@ -69,7 +69,7 @@
|
|||||||
</el-input>
|
</el-input>
|
||||||
<el-button
|
<el-button
|
||||||
size="large"
|
size="large"
|
||||||
class="send-email-button ml-1"
|
class="send-email-button ml-10"
|
||||||
@click="sendEmail"
|
@click="sendEmail"
|
||||||
:loading="sendEmailLoading"
|
:loading="sendEmailLoading"
|
||||||
>获取验证码</el-button
|
>获取验证码</el-button
|
||||||
@ -80,7 +80,7 @@
|
|||||||
<el-button type="primary" class="login-submit-button w-full" @click="register"
|
<el-button type="primary" class="login-submit-button w-full" @click="register"
|
||||||
>注册</el-button
|
>注册</el-button
|
||||||
>
|
>
|
||||||
<div class="operate-container mt-1">
|
<div class="operate-container mt-10">
|
||||||
<el-button
|
<el-button
|
||||||
class="register"
|
class="register"
|
||||||
@click="router.push('/login')"
|
@click="router.push('/login')"
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<login-layout>
|
<login-layout>
|
||||||
<LoginContainer>
|
<LoginContainer>
|
||||||
<h3 class="mb-2">修改密码</h3>
|
<h3 class="mb-20">修改密码</h3>
|
||||||
<el-form
|
<el-form
|
||||||
class="reset-password-form"
|
class="reset-password-form"
|
||||||
ref="resetPasswordFormRef"
|
ref="resetPasswordFormRef"
|
||||||
@ -40,7 +40,7 @@
|
|||||||
<el-button type="primary" class="login-submit-button w-full" @click="resetPassword"
|
<el-button type="primary" class="login-submit-button w-full" @click="resetPassword"
|
||||||
>确认修改</el-button
|
>确认修改</el-button
|
||||||
>
|
>
|
||||||
<div class="operate-container mt-1">
|
<div class="operate-container mt-10">
|
||||||
<el-button
|
<el-button
|
||||||
class="register"
|
class="register"
|
||||||
@click="router.push('/login')"
|
@click="router.push('/login')"
|
||||||
|
|||||||
@ -1,7 +1,43 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>团队管理</div>
|
<LayoutContent header="团队管理">
|
||||||
|
<div class="team-manage flex main-calc-height">
|
||||||
|
<div class="team-member p-15 border-r">
|
||||||
|
<h3>团队成员</h3>
|
||||||
|
<div class="align-right">
|
||||||
|
<el-button type="primary" link
|
||||||
|
><AppIcon iconName="app-add-users" class="add-user-icon" />添加成员</el-button
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
<div class="mt-10">
|
||||||
|
<el-input v-model="filterText" placeholder="请输入用户名搜索" suffix-icon="Search" />
|
||||||
|
</div>
|
||||||
|
<div class="member-list mt-10">
|
||||||
|
<ul>
|
||||||
|
<li class="active border-b-light flex-between p-15">
|
||||||
|
<div>
|
||||||
|
<span>baixin</span>
|
||||||
|
<el-tag class="ml-10" effect="dark">所有者</el-tag>
|
||||||
|
</div>
|
||||||
|
<el-dropdown trigger="click">
|
||||||
|
<span class="el-dropdown-link">
|
||||||
|
<el-icon><MoreFilled /></el-icon>
|
||||||
|
</span>
|
||||||
|
<template #dropdown>
|
||||||
|
<el-dropdown-menu>
|
||||||
|
<el-dropdown-item>移除</el-dropdown-item>
|
||||||
|
</el-dropdown-menu>
|
||||||
|
</template>
|
||||||
|
</el-dropdown>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="permission-setting p-15">
|
||||||
|
<h3>权限设置</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- <div class="sales-department__tree">
|
<!-- <div class="sales-department__tree">
|
||||||
<support-tree
|
<support-tree
|
||||||
ref="salesDepartmentTree"
|
ref="salesDepartmentTree"
|
||||||
v-model:data="dataSource"
|
v-model:data="dataSource"
|
||||||
@ -59,13 +95,16 @@
|
|||||||
</complex-table>
|
</complex-table>
|
||||||
<el-empty :image-size="200" v-else />
|
<el-empty :image-size="200" v-else />
|
||||||
</div> -->
|
</div> -->
|
||||||
<!-- 设置部门
|
<!-- 设置部门
|
||||||
<department-dialog ref="departmentDialogRef" :title="dialogTitle" @refresh="refresh" />
|
<department-dialog ref="departmentDialogRef" :title="dialogTitle" @refresh="refresh" />
|
||||||
<member-dialog ref="memberDialogRef" @refresh="refresh" /> -->
|
<member-dialog ref="memberDialogRef" @refresh="refresh" /> -->
|
||||||
|
</LayoutContent>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onMounted, ref, watch, nextTick } from 'vue'
|
import { onMounted, ref, watch, nextTick } from 'vue'
|
||||||
|
|
||||||
|
const filterText = ref('')
|
||||||
// import DepartmentDialog from './components/DepartmentDialog.vue'
|
// import DepartmentDialog from './components/DepartmentDialog.vue'
|
||||||
// import MemberDialog from './components/MemberDialog.vue'
|
// import MemberDialog from './components/MemberDialog.vue'
|
||||||
// import { getSalesTeams, deleteSalesTeams, putSetLeader } from '@/api/sales-team-controller'
|
// import { getSalesTeams, deleteSalesTeams, putSetLeader } from '@/api/sales-team-controller'
|
||||||
@ -212,22 +251,18 @@ onMounted(() => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
$department-left-width: 300px;
|
.team-manage {
|
||||||
|
.add-user-icon {
|
||||||
.sales-department {
|
margin-right: 5px;
|
||||||
&__tree {
|
font-size: 20px;
|
||||||
width: $department-left-width;
|
|
||||||
min-width: $department-left-width;
|
|
||||||
padding-right: 20px;
|
|
||||||
box-sizing: content-box;
|
|
||||||
}
|
}
|
||||||
&__table {
|
}
|
||||||
border-left: 1px solid var(--el-border-color);
|
.team-member {
|
||||||
width: calc(100% - $department-left-width - 40px);
|
width: 250px;
|
||||||
padding-left: 20px;
|
.member-list {
|
||||||
.table-header {
|
li {
|
||||||
h3 {
|
&.active {
|
||||||
font-size: 18px;
|
background: var(--el-color-primary-light-9);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user