diff --git a/sau_frontend/index.html b/sau_frontend/index.html new file mode 100644 index 0000000..f7772c1 --- /dev/null +++ b/sau_frontend/index.html @@ -0,0 +1,13 @@ + + + + + + + SAU自媒体自动化运营系统 + + +
+ + + diff --git a/sau_frontend/package.json b/sau_frontend/package.json new file mode 100644 index 0000000..1b0277a --- /dev/null +++ b/sau_frontend/package.json @@ -0,0 +1,22 @@ +{ + "name": "sau-frontend", + "version": "1.0.0", + "private": true, + "author": "Edan.Lee", + "scripts": { + "dev": "vite --host", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "axios": "^1.9.0", + "pinia": "^2.1.7", + "vue": "^3.3.4", + "vue-router": "^4.2.5" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.3.4", + "vite": "^4.4.9", + "vite-plugin-vue-devtools": "^7.7.6" + } +} diff --git a/sau_frontend/public/logo.svg b/sau_frontend/public/logo.svg new file mode 100644 index 0000000..9db6d0d --- /dev/null +++ b/sau_frontend/public/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sau_frontend/src/App.vue b/sau_frontend/src/App.vue new file mode 100644 index 0000000..159444f --- /dev/null +++ b/sau_frontend/src/App.vue @@ -0,0 +1,328 @@ + + + + + diff --git a/sau_frontend/src/assets/logo.svg b/sau_frontend/src/assets/logo.svg new file mode 100644 index 0000000..9db6d0d --- /dev/null +++ b/sau_frontend/src/assets/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sau_frontend/src/components/AccountView.vue b/sau_frontend/src/components/AccountView.vue new file mode 100644 index 0000000..683e602 --- /dev/null +++ b/sau_frontend/src/components/AccountView.vue @@ -0,0 +1,548 @@ + + + + + \ No newline at end of file diff --git a/sau_frontend/src/components/AddAccountModal.vue b/sau_frontend/src/components/AddAccountModal.vue new file mode 100644 index 0000000..ccdeae4 --- /dev/null +++ b/sau_frontend/src/components/AddAccountModal.vue @@ -0,0 +1,362 @@ + + + + + \ No newline at end of file diff --git a/sau_frontend/src/components/ArticlePublishView.vue b/sau_frontend/src/components/ArticlePublishView.vue new file mode 100644 index 0000000..4af07bd --- /dev/null +++ b/sau_frontend/src/components/ArticlePublishView.vue @@ -0,0 +1,131 @@ + + + + + \ No newline at end of file diff --git a/sau_frontend/src/components/DataView.vue b/sau_frontend/src/components/DataView.vue new file mode 100644 index 0000000..007c779 --- /dev/null +++ b/sau_frontend/src/components/DataView.vue @@ -0,0 +1,26 @@ + + + \ No newline at end of file diff --git a/sau_frontend/src/components/LoginModal.vue b/sau_frontend/src/components/LoginModal.vue new file mode 100644 index 0000000..584d1ba --- /dev/null +++ b/sau_frontend/src/components/LoginModal.vue @@ -0,0 +1,209 @@ + + + + + \ No newline at end of file diff --git a/sau_frontend/src/components/MaterialLibraryView.vue b/sau_frontend/src/components/MaterialLibraryView.vue new file mode 100644 index 0000000..ba6114d --- /dev/null +++ b/sau_frontend/src/components/MaterialLibraryView.vue @@ -0,0 +1,688 @@ + + + + + \ No newline at end of file diff --git a/sau_frontend/src/components/MultiPublishView.vue b/sau_frontend/src/components/MultiPublishView.vue new file mode 100644 index 0000000..0488f6b --- /dev/null +++ b/sau_frontend/src/components/MultiPublishView.vue @@ -0,0 +1,2303 @@ + + + + + \ No newline at end of file diff --git a/sau_frontend/src/components/PublishView.vue b/sau_frontend/src/components/PublishView.vue new file mode 100644 index 0000000..c56b252 --- /dev/null +++ b/sau_frontend/src/components/PublishView.vue @@ -0,0 +1,375 @@ + + + + + \ No newline at end of file diff --git a/sau_frontend/src/components/VideoPublishView.vue b/sau_frontend/src/components/VideoPublishView.vue new file mode 100644 index 0000000..a94da12 --- /dev/null +++ b/sau_frontend/src/components/VideoPublishView.vue @@ -0,0 +1,1759 @@ + + + + + \ No newline at end of file diff --git a/sau_frontend/src/components/WebsiteView.vue b/sau_frontend/src/components/WebsiteView.vue new file mode 100644 index 0000000..fa9eebc --- /dev/null +++ b/sau_frontend/src/components/WebsiteView.vue @@ -0,0 +1,26 @@ + + + \ No newline at end of file diff --git a/sau_frontend/src/components/layout/MainLayout.vue b/sau_frontend/src/components/layout/MainLayout.vue new file mode 100644 index 0000000..9396632 --- /dev/null +++ b/sau_frontend/src/components/layout/MainLayout.vue @@ -0,0 +1,245 @@ + + + + + \ No newline at end of file diff --git a/sau_frontend/src/components/new_file.vue b/sau_frontend/src/components/new_file.vue new file mode 100644 index 0000000..02409e3 --- /dev/null +++ b/sau_frontend/src/components/new_file.vue @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/sau_frontend/src/components/test.vue b/sau_frontend/src/components/test.vue new file mode 100644 index 0000000..a5ed9f4 --- /dev/null +++ b/sau_frontend/src/components/test.vue @@ -0,0 +1,70 @@ + + + + + \ No newline at end of file diff --git a/sau_frontend/src/config.js b/sau_frontend/src/config.js new file mode 100644 index 0000000..87323d0 --- /dev/null +++ b/sau_frontend/src/config.js @@ -0,0 +1,27 @@ +// 全局配置文件 + +// API基础URL +export const API_BASE_URL = 'http://localhost:5409'; + +// 全局账号列表缓存 +export const globalAccountsCache = { + accounts: null, // 缓存的账号数据 + lastFetchTime: null, // 最后一次获取数据的时间 + + // 检查缓存是否有效 + isValid() { + return this.accounts !== null; + }, + + // 更新缓存 + updateCache(accounts) { + this.accounts = accounts; + this.lastFetchTime = new Date().getTime(); + }, + + // 清除缓存 + clearCache() { + this.accounts = null; + this.lastFetchTime = null; + } +}; \ No newline at end of file diff --git a/sau_frontend/src/main.js b/sau_frontend/src/main.js new file mode 100644 index 0000000..1dbb885 --- /dev/null +++ b/sau_frontend/src/main.js @@ -0,0 +1,11 @@ +//引入createApp用于创建应用 +import { createApp } from 'vue' +//引入APP根组件 +import App from './App.vue' + +const app = createApp(App) +import router from './router' + +app.use(router) + +app.mount('#app') \ No newline at end of file diff --git a/sau_frontend/src/router/index.js b/sau_frontend/src/router/index.js new file mode 100644 index 0000000..008896c --- /dev/null +++ b/sau_frontend/src/router/index.js @@ -0,0 +1,94 @@ +//引入createRouter +import { createRouter, createWebHistory} from 'vue-router' +import { ref } from 'vue' +//创建路由 +import Account from '@/components/AccountView.vue' +import Publish from '@/components/PublishView.vue' +import Website from '@/components/WebsiteView.vue' +import Data from '@/components/DataView.vue' +import VideoPublish from '@/components/VideoPublishView.vue' +import MultiPublish from '@/components/MultiPublishView.vue' +import MaterialLibrary from '@/components/MaterialLibraryView.vue' + +// 存储动态添加的视频发布路由 +const videoRoutes = ref([]) + +// 添加新的视频发布路由 +function addVideoRoute() { + const id = `video-${Date.now()}`; + const newRoute = { + id, + path: `/video-publish/${id}`, // 修改路径为参数化形式 + name: `VideoPublish-${id}`, + // 使用工厂函数返回组件,确保每个路由使用独立的组件实例 + component: () => import('@/components/VideoPublishView.vue'), + props: route => ({ id: route.params.id }), // 将路由参数映射到组件props + meta: { title: `发布视频 ${videoRoutes.value.length + 1}`, isVideoPublish: true } + }; + videoRoutes.value.push(newRoute); + + // 动态添加路由 + if (!router.hasRoute(newRoute.name)) { + router.addRoute(newRoute); + } + + return newRoute; +} + +// 删除视频发布路由 +function removeVideoRoute(id) { + const index = videoRoutes.value.findIndex(route => route.id === id) + if (index !== -1) { + const route = videoRoutes.value[index] + // 从router中移除路由 + if (router.hasRoute(route.name)) { + router.removeRoute(route.name) + } + // 从数组中移除路由 + videoRoutes.value.splice(index, 1) + } +} + +const router = createRouter({ + history: createWebHistory(), + routes: [ + { + path: '/', + redirect: '/account' + }, + { + path: '/account', + component: Account, + meta: { title: '账号管理', icon: 'icon-account' } + }, + { + path: '/publish', + component: Publish, + meta: { title: '发布中心', icon: 'icon-publish' } + }, + { + path: '/multi-publish', + component: MultiPublish, + meta: { title: '多平台发布', icon: 'icon-multi-publish' } + }, + { + path: '/material-library', + component: MaterialLibrary, + meta: { title: '素材库', icon: 'icon-material' } + }, + { + path: '/website', + component: Website, + meta: { title: '网站', icon: 'icon-website' } + }, + { + path: '/data', + component: Data, + meta: { title: '数据', icon: 'icon-data' } + }, + ] +}) +export default router + +// 导出视频路由相关功能 +export { videoRoutes, addVideoRoute, removeVideoRoute } \ No newline at end of file diff --git a/sau_frontend/vite.config.js b/sau_frontend/vite.config.js new file mode 100644 index 0000000..4de9dbc --- /dev/null +++ b/sau_frontend/vite.config.js @@ -0,0 +1,50 @@ +import { fileURLToPath, URL } from 'node:url' + +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +// import vueDevTools from 'vite-plugin-vue-devtools' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + // vueDevTools(), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + '@assets': fileURLToPath(new URL('./src/assets', import.meta.url)), + }, + }, + optimizeDeps: { + exclude: ['fsevents'], + }, + server: { + proxy: { + '/api': { + target: 'http://localhost:5409', + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, ''), + // configure: (proxy, options) => { + // proxy.on('proxyReq', (proxyReq, req, res) => { + // // 支持SSE连接 + // if (req.url && req.url.includes('/login')) { + // proxyReq.setHeader('Accept', 'text/event-stream'); + // proxyReq.setHeader('Cache-Control', 'no-cache'); + // proxyReq.setHeader('Connection', 'keep-alive'); + // } + // }); + // proxy.on('proxyRes', (proxyRes, req, res) => { + // // 确保SSE响应头正确设置 + // if (req.url && req.url.includes('/login')) { + // proxyRes.headers['content-type'] = 'text/event-stream'; + // proxyRes.headers['cache-control'] = 'no-cache'; + // proxyRes.headers['connection'] = 'keep-alive'; + // proxyRes.headers['access-control-allow-origin'] = '*'; + // } + // }); + // } + } + } + } +}) \ No newline at end of file