Commit b4cbab0527405be38f5306b6293067b9f7058ab1

Authored by xp.Huang
2 parents 2ac743be 8cc7dd6c

Merge branch 'local_dev_ft' into 'main'

feat:新增大屏设计器页面和跳转配置

See merge request yunteng/thingskit-front!503
... ... @@ -16,7 +16,7 @@ VITE_GLOB_PUBLIC_PATH = /
16 16 # VITE_PROXY = [["/api","http://localhost:8080/api"],["/thingskit-drawio","http://localhost:3000/"]]
17 17 VITE_PROXY = [["/api","http://222.180.200.114:48080/api"],["/thingskit-drawio","http://localhost:3000/"],["/large-designer", "http://localhost:5555/large-designer/"]]
18 18 # VITE_PROXY = [["/api","http://121.37.251.8:8080/api"],["/thingskit-drawio","http://localhost:3000/"]]
19   -# VITE_PROXY = [["/api","http://192.168.10.103:8080/api"],["/thingskit-drawio","http://192.168.10.136:8080/api"]]
  19 +# VITE_PROXY = [["/api","http://192.168.10.125:8080/api"],["/thingskit-drawio","http://192.168.10.125:8080/api"]]
20 20
21 21 # 实时数据的ws地址
22 22 # VITE_WEB_SOCKET = ws://localhost:8080/api/ws/plugins/telemetry?token=
... ... @@ -39,6 +39,9 @@ VITE_GLOB_API_URL_PREFIX=/yt
39 39 #configuration
40 40 VITE_GLOB_CONFIGURATION = /thingskit-drawio
41 41
  42 +# 大屏设计器
  43 +VITE_GLOB_LARGE_DESIGNER = /large-designer
  44 +
42 45 # Content Security Policy
43 46 VITE_GLOB_CONTENT_SECURITY_POLICY = false
44 47
... ...
1   -# Whether to open mock
2   -VITE_GLOB_USE_MOCK = false
3   -
4   -# public path
5   -VITE_GLOB_PUBLIC_PATH = /
6   -
7   -# Delete console
8   -VITE_GLOB_DROP_CONSOLE = true
9   -
10   -# Whether to enable gzip or brotli compression
11   -# Optional: gzip | brotli | none
12   -# If you need multiple forms, you can use `,` to separate
13   -VITE_GLOB_BUILD_COMPRESS = 'gzip'
14   -
15   -# Whether to delete origin files when using compress, default false
16   -VITE_GLOB_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false
17   -
18   -# Basic interface address SPA
19   -VITE_GLOB_API_URL=http://122.9.141.195:8080/api
20   -
21   -# File upload address, optional
22   -# It can be forwarded by nginx or write the actual address directly
23   -VITE_GLOB_UPLOAD_URL=http://122.9.141.195:8080/api/yt/oss/upload
24   -
25   -# Interface prefix
26   -VITE_GLOB_API_URL_PREFIX=/yt
27   -
28   -# Whether to enable image compression
29   -VITE_GLOB_USE_IMAGEMIN= false
30   -
31   -# use pwa
32   -VITE_USE_PWA = false
33   -
34   -# Is it compatible with older browsers
35   -VITE_LEGACY = true
36   -
37   -# 实时数据的ws地址
38   -VITE_GLOB_WEB_SOCKET = ws://122.9.141.195:8080/api/ws/plugins/telemetry?token=
39   -
40   -#configuration
41   -VITE_GLOB_CONFIGURATION = /thingskit-scada
42   -
43   -# Content Security Policy
44   -VITE_GLOB_CONTENT_SECURITY_POLICY = false
45   -
46   -# Alarm Notify Polling Interval Time
47   -VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME = 60000
48   -
49   -# Alarm Notify Auto Close Time Unit is Second
50   -VITE_GLOB_ALARM_NOTIFY_DURATION = 5
  1 +# Whether to open mock
  2 +VITE_GLOB_USE_MOCK = false
  3 +
  4 +# public path
  5 +VITE_GLOB_PUBLIC_PATH = /
  6 +
  7 +# Delete console
  8 +VITE_GLOB_DROP_CONSOLE = true
  9 +
  10 +# Whether to enable gzip or brotli compression
  11 +# Optional: gzip | brotli | none
  12 +# If you need multiple forms, you can use `,` to separate
  13 +VITE_GLOB_BUILD_COMPRESS = 'gzip'
  14 +
  15 +# Whether to delete origin files when using compress, default false
  16 +VITE_GLOB_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false
  17 +
  18 +# Basic interface address SPA
  19 +VITE_GLOB_API_URL=http://122.9.141.195:8080/api
  20 +
  21 +# File upload address, optional
  22 +# It can be forwarded by nginx or write the actual address directly
  23 +VITE_GLOB_UPLOAD_URL=http://122.9.141.195:8080/api/yt/oss/upload
  24 +
  25 +# Interface prefix
  26 +VITE_GLOB_API_URL_PREFIX=/yt
  27 +
  28 +# Whether to enable image compression
  29 +VITE_GLOB_USE_IMAGEMIN= false
  30 +
  31 +# use pwa
  32 +VITE_USE_PWA = false
  33 +
  34 +# Is it compatible with older browsers
  35 +VITE_LEGACY = true
  36 +
  37 +# 实时数据的ws地址
  38 +VITE_GLOB_WEB_SOCKET = ws://122.9.141.195:8080/api/ws/plugins/telemetry?token=
  39 +
  40 +#configuration
  41 +VITE_GLOB_CONFIGURATION = /thingskit-scada
  42 +
  43 +# 大屏设计器
  44 +VITE_GLOB_LARGE_DESIGNER = /large-designer
  45 +
  46 +# Content Security Policy
  47 +VITE_GLOB_CONTENT_SECURITY_POLICY = false
  48 +
  49 +# Alarm Notify Polling Interval Time
  50 +VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME = 60000
  51 +
  52 +# Alarm Notify Auto Close Time Unit is Second
  53 +VITE_GLOB_ALARM_NOTIFY_DURATION = 5
