From 7d3236550c58aeaed958cbbd7deef6c06a4d0674 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sun, 3 Aug 2025 20:11:30 +0800 Subject: [PATCH] :tada: Initial Commit for the Sphere webpage --- DysonNetwork.Sphere/Client/.editorconfig | 9 ++ DysonNetwork.Sphere/Client/.gitattributes | 1 + DysonNetwork.Sphere/Client/.gitignore | 31 +++++ DysonNetwork.Sphere/Client/.prettierrc.json | 6 + .../Client/.vscode/extensions.json | 9 ++ DysonNetwork.Sphere/Client/env.d.ts | 1 + DysonNetwork.Sphere/Client/eslint.config.ts | 31 +++++ DysonNetwork.Sphere/Client/index.html | 14 +++ DysonNetwork.Sphere/Client/package.json | 58 +++++++++ DysonNetwork.Sphere/Client/public/favicon.png | Bin 0 -> 71375 bytes .../Client/public/image-broken.jpg | Bin 0 -> 38544 bytes .../Client/src/assets/main.css | 10 ++ .../Client/src/components/AttachmentItem.vue | 18 +++ .../Client/src/components/PostHeader.vue | 34 ++++++ .../Client/src/components/PostItem.vue | 53 ++++++++ .../Client/src/layouts/default.vue | 115 ++++++++++++++++++ DysonNetwork.Sphere/Client/src/main.ts | 16 +++ DysonNetwork.Sphere/Client/src/root.vue | 55 +++++++++ .../Client/src/router/index.ts | 39 ++++++ .../Client/src/stores/services.ts | 27 ++++ DysonNetwork.Sphere/Client/src/stores/user.ts | 65 ++++++++++ .../Client/src/views/index.vue | 67 ++++++++++ .../Client/src/views/not-found.vue | 16 +++ .../Client/src/views/secure.ts | 94 ++++++++++++++ DysonNetwork.Sphere/Client/tsconfig.app.json | 12 ++ DysonNetwork.Sphere/Client/tsconfig.json | 11 ++ DysonNetwork.Sphere/Client/tsconfig.node.json | 19 +++ DysonNetwork.Sphere/Client/vite.config.ts | 32 +++++ DysonNetwork.Sphere/Dockerfile | 38 +++++- DysonNetwork.Sphere/Program.cs | 2 + .../Startup/ServiceCollectionExtensions.cs | 12 +- 31 files changed, 886 insertions(+), 9 deletions(-) create mode 100644 DysonNetwork.Sphere/Client/.editorconfig create mode 100644 DysonNetwork.Sphere/Client/.gitattributes create mode 100644 DysonNetwork.Sphere/Client/.gitignore create mode 100644 DysonNetwork.Sphere/Client/.prettierrc.json create mode 100644 DysonNetwork.Sphere/Client/.vscode/extensions.json create mode 100644 DysonNetwork.Sphere/Client/env.d.ts create mode 100644 DysonNetwork.Sphere/Client/eslint.config.ts create mode 100644 DysonNetwork.Sphere/Client/index.html create mode 100644 DysonNetwork.Sphere/Client/package.json create mode 100755 DysonNetwork.Sphere/Client/public/favicon.png create mode 100644 DysonNetwork.Sphere/Client/public/image-broken.jpg create mode 100644 DysonNetwork.Sphere/Client/src/assets/main.css create mode 100644 DysonNetwork.Sphere/Client/src/components/AttachmentItem.vue create mode 100644 DysonNetwork.Sphere/Client/src/components/PostHeader.vue create mode 100644 DysonNetwork.Sphere/Client/src/components/PostItem.vue create mode 100644 DysonNetwork.Sphere/Client/src/layouts/default.vue create mode 100644 DysonNetwork.Sphere/Client/src/main.ts create mode 100644 DysonNetwork.Sphere/Client/src/root.vue create mode 100644 DysonNetwork.Sphere/Client/src/router/index.ts create mode 100644 DysonNetwork.Sphere/Client/src/stores/services.ts create mode 100644 DysonNetwork.Sphere/Client/src/stores/user.ts create mode 100644 DysonNetwork.Sphere/Client/src/views/index.vue create mode 100644 DysonNetwork.Sphere/Client/src/views/not-found.vue create mode 100644 DysonNetwork.Sphere/Client/src/views/secure.ts create mode 100644 DysonNetwork.Sphere/Client/tsconfig.app.json create mode 100644 DysonNetwork.Sphere/Client/tsconfig.json create mode 100644 DysonNetwork.Sphere/Client/tsconfig.node.json create mode 100644 DysonNetwork.Sphere/Client/vite.config.ts diff --git a/DysonNetwork.Sphere/Client/.editorconfig b/DysonNetwork.Sphere/Client/.editorconfig new file mode 100644 index 0000000..5a5809d --- /dev/null +++ b/DysonNetwork.Sphere/Client/.editorconfig @@ -0,0 +1,9 @@ +[*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue,css,scss,sass,less,styl}] +charset = utf-8 +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +end_of_line = lf +max_line_length = 100 diff --git a/DysonNetwork.Sphere/Client/.gitattributes b/DysonNetwork.Sphere/Client/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/DysonNetwork.Sphere/Client/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/DysonNetwork.Sphere/Client/.gitignore b/DysonNetwork.Sphere/Client/.gitignore new file mode 100644 index 0000000..20c3f25 --- /dev/null +++ b/DysonNetwork.Sphere/Client/.gitignore @@ -0,0 +1,31 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +**/node_modules/highlight.js/ +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.tsbuildinfo diff --git a/DysonNetwork.Sphere/Client/.prettierrc.json b/DysonNetwork.Sphere/Client/.prettierrc.json new file mode 100644 index 0000000..29a2402 --- /dev/null +++ b/DysonNetwork.Sphere/Client/.prettierrc.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://json.schemastore.org/prettierrc", + "semi": false, + "singleQuote": true, + "printWidth": 100 +} diff --git a/DysonNetwork.Sphere/Client/.vscode/extensions.json b/DysonNetwork.Sphere/Client/.vscode/extensions.json new file mode 100644 index 0000000..3f84126 --- /dev/null +++ b/DysonNetwork.Sphere/Client/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + "recommendations": [ + "Vue.volar", + "dbaeumer.vscode-eslint", + "EditorConfig.EditorConfig", + "oxc.oxc-vscode", + "esbenp.prettier-vscode" + ] +} diff --git a/DysonNetwork.Sphere/Client/env.d.ts b/DysonNetwork.Sphere/Client/env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/DysonNetwork.Sphere/Client/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/DysonNetwork.Sphere/Client/eslint.config.ts b/DysonNetwork.Sphere/Client/eslint.config.ts new file mode 100644 index 0000000..07ad90a --- /dev/null +++ b/DysonNetwork.Sphere/Client/eslint.config.ts @@ -0,0 +1,31 @@ +import { globalIgnores } from 'eslint/config' +import { defineConfigWithVueTs, vueTsConfigs } from '@vue/eslint-config-typescript' +import pluginVue from 'eslint-plugin-vue' +import pluginOxlint from 'eslint-plugin-oxlint' +import skipFormatting from '@vue/eslint-config-prettier/skip-formatting' + +// To allow more languages other than `ts` in `.vue` files, uncomment the following lines: +// import { configureVueProject } from '@vue/eslint-config-typescript' +// configureVueProject({ scriptLangs: ['ts', 'tsx'] }) +// More info at https://github.com/vuejs/eslint-config-typescript/#advanced-setup + +export default defineConfigWithVueTs( + { + name: 'app/files-to-lint', + files: ['**/*.{ts,mts,tsx,vue}'], + }, + + globalIgnores(['**/dist/**', '**/dist-ssr/**', '**/coverage/**']), + + pluginVue.configs['flat/essential'], + vueTsConfigs.recommended, + ...pluginOxlint.configs['flat/recommended'], + { + rules: { + 'vue/multi-word-component-names': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + }, + }, + skipFormatting, +) diff --git a/DysonNetwork.Sphere/Client/index.html b/DysonNetwork.Sphere/Client/index.html new file mode 100644 index 0000000..f18006e --- /dev/null +++ b/DysonNetwork.Sphere/Client/index.html @@ -0,0 +1,14 @@ + + + + + + + Solar Network + + + +
+ + + diff --git a/DysonNetwork.Sphere/Client/package.json b/DysonNetwork.Sphere/Client/package.json new file mode 100644 index 0000000..0d8e4be --- /dev/null +++ b/DysonNetwork.Sphere/Client/package.json @@ -0,0 +1,58 @@ +{ + "name": "@solar-network/sphere", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "run-p type-check \"build-only {@}\" --", + "preview": "vite preview", + "build-only": "vite build", + "type-check": "vue-tsc --build", + "lint:oxlint": "oxlint . --fix -D correctness --ignore-path .gitignore", + "lint:eslint": "eslint . --fix", + "lint": "run-s lint:*", + "format": "prettier --write src/" + }, + "dependencies": { + "@fingerprintjs/fingerprintjs": "^4.6.2", + "@fontsource-variable/nunito": "^5.2.6", + "@hcaptcha/vue3-hcaptcha": "^1.3.0", + "@tailwindcss/typography": "^0.5.16", + "@tailwindcss/vite": "^4.1.11", + "@vueuse/core": "^13.5.0", + "aspnet-prerendering": "^3.0.1", + "cfturnstile-vue3": "^2.0.0", + "chart.js": "^4.5.0", + "dayjs": "^1.11.13", + "marked": "^16.1.1", + "pinia": "^3.0.3", + "tailwindcss": "^4.1.11", + "tus-js-client": "^4.3.1", + "vue": "^3.5.17", + "vue-chartjs": "^5.3.2", + "vue-router": "^4.5.1" + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.2", + "@types/node": "^22.16.4", + "@vicons/material": "^0.13.0", + "@vitejs/plugin-vue": "^6.0.0", + "@vitejs/plugin-vue-jsx": "^5.0.1", + "@vue/eslint-config-prettier": "^10.2.0", + "@vue/eslint-config-typescript": "^14.6.0", + "@vue/tsconfig": "^0.7.0", + "eslint": "^9.31.0", + "eslint-plugin-oxlint": "~1.1.0", + "eslint-plugin-vue": "~10.2.0", + "jiti": "^2.4.2", + "naive-ui": "^2.42.0", + "npm-run-all2": "^8.0.4", + "oxlint": "~1.1.0", + "prettier": "3.5.3", + "typescript": "~5.8.3", + "vite": "npm:rolldown-vite@latest", + "vite-plugin-vue-devtools": "^7.7.7", + "vue-tsc": "^2.2.12" + } +} \ No newline at end of file diff --git a/DysonNetwork.Sphere/Client/public/favicon.png b/DysonNetwork.Sphere/Client/public/favicon.png new file mode 100755 index 0000000000000000000000000000000000000000..0eeb8c11185064aeed6a0a0696e691d3ea92530a GIT binary patch literal 71375 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 literal 0 HcmV?d00001 diff --git a/DysonNetwork.Sphere/Client/src/assets/main.css b/DysonNetwork.Sphere/Client/src/assets/main.css new file mode 100644 index 0000000..dcb13cc --- /dev/null +++ b/DysonNetwork.Sphere/Client/src/assets/main.css @@ -0,0 +1,10 @@ +@import "tailwindcss"; +@plugin "@tailwindcss/typography"; + +@layer theme, base, components, utilities; + +@layer base { + body { + font-family: 'Nunito Variable', sans-serif; + } +} diff --git a/DysonNetwork.Sphere/Client/src/components/AttachmentItem.vue b/DysonNetwork.Sphere/Client/src/components/AttachmentItem.vue new file mode 100644 index 0000000..b0e6ced --- /dev/null +++ b/DysonNetwork.Sphere/Client/src/components/AttachmentItem.vue @@ -0,0 +1,18 @@ + + + diff --git a/DysonNetwork.Sphere/Client/src/components/PostHeader.vue b/DysonNetwork.Sphere/Client/src/components/PostHeader.vue new file mode 100644 index 0000000..2a33512 --- /dev/null +++ b/DysonNetwork.Sphere/Client/src/components/PostHeader.vue @@ -0,0 +1,34 @@ + + + diff --git a/DysonNetwork.Sphere/Client/src/components/PostItem.vue b/DysonNetwork.Sphere/Client/src/components/PostItem.vue new file mode 100644 index 0000000..3aa4386 --- /dev/null +++ b/DysonNetwork.Sphere/Client/src/components/PostItem.vue @@ -0,0 +1,53 @@ + + + diff --git a/DysonNetwork.Sphere/Client/src/layouts/default.vue b/DysonNetwork.Sphere/Client/src/layouts/default.vue new file mode 100644 index 0000000..b1ccd23 --- /dev/null +++ b/DysonNetwork.Sphere/Client/src/layouts/default.vue @@ -0,0 +1,115 @@ + + + + + diff --git a/DysonNetwork.Sphere/Client/src/main.ts b/DysonNetwork.Sphere/Client/src/main.ts new file mode 100644 index 0000000..d535f8e --- /dev/null +++ b/DysonNetwork.Sphere/Client/src/main.ts @@ -0,0 +1,16 @@ +import '@fontsource-variable/nunito'; + +import './assets/main.css' + +import { createApp } from 'vue' +import { createPinia } from 'pinia' + +import Root from './root.vue' +import router from './router' + +const app = createApp(Root) + +app.use(createPinia()) +app.use(router) + +app.mount('#app') diff --git a/DysonNetwork.Sphere/Client/src/root.vue b/DysonNetwork.Sphere/Client/src/root.vue new file mode 100644 index 0000000..f838752 --- /dev/null +++ b/DysonNetwork.Sphere/Client/src/root.vue @@ -0,0 +1,55 @@ + + + diff --git a/DysonNetwork.Sphere/Client/src/router/index.ts b/DysonNetwork.Sphere/Client/src/router/index.ts new file mode 100644 index 0000000..1d13263 --- /dev/null +++ b/DysonNetwork.Sphere/Client/src/router/index.ts @@ -0,0 +1,39 @@ +import { createRouter, createWebHistory } from 'vue-router' +import { useUserStore } from '@/stores/user' +import { useServicesStore } from '@/stores/services' + +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes: [ + { + path: '/', + name: 'index', + component: () => import('../views/index.vue'), + }, + ], +}) + +router.beforeEach(async (to, from, next) => { + const userStore = useUserStore() + const servicesStore = useServicesStore() + + // Initialize user state if not already initialized + if (!userStore.user) { + await userStore.fetchUser() + } + + if (to.matched.some((record) => record.meta.requiresAuth) && !userStore.isAuthenticated) { + window.open( + servicesStore.getSerivceUrl( + 'DysonNetwork.Pass', + 'login?redirect=' + encodeURIComponent(window.location.href), + )!, + '_blank', + ) + next('/') + } else { + next() + } +}) + +export default router diff --git a/DysonNetwork.Sphere/Client/src/stores/services.ts b/DysonNetwork.Sphere/Client/src/stores/services.ts new file mode 100644 index 0000000..2ef28c9 --- /dev/null +++ b/DysonNetwork.Sphere/Client/src/stores/services.ts @@ -0,0 +1,27 @@ +import { defineStore } from 'pinia' +import { ref } from 'vue' + +export const useServicesStore = defineStore('services', () => { + const services = ref>({}) + + async function fetchServices() { + try { + const response = await fetch('/cgi/.well-known/services') + if (!response.ok) { + throw new Error('Network response was not ok') + } + const data = await response.json() + services.value = data + } catch (error) { + console.error('Failed to fetch services:', error) + services.value = {} + } + } + + function getSerivceUrl(serviceName: string, ...parts: string[]): string | null { + const baseUrl = services.value[serviceName] || null + return baseUrl ? `${baseUrl}/${parts.join('/')}` : null + } + + return { services, fetchServices, getSerivceUrl } +}) diff --git a/DysonNetwork.Sphere/Client/src/stores/user.ts b/DysonNetwork.Sphere/Client/src/stores/user.ts new file mode 100644 index 0000000..7dca8a6 --- /dev/null +++ b/DysonNetwork.Sphere/Client/src/stores/user.ts @@ -0,0 +1,65 @@ +import { defineStore } from 'pinia' +import { ref, computed } from 'vue' + +export const useUserStore = defineStore('user', () => { + // State + const user = ref(null) + const isLoading = ref(false) + const error = ref(null) + + // Getters + const isAuthenticated = computed(() => !!user.value) + + // Actions + async function fetchUser(reload = true) { + if (!reload && user.value) return + isLoading.value = true + error.value = null + try { + const response = await fetch('/cgi/id/accounts/me', { + credentials: 'include', + }) + + if (!response.ok) { + // If the token is invalid, clear it and the user state + throw new Error('Failed to fetch user information.') + } + + user.value = await response.json() + } catch (e: any) { + error.value = e.message + user.value = null // Clear user data on error + } finally { + isLoading.value = false + } + } + + function initialize() { + const allowedOrigin = import.meta.env.DEV ? window.location.origin : 'https://id.solian.app' + window.addEventListener('message', (event) => { + // IMPORTANT: Always check the origin of the message for security! + // This prevents malicious scripts from sending fake login status updates. + // Ensure event.origin exactly matches your identity service's origin. + if (event.origin !== allowedOrigin) { + console.warn(`[SYNC] Message received from unexpected origin: ${event.origin}. Ignoring.`) + return // Ignore messages from unknown origins + } + + // Check if the message is the type we're expecting + if (event.data && event.data.type === 'DY:LOGIN_STATUS_CHANGE') { + const { loggedIn } = event.data + console.log(`[SYNC] Received login status change: ${loggedIn}`) + fetchUser() // Re-fetch user data on login status change + } + }) + } + + return { + user, + isLoading, + error, + isAuthenticated, + fetchUser, + initialize, + } +}) diff --git a/DysonNetwork.Sphere/Client/src/views/index.vue b/DysonNetwork.Sphere/Client/src/views/index.vue new file mode 100644 index 0000000..8e57671 --- /dev/null +++ b/DysonNetwork.Sphere/Client/src/views/index.vue @@ -0,0 +1,67 @@ + + + diff --git a/DysonNetwork.Sphere/Client/src/views/not-found.vue b/DysonNetwork.Sphere/Client/src/views/not-found.vue new file mode 100644 index 0000000..b5c8da9 --- /dev/null +++ b/DysonNetwork.Sphere/Client/src/views/not-found.vue @@ -0,0 +1,16 @@ + + + diff --git a/DysonNetwork.Sphere/Client/src/views/secure.ts b/DysonNetwork.Sphere/Client/src/views/secure.ts new file mode 100644 index 0000000..1d8a352 --- /dev/null +++ b/DysonNetwork.Sphere/Client/src/views/secure.ts @@ -0,0 +1,94 @@ +export async function downloadAndDecryptFile( + url: string, + password: string, + fileName: string, + onProgress?: (progress: number) => void, +): Promise { + const response = await fetch(url) + if (!response.ok) throw new Error(`Failed to fetch: ${response.status}`) + + const contentLength = +(response.headers.get('Content-Length') || 0) + const reader = response.body!.getReader() + const chunks: Uint8Array[] = [] + let received = 0 + + while (true) { + const { done, value } = await reader.read() + if (done) break + if (value) { + chunks.push(value) + received += value.length + if (contentLength && onProgress) { + onProgress(received / contentLength) + } + } + } + + const fullBuffer = new Uint8Array(received) + let offset = 0 + for (const chunk of chunks) { + fullBuffer.set(chunk, offset) + offset += chunk.length + } + + const decryptedBytes = await decryptFile(fullBuffer, password) + + // Create a blob and trigger a download + const blob = new Blob([decryptedBytes]) + const downloadUrl = URL.createObjectURL(blob) + const a = document.createElement('a') + a.href = downloadUrl + a.download = fileName + document.body.appendChild(a) + a.click() + a.remove() + URL.revokeObjectURL(downloadUrl) +} + +export async function decryptFile(fileBuffer: Uint8Array, password: string): Promise { + const salt = fileBuffer.slice(0, 16) + const nonce = fileBuffer.slice(16, 28) + const tag = fileBuffer.slice(28, 44) + const ciphertext = fileBuffer.slice(44) + + const enc = new TextEncoder() + const keyMaterial = await crypto.subtle.importKey( + 'raw', + enc.encode(password), + { name: 'PBKDF2' }, + false, + ['deriveKey'], + ) + const key = await crypto.subtle.deriveKey( + { name: 'PBKDF2', salt, iterations: 100000, hash: 'SHA-256' }, + keyMaterial, + { name: 'AES-GCM', length: 256 }, + false, + ['decrypt'], + ) + + const fullCiphertext = new Uint8Array(ciphertext.length + tag.length) + fullCiphertext.set(ciphertext) + fullCiphertext.set(tag, ciphertext.length) + + let decrypted: ArrayBuffer + try { + decrypted = await crypto.subtle.decrypt( + { name: 'AES-GCM', iv: nonce, tagLength: 128 }, + key, + fullCiphertext, + ) + } catch { + throw new Error('Incorrect password or corrupted file.') + } + + const magic = new TextEncoder().encode('DYSON1') + const decryptedBytes = new Uint8Array(decrypted) + for (let i = 0; i < magic.length; i++) { + if (decryptedBytes[i] !== magic[i]) { + throw new Error('Incorrect password or corrupted file.') + } + } + + return decryptedBytes.slice(magic.length) +} diff --git a/DysonNetwork.Sphere/Client/tsconfig.app.json b/DysonNetwork.Sphere/Client/tsconfig.app.json new file mode 100644 index 0000000..d0f8430 --- /dev/null +++ b/DysonNetwork.Sphere/Client/tsconfig.app.json @@ -0,0 +1,12 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "include": ["env.d.ts", "src/**/*", "src/**/*.vue", "./**/*.d.ts"], + "exclude": ["src/**/__tests__/*"], + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/DysonNetwork.Sphere/Client/tsconfig.json b/DysonNetwork.Sphere/Client/tsconfig.json new file mode 100644 index 0000000..66b5e57 --- /dev/null +++ b/DysonNetwork.Sphere/Client/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.node.json" + }, + { + "path": "./tsconfig.app.json" + } + ] +} diff --git a/DysonNetwork.Sphere/Client/tsconfig.node.json b/DysonNetwork.Sphere/Client/tsconfig.node.json new file mode 100644 index 0000000..a83dfc9 --- /dev/null +++ b/DysonNetwork.Sphere/Client/tsconfig.node.json @@ -0,0 +1,19 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "include": [ + "vite.config.*", + "vitest.config.*", + "cypress.config.*", + "nightwatch.conf.*", + "playwright.config.*", + "eslint.config.*" + ], + "compilerOptions": { + "noEmit": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + + "module": "ESNext", + "moduleResolution": "Bundler", + "types": ["node"] + } +} diff --git a/DysonNetwork.Sphere/Client/vite.config.ts b/DysonNetwork.Sphere/Client/vite.config.ts new file mode 100644 index 0000000..387d074 --- /dev/null +++ b/DysonNetwork.Sphere/Client/vite.config.ts @@ -0,0 +1,32 @@ +import { fileURLToPath, URL } from 'node:url' + +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' +import vueDevTools from 'vite-plugin-vue-devtools' +import tailwindcss from '@tailwindcss/vite' + +process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0' + +// https://vite.dev/config/ +export default defineConfig({ + base: '/', + plugins: [vue(), vueJsx(), vueDevTools(), tailwindcss()], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + }, + }, + server: { + proxy: { + '/api': { + target: 'http://localhost:5071', + changeOrigin: true, + }, + '/cgi': { + target: 'http://localhost:5071', + changeOrigin: true, + } + }, + }, +}) diff --git a/DysonNetwork.Sphere/Dockerfile b/DysonNetwork.Sphere/Dockerfile index d604165..5fcc394 100644 --- a/DysonNetwork.Sphere/Dockerfile +++ b/DysonNetwork.Sphere/Dockerfile @@ -1,9 +1,28 @@ +# Stage 1: Base runtime image FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base USER $APP_UID WORKDIR /app EXPOSE 8080 EXPOSE 8081 +# Stage 2: Build SPA +FROM node:22-alpine AS spa-builder +WORKDIR /src + +# Copy package files for SPA +COPY ["DysonNetwork.Sphere/Client/package.json", "DysonNetwork.Sphere/Client/package-lock.json*", "./Client/"] + +# Install SPA dependencies +WORKDIR /src/Client +RUN npm install + +# Copy SPA source +COPY ["DysonNetwork.Sphere/Client/", "./"] + +# Build SPA +RUN npm run build + +# Stage 3: Build .NET application FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src @@ -16,9 +35,12 @@ COPY ["DysonNetwork.Shared/DysonNetwork.Shared.csproj", "DysonNetwork.Shared/"] # Restore packages RUN dotnet restore "DysonNetwork.Sphere/DysonNetwork.Sphere.csproj" -# Copy everything except Pass project's config files +# Copy everything else and build COPY . . +# Copy built SPA to wwwroot +COPY --from=spa-builder /src/Client/dist /src/DysonNetwork.Sphere/wwwroot/dist + # Remove Pass project's config files to prevent conflicts RUN rm -f /src/DysonNetwork.Pass/appsettings*.json /src/DysonNetwork.Pass/version.json @@ -26,16 +48,24 @@ RUN rm -f /src/DysonNetwork.Pass/appsettings*.json /src/DysonNetwork.Pass/versio RUN mkdir -p /src/DysonNetwork.Sphere/bin/Release/net9.0/zh-hans \ && mkdir -p /src/DysonNetwork.Pass/bin/Release/net9.0/zh-hans +# Build the application WORKDIR "/src/DysonNetwork.Sphere" -RUN dotnet build "DysonNetwork.Sphere.csproj" -c $BUILD_CONFIGURATION -o /app/build +RUN dotnet build "DysonNetwork.Sphere.csproj" -c $BUILD_CONFIGURATION -o /app/build \ + -p:TypeScriptCompileBlocked=true \ + -p:UseRazorBuildServer=false +# Stage 4: Publish FROM build AS publish ARG BUILD_CONFIGURATION=Release # Ensure the target directory for localized resources exists RUN mkdir -p /app/publish/zh-Hans -RUN dotnet publish "./DysonNetwork.Sphere.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false +RUN dotnet publish "DysonNetwork.Sphere.csproj" -c $BUILD_CONFIGURATION -o /app/publish \ + -p:TypeScriptCompileBlocked=true \ + -p:UseRazorBuildServer=false \ + /p:UseAppHost=false +# Final stage: Runtime FROM base AS final WORKDIR /app COPY --from=publish /app/publish . -ENTRYPOINT ["dotnet", "DysonNetwork.Sphere.dll"] +ENTRYPOINT ["dotnet", "DysonNetwork.Sphere.dll"] \ No newline at end of file diff --git a/DysonNetwork.Sphere/Program.cs b/DysonNetwork.Sphere/Program.cs index f8b9c9d..9521387 100644 --- a/DysonNetwork.Sphere/Program.cs +++ b/DysonNetwork.Sphere/Program.cs @@ -45,4 +45,6 @@ using (var scope = app.Services.CreateScope()) // Configure application middleware pipeline app.ConfigureAppMiddleware(builder.Configuration); +app.MapGatewayProxy(); + app.Run(); \ No newline at end of file diff --git a/DysonNetwork.Sphere/Startup/ServiceCollectionExtensions.cs b/DysonNetwork.Sphere/Startup/ServiceCollectionExtensions.cs index 190d06a..4448298 100644 --- a/DysonNetwork.Sphere/Startup/ServiceCollectionExtensions.cs +++ b/DysonNetwork.Sphere/Startup/ServiceCollectionExtensions.cs @@ -52,13 +52,15 @@ public static class ServiceCollectionExtensions { options.DataAnnotationLocalizerProvider = (type, factory) => factory.Create(typeof(SharedResource)); + }).ConfigureApplicationPartManager(opts => + { + var mockingPart = opts.ApplicationParts.FirstOrDefault(a => a.Name == "DysonNetwork.Pass"); + if (mockingPart != null) + opts.ApplicationParts.Remove(mockingPart); }); services.AddRazorPages(); - - services.AddGrpc(options => - { - options.EnableDetailedErrors = true; - }); + + services.AddGrpc(options => { options.EnableDetailedErrors = true; }); services.Configure(options => {