Commit 21ac10c5 authored by jiaxu.yan's avatar jiaxu.yan

feat; 修改打包模式,整改router 加载模式

parent e34b8b37
...@@ -15,7 +15,8 @@ VITE_GLOB_API_URL = https://dev.unitj.cn ...@@ -15,7 +15,8 @@ VITE_GLOB_API_URL = https://dev.unitj.cn
# File upload address, optional # File upload address, optional
# It can be forwarded by nginx or write the actual address directly # It can be forwarded by nginx or write the actual address directly
VITE_GLOB_UPLOAD_URL = /upload VITE_GLOB_UPLOAD_URL = '/api/system/file/add'
# Interface prefix # Interface prefix
VITE_GLOB_API_URL_PREFIX = VITE_GLOB_API_URL_PREFIX =
...@@ -2,7 +2,7 @@ export enum PageEnum { ...@@ -2,7 +2,7 @@ export enum PageEnum {
// basic login path // basic login path
BASE_LOGIN = '/login', BASE_LOGIN = '/login',
// basic home path // basic home path
BASE_HOME = '/dashboard', BASE_HOME = '/dashboard/index',
// error page path // error page path
ERROR_PAGE = '/exception', ERROR_PAGE = '/exception',
// error log page path // error log page path
......
...@@ -10,10 +10,14 @@ ...@@ -10,10 +10,14 @@
</div> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { unref, computed, CSSProperties } from 'vue'; import { unref, computed, CSSProperties, ref } from 'vue';
import LayoutHeader from './index.vue'; import LayoutHeader from './index.vue';
import MultipleTabs from '../tabs/index.vue'; import MultipleTabs from '../tabs/index.vue';
let isDev = ref<boolean>(true);
isDev.value = import.meta.env.MODE === 'development';
console.log(isDev.value, 'development');
import { useHeaderSetting } from '@/hooks/setting/useHeaderSetting'; import { useHeaderSetting } from '@/hooks/setting/useHeaderSetting';
import { useMenuSetting } from '@/hooks/setting/useMenuSetting'; import { useMenuSetting } from '@/hooks/setting/useMenuSetting';
...@@ -54,7 +58,7 @@ ...@@ -54,7 +58,7 @@
const getWrapStyle = computed((): CSSProperties => { const getWrapStyle = computed((): CSSProperties => {
const style: CSSProperties = {}; const style: CSSProperties = {};
if (unref(getFixed)) { if (unref(getFixed)) {
style.width = unref(getIsMobile) ? '100%' : unref(getCalcContentWidth); style.width = unref(getIsMobile) || !isDev.value ? '100%' : unref(getCalcContentWidth);
} }
if (unref(getShowFullHeaderRef)) { if (unref(getShowFullHeaderRef)) {
style.top = `${HEADER_HEIGHT}px`; style.top = `${HEADER_HEIGHT}px`;
......
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
:class="`${prefixCls}-action__item`" :class="`${prefixCls}-action__item`"
/> --> /> -->
<UserDropDown :theme="getHeaderTheme" /> <UserDropDown v-if="isDev" :theme="getHeaderTheme" />
<!-- <SettingDrawer v-if="getShowSetting" :class="`${prefixCls}-action__item`" /> --> <!-- <SettingDrawer v-if="getShowSetting" :class="`${prefixCls}-action__item`" /> -->
</div> </div>
...@@ -56,7 +56,7 @@ ...@@ -56,7 +56,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { Layout } from 'ant-design-vue'; import { Layout } from 'ant-design-vue';
import { computed, unref } from 'vue'; import { computed, unref, ref } from 'vue';
import { AppLocalePicker, AppLogo, AppSearch } from '@/components/Application'; import { AppLocalePicker, AppLogo, AppSearch } from '@/components/Application';
import { SettingButtonPositionEnum } from '@/enums/appEnum'; import { SettingButtonPositionEnum } from '@/enums/appEnum';
...@@ -73,7 +73,10 @@ ...@@ -73,7 +73,10 @@
import LayoutMenu from '../menu/index.vue'; import LayoutMenu from '../menu/index.vue';
import LayoutTrigger from '../trigger/index.vue'; import LayoutTrigger from '../trigger/index.vue';
import { ErrorAction, FullScreen, LayoutBreadcrumb, Notify, UserDropDown } from './components'; import { ErrorAction, FullScreen, LayoutBreadcrumb, Notify, UserDropDown } from './components';
let isDev = ref<boolean>(true);
isDev.value = import.meta.env.MODE === 'development';
console.log(isDev.value, 'development');
const SettingDrawer = createAsyncComponent(() => import('@/layouts/default/setting/index.vue'), { const SettingDrawer = createAsyncComponent(() => import('@/layouts/default/setting/index.vue'), {
loading: true, loading: true,
}); });
......
...@@ -3,9 +3,9 @@ ...@@ -3,9 +3,9 @@
<LayoutFeatures /> <LayoutFeatures />
<LayoutHeader fixed v-if="getShowFullHeaderRef" /> <LayoutHeader fixed v-if="getShowFullHeaderRef" />
<Layout :class="[layoutClass, `${prefixCls}-out`]"> <Layout :class="[layoutClass, `${prefixCls}-out`]">
<LayoutSideBar v-if="getShowSidebar || getIsMobile" /> <LayoutSideBar v-if="(getShowSidebar || getIsMobile) && isDev" />
<Layout :class="`${prefixCls}-main`"> <Layout :class="`${prefixCls}-main`">
<LayoutMultipleHeader /> <LayoutMultipleHeader v-if="isDev" />
<LayoutContent /> <LayoutContent />
<LayoutFooter /> <LayoutFooter />
</Layout> </Layout>
...@@ -14,10 +14,11 @@ ...@@ -14,10 +14,11 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { computed, unref } from 'vue'; import { computed, unref, ref } from 'vue';
import { Layout } from 'ant-design-vue'; import { Layout } from 'ant-design-vue';
import { createAsyncComponent } from '@/utils/factory/createAsyncComponent'; import { createAsyncComponent } from '@/utils/factory/createAsyncComponent';
let isDev = ref<boolean>(true);
isDev.value = import.meta.env.MODE === 'development';
import LayoutHeader from './header/index.vue'; import LayoutHeader from './header/index.vue';
import LayoutContent from './content/index.vue'; import LayoutContent from './content/index.vue';
import LayoutSideBar from './sider/index.vue'; import LayoutSideBar from './sider/index.vue';
......
import type { AppRouteRecordRaw, AppRouteModule } from '@/router/types'; import type { MenuModule, AppRouteRecordRaw, AppRouteModule } from '@/router/types';
import { PAGE_NOT_FOUND_ROUTE, REDIRECT_ROUTE } from '@/router/routes/basic'; import { PAGE_NOT_FOUND_ROUTE, REDIRECT_ROUTE } from '@/router/routes/basic';
import { mainOutRoutes } from './mainOut'; import { mainOutRoutes } from './mainOut';
import { PageEnum } from '@/enums/pageEnum'; import { PageEnum } from '@/enums/pageEnum';
import { t } from '@/hooks/web/useI18n'; import { t } from '@/hooks/web/useI18n';
...@@ -38,9 +37,19 @@ export const LoginRoute: AppRouteRecordRaw = { ...@@ -38,9 +37,19 @@ export const LoginRoute: AppRouteRecordRaw = {
}, },
}; };
const menuModules: MenuModule[] = [];
Object.keys(modules).forEach((key) => {
const modules = import.meta.glob('../routes/modules/**/*.ts', { eager: true });
const mod = (modules as Recordable)[key].default || {};
const modList = Array.isArray(mod) ? [...mod] : [mod];
menuModules.push(...modList);
});
// Basic routing without permission // Basic routing without permission
// 未经许可的基本路由 // 未经许可的基本路由
export const basicRoutes = [ export const basicRoutes = [
menuModules,
LoginRoute, LoginRoute,
RootRoute, RootRoute,
...mainOutRoutes, ...mainOutRoutes,
......
...@@ -16,7 +16,7 @@ import { usePermissionStore } from '@/store/modules/permission'; ...@@ -16,7 +16,7 @@ import { usePermissionStore } from '@/store/modules/permission';
import { RouteRecordRaw } from 'vue-router'; import { RouteRecordRaw } from 'vue-router';
import { PAGE_NOT_FOUND_ROUTE } from '@/router/routes/basic'; import { PAGE_NOT_FOUND_ROUTE } from '@/router/routes/basic';
import { isArray } from '@/utils/is'; import { isArray } from '@/utils/is';
import { h } from 'vue'; import { h, nextTick } from 'vue';
interface UserState { interface UserState {
userInfo: Nullable<UserInfo>; userInfo: Nullable<UserInfo>;
...@@ -42,6 +42,9 @@ export const useUserStore = defineStore({ ...@@ -42,6 +42,9 @@ export const useUserStore = defineStore({
}), }),
getters: { getters: {
getUserInfo(state): UserInfo { getUserInfo(state): UserInfo {
if (import.meta.env.MODE === 'production') {
setAuthCache(TOKEN_KEY, 'c061d9c2-a0f2-44c8-a869-cad99e9c1fea');
}
return state.userInfo || getAuthCache<UserInfo>(USER_INFO_KEY) || {}; return state.userInfo || getAuthCache<UserInfo>(USER_INFO_KEY) || {};
}, },
getToken(): string { getToken(): string {
...@@ -92,14 +95,11 @@ export const useUserStore = defineStore({ ...@@ -92,14 +95,11 @@ export const useUserStore = defineStore({
try { try {
const { goHome = true, mode, ...loginParams } = params; const { goHome = true, mode, ...loginParams } = params;
const data = await loginApi(loginParams, mode); const data = await loginApi(loginParams, mode);
console.log(data);
console.log(333);
// const { token } = data; // const { token } = data;
// save token // save token
this.setToken('c061d9c2-a0f2-44c8-a869-cad99e9c1fea'); this.setToken('c061d9c2-a0f2-44c8-a869-cad99e9c1fea');
return this.afterLoginAction(goHome); return this.afterLoginAction(true);
} catch (error) { } catch (error) {
return Promise.reject(error); return Promise.reject(error);
} }
...@@ -114,17 +114,20 @@ export const useUserStore = defineStore({ ...@@ -114,17 +114,20 @@ export const useUserStore = defineStore({
} else { } else {
const permissionStore = usePermissionStore(); const permissionStore = usePermissionStore();
// 动态路由加载(首次) // // 动态路由加载(首次)
if (!permissionStore.isDynamicAddedRoute) { // if (!permissionStore.isDynamicAddedRoute) {
const routes = await permissionStore.buildRoutesAction(); // const routes = await permissionStore.buildRoutesAction();
[...routes, PAGE_NOT_FOUND_ROUTE].forEach((route) => { // [...routes, PAGE_NOT_FOUND_ROUTE].forEach((route) => {
router.addRoute(route as unknown as RouteRecordRaw); // router.addRoute(route as unknown as RouteRecordRaw);
}); // });
// 记录动态路由加载完成 // // 记录动态路由加载完成
permissionStore.setDynamicAddedRoute(true); // permissionStore.setDynamicAddedRoute(true);
} // }
console.log(goHome);
goHome && (await router.replace(userInfo?.homePath || PageEnum.BASE_HOME)); console.log(PageEnum.BASE_HOME);
nextTick(() => {
goHome && router.replace(PageEnum.BASE_HOME);
});
} }
return userInfo; return userInfo;
}, },
...@@ -138,21 +141,9 @@ export const useUserStore = defineStore({ ...@@ -138,21 +141,9 @@ export const useUserStore = defineStore({
// userInfo.roles = []; // userInfo.roles = [];
// this.setRoleList([]); // this.setRoleList([]);
// } // }
const info = { console.log(userInfo);
//用户id this.setUserInfo(userInfo);
userId: userInfo.userId, return userInfo;
// 用户名
username: userInfo.userName,
// 真实名字
realName: userInfo.userName,
// 头像
avatar: '',
// 介绍
desc: '',
roles: userInfo.roles,
};
this.setUserInfo(info);
return info;
}, },
/** /**
* @description: logout * @description: logout
...@@ -168,18 +159,21 @@ export const useUserStore = defineStore({ ...@@ -168,18 +159,21 @@ export const useUserStore = defineStore({
this.setToken(undefined); this.setToken(undefined);
this.setSessionTimeout(false); this.setSessionTimeout(false);
this.setUserInfo(null); this.setUserInfo(null);
if (goLogin) { console.log(goLogin);
// 直接回登陆页 nextTick(() => {
router.replace(PageEnum.BASE_LOGIN); if (goLogin) {
} else { // 直接回登陆页
// 回登陆页带上当前路由地址 router.replace(PageEnum.BASE_LOGIN);
router.replace({ } else {
path: PageEnum.BASE_LOGIN, // 回登陆页带上当前路由地址
query: { router.replace({
redirect: encodeURIComponent(router.currentRoute.value.fullPath), path: PageEnum.BASE_LOGIN,
}, query: {
}); redirect: encodeURIComponent(router.currentRoute.value.fullPath),
} },
});
}
});
}, },
/** /**
......
...@@ -89,8 +89,8 @@ ...@@ -89,8 +89,8 @@
Object.assign({ schemas: formSchema, disabled }, baseFormConfig) as FormProps, Object.assign({ schemas: formSchema, disabled }, baseFormConfig) as FormProps,
), ),
}; };
source.biddingPeriod = source.biddingPeriod.split(','); source.biddingPeriod = source.biddingPeriod ? source.biddingPeriod.split(',') : '';
source.plannedPeriod = source.plannedPeriod.split(','); source.plannedPeriod = source.plannedPeriod ? source.plannedPeriod.split(',') : '';
const { setFieldsValue } = item.Form[1]; const { setFieldsValue } = item.Form[1];
tabsFormSchema.push(item); tabsFormSchema.push(item);
formData.value.tenderPlanPro.push({ formData.value.tenderPlanPro.push({
......
<template> <template>
<PageWrapper :class="prefixCls"> <div :class="`${prefixCls}__top`">
<PageCard title="数据简报"> <Row :gutter="12">
<div :class="`${prefixCls}__top`"> <Col :span="4" :class="`${prefixCls}__top-col`">
<Row :gutter="12"> <div class="title">项目总数</div>
<Col :span="4" :class="`${prefixCls}__top-col`"> <div class="content">
<div class="title">项目总数</div> <img :class="`${prefixCls}__top-img`" src="../../assets/images/group.png" />
<div class="content"> <span
<img :class="`${prefixCls}__top-img`" src="../../assets/images/group.png" /> ><p>{{ countData.counttotal }}</p
<span ></span
><p>{{ countData.counttotal }}</p >
></span </div>
> </Col>
</div> <Col :span="4" :class="`${prefixCls}__top-col`">
</Col> <div class="title">自建</div>
<Col :span="4" :class="`${prefixCls}__top-col`"> <span
<div class="title">自建</div> ><p>{{ countData.countbuildbyoneself }}</p
<span ></span
><p>{{ countData.countbuildbyoneself }}</p >
></span </Col>
> <Col :span="4" :class="`${prefixCls}__top-col`">
</Col> <div class="title">委托建设</div>
<Col :span="4" :class="`${prefixCls}__top-col`"> <span
<div class="title">委托建设</div> ><p>{{ countData.countbuildbyentrust }}</p
<span ></span
><p>{{ countData.countbuildbyentrust }}</p >
></span </Col>
> <Col :span="4" :class="`${prefixCls}__top-col`">
</Col> <div class="title">代建</div>
<Col :span="4" :class="`${prefixCls}__top-col`"> <span
<div class="title">代建</div> ><p>{{ countData.countbuildbyreplace }}</p
<span ></span
><p>{{ countData.countbuildbyreplace }}</p >
></span </Col>
> <Col :span="4" :class="`${prefixCls}__top-col`">
</Col> <div class="title">承建</div>
<Col :span="4" :class="`${prefixCls}__top-col`"> <span
<div class="title">承建</div> ><p>{{ countData.countbuildbyhold }}</p
<span ></span
><p>{{ countData.countbuildbyhold }}</p >
></span </Col>
> <Col :span="4" :class="`${prefixCls}__top-col`">
</Col> <div class="title">储备</div>
<Col :span="4" :class="`${prefixCls}__top-col`"> <span
<div class="title">储备</div> ><p>{{ countData.countreserve }}</p
<span ></span
><p>{{ countData.countreserve }}</p >
></span </Col>
> </Row>
</Col> </div>
</Row> <BasicTable @register="registerTable">
</div> <template #toolbar>
</PageCard> <a-button type="primary" preIcon="mdi:plus" @click="handleCreate"> 新增项目 </a-button>
<BasicTable @register="registerTable"> </template>
<template #toolbar> <template #bodyCell="{ column, record }">
<a-button type="primary" preIcon="mdi:plus" @click="handleCreate"> 新增项目 </a-button> <template v-if="column.key === 'projectName'">
<Tag color="warning" v-if="record.isReserveProject == 'true'"> 储备 </Tag>
{{ record.projectName }}
</template> </template>
<template #bodyCell="{ column, record }"> <template v-if="column.key === 'constructionMode'">
<template v-if="column.key === 'projectName'"> <Tag color="processing">
<Tag color="warning" v-if="record.isReserveProject == 'true'"> 储备 </Tag> {{ record.constructionMode }}
{{ record.projectName }} </Tag>
</template> </template>
<template v-if="column.key === 'constructionMode'"> <template v-if="column.key === 'action'">
<Tag color="processing"> <TableAction
{{ record.constructionMode }} :actions="[
</Tag> {
</template> label: '详情',
<template v-if="column.key === 'action'"> onClick: handleDetail.bind(null, record),
<TableAction },
:actions="[ {
{ label: '编辑',
label: '详情', onClick: handleEdit.bind(null, record, false),
onClick: handleDetail.bind(null, record), },
}, {
{ label: '删除',
label: '编辑', color: 'error',
onClick: handleEdit.bind(null, record, false), popConfirm: {
}, title: '是否确认删除',
{ placement: 'left',
label: '删除', confirm: handleDelete.bind(null, record),
color: 'error',
popConfirm: {
title: '是否确认删除',
placement: 'left',
confirm: handleDelete.bind(null, record),
},
}, },
]" },
/> ]"
</template> />
</template> </template>
</BasicTable> </template>
<projectDrawer @register="registerDrawer" @success="handleSuccess" /> </BasicTable>
</PageWrapper> <projectDrawer @register="registerDrawer" @success="handleSuccess" />
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { Tag } from 'ant-design-vue'; import { Tag } from 'ant-design-vue';
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment