feat: 调整项目结构

This commit is contained in:
duanshuwen
2025-12-19 13:10:08 +08:00
parent 6778c57a0e
commit 0d6ffdef83
33 changed files with 219 additions and 102 deletions

2
global.d.ts vendored
View File

@@ -121,7 +121,7 @@ declare global {
} }
declare module "@store/*"; declare module "@store/*";
declare module "@modules/*"; declare module "@service/*";
declare module "@utils/*"; declare module "@utils/*";
declare module "@assets/images/*"; declare module "@assets/images/*";
declare module "@constant/*"; declare module "@constant/*";

16
html/dialog.html Normal file
View File

@@ -0,0 +1,16 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8" />
<title>NIANXX</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' http://8.138.234.141; connect-src 'self' http://8.138.234.141 https://api.iconify.design"
/>
</head>
<body>
<div id="app"></div>
<script type="module" src="../src/renderer/views/dialog/index.ts"></script>
</body>
</html>

View File

@@ -11,6 +11,6 @@
</head> </head>
<body> <body>
<div id="app"></div> <div id="app"></div>
<script type="module" src="/src/renderer/main.ts"></script> <script type="module" src="../src/renderer/main.ts"></script>
</body> </body>
</html> </html>

16
html/loading.html Normal file
View File

@@ -0,0 +1,16 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8" />
<title>NIANXX</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' http://8.138.234.141; connect-src 'self' http://8.138.234.141 https://api.iconify.design"
/>
</head>
<body>
<div id="app"></div>
<script type="module" src="../src/renderer/views/loading/index.ts"></script>
</body>
</html>

16
html/login.html Normal file
View File

@@ -0,0 +1,16 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8" />
<title>NIANXX</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' http://8.138.234.141; connect-src 'self' http://8.138.234.141 https://api.iconify.design"
/>
</head>
<body>
<div id="app"></div>
<script type="module" src="../src/renderer/views/login/index.ts"></script>
</body>
</html>

16
html/setting.html Normal file
View File

@@ -0,0 +1,16 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8" />
<title>NIANXX</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' http://8.138.234.141; connect-src 'self' http://8.138.234.141 https://api.iconify.design"
/>
</head>
<body>
<div id="app"></div>
<script type="module" src="../src/renderer/views/setting/index.ts"></script>
</body>
</html>

View File

@@ -1,8 +1,8 @@
import { app, BrowserWindow } from 'electron' import { app, BrowserWindow } from 'electron'
import { setupWindows } from '@main/wins' import { setupWindows } from '@main/wins'
import started from 'electron-squirrel-startup' import started from 'electron-squirrel-startup'
import configManager from '@modules/config-service' import configManager from '@main/service/config-service'
import logManager from '@modules/logger' import logManager from '@main/service/logger'
import { CONFIG_KEYS } from '@common/constants' import { CONFIG_KEYS } from '@common/constants'
// Handle creating/removing shortcuts on Windows when installing/uninstalling. // Handle creating/removing shortcuts on Windows when installing/uninstalling.

View File