... ...
  1 +import { defHttp } from '/@/utils/http/axios';
  2 +import type {
  3 + queryPageParams,
  4 + BigScreenCenterParams,
  5 + ConfigurationCenterInfo,
  6 + BigScreenCenterItemsModal,
  7 +} from './model/bigscreenCenterModel';
  8 +import { getPageData } from '../../base';
  9 +import { FileUploadResponse } from '../../oem/model';
  10 +enum API {
  11 + basicUrl = '/data_view',
  12 + UPLOAD = '/oss/upload',
  13 +}
  14 +
  15 +export const getPage = (params: queryPageParams) => {
  16 + return getPageData<BigScreenCenterItemsModal>(params, API.basicUrl);
  17 +};
  18 +
  19 +export const saveConfigurationCenter = (params: BigScreenCenterParams) => {
  20 + return defHttp.post({
  21 + url: API.basicUrl,
  22 + data: params,
  23 + });
  24 +};
  25 +
  26 +export const updateConfigurationCenter = (params: BigScreenCenterParams) => {
  27 + return defHttp.put({
  28 + url: API.basicUrl,
  29 + data: params,
  30 + });
  31 +};
  32 +
  33 +export const deleteBigScreenenter = (ids: string[]) => {
  34 + return defHttp.delete({
  35 + url: API.basicUrl,
  36 + data: {
  37 + ids: ids,
  38 + },
  39 + });
  40 +};
  41 +
  42 +export const saveOrUpdateBigScreenCenter = (params: ConfigurationCenterInfo, isUpdate: boolean) => {
  43 + return isUpdate ? updateConfigurationCenter(params) : saveConfigurationCenter(params);
  44 +};
  45 +
  46 +export const uploadThumbnail = (file: FormData) => {
  47 + return defHttp.post<FileUploadResponse>({ url: API.UPLOAD, params: file });
  48 +};
... ...
  1 +import { BasicPageParams } from '/@/api/model/baseModel';
  2 +
  3 +export interface BigScreenCenterItemsModel {
  4 + id: string;
  5 + name: string;
  6 + createTime: string;
  7 + creator: string;
  8 + remark: string;
  9 +}
  10 +export type queryPageParams = BasicPageParams & {
  11 + name?: Nullable<string>;
  12 + organizationId?: Nullable<number>;
  13 +};
  14 +
  15 +export interface ConfigurationModal {
  16 + items: BigScreenCenterItemsModel[];
  17 + total: number;
  18 +}
  19 +
  20 +export interface BigScreenCenterParams {
  21 + name: string;
  22 + createTime: string;
  23 + creator: string;
  24 + remark: string;
  25 + defaultContent?: string;
  26 +}
  27 +export type ConfigurationCenterInfo = BigScreenCenterParams;
... ...
1   -<script lang="ts" setup>
2   - import { Icon } from '/@/components/Icon';
3   - import { computed, ExtractPropTypes, unref } from 'vue';
4   - import { usePermission } from '/@/hooks/web/usePermission';
5   -
6   - interface AuthIconProps extends ExtractPropTypes<typeof Icon> {
7   - auth?: string;
8   - }
9   -
10   - const props = defineProps<AuthIconProps>();
11   -
12   - const emit = defineEmits(['click']);
13   -
14   - const { hasPermission } = usePermission();
15   -
16   - const getHasPermission = computed(() => {
17   - const { auth } = props;
18   - return auth ? hasPermission(auth) : true;
19   - });
20   -
21   - const getBindProps = computed(() => {
22   - return {
23   - ...props,
24   - ...(unref(getHasPermission) ? { onClick: (event: Event) => emit('click', event) } : {}),
25   - };
26   - });
27   -</script>
28   -
29   -<template>
30   - <Icon
31   - v-bind="getBindProps"
32   - class="justify-center items-center"
33   - :class="getHasPermission ? '' : '!cursor-not-allowed !text-gray-200'"
34   - />
35   -</template>
  1 +<script lang="ts" setup>
  2 + import { Icon } from '/@/components/Icon';
  3 + import { computed, ExtractPropTypes, unref } from 'vue';
  4 + import { usePermission } from '/@/hooks/web/usePermission';
  5 +
  6 + interface AuthIconProps extends ExtractPropTypes<typeof Icon> {
  7 + auth?: string;
  8 + }
  9 +
  10 + const props = defineProps<AuthIconProps>();
  11 +
  12 + const emit = defineEmits(['click']);
  13 +
  14 + const { hasPermission } = usePermission();
  15 +
  16 + const getHasPermission = computed(() => {
  17 + const { auth } = props;
  18 + console.log(auth);
  19 + return auth ? hasPermission(auth) : true;
  20 + });
  21 +
  22 + const getBindProps = computed(() => {
  23 + return {
  24 + ...props,
  25 + ...(unref(getHasPermission) ? { onClick: (event: Event) => emit('click', event) } : {}),
  26 + };
  27 + });
  28 +</script>
  29 +
  30 +<template>
  31 + <Icon
  32 + v-bind="getBindProps"
  33 + class="justify-center items-center"
  34 + :class="getHasPermission ? '' : '!cursor-not-allowed !text-gray-200'"
  35 + />
  36 +</template>
... ...
1   -import type { GlobConfig } from '/#/config';
2   -
3   -import { warn } from '/@/utils/log';
4   -import { getAppEnvConfig } from '/@/utils/env';
5   -
6   -export const useGlobSetting = (): Readonly<GlobConfig> => {
7   - const {
8   - VITE_GLOB_APP_TITLE,
9   - VITE_GLOB_API_URL,
10   - VITE_GLOB_APP_SHORT_NAME,
11   - VITE_GLOB_API_URL_PREFIX,
12   - VITE_GLOB_UPLOAD_URL,
13   - VITE_GLOB_CONFIGURATION,
14   - VITE_GLOB_WEB_SOCKET,
15   - VITE_GLOB_CONTENT_SECURITY_POLICY,
16   - VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME,
17   - VITE_GLOB_ALARM_NOTIFY_DURATION,
18   - } = getAppEnvConfig();
19   -
20   - if (!/[a-zA-Z\_]*/.test(VITE_GLOB_APP_SHORT_NAME)) {
21   - warn(
22   - `VITE_GLOB_APP_SHORT_NAME Variables can only be characters/underscores, please modify in the environment variables and re-running.`
23   - );
24   - }
25   -
26   - // Take global configuration
27   - const glob: Readonly<GlobConfig> = {
28   - title: VITE_GLOB_APP_TITLE,
29   - apiUrl: VITE_GLOB_API_URL,
30   - shortName: VITE_GLOB_APP_SHORT_NAME,
31   - urlPrefix: VITE_GLOB_API_URL_PREFIX,
32   - uploadUrl: VITE_GLOB_UPLOAD_URL,
33   - configurationPrefix: VITE_GLOB_CONFIGURATION,
34   - socketUrl: VITE_GLOB_WEB_SOCKET,
35   - securityPolicy: VITE_GLOB_CONTENT_SECURITY_POLICY,
36   - alarmNotifyDuration: VITE_GLOB_ALARM_NOTIFY_DURATION,
37   - alarmPollingInterval: VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME,
38   - };
39   - return glob as Readonly<GlobConfig>;
40   -};
  1 +import type { GlobConfig } from '/#/config';
  2 +
  3 +import { warn } from '/@/utils/log';
  4 +import { getAppEnvConfig } from '/@/utils/env';
  5 +
  6 +export const useGlobSetting = (): Readonly<GlobConfig> => {
  7 + const {
  8 + VITE_GLOB_APP_TITLE,
  9 + VITE_GLOB_API_URL,
  10 + VITE_GLOB_APP_SHORT_NAME,
  11 + VITE_GLOB_API_URL_PREFIX,
  12 + VITE_GLOB_UPLOAD_URL,
  13 + VITE_GLOB_CONFIGURATION,
  14 + VITE_GLOB_WEB_SOCKET,
  15 + VITE_GLOB_CONTENT_SECURITY_POLICY,
  16 + VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME,
  17 + VITE_GLOB_ALARM_NOTIFY_DURATION,
  18 + VITE_GLOB_LARGE_DESIGNER,
  19 + } = getAppEnvConfig();
  20 +
  21 + if (!/[a-zA-Z\_]*/.test(VITE_GLOB_APP_SHORT_NAME)) {
  22 + warn(
  23 + `VITE_GLOB_APP_SHORT_NAME Variables can only be characters/underscores, please modify in the environment variables and re-running.`
  24 + );
  25 + }
  26 +
  27 + // Take global configuration
  28 + const glob: Readonly<GlobConfig> = {
  29 + title: VITE_GLOB_APP_TITLE,
  30 + apiUrl: VITE_GLOB_API_URL,
  31 + shortName: VITE_GLOB_APP_SHORT_NAME,
  32 + urlPrefix: VITE_GLOB_API_URL_PREFIX,
  33 + uploadUrl: VITE_GLOB_UPLOAD_URL,
  34 + configurationPrefix: VITE_GLOB_CONFIGURATION,
  35 + largeDesignerPrefix: VITE_GLOB_LARGE_DESIGNER,
  36 + socketUrl: VITE_GLOB_WEB_SOCKET,
  37 + securityPolicy: VITE_GLOB_CONTENT_SECURITY_POLICY,
  38 + alarmNotifyDuration: VITE_GLOB_ALARM_NOTIFY_DURATION,
  39 + alarmPollingInterval: VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME,
  40 + };
  41 + return glob as Readonly<GlobConfig>;
  42 +};
