From 8f1153e739f3bdca1fe0d29bfd6a0353bdb36f21 Mon Sep 17 00:00:00 2001 From: callmeyan Date: Fri, 9 Dec 2022 09:52:37 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E6=B7=BB=E5=8A=A0=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E6=8C=87=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin-fe/src/assets/app.less | 2 + admin-fe/src/components/button/Index.vue | 6 +- admin-fe/src/components/input/input.vue | 6 +- admin-fe/src/components/select/Option.vue | 7 +- admin-fe/src/components/select/Select.vue | 101 +++++++++++++++++++--- admin-fe/src/directive/click_outside.ts | 60 +++++++++++++ admin-fe/src/main.ts | 2 + admin-fe/src/router/routes.ts | 54 ++++++++---- admin-fe/src/views/Test.vue | 59 ++++++++----- admin-fe/src/views/layout/AdminLayout.vue | 5 +- admin-fe/tsconfig.json | 6 ++ 11 files changed, 248 insertions(+), 60 deletions(-) create mode 100644 admin-fe/src/directive/click_outside.ts diff --git a/admin-fe/src/assets/app.less b/admin-fe/src/assets/app.less index 17da478..5932b9d 100644 --- a/admin-fe/src/assets/app.less +++ b/admin-fe/src/assets/app.less @@ -38,6 +38,8 @@ --info-color: #1890ff; --info-color-deprecated-bg: #e6f7ff; --info-color-deprecated-border: #91d5ff; + --placeholder-color: #ccc; + --border-color: #d9d9d9; --primary-color-text: #333; --font-size: 14px; diff --git a/admin-fe/src/components/button/Index.vue b/admin-fe/src/components/button/Index.vue index d8bdfa0..39802a8 100644 --- a/admin-fe/src/components/button/Index.vue +++ b/admin-fe/src/components/button/Index.vue @@ -21,12 +21,12 @@ defineOptions({ name: 'PButton' }) type ButtonProps = { - type: 'primary' | 'default' | 'text' | 'link' + type?: 'primary' | 'default' | 'text' | 'link' /** * 是否正在加载中 */ - loading: boolean - disabled: boolean + loading?: boolean + disabled?: boolean } const props = defineProps() const btnType = computed(() => props.type || 'primary') diff --git a/admin-fe/src/components/input/input.vue b/admin-fe/src/components/input/input.vue index 554409a..0be918a 100644 --- a/admin-fe/src/components/input/input.vue +++ b/admin-fe/src/components/input/input.vue @@ -74,7 +74,7 @@ const value = computed({ display: inline-block; width: 100%; min-width: 0; - padding: 4px 11px; + padding: 0px 11px; color: #000000d9; font-size: 14px; line-height: 1.5715; @@ -136,7 +136,7 @@ const value = computed({ position: relative; max-width: 100%; min-width: 0; - padding: 4px 6px; + padding: 0px 6px; color: #000000d9; font-size: 14px; line-height: 1.5715; @@ -157,6 +157,8 @@ const value = computed({ border: none; outline: none; margin: 0 6px; + height: 28px; + &:focus { box-shadow: none; diff --git a/admin-fe/src/components/select/Option.vue b/admin-fe/src/components/select/Option.vue index 90007e5..8de1b25 100644 --- a/admin-fe/src/components/select/Option.vue +++ b/admin-fe/src/components/select/Option.vue @@ -6,7 +6,12 @@ import {defineComponent} from "vue"; export default defineComponent({ - name: "POption" + name: "POption", + props:{ + value:{ + type: [String,Number,Object], + } + } }) diff --git a/admin-fe/src/components/select/Select.vue b/admin-fe/src/components/select/Select.vue index 6528883..f8264e6 100644 --- a/admin-fe/src/components/select/Select.vue +++ b/admin-fe/src/components/select/Select.vue @@ -1,14 +1,16 @@ @@ -30,6 +32,7 @@ export default { props: { placeholder: { type: String, + default: '请选择' }, }, emits: [ @@ -40,13 +43,91 @@ export default { ], setup(props) { const selectValue = ref(props.modelValue) + const isActive = ref(false) + function onClose(){ + isActive.value = false + } return { - selectValue + selectValue, isActive,onClose } } } - \ No newline at end of file diff --git a/admin-fe/src/directive/click_outside.ts b/admin-fe/src/directive/click_outside.ts new file mode 100644 index 0000000..54f520b --- /dev/null +++ b/admin-fe/src/directive/click_outside.ts @@ -0,0 +1,60 @@ +import type { + ObjectDirective, +} from 'vue' + +const nodeList = new Map(); +document.addEventListener('mousedown', (e: MouseEvent) => { + e.stopPropagation() + // @ts-ignore + const paths = e.path as Element[]; + // console.log(paths) + // 已经绑定过指令的元素 + nodeList.forEach((fn, ele) => { + // 当前点击元素的数组 + for (const c of paths) { + // 找到对应的元素 说明是点击了该元素或者他的子元素 + if (c == ele) { + return; + } + } + // 没有找到 说明在外面 可以出发事件 + fn.call(null) + }) +}) + +// 定义指令 +const clickOutside: ObjectDirective = { + // 在绑定元素的 attribute 前 + // 或事件监听器应用前调用 + created(el, binding, vnode, prevVnode) { + // 下面会介绍各个参数的细节 + nodeList.set(el,binding.value) + // console.log(nodeList) + }, + // 在元素被插入到 DOM 前调用 + beforeMount(el, binding, vnode, prevVnode) { + }, + // 在绑定元素的父组件 + // 及他自己的所有子节点都挂载完成后调用 + mounted(el, binding, vnode, prevVnode) { + }, + // 绑定元素的父组件更新前调用 + beforeUpdate(el, binding, vnode, prevVnode) { + }, + // 在绑定元素的父组件 + // 及他自己的所有子节点都更新后调用 + updated(el, binding, vnode, prevVnode) { + }, + // 绑定元素的父组件卸载前调用 + beforeUnmount(el, binding, vnode, prevVnode) { + nodeList.delete(el) + // console.log('remove ', index, el) + // nodeList.splice(index, 1)// 移除要销毁的元素 + // console.log(nodeList) + }, + // 绑定元素的父组件卸载后调用 + unmounted(el, binding, vnode, prevVnode) { + } +} + +export default clickOutside \ No newline at end of file diff --git a/admin-fe/src/main.ts b/admin-fe/src/main.ts index e88e7c5..563266c 100644 --- a/admin-fe/src/main.ts +++ b/admin-fe/src/main.ts @@ -6,6 +6,7 @@ import router from './router' import {httpConfig} from "./util/http"; import './assets/app.less' import PInput from "./components/input"; +import clickOutside from "./directive/click_outside"; httpConfig.baseURL = "http://localhost:8080" @@ -14,5 +15,6 @@ const app = createApp(App) app.use(router) app.use(createPinia()); app.component('PInput',PInput) +app.directive('click-outside',clickOutside) // 将应用实例挂载到 模板中 app.mount('#vue-root-app') \ No newline at end of file diff --git a/admin-fe/src/router/routes.ts b/admin-fe/src/router/routes.ts index f73ff66..fe2e300 100644 --- a/admin-fe/src/router/routes.ts +++ b/admin-fe/src/router/routes.ts @@ -2,32 +2,52 @@ import {RouteRecordRaw} from "vue-router"; import Home from '../views/admin/Home.vue' import Login from '../views/Login.vue' import NotFound from '../views/NotFound.vue' +import Test from '../views/Test.vue' import AdminLayout from '../views/layout/AdminLayout.vue' import UserIndex from '../views/user/index.vue' import GoodsIndex from '../views/goods/index.vue' +export const AdminRoutes: RouteRecordRaw[] = [ + { + path: 'home', + name: 'Home', + component: Home, + meta: { + title: 'Home' + } + }, + { + path: 'user', + name: 'UserIndex', + component: UserIndex, + meta: { + title: '用户管理' + } + }, + { + path: 'goods', + name: 'GoodsIndex', + component: GoodsIndex, + meta: { + title: '商品管理' + } + }, + { + path: 'test', + name: 'TestIndex', + component: Test, + meta: { + title: '测试页' + } + } +] + const routes: RouteRecordRaw[] = [ { path: '/', component: AdminLayout, redirect: '/home', - children: [ - { - path: 'home', - name: 'Home', - component: Home - }, - { - path: 'user', - name: 'UserIndex', - component: UserIndex - }, - { - path: 'goods', - name: 'GoodsIndex', - component: GoodsIndex - } - ] + children: AdminRoutes }, { path: '/login', diff --git a/admin-fe/src/views/Test.vue b/admin-fe/src/views/Test.vue index 1691f88..d0133f4 100644 --- a/admin-fe/src/views/Test.vue +++ b/admin-fe/src/views/Test.vue @@ -1,43 +1,54 @@ \ No newline at end of file diff --git a/admin-fe/src/views/layout/AdminLayout.vue b/admin-fe/src/views/layout/AdminLayout.vue index 76c67af..af27744 100644 --- a/admin-fe/src/views/layout/AdminLayout.vue +++ b/admin-fe/src/views/layout/AdminLayout.vue @@ -13,9 +13,7 @@
积分管理系统
@@ -30,6 +28,7 @@