@@ -1,7 +1,7 @@
import { BaseProvider } from "./BaseProvider"; import { BaseProvider } from "./BaseProvider";
import OpenAI from "openai"; import OpenAI from "openai";
import logManager from "@modules/logger" import logManager from "@main/service/logger"
function _transformChunk(chunk: OpenAI.Chat.Completions.ChatCompletionChunk): UniversalChunk { function _transformChunk(chunk: OpenAI.Chat.Completions.ChatCompletionChunk): UniversalChunk {

View File

@@ -2,8 +2,8 @@ import type { Provider } from "@common/types"
import { OpenAIProvider } from "./OpenAIProvider" import { OpenAIProvider } from "./OpenAIProvider"
import { parseOpenAISetting } from '@common/utils' import { parseOpenAISetting } from '@common/utils'
import { decode } from 'js-base64' import { decode } from 'js-base64'
import { configManager } from '@modules/config-service' import { configManager } from '@main/service/config-service'
import { logManager } from '@modules/logger' import { logManager } from '@main/service/logger'
import { CONFIG_KEYS } from "@common/constants" import { CONFIG_KEYS } from "@common/constants"
const providers = [ const providers = [

View File

@@ -5,7 +5,7 @@ import { debounce, simpleCloneDeep } from '@common/utils'
import * as fs from 'fs' import * as fs from 'fs'
import * as path from 'path' import * as path from 'path'
import logManager from '@modules/logger' import logManager from '@main/service/logger'
const DEFAULT_CONFIG: IConfig = { const DEFAULT_CONFIG: IConfig = {
[CONFIG_KEYS.THEME_MODE]: 'system', [CONFIG_KEYS.THEME_MODE]: 'system',

View File

@@ -2,8 +2,8 @@ import { ipcMain, Menu, type MenuItemConstructorOptions } from 'electron';
import { CONFIG_KEYS, IPC_EVENTS } from '@common/constants'; import { CONFIG_KEYS, IPC_EVENTS } from '@common/constants';
import { cloneDeep } from '@common/utils'; import { cloneDeep } from '@common/utils';
import { createTranslator } from '@main/utils' import { createTranslator } from '@main/utils'
import logManager from '@modules/logger' import logManager from '@main/service/logger'
import configManager from '@modules/config-service' import configManager from '@main/service/config-service'
let t: ReturnType<typeof createTranslator> = createTranslator(); let t: ReturnType<typeof createTranslator> = createTranslator();

View File

@@ -1,6 +1,6 @@
import { BrowserWindow, ipcMain, nativeTheme } from 'electron' import { BrowserWindow, ipcMain, nativeTheme } from 'electron'
import { configManager } from '@modules/config-service' import { configManager } from '@main/service/config-service'
import { logManager } from '@modules/logger' import { logManager } from '@main/service/logger'
import { IPC_EVENTS, CONFIG_KEYS } from '@common/constants' import { IPC_EVENTS, CONFIG_KEYS } from '@common/constants'
class ThemeService { class ThemeService {

View File

@@ -2,10 +2,10 @@ import { Tray, Menu, ipcMain, app } from 'electron'
import { createTranslator, createLogo } from '@main/utils' import { createTranslator, createLogo } from '@main/utils'
import { CONFIG_KEYS, IPC_EVENTS, WINDOW_NAMES, MAIN_WIN_SIZE } from '@common/constants' import { CONFIG_KEYS, IPC_EVENTS, WINDOW_NAMES, MAIN_WIN_SIZE } from '@common/constants'
import logManager from '@modules/logger' import logManager from '@main/service/logger'
// TODO: shortcutManager // TODO: shortcutManager
import windowManager from '@modules/window-service' import windowManager from '@main/service/window-service'
import configManager from '@modules/config-service' import configManager from '@main/service/config-service'
let t: ReturnType<typeof createTranslator> = createTranslator(); let t: ReturnType<typeof createTranslator> = createTranslator();

View File

@@ -5,9 +5,9 @@ import { BrowserWindow, BrowserWindowConstructorOptions, ipcMain, IpcMainInvokeE
import { debounce } from '@common/utils' import { debounce } from '@common/utils'
import { createLogo } from '@main/utils' import { createLogo } from '@main/utils'
import logManager from '@modules/logger' import logManager from '@main/service/logger'
import configManager from '@modules/config-service' import configManager from '@main/service/config-service'
import themeManager from '@modules/theme-service' import themeManager from '@main/service/theme-service'
import path from 'node:path'; import path from 'node:path';
interface WindowState { interface WindowState {
@@ -29,7 +29,7 @@ interface SizeOptions {
const SHARED_WINDOW_OPTIONS = { const SHARED_WINDOW_OPTIONS = {
titleBarStyle: 'hidden', titleBarStyle: 'hidden',
show: false, show: false,
title: 'Diona', title: 'NIANXX',
darkTheme: themeManager.isDark, darkTheme: themeManager.isDark,
backgroundColor: themeManager.isDark ? '#2C2C2C' : '#FFFFFF', backgroundColor: themeManager.isDark ? '#2C2C2C' : '#FFFFFF',
webPreferences: { webPreferences: {
@@ -49,6 +49,8 @@ class WindowService {
main: { instance: void 0, isHidden: false, onCreate: [], onClosed: [] }, main: { instance: void 0, isHidden: false, onCreate: [], onClosed: [] },
setting: { instance: void 0, isHidden: false, onCreate: [], onClosed: [] }, setting: { instance: void 0, isHidden: false, onCreate: [], onClosed: [] },
dialog: { instance: void 0, isHidden: false, onCreate: [], onClosed: [] }, dialog: { instance: void 0, isHidden: false, onCreate: [], onClosed: [] },
login: { instance: void 0, isHidden: false, onCreate: [], onClosed: [] },
loading: { instance: void 0, isHidden: false, onCreate: [], onClosed: [] },
} }
private constructor() { private constructor() {

View File

@@ -1,6 +1,6 @@
import { CONFIG_KEYS } from '@common/constants' import { CONFIG_KEYS } from '@common/constants'
import logManager from '@modules/logger' import logManager from '@main/service/logger'
import configManager from '@modules/config-service' import configManager from '@main/service/config-service'
import path from 'node:path' import path from 'node:path'
import en from '@locales/en.json' import en from '@locales/en.json'

View File

@@ -1,6 +1,6 @@
import { IPC_EVENTS, WINDOW_NAMES } from '@common/constants' import { IPC_EVENTS, WINDOW_NAMES } from '@common/constants'
import { BrowserWindow, ipcMain } from 'electron' import { BrowserWindow, ipcMain } from 'electron'
import { windowManager } from '@modules/window-service' import { windowManager } from '@main/service/window-service'
export function setupDialogWindow() { export function setupDialogWindow() {
let dialogWindow: BrowserWindow | void; let dialogWindow: BrowserWindow | void;

View File

@@ -2,11 +2,11 @@ import type { BrowserWindow } from 'electron'
import { ipcMain } from 'electron'; import { ipcMain } from 'electron';
import { WINDOW_NAMES, MAIN_WIN_SIZE, IPC_EVENTS, MENU_IDS, CONVERSATION_ITEM_MENU_IDS, CONVERSATION_LIST_MENU_IDS, MESSAGE_ITEM_MENU_IDS, CONFIG_KEYS } from '@common/constants' import { WINDOW_NAMES, MAIN_WIN_SIZE, IPC_EVENTS, MENU_IDS, CONVERSATION_ITEM_MENU_IDS, CONVERSATION_LIST_MENU_IDS, MESSAGE_ITEM_MENU_IDS, CONFIG_KEYS } from '@common/constants'
import { createProvider } from '../providers' import { createProvider } from '../providers'
import { windowManager } from '@modules/window-service' import { windowManager } from '@main/service/window-service'
import { menuManager } from '@modules/menu-service' import { menuManager } from '@main/service/menu-service'
import { logManager } from '@modules/logger' import { logManager } from '@main/service/logger'
import { configManager } from '@modules/config-service' import { configManager } from '@main/service/config-service'
import { trayManager } from '@modules/tray-service' import { trayManager } from '@main/service/tray-service'
const handleTray = (minimizeToTray: boolean) => { const handleTray = (minimizeToTray: boolean) => {
if (minimizeToTray) { if (minimizeToTray) {

View File

@@ -1,6 +1,6 @@
import { IPC_EVENTS, WINDOW_NAMES } from '@common/constants' import { IPC_EVENTS, WINDOW_NAMES } from '@common/constants'
import { ipcMain } from 'electron' import { ipcMain } from 'electron'
import { windowManager } from '@modules/window-service' import { windowManager } from '@main/service/window-service'
export function setupSetttingWindow() { export function setupSetttingWindow() {
ipcMain.on(`${IPC_EVENTS.OPEN_WINDOW}:${WINDOW_NAMES.SETTING}`, () => { ipcMain.on(`${IPC_EVENTS.OPEN_WINDOW}:${WINDOW_NAMES.SETTING}`, () => {

View File

@@ -1,18 +1,7 @@
import { createRouter, createWebHistory } from "vue-router"; import { createRouter, createMemoryHistory } from "vue-router";
import Layout from '@renderer/layout/index.vue' import Layout from '@renderer/layout/index.vue'
const routes = [ const routes = [
{
path: "/login",
name: "Login",
component: () => import("@renderer/views/login/index.vue"),
},
{
path: "/browser",
name: "Browser",
component: () => import("@renderer/browser/BrowserLayout.vue"),
meta: { requiresAuth: true },
},
{ {
path: "/", path: "/",
component: Layout, component: Layout,
@@ -23,53 +12,12 @@ const routes = [
name: "Home", name: "Home",
meta: { requiresAuth: true }, meta: { requiresAuth: true },
}, },
{
path: "stock",
name: "Stock",
component: () => import("@renderer/views/stock/index.vue"),
meta: { requiresAuth: true },
},
{
path: "rate",
name: "Rate",
component: () => import("@renderer/views/rate/index.vue"),
meta: { requiresAuth: true },
},
{
path: "order",
name: "Order",
component: () => import("@renderer/views/order/index.vue"),
meta: { requiresAuth: true },
},
{
path: "more",
name: "More",
component: () => import("@renderer/views/more/index.vue"),
meta: { requiresAuth: true },
},
{
path: "setting",
name: "Setting",
component: () => import("@renderer/views/setting/index.vue"),
meta: { requiresAuth: true },
},
{
path: "/dashboard",
name: "Dashboard",
component: () => import("@renderer/views/dashboard/index.vue"),
meta: { requiresAuth: true },
},
] ]
}, }
{
path: "/about",
name: "About",
component: () => import("@renderer/views/about/index.vue"),
},
]; ];
const router = createRouter({ const router = createRouter({
history: createWebHistory(), history: createMemoryHistory(),
routes, routes,
scrollBehavior(to: any, from: any, savedPosition: any) { scrollBehavior(to: any, from: any, savedPosition: any) {
if (savedPosition) { if (savedPosition) {
@@ -80,24 +28,24 @@ const router = createRouter({
}, },
}); });
router.beforeEach((to: any, from: any, next: any) => { // router.beforeEach((to: any, from: any, next: any) => {
const token = localStorage.getItem("token"); // const token = localStorage.getItem("token");
if (to.meta && (to.meta as any).requiresAuth && !token) { // if (to.meta && (to.meta as any).requiresAuth && !token) {
next({ path: "/login" }); // next({ path: "/login" });
return; // return;
} // }
if (token && to.path === "/login") { // if (token && to.path === "/login") {
next({ path: "/home" }); // next({ path: "/home" });
return; // return;
} // }
if (token && to.path === "/") { // if (token && to.path === "/") {
next({ path: "/home" }); // next({ path: "/home" });
return; // return;
} // }
next(); // next();
}); // });
export default router; export default router;

View File

@@ -0,0 +1,18 @@
import type { Plugin } from 'vue'
import logger from './logger'
export const errorHandler: Plugin = (app) => {
app.config.errorHandler = (err, instance, info) => {
logger.error('Vue error:', err, instance, info);
};
window.onerror = (message, source, lineno, colno, error) => {
logger.error('Window error:', message, source, lineno, colno, error);
};
window.onunhandledrejection = (event) => {
logger.error('Unhandled Promise Rejection:', event);
};
};
export default errorHandler;

View File

@@ -0,0 +1,15 @@
import '@renderer/styles/index.css'
import errorHandler from '@utils/errorHandler'
import i18n from '@renderer/i18n'
import HeaderBar from '@renderer/components/HeaderBar/index.vue'
import DragRegion from '@renderer/components/DragRegion/index.vue'
import Dialog from './index.vue'
createApp(Dialog)
.use(i18n)
.use(errorHandler)
.component('HeaderBar', HeaderBar)
.component('DragRegion', DragRegion)
.mount('#app')

View File

@@ -0,0 +1,5 @@
<template></template>
<script setup lang="ts">
</script>

View File

@@ -0,0 +1,16 @@
import '@renderer/styles/index.css'
import errorHandler from '@utils/errorHandler'
import i18n from '@renderer/i18n'
import HeaderBar from '@renderer/components/HeaderBar/index.vue'
import DragRegion from '@renderer/components/DragRegion/index.vue'
import Loading from './index.vue'
createApp(Loading)
.use(i18n)
.use(createPinia())
.use(errorHandler)
.component('HeaderBar', HeaderBar)
.component('DragRegion', DragRegion)
.mount('#app')

View File

@@ -0,0 +1,5 @@
<template></template>
<script setup lang="ts">
</script>

View File

@@ -0,0 +1,16 @@
import '@renderer/styles/index.css'
import errorHandler from '@utils/errorHandler'
import i18n from '@renderer/i18n'
import HeaderBar from '@renderer/components/HeaderBar/index.vue'
import DragRegion from '@renderer/components/DragRegion/index.vue'
import Login from './index.vue'
createApp(Login)
.use(i18n)
.use(createPinia())
.use(errorHandler)
.component('HeaderBar', HeaderBar)
.component('DragRegion', DragRegion)
.mount('#app')

View File

@@ -0,0 +1,15 @@
import '@renderer/styles/index.css'
import errorHandler from '@renderer/utils/errorHandler'
import i18n from '@renderer/i18n'
import HeaderBar from '@renderer/components/HeaderBar/index.vue'
import DragRegion from '@renderer/components/DragRegion/index.vue'
import Setting from './index.vue'
createApp(Setting)
.use(i18n)
.use(errorHandler)
.component('HeaderBar', HeaderBar)
.component('DragRegion', DragRegion)
.mount('#app')

View File

@@ -34,7 +34,7 @@
"@utils/*": ["src/renderer/utils/*"], "@utils/*": ["src/renderer/utils/*"],
"@common/*": ["src/common/*"], "@common/*": ["src/common/*"],
"@main/*": ["src/main/*"], "@main/*": ["src/main/*"],
"@modules/*": ["src/main/modules/*"], "@service/*": ["src/main/service/*"],
"@locales/*": ["locales/*"], "@locales/*": ["locales/*"],
"@hooks/*": ["src/renderer/hooks/*"], "@hooks/*": ["src/renderer/hooks/*"],
"@components/*": ["src/renderer/components/*"], "@components/*": ["src/renderer/components/*"],

View File

@@ -9,7 +9,7 @@
"paths": { "paths": {
"@assets/*": ["src/assets/*"], "@assets/*": ["src/assets/*"],
"@common/*": ["src/common/*"], "@common/*": ["src/common/*"],
"@modules/*": ["src/main/modules/*"], "@service/*": ["src/main/service/*"],
"@locales/*": ["locales/*"] "@locales/*": ["locales/*"]
} }
} }

View File

@@ -13,7 +13,7 @@ export default defineConfig( async () => {
'@common': resolve(__dirname, './src/common'), '@common': resolve(__dirname, './src/common'),
'@renderer': resolve(__dirname, './src/renderer'), '@renderer': resolve(__dirname, './src/renderer'),
'@locales': resolve(__dirname, 'locales'), '@locales': resolve(__dirname, 'locales'),
"@modules": resolve(__dirname, "./src/main/modules"), "@service": resolve(__dirname, "./src/main/service"),
}, },
}, },
} }

View File

@@ -17,6 +17,19 @@ export default defineConfig(async () => {
transformer: 'lightningcss' as CSSOptions['transformer'], transformer: 'lightningcss' as CSSOptions['transformer'],
}, },
build: {
target: 'es2022',
publicDir: 'public',
rollupOptions: {
input: [
resolve(__dirname, 'html/index.html'),
resolve(__dirname, 'html/dialog.html'),
resolve(__dirname, 'html/setting.html'),
resolve(__dirname, 'html/loading.html'),
]
}
},
resolve: { resolve: {
preserveSymlinks: true, preserveSymlinks: true,
alias: { alias: {