feat: 大屏

This commit is contained in:
ygx
2026-01-25 17:31:51 +08:00
parent 864345317d
commit e2fe633b28
7 changed files with 48 additions and 14 deletions

View File

@@ -78,8 +78,11 @@ axiosInstance.interceptors.response.use(
// 登录过期 // 登录过期
if (code === ResultEnum.TOKEN_OVERDUE) { if (code === ResultEnum.TOKEN_OVERDUE) {
window['$message'].error(window['$t']('http.token_overdue_message')) window['$message'].error(window['$t']('http.token_overdue_message'))
// iframe 嵌入模式下,token 过期不重定向到登录 // token 过期,跳转到源站首
console.error('[GoView] iframe 模式token 已过期,请更新 URL 中的 token 参数') console.error('[GoView] token 已过期,即将跳转到源站首页')
setTimeout(() => {
window.location.href = window.location.origin
}, 1500)
return Promise.resolve(responseData) return Promise.resolve(responseData)
} }
@@ -97,7 +100,8 @@ axiosInstance.interceptors.response.use(
const status = err.response?.status const status = err.response?.status
switch (status) { switch (status) {
case 401: case 401:
routerTurnByName(PageEnum.BASE_LOGIN_NAME) // token 失效,跳转到源站首页
window.location.href = window.location.origin
Promise.reject(err) Promise.reject(err)
break break

View File

@@ -43,6 +43,10 @@ export enum PageEnum {
BASE_HOME_ITEMS = '/project/items', BASE_HOME_ITEMS = '/project/items',
BASE_HOME_ITEMS_NAME = 'Project-Items', BASE_HOME_ITEMS_NAME = 'Project-Items',
// 项目管理
BASE_HOME_MANAGEMENT = '/project/management',
BASE_HOME_MANAGEMENT_NAME = 'Project-Management',
// 我的模板 // 我的模板
BASE_HOME_TEMPLATE = '/project/my-template', BASE_HOME_TEMPLATE = '/project/my-template',
BASE_HOME_TEMPLATE_NAME = 'Project-My-Template', BASE_HOME_TEMPLATE_NAME = 'Project-My-Template',

View File

@@ -5,6 +5,7 @@ import { PageEnum } from '@/enums/pageEnum'
const importPath = { const importPath = {
'PageEnum.BASE_HOME_NAME': () => import('@/views/project/index.vue'), 'PageEnum.BASE_HOME_NAME': () => import('@/views/project/index.vue'),
'PageEnum.BASE_HOME_ITEMS_NAME': () => import('@/views/project/items/index.vue'), 'PageEnum.BASE_HOME_ITEMS_NAME': () => import('@/views/project/items/index.vue'),
'PageEnum.BASE_HOME_MANAGEMENT_NAME': () => import('@/views/project/items/index.vue'),
'PageEnum.BASE_HOME_TEMPLATE_NAME': () => import('@/views/project/mtTemplate/index.vue'), 'PageEnum.BASE_HOME_TEMPLATE_NAME': () => import('@/views/project/mtTemplate/index.vue'),
'PageEnum.BASE_HOME_TEMPLATE_MARKET_NAME': () => import('@/views/project/templateMarket/index.vue') 'PageEnum.BASE_HOME_TEMPLATE_MARKET_NAME': () => import('@/views/project/templateMarket/index.vue')
} }
@@ -27,6 +28,14 @@ const projectRoutes: RouteRecordRaw = {
title: '我的项目' title: '我的项目'
} }
}, },
{
path: PageEnum.BASE_HOME_MANAGEMENT,
name: PageEnum.BASE_HOME_MANAGEMENT_NAME,
component: importPath['PageEnum.BASE_HOME_MANAGEMENT_NAME'],
meta: {
title: '项目管理'
}
},
{ {
path: PageEnum.BASE_HOME_TEMPLATE, path: PageEnum.BASE_HOME_TEMPLATE,
name: PageEnum.BASE_HOME_TEMPLATE_NAME, name: PageEnum.BASE_HOME_TEMPLATE_NAME,

View File

@@ -111,7 +111,8 @@ export const logout = async () => {
window['$message'].success(window['$t']('global.logout_success')) window['$message'].success(window['$t']('global.logout_success'))
clearCookie(RequestHttpHeaderEnum.COOKIE) clearCookie(RequestHttpHeaderEnum.COOKIE)
clearLocalStorage(StorageEnum.GO_SYSTEM_STORE) clearLocalStorage(StorageEnum.GO_SYSTEM_STORE)
routerTurnByName(PageEnum.BASE_LOGIN_NAME) // 退出登录后跳转到源站首页
window.location.href = window.location.origin
} }
} catch (error) { } catch (error) {
window['$message'].success(window['$t']('global.logout_failure')) window['$message'].success(window['$t']('global.logout_failure'))

View File

@@ -6,16 +6,16 @@ import { Chartype, ChartList } from '../../../index.d'
import { ResultEnum } from '@/enums/httpEnum' import { ResultEnum } from '@/enums/httpEnum'
// 数据初始化 // 数据初始化
export const useDataListInit = () => { export const useDataListInit = (filterState?: number) => {
const loading = ref(true) const loading = ref(true)
const paginat = reactive({ const paginat = reactive({
// 当前页数 // 当前页数
page: 1, page: 1,
// 每页值 // 每页值
limit: 10, limit: 12,
// 总数 // 总数
count: 10 count: 0
}) })
const list = ref<ChartList>([]) const list = ref<ChartList>([])
@@ -23,13 +23,18 @@ export const useDataListInit = () => {
// 数据请求 // 数据请求
const fetchList = async () => { const fetchList = async () => {
loading.value = true loading.value = true
const { code, data }: any = await projectListApi({ const params: any = {
page: paginat.page, page: paginat.page,
size: paginat.limit size: paginat.limit
}) }
// 如果有 filterState 参数,添加到请求中
if (filterState !== undefined) {
params.state = filterState
}
const { code, data }: any = await projectListApi(params)
if (code === 0) { if (code === 0) {
paginat.count = data.total paginat.count = data.total
list.value = (data.list).map(e => { list.value = (data.list).map((e: any) => {
const { identity, projectName, state, createTime, indexImage, createUserId, backgroundImage } = e const { identity, projectName, state, createTime, indexImage, createUserId, backgroundImage } = e
return { return {
identity: identity, identity: identity,

View File

@@ -7,7 +7,7 @@
<!-- 列表 --> <!-- 列表 -->
<div v-show="!loading"> <div v-show="!loading">
<n-grid :x-gap="20" :y-gap="20" cols="2 s:2 m:3 l:4 xl:4 xxl:4" responsive="screen"> <n-grid :x-gap="20" :y-gap="20" cols="2 s:2 m:3 l:4 xl:4 xxl:4" responsive="screen">
<n-grid-item v-for="(item, index) in list" :key="item.id"> <n-grid-item v-for="(item, index) in list" :key="item.identity">
<project-items-card <project-items-card
:cardData="item" :cardData="item"
@preview="previewHandle" @preview="previewHandle"
@@ -51,9 +51,14 @@ import { icon } from '@/plugins'
import { useModalDataInit } from './hooks/useModal.hook' import { useModalDataInit } from './hooks/useModal.hook'
import { useDataListInit } from './hooks/useData.hook' import { useDataListInit } from './hooks/useData.hook'
// 接收父组件传入的 state 过滤参数
const props = defineProps<{
filterState?: number
}>()
const { CopyIcon, EllipsisHorizontalCircleSharpIcon } = icon.ionicons5 const { CopyIcon, EllipsisHorizontalCircleSharpIcon } = icon.ionicons5
const { modalData, modalShow, closeModal, previewHandle, resizeHandle, editHandle } = useModalDataInit() const { modalData, modalShow, closeModal, previewHandle, resizeHandle, editHandle } = useModalDataInit()
const { loading, paginat, list, changeSize, changePage, releaseHandle, deleteHandle } = useDataListInit() const { loading, paginat, list, changeSize, changePage, releaseHandle, deleteHandle } = useDataListInit(props.filterState)
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@@ -3,12 +3,12 @@
<div class="go-project-items-header"> <div class="go-project-items-header">
<project-layout-create :collapsed="false"></project-layout-create> <project-layout-create :collapsed="false"></project-layout-create>
</div> </div>
<project-items-list></project-items-list> <project-items-list :filter-state="filterState"></project-items-list>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { onMounted } from 'vue' import { onMounted, computed } from 'vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
import { ProjectItemsList } from './components/ProjectItemsList' import { ProjectItemsList } from './components/ProjectItemsList'
import { ProjectLayoutCreate } from '../layout/components/ProjectLayoutCreate' import { ProjectLayoutCreate } from '../layout/components/ProjectLayoutCreate'
@@ -17,11 +17,17 @@ import { useDesignStore } from '@/store/modules/designStore/designStore'
import { SystemStoreEnum, SystemStoreUserInfoEnum } from '@/store/modules/systemStore/systemStore.d' import { SystemStoreEnum, SystemStoreUserInfoEnum } from '@/store/modules/systemStore/systemStore.d'
import { ThemeEnum } from '@/enums/styleEnum' import { ThemeEnum } from '@/enums/styleEnum'
import { setHtmlTheme } from '@/utils' import { setHtmlTheme } from '@/utils'
import { PageEnum } from '@/enums/pageEnum'
const route = useRoute() const route = useRoute()
const systemStore = useSystemStore() const systemStore = useSystemStore()
const designStore = useDesignStore() const designStore = useDesignStore()
// 根据路由判断是否需要过滤 state=1 的数据
const filterState = computed(() => {
return route.name === PageEnum.BASE_HOME_MANAGEMENT_NAME ? 1 : undefined
})
// 组件挂载时处理 URL 参数中的 token 和 mode // 组件挂载时处理 URL 参数中的 token 和 mode
onMounted(() => { onMounted(() => {
const { token, mode } = route.query const { token, mode } = route.query