diff --git a/package.json b/package.json index 9c8fc8603e77cc98f1f567cff26ff722edff06bd..c6ddcf9c0e534a55a310e0bfee314e9f6a7ae406 100644 --- a/package.json +++ b/package.json @@ -19,11 +19,12 @@ "@element-plus/icons-vue": "^2.0.4", "@opensig/open-analytics": "^0.0.9", "@types/d3": "^7.4.0", - "axios": "^0.26.0", + "axios": "^1.7.4", "d3": "^7.4.4", "echarts": "^5.3.2", "element-plus": "^2.1.4", "html2canvas": "^1.4.1", + "js-cookie": "^3.0.5", "lodash-es": "^4.17.21", "normalize.css": "^8.0.1", "pinia": "^2.0.11", @@ -33,11 +34,13 @@ "vue-router": "^4.0.13" }, "devDependencies": { + "@types/js-cookie": "^3.0.6", "@types/lodash-es": "^4.17.6", "@types/node": "^17.0.21", "@typescript-eslint/eslint-plugin": "^5.13.0", "@typescript-eslint/parser": "^5.13.0", "@vitejs/plugin-vue": "^4.6.2", + "@vitejs/plugin-vue-jsx": "^4.1.1", "@vue/eslint-config-prettier": "^7.0.0", "@vue/eslint-config-typescript": "^10.0.0", "eslint": "^8.9.0", @@ -47,7 +50,7 @@ "typescript": "^4.5.4", "unplugin-auto-import": "^0.11.5", "unplugin-vue-components": "^0.26.0", - "vite": "^4.5.3", + "vite": "^4.5.6", "vue-tsc": "^1.8.25" } } diff --git a/packages/euler/.env.development b/packages/euler/.env.development index d5a75c74803f55f386b0b745dada3e7367c07696..a4fe0c34fdee6116dc6e9bbf6b24db7374fac8e1 100644 --- a/packages/euler/.env.development +++ b/packages/euler/.env.development @@ -1,3 +1,3 @@ VITE_COOKIE_DOMAIN = localhost - +VITE_COOKIE_VER = "20240830" VITE_LOGIN_ORIGIN = https://id.openeuler.org diff --git a/packages/euler/.env.production b/packages/euler/.env.production index 79e379e6cfc388457ae92c706e79625c7ed410a8..709ca2dc8d65f6e1c9a18574e055b16794271e54 100644 --- a/packages/euler/.env.production +++ b/packages/euler/.env.production @@ -1,3 +1,3 @@ +VITE_COOKIE_VER = "20240830" VITE_COOKIE_DOMAIN = .openeuler.org - VITE_LOGIN_ORIGIN = https://id.openeuler.org diff --git a/packages/euler/components.d.ts b/packages/euler/components.d.ts index 6ffaf080bc321b9f7025ef01ab816688e0eda63d..9d0d9de7f20ec0369a490ae62b3142395ef099f4 100644 --- a/packages/euler/components.d.ts +++ b/packages/euler/components.d.ts @@ -11,6 +11,7 @@ declare module 'vue' { AppHeader: typeof import('./src/components/AppHeader.vue')['default'] AppHeaderMobile: typeof import('./src/components/AppHeaderMobile.vue')['default'] AppMobileMenu: typeof import('./src/components/AppMobileMenu.vue')['default'] + CookieNotice: typeof import('./src/components/CookieNotice.vue')['default'] ElAutocomplete: typeof import('element-plus/es')['ElAutocomplete'] ElAvatar: typeof import('element-plus/es')['ElAvatar'] ElButton: typeof import('element-plus/es')['ElButton'] diff --git a/packages/euler/src/App.vue b/packages/euler/src/App.vue index df9bcaf8cbddc1165093a32e8d479a936d31f01a..29f4124cbbd3dd34245176b937d844b4fe83493e 100644 --- a/packages/euler/src/App.vue +++ b/packages/euler/src/App.vue @@ -2,6 +2,7 @@ import AppHeader from '@/components/AppHeader.vue'; import { setStoreData, useStoreData } from 'shared/utils/login'; import { openCommunityInfo } from './api'; +import CookieNotice from './components/CookieNotice.vue'; setStoreData(openCommunityInfo.name); const { loginIframeSrc } = useStoreData(); @@ -15,6 +16,7 @@ const { loginIframeSrc } = useStoreData(); + +import { ref, watch, onMounted, computed } from 'vue'; +import { setCookie, removeCookie } from 'shared/utils/cookies'; +import { + useCookieStore, + COOKIE_AGREED_STATUS, + COOKIE_KEY, +} from 'shared/stores/cookies'; +import { useScreen } from 'shared/hooks/useScreen'; +import { useI18n } from 'vue-i18n'; + +import IconClose from '~icons/app/icon-close.svg'; +import { useRoute, useRouter } from 'vue-router'; +import oa from '@/shared/analytics'; + +const { lePadV } = useScreen(); +const { locale } = useI18n(); +const isZh = computed(() => locale.value === 'zh'); + +const cookieStore = useCookieStore(); +const router = useRouter(); + +const route = useRoute(); +const aboutCookiesUrl = computed( + () => `https://www.openeuler.org/${locale.value}/other/cookies/` +); + +const COOKIE_DOMAIN = import.meta.env.VITE_COOKIE_DOMAIN; + +// 是否允许分析cookie +const analysisAllowed = ref(false); + +// cookie提示是否显示 +const isNoticeVisible = ref(false); + +// 显示/隐藏cookie提示 +const toggleNoticeVisible = (val: boolean) => { + if (typeof val === 'boolean') { + isNoticeVisible.value = val; + } else { + isNoticeVisible.value = !isNoticeVisible.value; + } +}; + +// 弹出框是否显示 +const isDlgVisible = ref(false); + +// 显示/隐藏弹出框 +const toggleDlgVisible = (val: boolean) => { + if (typeof val === 'boolean') { + isDlgVisible.value = val; + } else { + isDlgVisible.value = !isNoticeVisible.value; + } +}; + +// 是否未签署 +const isNotSigned = () => { + return cookieStore.getUserCookieStatus() === COOKIE_AGREED_STATUS.NOT_SIGNED; +}; + +// 是否全部同意 +const isAllAgreed = () => { + return cookieStore.getUserCookieStatus() === COOKIE_AGREED_STATUS.ALL_AGREED; +}; + +onMounted(() => { + // 未签署,展示cookie notice + if (isNotSigned()) { + toggleNoticeVisible(true); + } + + if (cookieStore.isAllAgreed) { + analysisAllowed.value = true; + oa.enable(router); + } else { + oa.disable(); + } +}); + +// 用户同意所有cookie +const acceptAll = () => { + analysisAllowed.value = true; + cookieStore.status = COOKIE_AGREED_STATUS.ALL_AGREED; + removeCookie(COOKIE_KEY); + setCookie( + COOKIE_KEY, + `${COOKIE_AGREED_STATUS.ALL_AGREED}${cookieStore.version}`, + 180, + COOKIE_DOMAIN + ); + toggleNoticeVisible(false); + oa.enable(router); +}; + +// 用户拒绝所有cookie,即仅同意必要cookie +const rejectAll = () => { + analysisAllowed.value = false; + cookieStore.status = COOKIE_AGREED_STATUS.NECCESSARY_AGREED; + removeCookie(COOKIE_KEY); + setCookie( + COOKIE_KEY, + `${COOKIE_AGREED_STATUS.NECCESSARY_AGREED}${cookieStore.version}`, + 180, + COOKIE_DOMAIN + ); + toggleNoticeVisible(false); + oa.disable(); +}; + +const handleSave = () => { + if (analysisAllowed.value) { + acceptAll(); + } else { + rejectAll(); + } + + toggleDlgVisible(false); +}; + +const handleAllowAll = () => { + analysisAllowed.value = true; + acceptAll(); + toggleDlgVisible(false); +}; + +const onDlgChange = () => { + if (!isAllAgreed()) { + setTimeout(() => { + analysisAllowed.value = false; + }, 800); + } + toggleDlgVisible(false); +}; + +watch( + () => route.path, + () => { + if (isNotSigned()) { + toggleNoticeVisible(true); + } + } +); + + + + + + + + {{ $t('cookie.title') }} + + {{ $t('cookie.desc') }} + + {{ $t('cookie.link') }} {{ isZh ? '。' : '.' }} + + + + {{ + $t('cookie.acceptAll') + }} + {{ + $t('cookie.rejectAll') + }} + + {{ $t('cookie.manage') }} + + + + + + + + + + + {{ $t('cookie.necessaryCookie') }} + {{ + $t('cookie.necessaryCookieTip') + }} + + + {{ $t('cookie.necessaryCookieDetail') }} + + + + + {{ $t('cookie.analyticalCookie') }} + + + + + + {{ $t('cookie.analyticalCookieDetail') }} + + + + + + {{ + $t('cookie.saveSetting') + }} + + {{ $t('cookie.acceptAll') }} + + + + + + + + diff --git a/packages/euler/src/i18n/cookie/cookie-en.ts b/packages/euler/src/i18n/cookie/cookie-en.ts new file mode 100644 index 0000000000000000000000000000000000000000..716aceb422cc1276c18c942ab5d1456c9896f8e5 --- /dev/null +++ b/packages/euler/src/i18n/cookie/cookie-en.ts @@ -0,0 +1,17 @@ +export default { + title: 'openEuler Community Respects Your Privacy.', + desc: 'his site uses cookies from us and our partners to improve your browsing experience and make the site work properly. By clicking "Accept All", you consent to the use of cookies. By clicking "Reject All", you disable the use of unnecessary cookies. You can manage your cookie settings by clicking "Manage Cookies". For more information or to change your cookie settings, please refer to our ', + link: 'About Cookies', + acceptAll: 'Accept All', + rejectAll: 'Reject All', + manage: 'Manage Cookies', + necessaryCookie: 'Strictly Necessary Cookies', + necessaryCookieTip: 'Always active', + necessaryCookieDetail: + 'These cookies are necessary for the site to work properly and cannot be switched off. They are usually only set in response to actions made by you which amount to a request for services, such as logging in or filling in forms. You can set the browser to block these cookies, but that can make parts of the site not work. These cookies do not store any personally identifiable information.', + analyticalCookie: 'Analytics Cookies', + analyticalCookieDetail: + 'We will use these cookies only with your consent. These cookies help us make improvements by collecting statistics such as the number of visits and traffic sources.', + saveSetting: 'Save and Accept', + allowAll: 'Accept All', +}; diff --git a/packages/euler/src/i18n/cookie/cookie-zh.ts b/packages/euler/src/i18n/cookie/cookie-zh.ts new file mode 100644 index 0000000000000000000000000000000000000000..d9d1c58582e7ee0a242465873b0e406e07b608bc --- /dev/null +++ b/packages/euler/src/i18n/cookie/cookie-zh.ts @@ -0,0 +1,17 @@ +export default { + title: 'openEuler社区重视您的隐私', + desc: '我们在本网站上使用Cookie,包括第三方Cookie,以便网站正常运行和提升浏览体验。单击“全部接受”即表示您同意这些目的;单击“全部拒绝”即表示您拒绝非必要的Cookie;单击“管理Cookie”以选择接受或拒绝某些Cookie。需要了解更多信息或随时更改您的Cookie首选项,请参阅我们的', + link: '《关于cookies》', + acceptAll: '全部接受', + rejectAll: '全部拒绝', + manage: '管理Cookie', + necessaryCookie: '必要Cookie', + necessaryCookieTip: '始终启用', + necessaryCookieDetail: + '这些Cookie是网站正常工作所必需的,不能在我们的系统中关闭。它们通常仅是为了响应您的服务请求而设置的,例如登录或填写表单。您可以将浏览器设置为阻止Cookie来拒绝这些Cookie,但网站的某些部分将无法正常工作。这些Cookie不存储任何个人身份信息。', + analyticalCookie: '统计分析Cookie', + analyticalCookieDetail: + '我们将根据您的同意使用和处理这些非必要Cookie。这些Cookie允许我们获得摘要统计数据,例如,统计访问量和访问者来源,便于我们改进我们的网站。', + saveSetting: '保存并接受', + allowAll: '全部接受', +}; diff --git a/packages/euler/src/i18n/cookie/index.ts b/packages/euler/src/i18n/cookie/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..e1fad8cfc8c4da654029416e0f36de65ba1f2b1e --- /dev/null +++ b/packages/euler/src/i18n/cookie/index.ts @@ -0,0 +1,7 @@ +import zh from './cookie-zh'; +import en from './cookie-en'; + +export default (messages: { zh: any; en: any }) => { + messages.zh.cookie = zh; + messages.en.cookie = en; +}; diff --git a/packages/euler/src/i18n/index.ts b/packages/euler/src/i18n/index.ts index 91f7b5ab660bc904eca6071356ee8125817bd9b8..67aeae812b7e5be59439d90bdfdb262efe79aacb 100644 --- a/packages/euler/src/i18n/index.ts +++ b/packages/euler/src/i18n/index.ts @@ -2,6 +2,7 @@ import { createI18n } from 'vue-i18n'; import zhLanguage from './lang/zhLanguage'; import enLanguage from './lang/enLanguage'; +import cookie from './cookie'; const messages = { zh: { @@ -11,6 +12,8 @@ const messages = { ...enLanguage, }, }; + +cookie(messages); const i18n = createI18n({ locale: localStorage.getItem('lang') || 'zh', allowComposition: true, diff --git a/packages/euler/src/main.ts b/packages/euler/src/main.ts index 4809bd64770ad0af894b6c0bc82ad8522ba5217a..965c5f41af961c38aeefee7164e0eb40ff3eb670 100644 --- a/packages/euler/src/main.ts +++ b/packages/euler/src/main.ts @@ -1,5 +1,6 @@ import 'shared/styles/base.scss'; import '@/shared/styles/style.scss'; +import '@/shared/opendesign-styles/variable.scss'; // import '@authing/native-js-ui-components/lib/index.min.css'; import '@/views/mobile/sig/styles/style.scss'; import { createApp } from 'vue'; @@ -12,7 +13,7 @@ import locale from './assets/locale/cn'; // 引入自己的 import ElementPlus from 'element-plus'; import 'element-plus/theme-chalk/el-message.css'; import 'shared/styles/index.scss'; -import oa from '@/shared/analytics'; +import opendesign from 'shared/components/Opendesign'; // 国际化 import i18n from './i18n'; @@ -24,10 +25,7 @@ app.use(ElementPlus, { app.use(router); app.use(createPinia()); app.component('OIcon', OIcon); - -oa.enable(router); -oa.reportPerformance(); - +app.use(opendesign); app.mount('#app'); router.afterEach(() => { diff --git a/packages/euler/src/router.ts b/packages/euler/src/router.ts index 82ba9e3910649a17fc85b76e51150accefe71256..0e764eddb40669173d2b5b8d65e902b5f59a9012 100644 --- a/packages/euler/src/router.ts +++ b/packages/euler/src/router.ts @@ -1,7 +1,7 @@ import { createRouter, createWebHistory } from 'vue-router'; import { useCommonStore } from './stores/common'; import { querySigInfo, queryUserList } from 'shared/api'; -import { isTest, testIsPhone } from 'shared/utils/helper'; +import { testIsPhone } from 'shared/utils/helper'; export const routes = [ { path: '/', redirect: '/zh/overview' }, { diff --git a/packages/euler/src/shared/analytics.ts b/packages/euler/src/shared/analytics.ts index e1a35d83d868a0c24904489ce26928034d5d7cbc..ef3b57876ff371fec025a5045411bcd2a0ec6e3c 100644 --- a/packages/euler/src/shared/analytics.ts +++ b/packages/euler/src/shared/analytics.ts @@ -1,22 +1,3 @@ -import { OpenAnalytics } from '@opensig/open-analytics'; import { OAUtil } from 'shared/analytics'; -import { reportAnalytics } from 'shared/api/api-analytics'; -class EulerOa extends OAUtil { - oa?: OpenAnalytics; - - getInstance(): OpenAnalytics { - if (!this.oa) { - this.oa = new OpenAnalytics({ - appKey: 'openEuler', - request: (data) => { - reportAnalytics('openeuler', data); - }, - }); - } - return this.oa; - } -} - -const oa = new EulerOa(); -export default oa; +export default new OAUtil('openEuler', 'openeuler'); diff --git a/packages/euler/src/shared/opendesign-styles/_color.scss b/packages/euler/src/shared/opendesign-styles/_color.scss new file mode 100644 index 0000000000000000000000000000000000000000..924c296729df675cb164de372b20bbacaf098f4a --- /dev/null +++ b/packages/euler/src/shared/opendesign-styles/_color.scss @@ -0,0 +1,181 @@ +// 颜色 +:root { + /** + * 基础色盘 + */ + + // 克莱因蓝 + --o-color-kleinblue1: #000412; + --o-color-kleinblue2: #000827; + --o-color-kleinblue3: #0c2360; + --o-color-kleinblue4: #00288d; + --o-color-kleinblue5: #002fa7; + --o-color-kleinblue6: #0d3cb4; + --o-color-kleinblue7: #2555cd; + --o-color-kleinblue8: #406fe7; + --o-color-kleinblue9: #5988ff; + --o-color-kleinblue10: #b2c0e4; + + // 中性色 + --o-color-neutral1: #121212; + --o-color-neutral2: #151515; + --o-color-neutral3: #2d2d2d; + --o-color-neutral4: #3f3f3f; + --o-color-neutral5: #555555; + --o-color-neutral6: #707070; + --o-color-neutral7: #848484; + --o-color-neutral8: #999999; + --o-color-neutral9: #b2b2b2; + --o-color-neutral10: #cccccc; + --o-color-neutral11: #e5e5e5; + + // 红色 + --o-color-red1: #850d09; + --o-color-red2: #b4110c; + --o-color-red3: #e4160f; + --o-color-red4: #f13b35; + --o-color-red5: #f3524d; + --o-color-red6: #ff5f5a; + --o-color-red7: #ff7873; + --o-color-red8: #ff928d; + --o-color-red9: #ffaba6; + --o-color-red10: #ffd2af; + + // 黄色 + --o-color-yellow1: #754c01; + --o-color-yellow2: #a86d01; + --o-color-yellow3: #dabe01; + --o-color-yellow4: #feaa11; + --o-color-yellow5: #feb32a; + --o-color-yellow6: #ffc037; + --o-color-yellow7: #ffd950; + --o-color-yellow8: #fff36a; + --o-color-yellow9: #ffff83; + --o-color-yellow10: #ffe1aa; + + // 绿色 + --o-color-green1: #1f370f; + --o-color-green2: #355f1a; + --o-color-green3: #4b8725; + --o-color-green4: #62af30; + --o-color-green5: #6dc335; + --o-color-green6: #7ad042; + --o-color-green7: #93e95b; + --o-color-green8: #adff75; + --o-color-green9: #c6ff8e; + --o-color-green10: #c5e7ae; + + // 橙色 + --o-color-orange1: #9b370e; + --o-color-orange2: #b54f00; + --o-color-orange3: #e86600; + --o-color-orange4: #ff801c; + --o-color-orange5: #ff8e36; + --o-color-orange6: #ff9b43; + --o-color-orange7: #ffb45c; + --o-color-orange8: #ffce76; + --o-color-orange9: #ffcf8f; + --o-color-orange10: #ffd2af; + + // 灰蓝色 + --o-color-greyblue1: #e5e8f0; + --o-color-greyblue2: #f7f8fa; + --o-color-greyblue3: #f5f6f8; + + // 灰黑色 + --o-color-greyblack1: #1e1e1e; + --o-color-greyblack2: #242424; + --o-color-greyblack3: #2e2e2e; + --o-color-greyblack4: #383838; + + // 白色 + --o-color-white: #ffffff; + + // 黑色 + --o-color-black: #000000; + + // 透明 + --o-color-transparent: transparent; + + /** + * 状态颜色 && 功能颜色 + */ + + // 成功色 + --o-color-success1: var(--o-color-green5); // normal + --o-color-success2: var(--o-color-green7); // hover + --o-color-success3: var(--o-color-green10); // disabled + + // 告警色 + --o-color-warning1: var(--o-color-orange5); // normal + --o-color-warning2: var(--o-color-orange7); // hover + --o-color-warning3: var(--o-color-orange10); // disabled + + // 错误色 + --o-color-error1: var(--o-color-red5); // normal + --o-color-error2: var(--o-color-red7); // hover + --o-color-error3: var(--o-color-red10); // disabled + + // 品牌色 + --o-color-brand1: var(--o-color-kleinblue5); // 常规、文字 + --o-color-brand2: var(--o-color-kleinblue8); // 悬浮 + --o-color-brand3: var(--o-color-kleinblue4); // 确认 + --o-color-brand4: var(--o-color-kleinblue6); // 特殊场景 + --o-color-brand5: var(--o-color-kleinblue10); // 一般禁用 + --o-color-brand6: var( + --o-color-kleinblue10 + ); // 文字禁用,暂和一般禁用保持一致 + + // 文字颜色 + --o-color-text1: var(--o-color-black); // 强调/正文标题 黑色 + --o-color-text2: var(--o-color-white); // 强调/正文标题 白色 + --o-color-text3: var(--o-color-neutral4); // 次强调/正文标题 + --o-color-text4: var(--o-color-neutral6); // 次要信息/正文 + --o-color-text5: var(--o-color-neutral11); // 置灰信息 + --o-color-text-secondary: var(--o-color-neutral6); // 次级文字颜色 + + // 背景色 + --o-color-bg1: var(--o-color-greyblue3); // 整体背景色 + --o-color-bg2: var(--o-color-white); // 一级容器背景色 + --o-color-bg3: var(--o-color-greyblue2); // 二级容器背景色 + --o-color-bg4: var(--o-color-greyblue1); // 三级容器背景色 + --o-color-bg5: var(--o-color-white); // 弹出框、tooltip背景色 + --o-color-bg6: rgba(0, 0, 0, 0.5); // 蒙层 + --o-color-bg-secondary: var(--o-color-neutral11); // 次级颜色背景颜色 + + // 链接色 + --o-color-link1: var(--o-color-kleinblue5); // 常规 + --o-color-link2: var(--o-color-kleinblue8); // 悬浮 + --o-color-link3: var(--o-color-kleinblue4); // 点击 + --o-color-link4: var(--o-color-kleinblue6); // 特殊场景 + --o-color-link5: var(--o-color-kleinblue10); // 一般禁用 + --o-color-link6: var(--o-color-kleinblue10); // 文字禁用,暂和一般禁用保持一致 + + // 边框颜色 + --o-color-border1: var(--o-color-neutral6); + --o-color-border2: var(--o-color-neutral11); + --o-color-border3: var(--o-color-kleinblue5); + + // 分割线颜色 + --o-color-division1: var(--o-color-neutral11); + + // 填充色,用于阴影容器背景 + --o-color-fill1: var( + --o-color-white + ); // SL1 一级投影容器背景,应用于默认状态的卡片、楼层、导航栏、组件里局部投影背景等 + --o-color-fill2: var( + --o-color-white + ); // SL2 二级投影容器背景,应用于卡片、组件里局部投影等 + --o-color-fill2_hover: var( + --o-color-white + ); // SL2-hover 升起投影容器背景,应用于悬停状态的卡片等,是SL2的激活态 + --o-color-fill3: var( + --o-color-white + ); // SL3 三级投影容器背景,应用于一级投影上的卡片、组件等 + --o-color-fill4: var( + --o-color-white + ); // SL4 覆盖阴影容器背景,应用于信息提示【tips、活动进入按钮等】等投影容器 + --o-color-fill5: var( + --o-color-white + ); // SL5 弹出阴影容器背景,应用于模态弹窗投影 +} diff --git a/packages/euler/src/shared/opendesign-styles/_font.scss b/packages/euler/src/shared/opendesign-styles/_font.scss new file mode 100644 index 0000000000000000000000000000000000000000..56116fef4f7959919bfd44ce074a6761428aaa17 --- /dev/null +++ b/packages/euler/src/shared/opendesign-styles/_font.scss @@ -0,0 +1,26 @@ +// 字体 +:root { + // 字体font-size + --o-font-size-h1: 64px; + --o-font-size-h2: 54px; + --o-font-size-h3: 36px; + --o-font-size-h4: 28px; + --o-font-size-h5: 24px; + --o-font-size-h6: 20px; + --o-font-size-h7: 18px; + --o-font-size-h8: 16px; + --o-font-size-text: 14px; + --o-font-size-tip: 12px; + + // 字体line-height + --o-line-height-h1: 84px; + --o-line-height-h2: 76px; + --o-line-height-h3: 48px; + --o-line-height-h4: 36px; + --o-line-height-h5: 32px; + --o-line-height-h6: 28px; + --o-line-height-h7: 26px; + --o-line-height-h8: 24px; + --o-line-height-text: 22px; + --o-line-height-tip: 18px; +} diff --git a/packages/euler/src/shared/opendesign-styles/_shadow.scss b/packages/euler/src/shared/opendesign-styles/_shadow.scss new file mode 100644 index 0000000000000000000000000000000000000000..78dcd8d96a0a483060378c3cdb1dd4e6b7e80178 --- /dev/null +++ b/packages/euler/src/shared/opendesign-styles/_shadow.scss @@ -0,0 +1,9 @@ +// 阴影,注:SL2有hover投影 +:root { + --o-shadow-l1: 0 1px 5px rgba(45, 47, 51, 0.1); // SL1 一级投影,应用于楼层、导航栏、组件里局部投影等, + --o-shadow-l2: 0 1px 5px rgba(45, 47, 51, 0.1); // SL2-normal 二级投影,应用于卡片、组件里局部投影等 + --o-shadow-l2_hover: 0 6px 18px rgba(0, 47, 167, 0.14); // SL2-hover 升起投影,应用于悬停状态的卡片等,是SL2的激活态 + --o-shadow-l3: 0 6px 18px rgba(45, 47, 51, 0.14); // SL3 三级投影,应用于一级投影上的卡片、组件等 + --o-shadow-l4: 0 10px 32px rgba(45, 47, 51, 0.18); // SL4 覆盖阴影,应用于信息提示【tips、活动进入按钮等】等投影 + --o-shadow-l5: 0 12px 42px rgba(45, 47, 51, 0.24); // SL5 弹出阴影,应用于模态弹窗投影 +} diff --git a/packages/euler/src/shared/opendesign-styles/_spacing.scss b/packages/euler/src/shared/opendesign-styles/_spacing.scss new file mode 100644 index 0000000000000000000000000000000000000000..e3dcd5bfbe1370420420c90af1683fed7df3393f --- /dev/null +++ b/packages/euler/src/shared/opendesign-styles/_spacing.scss @@ -0,0 +1,13 @@ +// 间距 +:root { + --o-spacing-h1: 64px; + --o-spacing-h2: 40px; + --o-spacing-h3: 32px; + --o-spacing-h4: 24px; + --o-spacing-h5: 16px; + --o-spacing-h6: 12px; + --o-spacing-h7: 10px; + --o-spacing-h8: 8px; + --o-spacing-h9: 6px; + --o-spacing-h10: 4px; +} diff --git a/packages/euler/src/shared/opendesign-styles/variable.scss b/packages/euler/src/shared/opendesign-styles/variable.scss new file mode 100644 index 0000000000000000000000000000000000000000..c7242722c856dd379092fd4ea79825a664a01b7b --- /dev/null +++ b/packages/euler/src/shared/opendesign-styles/variable.scss @@ -0,0 +1,4 @@ +@import './_color.scss'; +@import './_shadow.scss'; +@import './_font.scss'; +@import './_spacing.scss'; diff --git a/packages/euler/vite.config.js b/packages/euler/vite.config.js index 0d7e6d0e5215f5ed37953e35351d24471d249b1f..4e29c98e44e01c942b77bfde28e343706db16ede 100644 --- a/packages/euler/vite.config.js +++ b/packages/euler/vite.config.js @@ -7,6 +7,8 @@ import { FileSystemIconLoader } from 'unplugin-icons/loaders'; import AutoImport from 'unplugin-auto-import/vite'; import Components from 'unplugin-vue-components/vite'; import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'; +import vueJsxPlugin from '@vitejs/plugin-vue-jsx'; + export default defineConfig({ base: '/', build: { @@ -20,6 +22,7 @@ export default defineConfig({ }, plugins: [ vue(), + vueJsxPlugin(), Icons({ compiler: 'vue3', customCollections: { @@ -36,7 +39,10 @@ export default defineConfig({ css: { preprocessorOptions: { scss: { - additionalData: `@use "@/shared/styles/element-plus/index.scss" as *;`, + additionalData: ` + @use "@/shared/styles/element-plus/index.scss" as *; + @use "shared/styles/mixin/screen.scss" as screen; + `, }, }, }, diff --git a/packages/gauss/.env.development b/packages/gauss/.env.development index ad64f353e894d0cc22ea2acc64ead55fe08f00ec..f4e8ce46926bcfcd3b9cd431b89dfc45b9824b52 100644 --- a/packages/gauss/.env.development +++ b/packages/gauss/.env.development @@ -1,3 +1,3 @@ VITE_COOKIE_DOMAIN = localhost - +VITE_COOKIE_VER = "20241230" VITE_LOGIN_ORIGIN = https://id.opengauss.org diff --git a/packages/gauss/.env.production b/packages/gauss/.env.production index 28b680c78b15f1d98040a774d862c366daed2431..6505bf37b2ac74144c502c889fc95108281a58f8 100644 --- a/packages/gauss/.env.production +++ b/packages/gauss/.env.production @@ -1,3 +1,2 @@ VITE_COOKIE_DOMAIN = .opengauss.org - -VITE_LOGIN_ORIGIN = https://id.opengauss.org +VITE_COOKIE_VER = "20241230" diff --git a/packages/gauss/components.d.ts b/packages/gauss/components.d.ts index 5f19a9a5836f6a6d36010c5ecd61e8a7aabe67a6..51645d827fe158555b6c6620d30024e8c424a7c7 100644 --- a/packages/gauss/components.d.ts +++ b/packages/gauss/components.d.ts @@ -11,8 +11,10 @@ declare module 'vue' { AppHeader: typeof import('./src/components/AppHeader.vue')['default'] AppHeaderMobile: typeof import('./src/components/AppHeaderMobile.vue')['default'] AppMobileMenu: typeof import('./src/components/AppMobileMenu.vue')['default'] + CookieNotice: typeof import('./src/components/CookieNotice.vue')['default'] ElAutocomplete: typeof import('element-plus/es')['ElAutocomplete'] ElCol: typeof import('element-plus/es')['ElCol'] + ElDialog: typeof import('element-plus/es')['ElDialog'] ElDrawer: typeof import('element-plus/es')['ElDrawer'] ElDropdown: typeof import('element-plus/es')['ElDropdown'] ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem'] diff --git a/packages/gauss/src/.env.production b/packages/gauss/src/.env.production deleted file mode 100644 index 5d271abd82c77b93ee2382546916694487a3919c..0000000000000000000000000000000000000000 --- a/packages/gauss/src/.env.production +++ /dev/null @@ -1,3 +0,0 @@ -VITE_COOKIE_DOMAIN = .test.osinfra.cn - -VITE_LOGIN_ORIGIN = https://opengauss-usercenter.test.osinfra.cn diff --git a/packages/gauss/src/App.vue b/packages/gauss/src/App.vue index 0b13d091d235fed8296e3481241bfd28e340ef3a..4961adca330e875301e8352008289f41fca1eb0a 100644 --- a/packages/gauss/src/App.vue +++ b/packages/gauss/src/App.vue @@ -1,5 +1,6 @@ @@ -9,10 +10,29 @@ import AppHeader from '@/components/AppHeader.vue'; + diff --git a/packages/gauss/src/i18n/cookie.ts b/packages/gauss/src/i18n/cookie.ts new file mode 100644 index 0000000000000000000000000000000000000000..549abd1b34409cb9d75dab72113aa9d35145385d --- /dev/null +++ b/packages/gauss/src/i18n/cookie.ts @@ -0,0 +1,41 @@ +const messages = { + zh: { + title: 'openGauss社区重视您的隐私', + desc: '我们在本网站上使用Cookie,包括第三方Cookie,以便网站正常运行和提升浏览体验。单击“全部接受”即表示您同意这些目的;单击“全部拒绝”即表示您拒绝非必要的Cookie;单击“管理Cookie”以选择接受或拒绝某些Cookie。需要了解更多信息或随时更改您的Cookie首选项,请参阅我们的', + link: '《关于cookies》', + acceptAll: '全部接受', + rejectAll: '全部拒绝', + manage: '管理Cookie', + necessaryCookie: '必要Cookie', + necessaryCookieTip: '始终启用', + necessaryCookieDetail: + '这些Cookie是网站正常工作所必需的,不能在我们的系统中关闭。它们通常仅是为了响应您的服务请求而设置的,例如登录或填写表单。您可以将浏览器设置为阻止Cookie来拒绝这些Cookie,但网站的某些部分将无法正常工作。这些Cookie不存储任何个人身份信息。', + analyticalCookie: '统计分析Cookie', + analyticalCookieDetail: + '我们将根据您的同意使用和处理这些非必要Cookie。这些Cookie允许我们获得摘要统计数据,例如,统计访问量和访问者来源,便于我们改进我们的网站。', + saveSetting: '保存设置', + setting: ' Cookie 设置', + }, + en: { + title: 'openGauss Community Respects Your Privacy', + desc: 'This site uses cookies from us and our partners to improve your browsing experience and make the site work properly. By clicking "Accept All", you consent to the use of cookies. By clicking "Reject All", you disable the use of unnecessary cookies. You can manage your cookie settings by clicking "Manage Cookies". For more information or to change your cookie settings, please refer to our', + link: 'About Cookies', + acceptAll: 'Accept All', + rejectAll: 'Reject All', + manage: 'Manage Cookies', + necessaryCookie: 'Strictly Necessary Cookies', + necessaryCookieTip: 'Always active', + necessaryCookieDetail: + 'These cookies are necessary for the site to work properly and cannot be switched off. They are usually only set in response to actions made by you which amount to a request for services, such as logging in or filling in forms. You can set the browser to block these cookies, but that can make parts of the site not work. These cookies do not store any personally identifiable information.', + analyticalCookie: 'Analytics Cookies', + analyticalCookieDetail: + 'We will use these cookies only with your consent. These cookies help us make improvements by collecting statistics such as the number of visits and traffic sources.', + saveSetting: 'Save Settings', + setting: 'Cookie settings', + }, +}; + +export default (params: { zh: any; en: any }) => { + params.zh.cookie = messages.zh; + params.en.cookie = messages.en; +}; diff --git a/packages/gauss/src/i18n/index.ts b/packages/gauss/src/i18n/index.ts index 12c4b8c98034058a866b0c5dc924471cb4c320eb..8b3ca1e3b87697e3cea6692049dcd4eae115e5b2 100644 --- a/packages/gauss/src/i18n/index.ts +++ b/packages/gauss/src/i18n/index.ts @@ -2,6 +2,7 @@ import { createI18n } from 'vue-i18n'; import zhLanguage from './lang/zhLanguage'; import enLanguage from './lang/enLanguage'; +import cookie from './cookie'; const messages = { zh: { @@ -11,6 +12,7 @@ const messages = { ...enLanguage, }, }; +cookie(messages); const setI18nLang = () => { const lang = localStorage.getItem('lang'); if (lang === null) { diff --git a/packages/gauss/src/main.ts b/packages/gauss/src/main.ts index a19389a62c08c9e872c5f46066729af3a8cc81cc..509c2b7d435c827d742c43bbf187565db89a2e4d 100644 --- a/packages/gauss/src/main.ts +++ b/packages/gauss/src/main.ts @@ -1,5 +1,6 @@ import 'shared/styles/base.scss'; import '@/shared/styles/style.scss'; +import '@/shared/styles/opendesign-style/variable.scss'; import { createApp } from 'vue'; import { createPinia } from 'pinia'; import App from './App.vue'; @@ -8,7 +9,7 @@ import OIcon from 'shared/components/OIcon.vue'; import zhLang from 'element-plus/lib/locale/lang/zh-cn'; // 引入官方的中文国际化 import locale from './assets/locale/cn'; // 引入自己的 import ElementPlus from 'element-plus'; -import oa from '@/shared/analytics'; +import opendesign from 'shared/components/Opendesign'; // 国际化 import i18n from './i18n'; @@ -18,13 +19,11 @@ app.use(ElementPlus, { locale: { ...zhLang, ...locale }, // 使用本地的 locale 去覆盖官方的 zhLang }); app.use(router); +app.use(opendesign); app.use(createPinia()); app.component('OIcon', OIcon); app.mount('#app'); -oa.enable(router); -oa.reportPerformance(); - router.afterEach(() => { window.scrollTo(0, 0); }); diff --git a/packages/gauss/src/shared/analytics.ts b/packages/gauss/src/shared/analytics.ts index 3d67c726c45330227c0ca970e78a6fd743fcefc0..5855b4aee06b2384d46c43906d95e88020863bbf 100644 --- a/packages/gauss/src/shared/analytics.ts +++ b/packages/gauss/src/shared/analytics.ts @@ -1,23 +1,3 @@ -import { OpenAnalytics } from '@opensig/open-analytics'; import { OAUtil } from 'shared/analytics'; -import { reportAnalytics } from 'shared/api/api-analytics'; -class GaussOa extends OAUtil { - oa?: OpenAnalytics; - - getInstance(): OpenAnalytics { - if (!this.oa) { - this.oa = new OpenAnalytics({ - appKey: 'openGauss', - request: (data) => { - reportAnalytics('opengauss', data); - }, - }); - this.oa.setHeader({ service: 'datastat' }); - } - return this.oa; - } -} - -const oa = new GaussOa(); -export default oa; +export default new OAUtil('openGauss', 'opengauss'); diff --git a/packages/gauss/src/shared/styles/opendesign-style/_color.scss b/packages/gauss/src/shared/styles/opendesign-style/_color.scss new file mode 100644 index 0000000000000000000000000000000000000000..5b8a9959e1185d61885f9f70e6e22e09eba10e8b --- /dev/null +++ b/packages/gauss/src/shared/styles/opendesign-style/_color.scss @@ -0,0 +1,169 @@ +// 颜色 +:root { + /** + * 基础色盘 + */ + + // 交通紫 + --o-color-trafficpurple1: #2d0a60; + --o-color-trafficpurple2: #420f8e; + --o-color-trafficpurple3: #5813bc; + --o-color-trafficpurple4: #6e1be8; + --o-color-trafficpurple5: #7d32ea; + --o-color-trafficpurple6: #ba3ff7; + --o-color-trafficpurple7: #a358ff; + --o-color-trafficpurple8: #bd72ff; + --o-color-trafficpurple9: #d68bff; + --o-color-trafficpurple10: #e1abff; + + // 中性色 + --o-color-neutral1: #121212; + --o-color-neutral2: #151515; + --o-color-neutral3: #2d2d2d; + --o-color-neutral4: #3f3f3f; + --o-color-neutral5: #555555; + --o-color-neutral6: #707070; + --o-color-neutral7: #848484; + --o-color-neutral8: #999999; + --o-color-neutral9: #b2b2b2; + --o-color-neutral10: #cccccc; + --o-color-neutral11: #e5e5e5; + + // 红色 + --o-color-red1: #850d09; + --o-color-red2: #b4110c; + --o-color-red3: #e4160f; + --o-color-red4: #f13b35; + --o-color-red5: #f3524d; + --o-color-red6: #ff5f5a; + --o-color-red7: #ff7873; + --o-color-red8: #ff928d; + --o-color-red9: #ffaba6; + --o-color-red10: #fabab8; + + // 黄色 + --o-color-yellow1: #754c01; + --o-color-yellow2: #a86d01; + --o-color-yellow3: #dabe01; + --o-color-yellow4: #feaa11; + --o-color-yellow5: #feb32a; + --o-color-yellow6: #ffc037; + --o-color-yellow7: #ffd950; + --o-color-yellow8: #fff36a; + --o-color-yellow9: #ffff83; + --o-color-yellow10: #ffe1aa; + + // 绿色 + --o-color-green1: #1f370f; + --o-color-green2: #355f1a; + --o-color-green3: #4b8725; + --o-color-green4: #62af30; + --o-color-green5: #6dc335; + --o-color-green6: #7ad042; + --o-color-green7: #93e95b; + --o-color-green8: #adff75; + --o-color-green9: #c6ff8e; + --o-color-green10: #c5e7ae; + + // 橙色 + --o-color-orange1: #9b370e; + --o-color-orange2: #b54f00; + --o-color-orange3: #e86600; + --o-color-orange4: #ff801c; + --o-color-orange5: #ff8e36; + --o-color-orange6: #ff9b43; + --o-color-orange7: #ffb45c; + --o-color-orange8: #ffce76; + --o-color-orange9: #ffcf8f; + --o-color-orange10: #ffd2af; + + // 灰蓝色 + --o-color-greyblue1: #e5e8f0; + --o-color-greyblue2: #f7f8fa; + --o-color-greyblue3: #f5f6f8; + + // 灰黑色 + --o-color-greyblack1: #1e1e1e; + --o-color-greyblack2: #242424; + --o-color-greyblack3: #2e2e2e; + --o-color-greyblack4: #383838; + + // 白色 + --o-color-white: #ffffff; + + // 黑色 + --o-color-black: #000000; + + // 透明 + --o-color-transparent: transparent; + + /** + * 状态颜色 && 功能颜色 + */ + + // 成功色 + --o-color-success1: var(--o-color-green5); // normal + --o-color-success2: var(--o-color-green7); // hover + --o-color-success3: var(--o-color-green10); // disabled + + // 告警色 + --o-color-warning1: var(--o-color-orange5); // normal + --o-color-warning2: var(--o-color-orange7); // hover + --o-color-warning3: var(--o-color-orange10); // disabled + + // 错误色 + --o-color-error1: var(--o-color-red5); // normal + --o-color-error2: var(--o-color-red7); // hover + --o-color-error3: var(--o-color-red10); // disabled + + // 品牌色 + --o-color-brand1: var(--o-color-trafficpurple5); // 常规、文字 + --o-color-brand2: var(--o-color-trafficpurple8); // 悬浮 + --o-color-brand3: var(--o-color-trafficpurple4); // 确认 + --o-color-brand4: var(--o-color-trafficpurple6); // 特殊场景 + --o-color-brand5: var(--o-color-trafficpurple10); // 一般禁用 + --o-color-brand6: var(--o-color-trafficpurple10); // 文字禁用,暂和一般禁用保持一致 + + // 文字颜色 + --o-color-text1: var(--o-color-black); // 强调/正文标题 黑色 + --o-color-text2: var(--o-color-white); // 强调/正文标题 白色 + --o-color-text3: var(--o-color-neutral4); // 次强调/正文标题 + --o-color-text4: var(--o-color-neutral6); // 次要信息/正文 + --o-color-text5: var(--o-color-neutral11); // 置灰信息 + --o-color-text-secondary: var(--o-color-neutral5); // 次级文字颜色 + + // 背景色 + --o-color-bg1: var(--o-color-greyblue3); // 整体背景色 + --o-color-bg2: var(--o-color-white); // 一级容器背景色 + --o-color-bg3: var(--o-color-greyblue2); // 二级容器背景色 + --o-color-bg4: var(--o-color-greyblue1); // 三级容器背景色 + --o-color-bg5: var(--o-color-white); // 弹出框、tooltip背景色 + --o-color-bg6: rgba(0, 0, 0, 0.5); // 蒙层 + --o-color-bg-secondary: var(--o-color-neutral11); // 次级颜色背景颜色 + + // 链接色 + --o-color-link1: var(--o-color-trafficpurple5); // 常规 + --o-color-link2: var(--o-color-trafficpurple8); // 悬浮 + --o-color-link3: var(--o-color-trafficpurple4); // 点击 + --o-color-link4: var(--o-color-trafficpurple6); // 特殊场景 + --o-color-link5: var(--o-color-trafficpurple10); // 一般禁用 + --o-color-link6: var(--o-color-trafficpurple10); // 文字禁用,暂和一般禁用保持一致 + + // 边框颜色 + --o-color-border1: var(--o-color-neutral6); + --o-color-border2: var(--o-color-neutral11); + --o-color-border3: var(--o-color-trafficpurple5); + + // 分割线颜色 + --o-color-division1: var(--o-color-neutral11); + + // 填充色,用于阴影容器背景 + --o-color-fill1: var(--o-color-white); // SL1 一级投影容器背景,应用于默认状态的卡片、楼层、导航栏、组件里局部投影背景等 + --o-color-fill2: var(--o-color-white); // SL2 二级投影容器背景,应用于卡片、组件里局部投影等 + --o-color-fill2_hover: var(--o-color-white); // SL2-hover 升起投影容器背景,应用于悬停状态的卡片等,是SL2的激活态 + --o-color-fill3: var(--o-color-white); // SL3 三级投影容器背景,应用于一级投影上的卡片、组件等 + --o-color-fill4: var(--o-color-white); // SL4 覆盖阴影容器背景,应用于信息提示【tips、活动进入按钮等】等投影容器 + --o-color-fill5: var(--o-color-white); // SL5 弹出阴影容器背景,应用于模态弹窗投影 + + --o-color-fill6:255,255,255; +} diff --git a/packages/gauss/src/shared/styles/opendesign-style/_font.scss b/packages/gauss/src/shared/styles/opendesign-style/_font.scss new file mode 100644 index 0000000000000000000000000000000000000000..56116fef4f7959919bfd44ce074a6761428aaa17 --- /dev/null +++ b/packages/gauss/src/shared/styles/opendesign-style/_font.scss @@ -0,0 +1,26 @@ +// 字体 +:root { + // 字体font-size + --o-font-size-h1: 64px; + --o-font-size-h2: 54px; + --o-font-size-h3: 36px; + --o-font-size-h4: 28px; + --o-font-size-h5: 24px; + --o-font-size-h6: 20px; + --o-font-size-h7: 18px; + --o-font-size-h8: 16px; + --o-font-size-text: 14px; + --o-font-size-tip: 12px; + + // 字体line-height + --o-line-height-h1: 84px; + --o-line-height-h2: 76px; + --o-line-height-h3: 48px; + --o-line-height-h4: 36px; + --o-line-height-h5: 32px; + --o-line-height-h6: 28px; + --o-line-height-h7: 26px; + --o-line-height-h8: 24px; + --o-line-height-text: 22px; + --o-line-height-tip: 18px; +} diff --git a/packages/gauss/src/shared/styles/opendesign-style/_shadow.scss b/packages/gauss/src/shared/styles/opendesign-style/_shadow.scss new file mode 100644 index 0000000000000000000000000000000000000000..31c21c71a49cbf0ed7a68f998a6b0cdadf53c42e --- /dev/null +++ b/packages/gauss/src/shared/styles/opendesign-style/_shadow.scss @@ -0,0 +1,9 @@ +// 阴影,注:SL2有hover投影 +:root { + --o-shadow-l1: 0 1px 5px rgba(45, 47, 51, 0.1); // SL1 一级投影,应用于楼层、导航栏、组件里局部投影等, + --o-shadow-l2: 0 1px 5px rgba(45, 47, 51, 0.1); // SL2-normal 二级投影,应用于卡片、组件里局部投影等 + --o-shadow-l2_hover: 0 6px 18px rgba(125, 50, 234, 0.14); // SL2-hover 升起投影,应用于悬停状态的卡片等,是SL2的激活态 + --o-shadow-l3: 0 6px 18px rgba(45, 47, 51, 0.14); // SL3 三级投影,应用于一级投影上的卡片、组件等 + --o-shadow-l4: 0 10px 32px rgba(45, 47, 51, 0.18); // SL4 覆盖阴影,应用于信息提示【tips、活动进入按钮等】等投影 + --o-shadow-l5: 0 12px 42px rgba(45, 47, 51, 0.24); // SL5 弹出阴影,应用于模态弹窗投影 +} diff --git a/packages/gauss/src/shared/styles/opendesign-style/_spacing.scss b/packages/gauss/src/shared/styles/opendesign-style/_spacing.scss new file mode 100644 index 0000000000000000000000000000000000000000..e3dcd5bfbe1370420420c90af1683fed7df3393f --- /dev/null +++ b/packages/gauss/src/shared/styles/opendesign-style/_spacing.scss @@ -0,0 +1,13 @@ +// 间距 +:root { + --o-spacing-h1: 64px; + --o-spacing-h2: 40px; + --o-spacing-h3: 32px; + --o-spacing-h4: 24px; + --o-spacing-h5: 16px; + --o-spacing-h6: 12px; + --o-spacing-h7: 10px; + --o-spacing-h8: 8px; + --o-spacing-h9: 6px; + --o-spacing-h10: 4px; +} diff --git a/packages/gauss/src/shared/styles/opendesign-style/variable.scss b/packages/gauss/src/shared/styles/opendesign-style/variable.scss new file mode 100644 index 0000000000000000000000000000000000000000..c7242722c856dd379092fd4ea79825a664a01b7b --- /dev/null +++ b/packages/gauss/src/shared/styles/opendesign-style/variable.scss @@ -0,0 +1,4 @@ +@import './_color.scss'; +@import './_shadow.scss'; +@import './_font.scss'; +@import './_spacing.scss'; diff --git a/packages/gauss/src/views/mobile/current/SpecialInterestGroupDiagram.vue b/packages/gauss/src/views/mobile/current/SpecialInterestGroupDiagram.vue index 1d9d47175e3d2d439a2f53fb5d836ac5cd9c0441..37ae9995410fd96cc491fde9c5077d7f628d51c2 100644 --- a/packages/gauss/src/views/mobile/current/SpecialInterestGroupDiagram.vue +++ b/packages/gauss/src/views/mobile/current/SpecialInterestGroupDiagram.vue @@ -49,7 +49,9 @@ } as any)" @click="goTo(val)" > - {{ val.sig_names }} + + {{ val.sig_names }} @@ -94,23 +96,23 @@ - - -
{{ $t('cookie.title') }}
+ {{ $t('cookie.desc') }} + + {{ $t('cookie.link') }} {{ isZh ? '。' : '.' }} +