... ...
1   -import type { GlobEnvConfig } from '/#/config';
2   -
3   -import { warn } from '/@/utils/log';
4   -import pkg from '../../package.json';
5   -import { getConfigFileName } from '../../build/getConfigFileName';
6   -
7   -export function getCommonStoragePrefix() {
8   - const { VITE_GLOB_APP_SHORT_NAME } = getAppEnvConfig();
9   - return `${VITE_GLOB_APP_SHORT_NAME}__${getEnv()}`.toUpperCase();
10   -}
11   -
12   -// Generate cache key according to version
13   -export function getStorageShortName() {
14   - return `${getCommonStoragePrefix()}${`__${pkg.version}`}__`.toUpperCase();
15   -}
16   -
17   -export function getAppEnvConfig() {
18   - const ENV_NAME = getConfigFileName(import.meta.env);
19   -
20   - const ENV = (import.meta.env.DEV
21   - ? // Get the global configuration (the configuration will be extracted independently when packaging)
22   - (import.meta.env as unknown as GlobEnvConfig)
23   - : window[ENV_NAME as any]) as unknown as GlobEnvConfig;
24   - const {
25   - VITE_GLOB_APP_TITLE,
26   - VITE_GLOB_API_URL,
27   - VITE_GLOB_APP_SHORT_NAME,
28   - VITE_GLOB_API_URL_PREFIX,
29   - VITE_GLOB_UPLOAD_URL,
30   - VITE_GLOB_CONFIGURATION,
31   - VITE_GLOB_WEB_SOCKET,
32   - VITE_GLOB_CONTENT_SECURITY_POLICY,
33   - VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME,
34   - VITE_GLOB_ALARM_NOTIFY_DURATION,
35   - } = ENV;
36   -
37   - if (!/^[a-zA-Z\_]*$/.test(VITE_GLOB_APP_SHORT_NAME)) {
38   - warn(
39   - `VITE_GLOB_APP_SHORT_NAME Variables can only be characters/underscores, please modify in the environment variables and re-running.`
40   - );
41   - }
42   -
43   - return {
44   - VITE_GLOB_APP_TITLE,
45   - VITE_GLOB_API_URL,
46   - VITE_GLOB_APP_SHORT_NAME,
47   - VITE_GLOB_API_URL_PREFIX,
48   - VITE_GLOB_UPLOAD_URL,
49   - VITE_GLOB_CONFIGURATION,
50   - VITE_GLOB_WEB_SOCKET,
51   - VITE_GLOB_CONTENT_SECURITY_POLICY,
52   - VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME,
53   - VITE_GLOB_ALARM_NOTIFY_DURATION,
54   - };
55   -}
56   -
57   -/**
58   - * @description: Development mode
59   - */
60   -export const devMode = 'development';
61   -
62   -/**
63   - * @description: Production mode
64   - */
65   -export const prodMode = 'production';
66   -
67   -/**
68   - * @description: Get environment variables
69   - * @returns:
70   - * @example:
71   - */
72   -export function getEnv(): string {
73   - return import.meta.env.MODE;
74   -}
75   -
76   -/**
77   - * @description: Is it a development mode
78   - * @returns:
79   - * @example:
80   - */
81   -export function isDevMode(): boolean {
82   - return import.meta.env.DEV;
83   -}
84   -
85   -/**
86   - * @description: Is it a production mode
87   - * @returns:
88   - * @example:
89   - */
90   -export function isProdMode(): boolean {
91   - return import.meta.env.PROD;
92   -}
  1 +import type { GlobEnvConfig } from '/#/config';
  2 +
  3 +import { warn } from '/@/utils/log';
  4 +import pkg from '../../package.json';
  5 +import { getConfigFileName } from '../../build/getConfigFileName';
  6 +
  7 +export function getCommonStoragePrefix() {
  8 + const { VITE_GLOB_APP_SHORT_NAME } = getAppEnvConfig();
  9 + return `${VITE_GLOB_APP_SHORT_NAME}__${getEnv()}`.toUpperCase();
  10 +}
  11 +
  12 +// Generate cache key according to version
  13 +export function getStorageShortName() {
  14 + return `${getCommonStoragePrefix()}${`__${pkg.version}`}__`.toUpperCase();
  15 +}
  16 +
  17 +export function getAppEnvConfig() {
  18 + const ENV_NAME = getConfigFileName(import.meta.env);
  19 +
  20 + const ENV = (import.meta.env.DEV
  21 + ? // Get the global configuration (the configuration will be extracted independently when packaging)
  22 + (import.meta.env as unknown as GlobEnvConfig)
  23 + : window[ENV_NAME as any]) as unknown as GlobEnvConfig;
  24 + const {
  25 + VITE_GLOB_APP_TITLE,
  26 + VITE_GLOB_API_URL,
  27 + VITE_GLOB_APP_SHORT_NAME,
  28 + VITE_GLOB_API_URL_PREFIX,
  29 + VITE_GLOB_UPLOAD_URL,
  30 + VITE_GLOB_CONFIGURATION,
  31 + VITE_GLOB_WEB_SOCKET,
  32 + VITE_GLOB_CONTENT_SECURITY_POLICY,
  33 + VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME,
  34 + VITE_GLOB_ALARM_NOTIFY_DURATION,
  35 + VITE_GLOB_LARGE_DESIGNER,
  36 + } = ENV;
  37 +
  38 + if (!/^[a-zA-Z\_]*$/.test(VITE_GLOB_APP_SHORT_NAME)) {
  39 + warn(
  40 + `VITE_GLOB_APP_SHORT_NAME Variables can only be characters/underscores, please modify in the environment variables and re-running.`
  41 + );
  42 + }
  43 +
  44 + return {
  45 + VITE_GLOB_APP_TITLE,
  46 + VITE_GLOB_API_URL,
  47 + VITE_GLOB_APP_SHORT_NAME,
  48 + VITE_GLOB_API_URL_PREFIX,
  49 + VITE_GLOB_UPLOAD_URL,
  50 + VITE_GLOB_CONFIGURATION,
  51 + VITE_GLOB_WEB_SOCKET,
  52 + VITE_GLOB_CONTENT_SECURITY_POLICY,
  53 + VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME,
  54 + VITE_GLOB_ALARM_NOTIFY_DURATION,
  55 + VITE_GLOB_LARGE_DESIGNER,
  56 + };
  57 +}
  58 +
  59 +/**
  60 + * @description: Development mode
  61 + */
  62 +export const devMode = 'development';
  63 +
  64 +/**
  65 + * @description: Production mode
  66 + */
  67 +export const prodMode = 'production';
  68 +
  69 +/**
  70 + * @description: Get environment variables
  71 + * @returns:
  72 + * @example:
  73 + */
  74 +export function getEnv(): string {
  75 + return import.meta.env.MODE;
  76 +}
  77 +
  78 +/**
  79 + * @description: Is it a development mode
  80 + * @returns:
  81 + * @example:
  82 + */
  83 +export function isDevMode(): boolean {
  84 + return import.meta.env.DEV;
  85 +}
  86 +
  87 +/**
  88 + * @description: Is it a production mode
  89 + * @returns:
  90 + * @example:
  91 + */
  92 +export function isProdMode(): boolean {
  93 + return import.meta.env.PROD;
  94 +}
