feat(projects): 添加组件名称,调整vue文件里面的类型声明位置

This commit is contained in:
Soybean 2022-07-10 14:02:00 +08:00
parent b60db89801
commit f64bc91ce2
76 changed files with 223 additions and 70 deletions

View File

@ -34,8 +34,8 @@
"@antv/data-set": "^0.11.8", "@antv/data-set": "^0.11.8",
"@antv/g2": "^4.2.5", "@antv/g2": "^4.2.5",
"@better-scroll/core": "^2.4.2", "@better-scroll/core": "^2.4.2",
"@soybeanjs/vue-admin-layout": "^1.0.4", "@soybeanjs/vue-admin-layout": "^1.0.6",
"@soybeanjs/vue-admin-tab": "^1.0.2", "@soybeanjs/vue-admin-tab": "^1.0.3",
"@vueuse/core": "^8.9.1", "@vueuse/core": "^8.9.1",
"axios": "^0.27.2", "axios": "^0.27.2",
"clipboard": "^2.0.11", "clipboard": "^2.0.11",

View File

@ -26,6 +26,8 @@ import { computed, watch, nextTick, onUnmounted } from 'vue';
import { NETWORK_ERROR_MSG } from '@/config'; import { NETWORK_ERROR_MSG } from '@/config';
import { useBoolean } from '@/hooks'; import { useBoolean } from '@/hooks';
defineOptions({ name: 'LoadingEmptyWrapper' });
interface Props { interface Props {
/** 是否加载 */ /** 是否加载 */
loading: boolean; loading: boolean;

View File

@ -9,11 +9,17 @@
<script setup lang="ts"> <script setup lang="ts">
import { computed } from 'vue'; import { computed } from 'vue';
defineOptions({ name: 'LoginAgreement' });
interface Props { interface Props {
/** 是否勾选 */ /** 是否勾选 */
value?: boolean; value?: boolean;
} }
const props = withDefaults(defineProps<Props>(), {
value: true
});
interface Emits { interface Emits {
(e: 'update:value', value: boolean): void; (e: 'update:value', value: boolean): void;
/** 点击协议 */ /** 点击协议 */
@ -22,10 +28,6 @@ interface Emits {
(e: 'click-policy'): void; (e: 'click-policy'): void;
} }
const props = withDefaults(defineProps<Props>(), {
value: true
});
const emit = defineEmits<Emits>(); const emit = defineEmits<Emits>();
const checked = computed({ const checked = computed({

View File

@ -8,9 +8,12 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
defineOptions({ name: 'DarkModeContainer' });
interface Props { interface Props {
inverted?: boolean; inverted?: boolean;
} }
withDefaults(defineProps<Props>(), { withDefaults(defineProps<Props>(), {
inverted: false inverted: false
}); });

View File

@ -8,19 +8,21 @@
<script setup lang="ts"> <script setup lang="ts">
import { computed } from 'vue'; import { computed } from 'vue';
defineOptions({ name: 'DarkModeSwitch' });
interface Props { interface Props {
/** 暗黑模式 */ /** 暗黑模式 */
dark?: boolean; dark?: boolean;
} }
interface Emits {
(e: 'update:dark', darkMode: boolean): void;
}
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
dark: false dark: false
}); });
interface Emits {
(e: 'update:dark', darkMode: boolean): void;
}
const emit = defineEmits<Emits>(); const emit = defineEmits<Emits>();
const darkMode = computed({ const darkMode = computed({

View File

@ -14,6 +14,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { routeName } from '@/router'; import { routeName } from '@/router';
defineOptions({ name: 'ExceptionBase' });
type ExceptionType = '403' | '404' | '500'; type ExceptionType = '403' | '404' | '500';
interface Props { interface Props {

View File

@ -18,6 +18,8 @@
import { computed } from 'vue'; import { computed } from 'vue';
import type { PopoverPlacement } from 'naive-ui'; import type { PopoverPlacement } from 'naive-ui';
defineOptions({ name: 'HoverContainer' });
interface Props { interface Props {
/** tooltip显示文本 */ /** tooltip显示文本 */
tooltipContent?: string; tooltipContent?: string;
@ -28,6 +30,7 @@ interface Props {
/** 反转模式下 */ /** 反转模式下 */
inverted?: boolean; inverted?: boolean;
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
tooltipContent: '', tooltipContent: '',
placement: 'bottom', placement: 'bottom',

View File

@ -15,6 +15,8 @@
import { defineComponent, h } from 'vue'; import { defineComponent, h } from 'vue';
import { useLoadingBar, useDialog, useMessage, useNotification } from 'naive-ui'; import { useLoadingBar, useDialog, useMessage, useNotification } from 'naive-ui';
defineOptions({ name: 'NaiveProvider' });
// naivewindow, 便 // naivewindow, 便
function registerNaiveTools() { function registerNaiveTools() {
window.$loadingBar = useLoadingBar(); window.$loadingBar = useLoadingBar();
@ -24,6 +26,7 @@ function registerNaiveTools() {
} }
const NaiveProviderContent = defineComponent({ const NaiveProviderContent = defineComponent({
name: 'NaiveProviderContent',
setup() { setup() {
registerNaiveTools(); registerNaiveTools();
}, },

View File

@ -4,6 +4,8 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
defineOptions({ name: 'SystemLogo' });
interface Props { interface Props {
/** logo是否填充 */ /** logo是否填充 */
fill?: boolean; fill?: boolean;

View File

@ -12,6 +12,8 @@ import { useElementSize } from '@vueuse/core';
import BScroll from '@better-scroll/core'; import BScroll from '@better-scroll/core';
import type { Options } from '@better-scroll/core'; import type { Options } from '@better-scroll/core';
defineOptions({ name: 'BetterScroll' });
interface Props { interface Props {
/** better-scroll的配置: https://better-scroll.github.io/docs/zh-CN/guide/base-scroll-options.html */ /** better-scroll的配置: https://better-scroll.github.io/docs/zh-CN/guide/base-scroll-options.html */
options: Options; options: Options;

View File

@ -6,6 +6,8 @@ import { ref, computed, onMounted, watch, watchEffect } from 'vue';
import { useTransition, TransitionPresets } from '@vueuse/core'; import { useTransition, TransitionPresets } from '@vueuse/core';
import { isNumber } from '@/utils'; import { isNumber } from '@/utils';
defineOptions({ name: 'CountTo' });
interface Props { interface Props {
/** 初始值 */ /** 初始值 */
startValue?: number; startValue?: number;
@ -45,10 +47,12 @@ const props = withDefaults(defineProps<Props>(), {
transition: 'linear' transition: 'linear'
}); });
const emit = defineEmits<{ interface Emits {
(e: 'on-started'): void; (e: 'on-started'): void;
(e: 'on-finished'): void; (e: 'on-finished'): void;
}>(); }
const emit = defineEmits<Emits>();
const source = ref(props.startValue); const source = ref(props.startValue);
let outputValue = useTransition(source); let outputValue = useTransition(source);

View File

@ -5,6 +5,8 @@
<script setup lang="ts"> <script setup lang="ts">
import WebSiteLink from './WebSiteLink.vue'; import WebSiteLink from './WebSiteLink.vue';
defineOptions({ name: 'GithubLink' });
interface Props { interface Props {
/** github链接 */ /** github链接 */
link: string; link: string;

View File

@ -29,6 +29,8 @@ import { ref, computed } from 'vue';
import { Icon } from '@iconify/vue'; import { Icon } from '@iconify/vue';
import { useThemeStore } from '@/store'; import { useThemeStore } from '@/store';
defineOptions({ name: 'IconSelect' });
interface Props { interface Props {
/** 选中的图标 */ /** 选中的图标 */
value: string; value: string;
@ -38,14 +40,14 @@ interface Props {
emptyIcon?: string; emptyIcon?: string;
} }
interface Emits {
(e: 'update:value', val: string): void;
}
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
emptyIcon: 'mdi:apps' emptyIcon: 'mdi:apps'
}); });
interface Emits {
(e: 'update:value', val: string): void;
}
const emit = defineEmits<Emits>(); const emit = defineEmits<Emits>();
const theme = useThemeStore(); const theme = useThemeStore();

View File

@ -8,18 +8,20 @@
import { watch } from 'vue'; import { watch } from 'vue';
import { useImageVerify } from '@/hooks'; import { useImageVerify } from '@/hooks';
defineOptions({ name: 'ImageVerify' });
interface Props { interface Props {
code?: string; code?: string;
} }
interface Emits {
(e: 'update:code', code: string): void;
}
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
code: '' code: ''
}); });
interface Emits {
(e: 'update:code', code: string): void;
}
const emit = defineEmits<Emits>(); const emit = defineEmits<Emits>();
const { domRef, imgCode, setImgCode, getImgCode } = useImageVerify(); const { domRef, imgCode, setImgCode, getImgCode } = useImageVerify();

View File

@ -7,6 +7,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { computed } from 'vue'; import { computed } from 'vue';
defineOptions({ name: 'SvgIcon' });
interface Props { interface Props {
/** 前缀 */ /** 前缀 */
prefix?: string; prefix?: string;

View File

@ -8,6 +8,8 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
defineOptions({ name: 'WebSiteLink' });
interface Props { interface Props {
/** 网址名称 */ /** 网址名称 */
label: string; label: string;

View File

@ -46,6 +46,8 @@ import {
GlobalBackTop GlobalBackTop
} from '../common'; } from '../common';
defineOptions({ name: 'BasicLayout' });
const app = useAppStore(); const app = useAppStore();
const theme = useThemeStore(); const theme = useThemeStore();

View File

@ -4,6 +4,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { GlobalContent } from '../common'; import { GlobalContent } from '../common';
defineOptions({ name: 'BlankLayout' });
</script> </script>
<style scoped></style> <style scoped></style>

View File

@ -6,6 +6,8 @@
import { computed } from 'vue'; import { computed } from 'vue';
import { useWindowScroll } from '@vueuse/core'; import { useWindowScroll } from '@vueuse/core';
defineOptions({ name: 'GlobalBackTop' });
const { y: scrollY } = useWindowScroll(); const { y: scrollY } = useWindowScroll();
const show = computed(() => scrollY.value > 180); const show = computed(() => scrollY.value > 180);

View File

@ -22,20 +22,22 @@
<script setup lang="ts"> <script setup lang="ts">
import { useAppStore, useThemeStore, useRouteStore } from '@/store'; import { useAppStore, useThemeStore, useRouteStore } from '@/store';
defineOptions({ name: 'GlobalContent' });
interface Props { interface Props {
/** 显示padding */ /** 显示padding */
showPadding?: boolean; showPadding?: boolean;
} }
withDefaults(defineProps<Props>(), {
showPadding: true
});
interface Emits { interface Emits {
/** 禁止主体溢出 */ /** 禁止主体溢出 */
(e: 'hide-main-overflow', hidden: boolean): void; (e: 'hide-main-overflow', hidden: boolean): void;
} }
withDefaults(defineProps<Props>(), {
showPadding: true
});
const emit = defineEmits<Emits>(); const emit = defineEmits<Emits>();
const app = useAppStore(); const app = useAppStore();

View File

@ -4,6 +4,8 @@
</dark-mode-container> </dark-mode-container>
</template> </template>
<script setup lang="ts"></script> <script setup lang="ts">
defineOptions({ name: 'GlobalFooter' });
</script>
<style scoped></style> <style scoped></style>

View File

@ -9,6 +9,8 @@
import { useFullscreen } from '@vueuse/core'; import { useFullscreen } from '@vueuse/core';
import { useThemeStore } from '@/store'; import { useThemeStore } from '@/store';
defineOptions({ name: 'FullScreen' });
const { isFullscreen, toggle } = useFullscreen(); const { isFullscreen, toggle } = useFullscreen();
const theme = useThemeStore(); const theme = useThemeStore();
</script> </script>

View File

@ -12,6 +12,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useThemeStore } from '@/store'; import { useThemeStore } from '@/store';
defineOptions({ name: 'GithubSite' });
const theme = useThemeStore(); const theme = useThemeStore();
function handleClickLink() { function handleClickLink() {
window.open('https://github.com/honghuangdc/soybean-admin', '_blank'); window.open('https://github.com/honghuangdc/soybean-admin', '_blank');

View File

@ -34,6 +34,8 @@ import { useThemeStore, useRouteStore } from '@/store';
import { useRouterPush } from '@/composables'; import { useRouterPush } from '@/composables';
import { getBreadcrumbByRouteKey } from '@/utils'; import { getBreadcrumbByRouteKey } from '@/utils';
defineOptions({ name: 'GlobalBreadcrumb' });
const route = useRoute(); const route = useRoute();
const theme = useThemeStore(); const theme = useThemeStore();
const routeStore = useRouteStore(); const routeStore = useRouteStore();

View File

@ -21,6 +21,8 @@ import type { MenuOption } from 'naive-ui';
import { useRouteStore, useThemeStore } from '@/store'; import { useRouteStore, useThemeStore } from '@/store';
import { useRouterPush } from '@/composables'; import { useRouterPush } from '@/composables';
defineOptions({ name: 'HeaderMenu' });
const route = useRoute(); const route = useRoute();
const routeStore = useRouteStore(); const routeStore = useRouteStore();
const theme = useThemeStore(); const theme = useThemeStore();

View File

@ -8,6 +8,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useAppStore, useThemeStore } from '@/store'; import { useAppStore, useThemeStore } from '@/store';
defineOptions({ name: 'MenuCollapse' });
const app = useAppStore(); const app = useAppStore();
const theme = useThemeStore(); const theme = useThemeStore();
</script> </script>

View File

@ -38,18 +38,20 @@
<script lang="ts" setup> <script lang="ts" setup>
import { Icon } from '@iconify/vue'; import { Icon } from '@iconify/vue';
defineOptions({ name: 'MessageList' });
interface Props { interface Props {
list?: Message.List[]; list?: Message.List[];
} }
interface Emits {
(e: 'read', val: number): void;
}
withDefaults(defineProps<Props>(), { withDefaults(defineProps<Props>(), {
list: () => [] list: () => []
}); });
interface Emits {
(e: 'read', val: number): void;
}
const emit = defineEmits<Emits>(); const emit = defineEmits<Emits>();
function handleRead(index: number) { function handleRead(index: number) {

View File

@ -12,6 +12,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { useAppStore, useThemeStore } from '@/store'; import { useAppStore, useThemeStore } from '@/store';
defineOptions({ name: 'SettingButton' });
const app = useAppStore(); const app = useAppStore();
const theme = useThemeStore(); const theme = useThemeStore();
</script> </script>

View File

@ -48,9 +48,13 @@ import { useThemeStore } from '@/store';
import { useBoolean } from '@/hooks'; import { useBoolean } from '@/hooks';
import MessageList from './MessageList.vue'; import MessageList from './MessageList.vue';
defineOptions({ name: 'SystemMessage' });
const theme = useThemeStore(); const theme = useThemeStore();
const { bool: loading, setBool: setLoading } = useBoolean(); const { bool: loading, setBool: setLoading } = useBoolean();
const currentTab = ref(0); const currentTab = ref(0);
const tabData = ref<Message.Tab[]>([ const tabData = ref<Message.Tab[]>([
{ {
key: 1, key: 1,

View File

@ -7,6 +7,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useThemeStore } from '@/store'; import { useThemeStore } from '@/store';
defineOptions({ name: 'ThemeMode' });
const theme = useThemeStore(); const theme = useThemeStore();
</script> </script>

View File

@ -8,15 +8,16 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import type { DropdownOption } from 'naive-ui';
import { useAuthStore, useThemeStore } from '@/store'; import { useAuthStore, useThemeStore } from '@/store';
import { iconifyRender } from '@/utils'; import { iconifyRender } from '@/utils';
type DropdownKey = 'user-center' | 'logout'; defineOptions({ name: 'UserAvatar' });
const auth = useAuthStore(); const auth = useAuthStore();
const theme = useThemeStore(); const theme = useThemeStore();
const options = [ const options: DropdownOption[] = [
{ {
label: '用户中心', label: '用户中心',
key: 'user-center', key: 'user-center',
@ -33,6 +34,8 @@ const options = [
} }
]; ];
type DropdownKey = 'user-center' | 'logout';
function handleDropdown(optionKey: string) { function handleDropdown(optionKey: string) {
const key = optionKey as DropdownKey; const key = optionKey as DropdownKey;
if (key === 'logout') { if (key === 'logout') {

View File

@ -34,6 +34,8 @@ import {
SettingButton SettingButton
} from './components'; } from './components';
defineOptions({ name: 'GlobalHeader' });
interface Props { interface Props {
/** 显示logo */ /** 显示logo */
showLogo: GlobalHeaderProps['showLogo']; showLogo: GlobalHeaderProps['showLogo'];

View File

@ -11,6 +11,8 @@
import { routePath } from '@/router'; import { routePath } from '@/router';
import { useAppInfo } from '@/composables'; import { useAppInfo } from '@/composables';
defineOptions({ name: 'GlobalLogo' });
interface Props { interface Props {
/** 显示名字 */ /** 显示名字 */
showTitle: boolean; showTitle: boolean;

View File

@ -16,7 +16,9 @@
</div> </div>
</template> </template>
<script lang="ts" setup></script> <script lang="ts" setup>
defineOptions({ name: 'SearchFooter' });
</script>
<style lang="scss" scoped> <style lang="scss" scoped>
.icon { .icon {

View File

@ -31,17 +31,19 @@ import { useRouteStore } from '@/store';
import SearchResult from './SearchResult.vue'; import SearchResult from './SearchResult.vue';
import SearchFooter from './SearchFooter.vue'; import SearchFooter from './SearchFooter.vue';
defineOptions({ name: 'SearchModal' });
interface Props { interface Props {
/** 弹窗显隐 */ /** 弹窗显隐 */
value: boolean; value: boolean;
} }
const props = defineProps<Props>();
interface Emits { interface Emits {
(e: 'update:value', val: boolean): void; (e: 'update:value', val: boolean): void;
} }
const props = defineProps<Props>();
const emit = defineEmits<Emits>(); const emit = defineEmits<Emits>();
const router = useRouter(); const router = useRouter();

View File

@ -25,18 +25,20 @@ import { computed } from 'vue';
import { Icon } from '@iconify/vue'; import { Icon } from '@iconify/vue';
import { useThemeStore } from '@/store'; import { useThemeStore } from '@/store';
defineOptions({ name: 'SearchResult' });
interface Props { interface Props {
value: string; value: string;
options: AuthRoute.Route[]; options: AuthRoute.Route[];
} }
const props = defineProps<Props>();
interface Emits { interface Emits {
(e: 'update:value', val: string): void; (e: 'update:value', val: string): void;
(e: 'enter'): void; (e: 'enter'): void;
} }
const props = defineProps<Props>();
const emit = defineEmits<Emits>(); const emit = defineEmits<Emits>();
const theme = useThemeStore(); const theme = useThemeStore();

View File

@ -17,6 +17,8 @@ import { useThemeStore } from '@/store';
import { useBoolean } from '@/hooks'; import { useBoolean } from '@/hooks';
import { SearchModal } from './components'; import { SearchModal } from './components';
defineOptions({ name: 'GlobalSearch' });
const { bool: show, toggle } = useBoolean(); const { bool: show, toggle } = useBoolean();
const theme = useThemeStore(); const theme = useThemeStore();

View File

@ -8,6 +8,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useAppStore } from '@/store'; import { useAppStore } from '@/store';
defineOptions({ name: 'MixMenuCollapse' });
const app = useAppStore(); const app = useAppStore();
</script> </script>

View File

@ -20,6 +20,8 @@ import { computed } from 'vue';
import type { VNodeChild } from 'vue'; import type { VNodeChild } from 'vue';
import { useBoolean } from '@/hooks'; import { useBoolean } from '@/hooks';
defineOptions({ name: 'MixMenuDetail' });
interface Props { interface Props {
/** 路由名称 */ /** 路由名称 */
routeName: string; routeName: string;

View File

@ -36,6 +36,8 @@ import { useAppStore, useThemeStore } from '@/store';
import { useAppInfo, useRouterPush } from '@/composables'; import { useAppInfo, useRouterPush } from '@/composables';
import { getActiveKeyPathsOfMenus } from '@/utils'; import { getActiveKeyPathsOfMenus } from '@/utils';
defineOptions({ name: 'MixMenuDrawer' });
interface Props { interface Props {
/** 菜单抽屉可见性 */ /** 菜单抽屉可见性 */
visible: boolean; visible: boolean;

View File

@ -29,6 +29,8 @@ import { useBoolean } from '@/hooks';
import { GlobalLogo } from '@/layouts/common'; import { GlobalLogo } from '@/layouts/common';
import { MixMenuDetail, MixMenuDrawer, MixMenuCollapse } from './components'; import { MixMenuDetail, MixMenuDrawer, MixMenuCollapse } from './components';
defineOptions({ name: 'VerticalMixSider' });
const route = useRoute(); const route = useRoute();
const app = useAppStore(); const app = useAppStore();
const theme = useThemeStore(); const theme = useThemeStore();

View File

@ -23,6 +23,8 @@ import { useAppStore, useThemeStore, useRouteStore } from '@/store';
import { useRouterPush } from '@/composables'; import { useRouterPush } from '@/composables';
import { getActiveKeyPathsOfMenus } from '@/utils'; import { getActiveKeyPathsOfMenus } from '@/utils';
defineOptions({ name: 'VerticalMenu' });
const route = useRoute(); const route = useRoute();
const app = useAppStore(); const app = useAppStore();
const theme = useThemeStore(); const theme = useThemeStore();

View File

@ -11,6 +11,8 @@ import { useAppStore, useThemeStore } from '@/store';
import { GlobalLogo } from '@/layouts/common'; import { GlobalLogo } from '@/layouts/common';
import { VerticalMenu } from './components'; import { VerticalMenu } from './components';
defineOptions({ name: 'VerticalSider' });
const app = useAppStore(); const app = useAppStore();
const theme = useThemeStore(); const theme = useThemeStore();

View File

@ -8,6 +8,8 @@ import { computed } from 'vue';
import { useThemeStore } from '@/store'; import { useThemeStore } from '@/store';
import { VerticalSider, VerticalMixSider } from './components'; import { VerticalSider, VerticalMixSider } from './components';
defineOptions({ name: 'GlobalSider' });
const theme = useThemeStore(); const theme = useThemeStore();
const isVerticalMix = computed(() => theme.layout.mode === 'vertical-mix'); const isVerticalMix = computed(() => theme.layout.mode === 'vertical-mix');

View File

@ -8,6 +8,8 @@
import { useAppStore } from '@/store'; import { useAppStore } from '@/store';
import { useLoading } from '@/hooks'; import { useLoading } from '@/hooks';
defineOptions({ name: 'ReloadButton' });
const app = useAppStore(); const app = useAppStore();
const { loading, startLoading, endLoading } = useLoading(); const { loading, startLoading, endLoading } = useLoading();

View File

@ -16,6 +16,8 @@ import type { DropdownOption } from 'naive-ui';
import { useAppStore, useTabStore } from '@/store'; import { useAppStore, useTabStore } from '@/store';
import { iconifyRender } from '@/utils'; import { iconifyRender } from '@/utils';
defineOptions({ name: 'ContextMenu' });
interface Props { interface Props {
/** 右键菜单可见性 */ /** 右键菜单可见性 */
visible?: boolean; visible?: boolean;
@ -27,20 +29,15 @@ interface Props {
y: number; y: number;
} }
interface Emits {
(e: 'update:visible', visible: boolean): void;
}
type DropdownKey = 'reload-current' | 'close-current' | 'close-other' | 'close-left' | 'close-right' | 'close-all';
type Option = DropdownOption & {
key: DropdownKey;
};
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
visible: false, visible: false,
currentPath: '' currentPath: ''
}); });
interface Emits {
(e: 'update:visible', visible: boolean): void;
}
const emit = defineEmits<Emits>(); const emit = defineEmits<Emits>();
const app = useAppStore(); const app = useAppStore();
@ -59,6 +56,11 @@ function hide() {
dropdownVisible.value = false; dropdownVisible.value = false;
} }
type DropdownKey = 'reload-current' | 'close-current' | 'close-other' | 'close-left' | 'close-right' | 'close-all';
type Option = DropdownOption & {
key: DropdownKey;
};
const options = computed<Option[]>(() => [ const options = computed<Option[]>(() => [
{ {
label: '重新加载', label: '重新加载',

View File

@ -32,6 +32,8 @@ import { Icon } from '@iconify/vue';
import { useThemeStore, useTabStore } from '@/store'; import { useThemeStore, useTabStore } from '@/store';
import { ContextMenu } from './components'; import { ContextMenu } from './components';
defineOptions({ name: 'TabDetail' });
interface Emits { interface Emits {
(e: 'scroll', clientX: number): void; (e: 'scroll', clientX: number): void;
} }

View File

@ -17,6 +17,8 @@ import { useThemeStore, useTabStore } from '@/store';
import { useDeviceInfo } from '@/composables'; import { useDeviceInfo } from '@/composables';
import { TabDetail, ReloadButton } from './components'; import { TabDetail, ReloadButton } from './components';
defineOptions({ name: 'GlobalTab' });
const route = useRoute(); const route = useRoute();
const theme = useThemeStore(); const theme = useThemeStore();
const tab = useTabStore(); const tab = useTabStore();

View File

@ -28,6 +28,8 @@
import { useThemeStore } from '@/store'; import { useThemeStore } from '@/store';
import SettingMenu from '../SettingMenu/index.vue'; import SettingMenu from '../SettingMenu/index.vue';
defineOptions({ name: 'DarkMode' });
const theme = useThemeStore(); const theme = useThemeStore();
</script> </script>
<style scoped> <style scoped>

View File

@ -13,6 +13,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { useAppStore } from '@/store'; import { useAppStore } from '@/store';
defineOptions({ name: 'DrawerButton' });
const app = useAppStore(); const app = useAppStore();
</script> </script>

View File

@ -20,6 +20,8 @@ import { computed } from 'vue';
import type { PopoverPlacement } from 'naive-ui'; import type { PopoverPlacement } from 'naive-ui';
import type { EnumThemeLayoutMode } from '@/enum'; import type { EnumThemeLayoutMode } from '@/enum';
defineOptions({ name: 'LayoutCheckbox' });
interface Props { interface Props {
/** 布局模式 */ /** 布局模式 */
mode: EnumType.ThemeLayoutMode; mode: EnumType.ThemeLayoutMode;

View File

@ -16,6 +16,8 @@
import { useThemeStore } from '@/store'; import { useThemeStore } from '@/store';
import { LayoutCheckbox } from './components'; import { LayoutCheckbox } from './components';
defineOptions({ name: 'LayoutMode' });
const theme = useThemeStore(); const theme = useThemeStore();
</script> </script>

View File

@ -68,6 +68,8 @@
import { useThemeStore } from '@/store'; import { useThemeStore } from '@/store';
import SettingMenu from '../SettingMenu/index.vue'; import SettingMenu from '../SettingMenu/index.vue';
defineOptions({ name: 'PageFunc' });
const theme = useThemeStore(); const theme = useThemeStore();
</script> </script>

View File

@ -38,6 +38,8 @@
import { useThemeStore } from '@/store'; import { useThemeStore } from '@/store';
import SettingMenu from '../SettingMenu/index.vue'; import SettingMenu from '../SettingMenu/index.vue';
defineOptions({ name: 'PageView' });
const theme = useThemeStore(); const theme = useThemeStore();
</script> </script>

View File

@ -6,6 +6,8 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
defineOptions({ name: 'SettingMenu' });
interface Props { interface Props {
/** 文本 */ /** 文本 */
label: string; label: string;

View File

@ -7,6 +7,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { computed } from 'vue'; import { computed } from 'vue';
defineOptions({ name: 'ColorCheckbox' });
interface Props { interface Props {
/** 颜色 */ /** 颜色 */
color: string; color: string;

View File

@ -27,16 +27,18 @@ import { traditionColors } from '@/settings';
import { useThemeStore } from '@/store'; import { useThemeStore } from '@/store';
import ColorCheckbox from './ColorCheckbox.vue'; import ColorCheckbox from './ColorCheckbox.vue';
defineOptions({ name: 'ColorModal' });
interface Props { interface Props {
visible: boolean; visible: boolean;
} }
defineProps<Props>();
interface Emits { interface Emits {
(e: 'close'): void; (e: 'close'): void;
} }
defineProps<Props>();
const emit = defineEmits<Emits>(); const emit = defineEmits<Emits>();
const theme = useThemeStore(); const theme = useThemeStore();

View File

@ -19,6 +19,8 @@ import { useThemeStore } from '@/store';
import { useBoolean } from '@/hooks'; import { useBoolean } from '@/hooks';
import { ColorCheckbox, ColorModal } from './components'; import { ColorCheckbox, ColorModal } from './components';
defineOptions({ name: 'ThemeColorSelect' });
const theme = useThemeStore(); const theme = useThemeStore();
const { bool: visible, setTrue: openModal, setFalse: closeModal } = useBoolean(); const { bool: visible, setTrue: openModal, setFalse: closeModal } = useBoolean();

View File

@ -14,6 +14,8 @@ import { ref, watch, onMounted, onUnmounted } from 'vue';
import Clipboard from 'clipboard'; import Clipboard from 'clipboard';
import { useThemeStore } from '@/store'; import { useThemeStore } from '@/store';
defineOptions({ name: 'ThemeConfig' });
const theme = useThemeStore(); const theme = useThemeStore();
const copyRef = ref<HTMLElement>(); const copyRef = ref<HTMLElement>();

View File

@ -16,6 +16,8 @@
import { useAppStore } from '@/store'; import { useAppStore } from '@/store';
import { DrawerButton, DarkMode, LayoutMode, ThemeColorSelect, PageFunc, PageView, ThemeConfig } from './components'; import { DrawerButton, DarkMode, LayoutMode, ThemeColorSelect, PageFunc, PageView, ThemeConfig } from './components';
defineOptions({ name: 'SettingDrawer' });
const app = useAppStore(); const app = useAppStore();
const showButton = import.meta.env.DEV || import.meta.env.VITE_VERCEL === '1'; const showButton = import.meta.env.DEV || import.meta.env.VITE_VERCEL === '1';

View File

@ -1,5 +1,4 @@
import type { Component } from 'vue'; import type { Component } from 'vue';
import { EnumLayoutComponentName } from '@/enum';
import { BasicLayout, BlankLayout } from '@/layouts'; import { BasicLayout, BlankLayout } from '@/layouts';
import { views } from '@/views'; import { views } from '@/views';
@ -14,7 +13,7 @@ export function getLayoutComponent(layoutType: EnumType.LayoutComponentName) {
basic: BasicLayout, basic: BasicLayout,
blank: BlankLayout blank: BlankLayout
}; };
return () => setViewComponentName(layoutComponent[layoutType], EnumLayoutComponentName[layoutType]); return layoutComponent[layoutType];
} }
/** /**

View File

@ -11,6 +11,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { pkgJson } from './model'; import { pkgJson } from './model';
defineOptions({ name: 'DevDependency' });
const { devDependencies } = pkgJson; const { devDependencies } = pkgJson;
</script> </script>

View File

@ -11,6 +11,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { pkgJson } from './model'; import { pkgJson } from './model';
defineOptions({ name: 'ProDependency' });
const { dependencies } = pkgJson; const { dependencies } = pkgJson;
</script> </script>

View File

@ -20,6 +20,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { pkgJson } from './model'; import { pkgJson } from './model';
defineOptions({ name: 'ProjectInfo' });
const { version } = pkgJson; const { version } = pkgJson;
const latestBuildTime = PROJECT_BUILD_TIME; const latestBuildTime = PROJECT_BUILD_TIME;
</script> </script>

View File

@ -7,6 +7,8 @@
</n-card> </n-card>
</template> </template>
<script setup lang="ts"></script> <script setup lang="ts">
defineOptions({ name: 'ProjectIntroduction' });
</script>
<style scoped></style> <style scoped></style>

View File

@ -23,6 +23,8 @@
import { h } from 'vue'; import { h } from 'vue';
import { NTag } from 'naive-ui'; import { NTag } from 'naive-ui';
defineOptions({ name: 'DashboardAnalysisBottomPart' });
interface TimelineData { interface TimelineData {
type: 'default' | 'info' | 'success' | 'warning' | 'error'; type: 'default' | 'info' | 'success' | 'warning' | 'error';
title: string; title: string;

View File

@ -21,6 +21,8 @@
import { Icon } from '@iconify/vue'; import { Icon } from '@iconify/vue';
import { GradientBg } from './components'; import { GradientBg } from './components';
defineOptions({ name: 'DashboardAnalysisDataCard' });
interface CardData { interface CardData {
id: string; id: string;
title: string; title: string;

View File

@ -34,6 +34,8 @@
import { ref } from 'vue'; import { ref } from 'vue';
import { useEcharts, type ECOption } from '@/composables'; import { useEcharts, type ECOption } from '@/composables';
defineOptions({ name: 'DashboardAnalysisTopCard' });
const lineOptions = ref<ECOption>({ const lineOptions = ref<ECOption>({
tooltip: { tooltip: {
trigger: 'axis', trigger: 'axis',

View File

@ -18,14 +18,16 @@
<script setup lang="ts"> <script setup lang="ts">
import { useAuthStore } from '@/store'; import { useAuthStore } from '@/store';
defineOptions({ name: 'DashboardWorkbenchHeader' });
const auth = useAuthStore();
interface StatisticData { interface StatisticData {
id: number; id: number;
label: string; label: string;
value: string; value: string;
} }
const auth = useAuthStore();
const statisticData: StatisticData[] = [ const statisticData: StatisticData[] = [
{ {
id: 0, id: 0,

View File

@ -10,6 +10,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { Icon } from '@iconify/vue'; import { Icon } from '@iconify/vue';
defineOptions({ name: 'DashboardWorkbenchMainShortcutsCard' });
interface Props { interface Props {
/** 快捷操作名称 */ /** 快捷操作名称 */
label: string; label: string;

View File

@ -17,6 +17,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { Icon } from '@iconify/vue'; import { Icon } from '@iconify/vue';
defineOptions({ name: 'DashboardWorkbenchMainTechnologyCard' });
interface Props { interface Props {
/** 技术名称 */ /** 技术名称 */
name: string; name: string;

View File

@ -47,6 +47,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { TechnologyCard, ShortcutsCard } from './components'; import { TechnologyCard, ShortcutsCard } from './components';
defineOptions({ name: 'DashboardWorkbenchMain' });
interface Technology { interface Technology {
id: number; id: number;
name: string; name: string;
@ -57,19 +59,6 @@ interface Technology {
iconColor?: string; iconColor?: string;
} }
interface Activity {
id: number;
content: string;
time: string;
}
interface Shortcuts {
id: number;
label: string;
icon: string;
iconColor: string;
}
const technology: Technology[] = [ const technology: Technology[] = [
{ {
id: 0, id: 0,
@ -124,6 +113,12 @@ const technology: Technology[] = [
} }
]; ];
interface Activity {
id: number;
content: string;
time: string;
}
const activity: Activity[] = [ const activity: Activity[] = [
{ id: 4, content: 'Soybean 刚才把工作台页面随便写了一些,凑合能看了!', time: '2021-11-07 22:45:32' }, { id: 4, content: 'Soybean 刚才把工作台页面随便写了一些,凑合能看了!', time: '2021-11-07 22:45:32' },
{ id: 3, content: 'Soybean 正在忙于为soybean-admin写项目说明文档', time: '2021-11-03 20:33:31' }, { id: 3, content: 'Soybean 正在忙于为soybean-admin写项目说明文档', time: '2021-11-03 20:33:31' },
@ -132,6 +127,13 @@ const activity: Activity[] = [
{ id: 0, content: 'Soybean 在2021年5月28日创建了开源项目soybean-admin', time: '2021-05-28 22:22:22' } { id: 0, content: 'Soybean 在2021年5月28日创建了开源项目soybean-admin', time: '2021-05-28 22:22:22' }
]; ];
interface Shortcuts {
id: number;
label: string;
icon: string;
iconColor: string;
}
const shortcuts: Shortcuts[] = [ const shortcuts: Shortcuts[] = [
{ id: 0, label: '主控台', icon: 'mdi:desktop-mac-dashboard', iconColor: '#409eff' }, { id: 0, label: '主控台', icon: 'mdi:desktop-mac-dashboard', iconColor: '#409eff' },
{ id: 1, label: '系统管理', icon: 'ic:outline-settings', iconColor: '#7238d1' }, { id: 1, label: '系统管理', icon: 'ic:outline-settings', iconColor: '#7238d1' },

View File

@ -7,6 +7,8 @@ import { ref, onMounted } from 'vue';
import { useScriptTag } from '@vueuse/core'; import { useScriptTag } from '@vueuse/core';
import { BAIDU_MAP_SDK_URL } from '@/config'; import { BAIDU_MAP_SDK_URL } from '@/config';
defineOptions({ name: 'BaiduMap' });
const { load } = useScriptTag(BAIDU_MAP_SDK_URL); const { load } = useScriptTag(BAIDU_MAP_SDK_URL);
const domRef = ref<HTMLDivElement>(); const domRef = ref<HTMLDivElement>();

View File

@ -7,6 +7,8 @@ import { ref, onMounted } from 'vue';
import { useScriptTag } from '@vueuse/core'; import { useScriptTag } from '@vueuse/core';
import { GAODE_MAP_SDK_URL } from '@/config'; import { GAODE_MAP_SDK_URL } from '@/config';
defineOptions({ name: 'GaodeMap' });
const { load } = useScriptTag(GAODE_MAP_SDK_URL); const { load } = useScriptTag(GAODE_MAP_SDK_URL);
const domRef = ref<HTMLDivElement>(); const domRef = ref<HTMLDivElement>();

View File

@ -7,6 +7,8 @@ import { ref, onMounted } from 'vue';
import { useScriptTag } from '@vueuse/core'; import { useScriptTag } from '@vueuse/core';
import { TENCENT_MAP_SDK_URL } from '@/config'; import { TENCENT_MAP_SDK_URL } from '@/config';
defineOptions({ name: 'TencentMap' });
const { load } = useScriptTag(TENCENT_MAP_SDK_URL); const { load } = useScriptTag(TENCENT_MAP_SDK_URL);
const domRef = ref<HTMLDivElement | null>(null); const domRef = ref<HTMLDivElement | null>(null);

View File

@ -41,17 +41,17 @@ interface Props {
module: EnumType.LoginModuleKey; module: EnumType.LoginModuleKey;
} }
const props = defineProps<Props>();
const theme = useThemeStore();
const { title } = useAppInfo();
interface LoginModule { interface LoginModule {
key: EnumType.LoginModuleKey; key: EnumType.LoginModuleKey;
label: EnumLoginModule; label: EnumLoginModule;
component: Component; component: Component;
} }
const props = defineProps<Props>();
const theme = useThemeStore();
const { title } = useAppInfo();
const modules: LoginModule[] = [ const modules: LoginModule[] = [
{ key: 'pwd-login', label: EnumLoginModule['pwd-login'], component: PwdLogin }, { key: 'pwd-login', label: EnumLoginModule['pwd-login'], component: PwdLogin },
{ key: 'code-login', label: EnumLoginModule['code-login'], component: CodeLogin }, { key: 'code-login', label: EnumLoginModule['code-login'], component: CodeLogin },