... ...
  1 +<template>
  2 + <BasicDrawer
  3 + v-bind="$attrs"
  4 + @register="registerDrawer"
  5 + showFooter
  6 + :title="getTitle"
  7 + width="30%"
  8 + @ok="handleSubmit"
  9 + >
  10 + <BasicForm @register="registerForm" />
  11 + </BasicDrawer>
  12 +</template>
  13 +<script lang="ts">
  14 + import { defineComponent, ref, computed, unref } from 'vue';
  15 + import { BasicForm, useForm } from '/@/components/Form';
  16 + import { formSchema, Platform } from './config';
  17 + import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
  18 + import { useMessage } from '/@/hooks/web/useMessage';
  19 + import { saveOrUpdateBigScreenCenter } from '/@/api/bigscreen/center/bigscreenCenter';
  20 + import { FileItem } from '/@/components/Form/src/components/ApiUpload.vue';
  21 + import { buildUUID } from '/@/utils/uuid';
  22 +
  23 + export default defineComponent({
  24 + name: 'BigScreenDrawer',
  25 + components: { BasicDrawer, BasicForm },
  26 + emits: ['success', 'register'],
  27 + setup(_, { emit }) {
  28 + const isUpdate = ref(true);
  29 +
  30 + const [registerForm, { validate, setFieldsValue, resetFields }] = useForm({
  31 + labelWidth: 120,
  32 + schemas: formSchema,
  33 + showActionButtonGroup: false,
  34 + });
  35 +
  36 + const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
  37 + await resetFields();
  38 + setDrawerProps({ confirmLoading: false });
  39 + isUpdate.value = !!data?.isUpdate;
  40 + if (unref(isUpdate)) {
  41 + if (data.record.thumbnail) {
  42 + data.record.thumbnail = [
  43 + { uid: buildUUID(), name: 'name', url: data.record.thumbnail } as FileItem,
  44 + ];
  45 + }
  46 + if (data.record.organizationDTO) {
  47 + await setFieldsValue(data.record);
  48 + } else {
  49 + Reflect.deleteProperty(data.record, 'organizationId');
  50 + await setFieldsValue(data.record);
  51 + }
  52 + }
  53 + });
  54 +
  55 + const getTitle = computed(() => (!unref(isUpdate) ? '新增大屏' : '编辑大屏'));
  56 +
  57 + const getDefaultContent = (platform: Platform) => {
  58 + if (platform === Platform.PC) {
  59 + }
  60 + };
  61 +
  62 + async function handleSubmit() {
  63 + try {
  64 + const { createMessage } = useMessage();
  65 + const values = await validate();
  66 + if (Reflect.has(values, 'thumbnail')) {
  67 + const file = (values.thumbnail || []).at(0) || {};
  68 + values.thumbnail = file.url || null;
  69 + }
  70 + setDrawerProps({ confirmLoading: true });
  71 + let saveMessage = '添加成功';
  72 + let updateMessage = '修改成功';
  73 + values.defaultContent = getDefaultContent(values.platform);
  74 + await saveOrUpdateBigScreenCenter(values, unref(isUpdate));
  75 + closeDrawer();
  76 + emit('success');
  77 + createMessage.success(unref(isUpdate) ? updateMessage : saveMessage);
  78 + } finally {
  79 + setDrawerProps({ confirmLoading: false });
  80 + }
  81 + }
  82 +
  83 + return {
  84 + getTitle,
  85 + registerDrawer,
  86 + registerForm,
  87 + handleSubmit,
  88 + };
  89 + },
  90 + });
  91 +</script>
... ...
  1 +import { FormSchema } from '/@/components/Table';
  2 +import { getOrganizationList } from '/@/api/system/system';
  3 +import { copyTransFun } from '/@/utils/fnUtils';
  4 +import { FileItem } from '/@/components/Form/src/components/ApiUpload.vue';
  5 +import { createImgPreview } from '/@/components/Preview';
  6 +import { uploadThumbnail } from '/@/api/configuration/center/configurationCenter';
  7 +export enum Platform {
  8 + PHONE = 0,
  9 + PC = 1,
  10 +}
  11 +
  12 +export enum ConfigurationPermission {
  13 + CREATE = 'api:yt:dataview:center:post',
  14 + UPDATE = 'api:yt:dataview:center:update',
  15 + DELETE = 'api:yt:dataview:center:delete',
  16 + DESIGN = 'api:yt:dataview:center:get_configuration_info:design',
  17 + PREVIEW = 'api:yt:dataview:center:get_configuration_info:preview',
  18 +}
  19 +
  20 +// 查询字段
  21 +export const searchFormSchema: FormSchema[] = [
  22 + {
  23 + field: 'name',
  24 + label: '大屏名称',
  25 + component: 'Input',
  26 + colProps: { span: 8 },
  27 + componentProps: {
  28 + maxLength: 36,
  29 + placeholder: '请输入大屏名称',
  30 + },
  31 + },
  32 +];
  33 +
  34 +export const formSchema: FormSchema[] = [
  35 + {
  36 + field: 'thumbnail',
  37 + label: '缩略图',
  38 + component: 'ApiUpload',
  39 + changeEvent: 'update:fileList',
  40 + valueField: 'fileList',
  41 + componentProps: () => {
  42 + return {
  43 + listType: 'picture-card',
  44 + maxFileLimit: 1,
  45 + api: async (file: File) => {
  46 + try {
  47 + const formData = new FormData();
  48 + formData.set('file', file);
  49 + const { fileStaticUri, fileName } = await uploadThumbnail(formData);
  50 + return {
  51 + uid: fileStaticUri,
  52 + name: fileName,
  53 + url: fileStaticUri,
  54 + } as FileItem;
  55 + } catch (error) {
  56 + return {};
  57 + }
  58 + },
  59 + onPreview: (fileList: FileItem) => {
  60 + createImgPreview({ imageList: [fileList.url!] });
  61 + },
  62 + };
  63 + },
  64 + },
  65 +
  66 + {
  67 + field: 'name',
  68 + label: '大屏名称',
  69 + required: true,
  70 + component: 'Input',
  71 + componentProps: {
  72 + placeholder: '请输入大屏名称',
  73 + maxLength: 255,
  74 + },
  75 + },
  76 + {
  77 + field: 'organizationId',
  78 + label: '所属组织',
  79 + required: true,
  80 + component: 'ApiTreeSelect',
  81 + componentProps: {
  82 + api: async () => {
  83 + const data = await getOrganizationList();
  84 + copyTransFun(data as any as any[]);
  85 + return data;
  86 + },
  87 + },
  88 + },
  89 + {
  90 + field: 'state',
  91 + label: '发布状态',
  92 + required: true,
  93 + component: 'RadioGroup',
  94 + defaultValue: Platform.PC,
  95 + componentProps: {
  96 + defaultValue: Platform.PC,
  97 + options: [
  98 + { label: '未发布', value: Platform.PC },
  99 + { label: '已发布', value: Platform.PHONE },
  100 + ],
  101 + },
  102 + },
  103 + {
  104 + field: 'remark',
  105 + label: '备注',
  106 + component: 'InputTextArea',
  107 + componentProps: {
  108 + placeholder: '请输入备注',
  109 + maxLength: 255,
  110 + },
  111 + },
  112 + {
  113 + field: 'id',
  114 + label: '',
  115 + component: 'Input',
  116 + show: false,
  117 + componentProps: {
  118 + maxLength: 36,
  119 + placeholder: 'id',
  120 + },
  121 + },
  122 +];
... ...
  1 +<script setup lang="ts">
  2 + import { List, Card, Button, PaginationProps, Tooltip } from 'ant-design-vue';
  3 + import { ReloadOutlined } from '@ant-design/icons-vue';
  4 + import { onMounted, reactive, ref, unref } from 'vue';
  5 + import { OrganizationIdTree, useResetOrganizationTree } from '../common/organizationIdTree';
  6 + import { deleteBigScreenenter, getPage } from '/@/api/bigscreen/center/bigscreenCenter';
  7 + import { BigScreenCenterItemsModel } from '/@/api/bigscreen/center/model/bigscreenCenterModel';
  8 + import { PageWrapper } from '/@/components/Page';
  9 + import { BasicForm, useForm } from '/@/components/Form';
  10 + import { ConfigurationPermission, searchFormSchema } from './config';
  11 + import { useMessage } from '/@/hooks/web/useMessage';
  12 + import { Authority } from '/@/components/Authority';
  13 + import ConfigurationCenterDrawer from './BigScreenDrawer.vue';
  14 + import { useDrawer } from '/@/components/Drawer';
  15 + import { getBoundingClientRect } from '/@/utils/domUtils';
  16 + import configurationSrc from '/@/assets/icons/configuration.svg';
  17 + import { cloneDeep } from 'lodash';
  18 + import { useGlobSetting } from '/@/hooks/setting';
  19 + import { AuthIcon, CardLayoutButton } from '/@/components/Widget';
  20 + import AuthDropDown from '/@/components/Widget/AuthDropDown.vue';
  21 +
  22 + const listColumn = ref(5);
  23 +
  24 + const { createMessage } = useMessage();
  25 +
  26 + const organizationId = ref<Nullable<number>>(null);
  27 +
  28 + const pagination = reactive<PaginationProps>({
  29 + size: 'small',
  30 + showTotal: (total: number) => `共 ${total} 条数据`,
  31 + current: 1,
  32 + pageSize: unref(listColumn) * 2,
  33 + onChange: (page: number) => {
  34 + pagination.current = page;
  35 + getListData();
  36 + },
  37 + });
  38 +
  39 + const loading = ref(false);
  40 +
  41 + const dataSource = ref<BigScreenCenterItemsModel[]>([]);
  42 +
  43 + const [registerForm, { getFieldsValue }] = useForm({
  44 + schemas: searchFormSchema,
  45 + showAdvancedButton: true,
  46 + labelWidth: 100,
  47 + compact: true,
  48 + resetFunc: () => {
  49 + resetFn();
  50 + organizationId.value = null;
  51 + return getListData();
  52 + },
  53 + submitFunc: async () => {
  54 + const value = getFieldsValue();
  55 + getListData(value);
  56 + },
  57 + });
  58 +
  59 + async function getListData(value: Recordable = {}) {
  60 + try {
  61 + loading.value = true;
  62 + const pageSize = unref(listColumn) * 2;
  63 + const { items, total } = await getPage({
  64 + organizationId: unref(organizationId),
  65 + ...value,
  66 + page: pagination.current!,
  67 + pageSize,
  68 + });
  69 +
  70 + dataSource.value = items;
  71 + Object.assign(pagination, { total, pageSize });
  72 + } catch (error) {
  73 + } finally {
  74 + loading.value = false;
  75 + }
  76 + }
  77 +
  78 + onMounted(() => {
  79 + getListData();
  80 + });
  81 +
  82 + const searchInfo = reactive<Recordable>({});
  83 + const { organizationIdTreeRef, resetFn } = useResetOrganizationTree(searchInfo);
  84 + const handleSelect = (orgId: number) => {
  85 + organizationId.value = orgId;
  86 + getListData();
  87 + };
  88 +
  89 + const [registerDrawer, { openDrawer }] = useDrawer();
  90 +
  91 + const handleCreateOrUpdate = (record?: BigScreenCenterItemsModel) => {
  92 + if (record) {
  93 + openDrawer(true, {
  94 + isUpdate: true,
  95 + record: cloneDeep(record),
  96 + });
  97 + } else {
  98 + openDrawer(true, {
  99 + isUpdate: false,
  100 + });
  101 + }
  102 + };
  103 +
  104 + const { largeDesignerPrefix } = useGlobSetting();
  105 +
  106 + const handlePreview = (record: BigScreenCenterItemsModel) => {
  107 + window.open(`${largeDesignerPrefix}/${record.id}`);
  108 + };
  109 +
  110 + const handleDesign = (record: BigScreenCenterItemsModel) => {
  111 + window.open(`${largeDesignerPrefix}/${record.id}`);
  112 + };
  113 +
  114 + const handleDelete = async (record: BigScreenCenterItemsModel) => {
  115 + try {
  116 + await deleteBigScreenenter([record.id]);
  117 + createMessage.success('删除成功');
  118 + await getListData();
  119 + } catch (error) {}
  120 + };
  121 +
  122 + const handleCardLayoutChange = () => {
  123 + pagination.current = 1;
  124 + getListData();
  125 + };
  126 +
  127 + const listEl = ref<Nullable<ComponentElRef>>(null);
  128 +
  129 + onMounted(() => {
  130 + const clientHeight = document.documentElement.clientHeight;
  131 + const rect = getBoundingClientRect(unref(listEl)!.$el!) as DOMRect;
  132 + // margin-top 24 height 24
  133 + const paginationHeight = 24 + 24 + 8;
  134 + // list pading top 8 maring-top 8 extra slot 56
  135 + const listContainerMarginBottom = 8 + 8 + 56;
  136 + const listContainerHeight =
  137 + clientHeight - rect.top - paginationHeight - listContainerMarginBottom;
  138 + const listContainerEl = (unref(listEl)!.$el as HTMLElement).querySelector(
  139 + '.ant-spin-container'
  140 + ) as HTMLElement;
  141 + listContainerEl &&
  142 + (listContainerEl.style.height = listContainerHeight + 'px') &&
  143 + (listContainerEl.style.overflowY = 'auto') &&
  144 + (listContainerEl.style.overflowX = 'hidden');
  145 + });
  146 +</script>
  147 +
  148 +<template>
  149 + <PageWrapper dense contentFullHeight contentClass="flex">
  150 + <OrganizationIdTree @select="handleSelect" ref="organizationIdTreeRef" />
  151 + <section class="flex-auto p-4 w-3/4 xl:w-4/5 w-full configuration-list">
  152 + <div class="flex-auto w-full bg-light-50 dark:bg-dark-900 p-4">
  153 + <BasicForm @register="registerForm" />
  154 + </div>
  155 + <List
  156 + ref="listEl"
  157 + :loading="loading"
  158 + class="flex-auto bg-light-50 dark:bg-dark-900 !p-2 !mt-4"
  159 + position="bottom"
  160 + :pagination="pagination"
  161 + :data-source="dataSource"
  162 + :grid="{ gutter: 4, column: listColumn }"
  163 + >
  164 + <template #header>
  165 + <div class="flex gap-3 justify-end">
  166 + <Authority :value="ConfigurationPermission.CREATE">
  167 + <Button type="primary" @click="handleCreateOrUpdate()">新增大屏</Button>
  168 + </Authority>
  169 + <CardLayoutButton v-model:value="listColumn" @change="handleCardLayoutChange" />
  170 + <Tooltip title="刷新">
  171 + <Button type="primary" @click="getListData">
  172 + <ReloadOutlined @click="getListData" />
  173 + </Button>
  174 + </Tooltip>
  175 + </div>
  176 + </template>
  177 + <template #renderItem="{ item }">
  178 + <List.Item>
  179 + <Card hoverable>
  180 + <template #cover>
  181 + <div class="h-full w-full !flex justify-center items-center text-center p-1">
  182 + <img
  183 + class="w-full h-36"
  184 + alt="example"
  185 + :src="item.thumbnail || configurationSrc"
  186 + @click="handlePreview(item)"
  187 + />
  188 + </div>
  189 + </template>
  190 + <template class="ant-card-actions" #actions>
  191 + <Tooltip title="预览">
  192 + <AuthIcon
  193 + class="!text-lg"
  194 + icon="ant-design:eye-outlined"
  195 + @click="handlePreview(item)"
  196 + />
  197 + </Tooltip>
  198 + <Tooltip title="设计">
  199 + <AuthIcon
  200 + class="!text-lg"
  201 + icon="ant-design:edit-outlined"
  202 + @click="handleDesign(item)"
  203 + />
  204 + </Tooltip>
  205 + <AuthDropDown
  206 + :dropMenuList="[
  207 + {
  208 + text: '编辑',
  209 + auth: ConfigurationPermission.UPDATE,
  210 + icon: 'clarity:note-edit-line',
  211 + event: '',
  212 + onClick: handleCreateOrUpdate.bind(null, item),
  213 + },
  214 + {
  215 + text: '删除',
  216 + auth: ConfigurationPermission.DELETE,
  217 + icon: 'ant-design:delete-outlined',
  218 + event: '',
  219 + popconfirm: {
  220 + title: '是否确认删除操作?',
  221 + onConfirm: handleDelete.bind(null, item),
  222 + },
  223 + },
  224 + ]"
  225 + :trigger="['hover']"
  226 + />
  227 + </template>
  228 + <Card.Meta>
  229 + <template #title>
  230 + <span class="truncate">{{ item.name }}</span>
  231 + </template>
  232 + <template #description>
  233 + <div class="truncate h-11">
  234 + <div class="truncate">{{ item.organizationDTO.name }}</div>
  235 + <div class="truncate">{{ item.remark || '' }} </div>
  236 + </div>
  237 + </template>
  238 + </Card.Meta>
  239 + </Card>
  240 + </List.Item>
  241 + </template>
  242 + </List>
  243 + </section>
  244 + <ConfigurationCenterDrawer @register="registerDrawer" @success="getListData" />
  245 + </PageWrapper>
  246 +</template>
  247 +
  248 +<style lang="less" scoped>
  249 + .configuration-list:deep(.ant-list-header) {
  250 + border-bottom: none !important;
  251 + }
  252 +
  253 + .configuration-list:deep(.ant-list-pagination) {
  254 + height: 24px;
  255 + }
  256 +
  257 + .configuration-list:deep(.ant-card-body) {
  258 + padding: 16px !important;
  259 + }
  260 +
  261 + .configuration-list:deep(.ant-list-empty-text) {
  262 + @apply w-full h-full flex justify-center items-center;
  263 + }
  264 +</style>
... ...
1   -import { MenuTypeEnum, MenuModeEnum, TriggerEnum, MixSidebarTriggerEnum } from '/@/enums/menuEnum';
2   -import {
3   - ContentEnum,
4   - PermissionModeEnum,
5   - ThemeEnum,
6   - RouterTransitionEnum,
7   - SettingButtonPositionEnum,
8   - SessionTimeoutProcessingEnum,
9   -} from '/@/enums/appEnum';
10   -
11   -import { CacheTypeEnum } from '/@/enums/cacheEnum';
12   -
13   -export type LocaleType = 'zh_CN' | 'en' | 'ru' | 'ja' | 'ko';
14   -
15   -export interface MenuSetting {
16   - bgColor: string;
17   - fixed: boolean;
18   - collapsed: boolean;
19   - canDrag: boolean;
20   - show: boolean;
21   - hidden: boolean;
22   - split: boolean;
23   - menuWidth: number;
24   - mode: MenuModeEnum;
25   - type: MenuTypeEnum;
26   - theme: ThemeEnum;
27   - topMenuAlign: 'start' | 'center' | 'end';
28   - trigger: TriggerEnum;
29   - accordion: boolean;
30   - closeMixSidebarOnChange: boolean;
31   - collapsedShowTitle: boolean;
32   - mixSideTrigger: MixSidebarTriggerEnum;
33   - mixSideFixed: boolean;
34   -}
35   -
36   -export interface MultiTabsSetting {
37   - cache: boolean;
38   - show: boolean;
39   - showQuick: boolean;
40   - canDrag: boolean;
41   - showRedo: boolean;
42   - showFold: boolean;
43   -}
44   -
45   -export interface HeaderSetting {
46   - bgColor: string;
47   - fixed: boolean;
48   - show: boolean;
49   - theme: ThemeEnum;
50   - // Turn on full screen
51   - showFullScreen: boolean;
52   - // Whether to show the lock screen
53   - useLockPage: boolean;
54   - // Show document button
55   - showDoc: boolean;
56   - // Show message center button
57   - showNotice: boolean;
58   - showSearch: boolean;
59   -}
60   -
61   -export interface LocaleSetting {
62   - showPicker: boolean;
63   - // Current language
64   - locale: LocaleType;
65   - // default language
66   - fallback: LocaleType;
67   - // available Locales
68   - availableLocales: LocaleType[];
69   -}
70   -
71   -export interface TransitionSetting {
72   - // Whether to open the page switching animation
73   - enable: boolean;
74   - // Route basic switching animation
75   - basicTransition: RouterTransitionEnum;
76   - // Whether to open page switching loading
77   - openPageLoading: boolean;
78   - // Whether to open the top progress bar
79   - openNProgress: boolean;
80   -}
81   -
82   -export interface ProjectConfig {
83   - // Storage location of permission related information
84   - permissionCacheType: CacheTypeEnum;
85   - // Whether to show the configuration button
86   - showSettingButton: boolean;
87   - // Whether to show the theme switch button
88   - showDarkModeToggle: boolean;
89   - // Configure where the button is displayed
90   - settingButtonPosition: SettingButtonPositionEnum;
91   - // Permission mode
92   - permissionMode: PermissionModeEnum;
93   - // Session timeout processing
94   - sessionTimeoutProcessing: SessionTimeoutProcessingEnum;
95   - // Website gray mode, open for possible mourning dates
96   - grayMode: boolean;
97   - // Whether to turn on the color weak mode
98   - colorWeak: boolean;
99   - // Theme color
100   - themeColor: string;
101   -
102   - // The main interface is displayed in full screen, the menu is not displayed, and the top
103   - fullContent: boolean;
104   - // content width
105   - contentMode: ContentEnum;
106   - // Whether to display the logo
107   - showLogo: boolean;
108   - // Whether to show the global footer
109   - showFooter: boolean;
110   - // menuType: MenuTypeEnum;
111   - headerSetting: HeaderSetting;
112   - // menuSetting
113   - menuSetting: MenuSetting;
114   - // Multi-tab settings
115   - multiTabsSetting: MultiTabsSetting;
116   - // Animation configuration
117   - transitionSetting: TransitionSetting;
118   - // pageLayout whether to enable keep-alive
119   - openKeepAlive: boolean;
120   - // Lock screen time
121   - lockTime: number;
122   - // Show breadcrumbs
123   - showBreadCrumb: boolean;
124   - // Show breadcrumb icon
125   - showBreadCrumbIcon: boolean;
126   - // Use error-handler-plugin
127   - useErrorHandle: boolean;
128   - // Whether to open back to top
129   - useOpenBackTop: boolean;
130   - // Is it possible to embed iframe pages
131   - canEmbedIFramePage: boolean;
132   - // Whether to delete unclosed messages and notify when switching the interface
133   - closeMessageOnSwitch: boolean;
134   - // Whether to cancel the http request that has been sent but not responded when switching the interface.
135   - removeAllHttpPending: boolean;
136   -}
137   -
138   -export interface GlobConfig {
139   - // Site title
140   - title: string;
141   - // Service interface url
142   - apiUrl: string;
143   - // Upload url
144   - uploadUrl?: string;
145   - // Service interface url prefix
146   - urlPrefix?: string;
147   - // Project abbreviation
148   - shortName: string;
149   - // configuration center proxy prefix
150   - configurationPrefix: string;
151   - // socket url
152   - socketUrl: string;
153   - // alarm notify alarm duration
154   - alarmNotifyDuration: string;
155   - // alarm notify polling interval
156   - alarmPollingInterval: string;
157   - // upgrade your http policy to https
158   - securityPolicy: string;
159   -}
160   -export interface GlobEnvConfig {
161   - // Site title
162   - VITE_GLOB_APP_TITLE: string;
163   - // Service interface url
164   - VITE_GLOB_API_URL: string;
165   - // Service interface url prefix
166   - VITE_GLOB_API_URL_PREFIX?: string;
167   - // Project abbreviation
168   - VITE_GLOB_APP_SHORT_NAME: string;
169   - // Upload url
170   - VITE_GLOB_UPLOAD_URL?: string;
171   - // configuration
172   - VITE_GLOB_CONFIGURATION: string;
173   - // socket
174   - VITE_GLOB_WEB_SOCKET: string;
175   - // force transform http to https
176   - VITE_GLOB_CONTENT_SECURITY_POLICY: string;
177   - // notify polling interval time
178   - VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME: string;
179   - // notify duration
180   - VITE_GLOB_ALARM_NOTIFY_DURATION: string;
181   -}
  1 +import { MenuTypeEnum, MenuModeEnum, TriggerEnum, MixSidebarTriggerEnum } from '/@/enums/menuEnum';
  2 +import {
  3 + ContentEnum,
  4 + PermissionModeEnum,
  5 + ThemeEnum,
  6 + RouterTransitionEnum,
  7 + SettingButtonPositionEnum,
  8 + SessionTimeoutProcessingEnum,
  9 +} from '/@/enums/appEnum';
  10 +
  11 +import { CacheTypeEnum } from '/@/enums/cacheEnum';
  12 +
  13 +export type LocaleType = 'zh_CN' | 'en' | 'ru' | 'ja' | 'ko';
  14 +
  15 +export interface MenuSetting {
  16 + bgColor: string;
  17 + fixed: boolean;
  18 + collapsed: boolean;
  19 + canDrag: boolean;
  20 + show: boolean;
  21 + hidden: boolean;
  22 + split: boolean;
  23 + menuWidth: number;
  24 + mode: MenuModeEnum;
  25 + type: MenuTypeEnum;
  26 + theme: ThemeEnum;
  27 + topMenuAlign: 'start' | 'center' | 'end';
  28 + trigger: TriggerEnum;
  29 + accordion: boolean;
  30 + closeMixSidebarOnChange: boolean;
  31 + collapsedShowTitle: boolean;
  32 + mixSideTrigger: MixSidebarTriggerEnum;
  33 + mixSideFixed: boolean;
  34 +}
  35 +
  36 +export interface MultiTabsSetting {
  37 + cache: boolean;
  38 + show: boolean;
  39 + showQuick: boolean;
  40 + canDrag: boolean;
  41 + showRedo: boolean;
  42 + showFold: boolean;
  43 +}
  44 +
  45 +export interface HeaderSetting {
  46 + bgColor: string;
  47 + fixed: boolean;
  48 + show: boolean;
  49 + theme: ThemeEnum;
  50 + // Turn on full screen
  51 + showFullScreen: boolean;
  52 + // Whether to show the lock screen
  53 + useLockPage: boolean;
  54 + // Show document button
  55 + showDoc: boolean;
  56 + // Show message center button
  57 + showNotice: boolean;
  58 + showSearch: boolean;
  59 +}
  60 +
  61 +export interface LocaleSetting {
  62 + showPicker: boolean;
  63 + // Current language
  64 + locale: LocaleType;
  65 + // default language
  66 + fallback: LocaleType;
  67 + // available Locales
  68 + availableLocales: LocaleType[];
  69 +}
  70 +
  71 +export interface TransitionSetting {
  72 + // Whether to open the page switching animation
  73 + enable: boolean;
  74 + // Route basic switching animation
  75 + basicTransition: RouterTransitionEnum;
  76 + // Whether to open page switching loading
  77 + openPageLoading: boolean;
  78 + // Whether to open the top progress bar
  79 + openNProgress: boolean;
  80 +}
  81 +
  82 +export interface ProjectConfig {
  83 + // Storage location of permission related information
  84 + permissionCacheType: CacheTypeEnum;
  85 + // Whether to show the configuration button
  86 + showSettingButton: boolean;
  87 + // Whether to show the theme switch button
  88 + showDarkModeToggle: boolean;
  89 + // Configure where the button is displayed
  90 + settingButtonPosition: SettingButtonPositionEnum;
  91 + // Permission mode
  92 + permissionMode: PermissionModeEnum;
  93 + // Session timeout processing
  94 + sessionTimeoutProcessing: SessionTimeoutProcessingEnum;
  95 + // Website gray mode, open for possible mourning dates
  96 + grayMode: boolean;
  97 + // Whether to turn on the color weak mode
  98 + colorWeak: boolean;
  99 + // Theme color
  100 + themeColor: string;
  101 +
  102 + // The main interface is displayed in full screen, the menu is not displayed, and the top
  103 + fullContent: boolean;
  104 + // content width
  105 + contentMode: ContentEnum;
  106 + // Whether to display the logo
  107 + showLogo: boolean;
  108 + // Whether to show the global footer
  109 + showFooter: boolean;
  110 + // menuType: MenuTypeEnum;
  111 + headerSetting: HeaderSetting;
  112 + // menuSetting
  113 + menuSetting: MenuSetting;
  114 + // Multi-tab settings
  115 + multiTabsSetting: MultiTabsSetting;
  116 + // Animation configuration
  117 + transitionSetting: TransitionSetting;
  118 + // pageLayout whether to enable keep-alive
  119 + openKeepAlive: boolean;
  120 + // Lock screen time
  121 + lockTime: number;
  122 + // Show breadcrumbs
  123 + showBreadCrumb: boolean;
  124 + // Show breadcrumb icon
  125 + showBreadCrumbIcon: boolean;
  126 + // Use error-handler-plugin
  127 + useErrorHandle: boolean;
  128 + // Whether to open back to top
  129 + useOpenBackTop: boolean;
  130 + // Is it possible to embed iframe pages
  131 + canEmbedIFramePage: boolean;
  132 + // Whether to delete unclosed messages and notify when switching the interface
  133 + closeMessageOnSwitch: boolean;
  134 + // Whether to cancel the http request that has been sent but not responded when switching the interface.
  135 + removeAllHttpPending: boolean;
  136 +}
  137 +
  138 +export interface GlobConfig {
  139 + // Site title
  140 + title: string;
  141 + // Service interface url
  142 + apiUrl: string;
  143 + // Upload url
  144 + uploadUrl?: string;
  145 + // Service interface url prefix
  146 + urlPrefix?: string;
  147 + // Project abbreviation
  148 + shortName: string;
  149 + // configuration center proxy prefix
  150 + configurationPrefix: string;
  151 + // large designer proxy prefix
  152 + largeDesignerPrefix: string;
  153 + // socket url
  154 + socketUrl: string;
  155 + // alarm notify alarm duration
  156 + alarmNotifyDuration: string;
  157 + // alarm notify polling interval
  158 + alarmPollingInterval: string;
  159 + // upgrade your http policy to https
  160 + securityPolicy: string;
  161 +}
  162 +export interface GlobEnvConfig {
  163 + // Site title
  164 + VITE_GLOB_APP_TITLE: string;
  165 + // Service interface url
  166 + VITE_GLOB_API_URL: string;
  167 + // Service interface url prefix
  168 + VITE_GLOB_API_URL_PREFIX?: string;
  169 + // Project abbreviation
  170 + VITE_GLOB_APP_SHORT_NAME: string;
  171 + // Upload url
  172 + VITE_GLOB_UPLOAD_URL?: string;
  173 + // configuration
  174 + VITE_GLOB_CONFIGURATION: string;
  175 + // large designer
  176 + VITE_GLOB_LARGE_DESIGNER: string;
  177 + // socket
  178 + VITE_GLOB_WEB_SOCKET: string;
  179 + // force transform http to https
  180 + VITE_GLOB_CONTENT_SECURITY_POLICY: string;
  181 + // notify polling interval time
  182 + VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME: string;
  183 + // notify duration
  184 + VITE_GLOB_ALARM_NOTIFY_DURATION: string;
  185 +}
... ...