作者 202304001

initial commit

* text=auto eol=lf
... ...
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
.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
... ...
{
"$schema": "https://json.schemastore.org/prettierrc",
"semi": false,
"singleQuote": true,
"printWidth": 100,
"plugins": ["prettier-plugin-tailwindcss"]
}
... ...
{
"recommendations": [
"Vue.volar",
"esbenp.prettier-vscode"
]
}
... ...
# aigeo
This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur).
## Customize configuration
See [Vite Configuration Reference](https://vite.dev/config/).
## Project Setup
```sh
npm install
```
### Compile and Hot-Reload for Development
```sh
npm run dev
```
### Compile and Minify for Production
```sh
npm run build
```
... ...
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="UTF-8">
<link rel="icon" href="/favicon.ico">
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" rel="stylesheet">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vite App</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>
... ...
{
"compilerOptions": {
"paths": {
"@/*": ["./src/*"]
}
},
"exclude": ["node_modules", "dist"]
}
... ...
此 diff 太大无法显示。
{
"name": "aigeo",
"version": "0.0.0",
"private": true,
"type": "module",
"engines": {
"node": "^20.19.0 || >=22.12.0"
},
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"format": "prettier --write src/"
},
"dependencies": {
"chart.js": "^4.5.0",
"pinia": "^3.0.3",
"sass": "^1.90.0",
"tailwindcss": "^3.4.17",
"vue": "^3.5.18",
"vue-router": "^4.5.1"
},
"devDependencies": {
"@vitejs/plugin-vue": "^6.0.1",
"autoprefixer": "^10.4.21",
"postcss": "^8.5.6",
"postcss-import": "^16.1.1",
"prettier": "3.6.2",
"prettier-plugin-tailwindcss": "^0.6.14",
"vite": "^7.0.6",
"vite-plugin-vue-devtools": "^8.0.0"
}
}
... ...
export default {
plugins: {
'postcss-import': {},
tailwindcss: {},
autoprefixer: {},
},
}
... ...
不能预览此文件类型
<script setup>
import { RouterView } from 'vue-router'
</script>
<template>
<RouterView />
</template>
<style scoped></style>
... ...
color palette from <https://github.com/vuejs/theme>
:root {
--vt-c-white: #ffffff;
--vt-c-white-soft: #f8f8f8;
--vt-c-white-mute: #f2f2f2;
--vt-c-black: #181818;
--vt-c-black-soft: #222222;
--vt-c-black-mute: #282828;
--vt-c-indigo: #2c3e50;
--vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
--vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
--vt-c-divider-dark-1: rgba(84, 84, 84, 0.65);
--vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
--vt-c-text-light-1: var(--vt-c-indigo);
--vt-c-text-light-2: rgba(60, 60, 60, 0.66);
--vt-c-text-dark-1: var(--vt-c-white);
--vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
}
/* semantic color variables for this project */
:root {
--color-background: var(--vt-c-white);
--color-background-soft: var(--vt-c-white-soft);
--color-background-mute: var(--vt-c-white-mute);
--color-border: var(--vt-c-divider-light-2);
--color-border-hover: var(--vt-c-divider-light-1);
--color-heading: var(--vt-c-text-light-1);
--color-text: var(--vt-c-text-light-1);
--section-gap: 160px;
}
@media (prefers-color-scheme: dark) {
:root {
--color-background: var(--vt-c-black);
--color-background-soft: var(--vt-c-black-soft);
--color-background-mute: var(--vt-c-black-mute);
--color-border: var(--vt-c-divider-dark-2);
--color-border-hover: var(--vt-c-divider-dark-1);
--color-heading: var(--vt-c-text-dark-1);
--color-text: var(--vt-c-text-dark-2);
}
}
... ...
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 261.76 226.69"><path d="M161.096.001l-30.225 52.351L100.647.001H-.005l130.877 226.688L261.749.001z" fill="#41b883"/><path d="M161.096.001l-30.225 52.351L100.647.001H52.346l78.526 136.01L209.398.001z" fill="#34495e"/></svg>
... ...
@import './base.css';
@import 'tailwindcss/base';
@import 'tailwindcss/components';
@import 'tailwindcss/utilities';
... ...
<template>
<aside class="w-64 bg-white shadow-md z-10 hidden md:block transition-all duration-300 ease-in-out">
<div class="p-5 border-b">
<div class="flex items-center space-x-3">
<div class="w-10 h-10 rounded-lg bg-primary flex items-center justify-center">
<i class="fa fa-pencil text-white text-xl"></i>
</div>
<h1 class="text-xl font-bold text-dark">智撰</h1>
</div>
<p class="text-gray-500 text-sm mt-1">AI软文自动生成与发布平台</p>
</div>
<nav class="p-4">
<p class="text-xs uppercase text-gray-500 font-semibold mb-2 px-3">主功能</p>
<ul class="space-y-1">
<li>
<a href="dashboard.html"
class="flex items-center space-x-3 px-3 py-3 rounded-lg sidebar-item-active">
<i class="fa fa-dashboard w-5 text-center"></i>
<span>控制台</span>
</a>
</li>
<li>
<a href="knowledge-base.html"
class="flex items-center space-x-3 px-3 py-3 rounded-lg hover:bg-gray-100 transition-colors">
<i class="fa fa-book w-5 text-center"></i>
<span>知识库管理</span>
</a>
</li>
<li>
<a href="article-generation.html"
class="flex items-center space-x-3 px-3 py-3 rounded-lg hover:bg-gray-100 transition-colors">
<i class="fa fa-file-text w-5 text-center"></i>
<span>软文生成</span>
</a>
</li>
<li>
<a href="publishing-schedule.html"
class="flex items-center space-x-3 px-3 py-3 rounded-lg hover:bg-gray-100 transition-colors">
<i class="fa fa-calendar w-5 text-center"></i>
<span>发布计划</span>
</a>
</li>
<li>
<a href="analytics.html"
class="flex items-center space-x-3 px-3 py-3 rounded-lg hover:bg-gray-100 transition-colors">
<i class="fa fa-bar-chart w-5 text-center"></i>
<span>数据分析</span>
</a>
</li>
</ul>
<p class="text-xs uppercase text-gray-500 font-semibold mb-2 px-3 mt-6">系统</p>
<ul class="space-y-1">
<li>
<a href="settings.html"
class="flex items-center space-x-3 px-3 py-3 rounded-lg hover:bg-gray-100 transition-colors">
<i class="fa fa-cog w-5 text-center"></i>
<span>设置</span>
</a>
</li>
<li>
<a href="help-center.html"
class="flex items-center space-x-3 px-3 py-3 rounded-lg hover:bg-gray-100 transition-colors">
<i class="fa fa-question-circle w-5 text-center"></i>
<span>帮助中心</span>
</a>
</li>
</ul>
</nav>
<div class="absolute bottom-0 left-0 right-0 p-4 border-t">
<div class="flex items-center space-x-3">
<img src="https://picsum.photos/id/1005/200/200" alt="用户头像" class="w-10 h-10 rounded-full object-cover">
<div>
<p class="font-medium text-sm">张经理</p>
<p class="text-gray-500 text-xs">高级会员</p>
</div>
<button class="ml-auto text-gray-500 hover:text-dark" title="退出登录">
<i class="fa fa-sign-out"></i>
</button>
</div>
</div>
</aside>
</template>
<script setup>
</script>
<style scoped></style>
... ...
import './assets/main.css'
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
import router from './router'
const app = createApp(App)
app.use(createPinia())
app.use(router)
app.mount('#app')
... ...
import { createRouter, createWebHistory } from 'vue-router'
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes: [
{
path: '/',
name: 'home',
component: () => import('../views/layout/index.vue'),
},
{
path: '/test',
name: 'about',
component: () => import('../views/test.vue'),
},
],
})
export default router
... ...
import { ref, computed } from 'vue'
import { defineStore } from 'pinia'
export const useCounterStore = defineStore('counter', () => {
const count = ref(0)
const doubleCount = computed(() => count.value * 2)
function increment() {
count.value++
}
return { count, doubleCount, increment }
})
... ...
<template>
<div class="flex h-screen overflow-hidden">
<!-- 侧边栏 -->
<siderbar />
<!-- 主内容区 -->
<div class="flex-1 flex flex-col overflow-hidden">
<!-- 顶部导航 -->
<header class="bg-white shadow-sm z-10">
<div class="flex items-center justify-between p-4">
<div class="flex items-center">
<button class="md:hidden mr-4 text-gray-500 hover:text-dark" id="mobile-menu-button"
@click="toggleMobileMenu">
<i class="fa fa-bars text-xl"></i>
</button>
<div class="relative">
<input type="text" placeholder="搜索..."
class="pl-10 pr-4 py-2 rounded-lg border border-gray-200 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary w-64">
<i
class="fa fa-search absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400"></i>
</div>
</div>
<div class="flex items-center space-x-4">
<button class="relative text-gray-500 hover:text-dark transition-colors" title="通知">
<i class="fa fa-bell text-xl"></i>
<span
class="absolute -top-1 -right-1 w-4 h-4 bg-danger rounded-full text-white text-xs flex items-center justify-center">3</span>
</button>
<button class="relative text-gray-500 hover:text-dark transition-colors" title="消息">
<i class="fa fa-envelope text-xl"></i>
<span
class="absolute -top-1 -right-1 w-4 h-4 bg-primary rounded-full text-white text-xs flex items-center justify-center">5</span>
</button>
<div class="hidden md:block h-6 w-px bg-gray-200"></div>
<!-- 个人信息下拉菜单 -->
<div class="relative" id="user-menu-container">
<button class="flex items-center space-x-2 focus:outline-none" id="user-menu-button"
@click="toggleUserDropdown">
<img src="https://picsum.photos/id/1005/200/200" alt="用户头像"
class="w-8 h-8 rounded-full object-cover md:hidden">
<span class="hidden md:inline text-sm font-medium">张经理</span>
<i class="fa fa-angle-down text-gray-500"></i>
</button>
<!-- 下拉菜单内容 -->
<div class="absolute right-0 mt-2 w-48 bg-white rounded-lg shadow-lg py-1 z-50 transition-all duration-200"
id="user-dropdown"
:class="userDropdownOpen ? 'opacity-100 visible translate-y-0' : 'opacity-0 invisible -translate-y-2'">
<a href="profile.html" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">
<i class="fa fa-user mr-2"></i>个人资料
</a>
<a href="account-settings.html"
class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">
<i class="fa fa-cog mr-2"></i>账户设置
</a>
<a href="subscription.html"
class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">
<i class="fa fa-subscription mr-2"></i>会员订阅
</a>
<div class="border-t border-gray-100 my-1"></div>
<a href="login.html" class="block px-4 py-2 text-sm text-danger hover:bg-gray-100">
<i class="fa fa-sign-out mr-2"></i>退出登录
</a>
</div>
</div>
</div>
</div>
</header>
<!-- 页面内容 -->
<main class="flex-1 overflow-y-auto p-4 md:p-6 scrollbar-hide bg-gray-50">
<div class="mb-6">
<h2 class="text-[clamp(1.5rem,3vw,2rem)] font-bold">控制台</h2>
<p class="text-gray-500 mt-1">欢迎回来,今天是 <span class="font-medium" id="current-date">{{ currentDate
}}</span>
</p>
</div>
<!-- 数据概览卡片 -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 mb-6">
<div class="bg-white rounded-xl shadow-sm p-5 card-hover">
<div class="flex items-start justify-between">
<div>
<p class="text-gray-500 text-sm">已生成软文</p>
<h3 class="text-2xl font-bold mt-1">248</h3>
<p class="text-success text-sm mt-2 flex items-center">
<i class="fa fa-arrow-up mr-1"></i> 12.5% <span
class="text-gray-500 ml-1">较上月</span>
</p>
</div>
<div
class="w-12 h-12 rounded-lg bg-primary/10 flex items-center justify-center text-primary">
<i class="fa fa-file-text-o text-xl"></i>
</div>
</div>
</div>
<div class="bg-white rounded-xl shadow-sm p-5 card-hover">
<div class="flex items-start justify-between">
<div>
<p class="text-gray-500 text-sm">已发布</p>
<h3 class="text-2xl font-bold mt-1">196</h3>
<p class="text-success text-sm mt-2 flex items-center">
<i class="fa fa-arrow-up mr-1"></i> 8.3% <span class="text-gray-500 ml-1">较上月</span>
</p>
</div>
<div
class="w-12 h-12 rounded-lg bg-success/10 flex items-center justify-center text-success">
<i class="fa fa-check-circle-o text-xl"></i>
</div>
</div>
</div>
<div class="bg-white rounded-xl shadow-sm p-5 card-hover">
<div class="flex items-start justify-between">
<div>
<p class="text-gray-500 text-sm">知识库文档</p>
<h3 class="text-2xl font-bold mt-1">156</h3>
<p class="text-success text-sm mt-2 flex items-center">
<i class="fa fa-arrow-up mr-1"></i> 15.2% <span
class="text-gray-500 ml-1">较上月</span>
</p>
</div>
<div
class="w-12 h-12 rounded-lg bg-secondary/10 flex items-center justify-center text-secondary">
<i class="fa fa-book text-xl"></i>
</div>
</div>
</div>
<div class="bg-white rounded-xl shadow-sm p-5 card-hover">
<div class="flex items-start justify-between">
<div>
<p class="text-gray-500 text-sm">平均阅读量</p>
<h3 class="text-2xl font-bold mt-1">2.4k</h3>
<p class="text-danger text-sm mt-2 flex items-center">
<i class="fa fa-arrow-down mr-1"></i> 3.1% <span
class="text-gray-500 ml-1">较上月</span>
</p>
</div>
<div
class="w-12 h-12 rounded-lg bg-warning/10 flex items-center justify-center text-warning">
<i class="fa fa-eye text-xl"></i>
</div>
</div>
</div>
</div>
<!-- 图表和最近活动 -->
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6 mb-6">
<!-- 内容趋势图表 -->
<div class="bg-white rounded-xl shadow-sm p-5 lg:col-span-2 card-hover">
<div class="flex items-center justify-between mb-6">
<h3 class="font-bold text-lg">内容趋势</h3>
<div class="flex space-x-2">
<button class="px-3 py-1 text-sm bg-primary/10 text-primary rounded-lg">周</button>
<button class="px-3 py-1 text-sm text-gray-500 hover:bg-gray-100 rounded-lg">月</button>
<button class="px-3 py-1 text-sm text-gray-500 hover:bg-gray-100 rounded-lg">年</button>
</div>
</div>
<div class="h-64">
<canvas id="contentTrendChart"></canvas>
</div>
</div>
<!-- 最近活动 -->
<div class="bg-white rounded-xl shadow-sm p-5 card-hover">
<div class="flex items-center justify-between mb-6">
<h3 class="font-bold text-lg">最近活动</h3>
<a href="activity-log.html" class="text-primary text-sm hover:underline">查看全部</a>
</div>
<div class="space-y-4 max-h-64 overflow-y-auto scrollbar-hide">
<div class="flex items-start space-x-3" v-for="activity in recentActivities"
:key="activity.id">
<div class="w-8 h-8 rounded-full" :class="activity.bgClass">
<i class="fa" :class="activity.iconClass"></i>
</div>
<div>
<p class="text-sm">{{ activity.description }}</p>
<p class="text-gray-500 text-xs mt-1">{{ activity.time }}</p>
</div>
</div>
</div>
</div>
</div>
<!-- 核心功能区 -->
<div class="grid grid-cols-1 md:grid-cols-2 gap-6 mb-6">
<!-- 软文生成 -->
<div class="bg-white rounded-xl shadow-sm overflow-hidden card-hover">
<div class="h-32 bg-gradient-to-r from-primary to-primary/70 relative">
<div class="absolute right-0 top-0 opacity-10">
<i class="fa fa-file-text text-[150px] text-white"></i>
</div>
<div class="p-5 relative z-10">
<h3 class="text-white font-bold text-xl">软文生成</h3>
<p class="text-white/80 text-sm mt-1">基于AI和知识库,快速生成高质量软文</p>
</div>
</div>
<div class="p-5">
<div class="mb-4">
<label class="block text-sm font-medium text-gray-700 mb-1">生成主题</label>
<input type="text" placeholder="输入您想要生成的软文主题..."
class="w-full px-4 py-2 rounded-lg border border-gray-200 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary"
v-model="articleGeneration.topic">
</div>
<div class="grid grid-cols-2 gap-3 mb-4">
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">文章风格</label>
<select
class="w-full px-4 py-2 rounded-lg border border-gray-200 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary"
v-model="articleGeneration.style">
<option>专业严谨</option>
<option>轻松活泼</option>
<option>幽默风趣</option>
<option>简洁明了</option>
</select>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">参考知识库</label>
<select
class="w-full px-4 py-2 rounded-lg border border-gray-200 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary"
v-model="articleGeneration.knowledgeBase">
<option>全部文档</option>
<option>产品手册</option>
<option>行业报告</option>
<option>营销素材</option>
</select>
</div>
</div>
<button class="w-full btn-primary flex items-center justify-center"
id="generate-article-button" @click="generateArticle">
<i class="fa fa-magic mr-2"></i> 立即生成
</button>
</div>
</div>
<!-- 发布计划 -->
<div class="bg-white rounded-xl shadow-sm overflow-hidden card-hover">
<div class="h-32 bg-gradient-to-r from-secondary to-secondary/70 relative">
<div class="absolute right-0 top-0 opacity-10">
<i class="fa fa-calendar-check-o text-[150px] text-white"></i>
</div>
<div class="p-5 relative z-10">
<h3 class="text-white font-bold text-xl">发布计划</h3>
<p class="text-white/80 text-sm mt-1">设置全年发布计划,自动定时发布</p>
</div>
</div>
<div class="p-5">
<div class="mb-4">
<label class="block text-sm font-medium text-gray-700 mb-1">发布平台</label>
<div class="flex flex-wrap gap-2">
<label
class="inline-flex items-center px-3 py-1 border border-gray-200 rounded-full text-sm cursor-pointer hover:bg-gray-50"
v-for="platform in publishPlatforms" :key="platform.id">
<input type="checkbox" class="form-checkbox text-primary h-4 w-4 mr-2"
v-model="platform.checked">
<span>{{ platform.name }}</span>
</label>
</div>
</div>
<div class="mb-4">
<label class="block text-sm font-medium text-gray-700 mb-1">发布频率</label>
<div class="flex items-center">
<input type="number" v-model="publishFrequency.count" min="1" max="10"
class="w-16 px-3 py-2 rounded-lg border border-gray-200 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary">
<span class="mx-2 text-gray-500">篇/天</span>
<select
class="flex-1 ml-2 px-3 py-2 rounded-lg border border-gray-200 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary"
v-model="publishFrequency.period">
<option>工作日发布</option>
<option>每日发布</option>
<option>自定义日期</option>
</select>
</div>
</div>
<button class="w-full btn-primary flex items-center justify-center"
id="setup-schedule-button" @click="setupSchedule">
<i class="fa fa-calendar-plus-o mr-2"></i> 设置计划
</button>
</div>
</div>
</div>
<!-- 知识库和待发布 -->
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
<!-- 知识库管理 -->
<div class="bg-white rounded-xl shadow-sm p-5 card-hover">
<div class="flex items-center justify-between mb-4">
<h3 class="font-bold text-lg">知识库管理</h3>
<button class="btn-secondary text-sm py-1" id="add-knowledge-button"
@click="openModal('add-knowledge-modal')">
<i class="fa fa-plus mr-1"></i> 新增
</button>
</div>
<div class="space-y-3 max-h-72 overflow-y-auto scrollbar-hide">
<div class="flex items-center justify-between p-3 border border-gray-100 rounded-lg hover:bg-gray-50"
v-for="doc in knowledgeDocs" :key="doc.id">
<div class="flex items-center space-x-3">
<div class="w-10 h-10 rounded" :class="doc.iconBgClass">
<i class="fa" :class="doc.iconClass"></i>
</div>
<div>
<p class="text-sm font-medium">{{ doc.name }}</p>
<p class="text-gray-500 text-xs">{{ doc.size }} · {{ doc.date }}</p>
</div>
</div>
<div class="flex space-x-1">
<button class="text-gray-400 hover:text-primary p-1" title="编辑"
@click="editKnowledgeDoc(doc.id)">
<i class="fa fa-pencil"></i>
</button>
<button class="text-gray-400 hover:text-danger p-1" title="删除"
@click="deleteKnowledgeDoc(doc.id)">
<i class="fa fa-trash"></i>
</button>
</div>
</div>
</div>
<div class="mt-4 text-center">
<a href="knowledge-base.html" class="text-primary text-sm hover:underline">查看所有文档</a>
</div>
</div>
<!-- 待发布文章 -->
<div class="bg-white rounded-xl shadow-sm p-5 lg:col-span-2 card-hover">
<div class="flex items-center justify-between mb-4">
<h3 class="font-bold text-lg">待发布文章</h3>
<div class="flex space-x-2">
<button class="btn-secondary text-sm py-1">
<i class="fa fa-calendar mr-1"></i> 查看计划
</button>
<button class="btn-primary text-sm py-1" id="add-article-button"
@click="openModal('add-article-modal')">
<i class="fa fa-plus mr-1"></i> 新增文章
</button>
</div>
</div>
<div class="overflow-x-auto">
<table class="min-w-full">
<thead>
<tr class="text-left text-gray-500 text-sm border-b">
<th class="pb-3 font-medium">标题</th>
<th class="pb-3 font-medium">发布平台</th>
<th class="pb-3 font-medium">发布时间</th>
<th class="pb-3 font-medium">状态</th>
<th class="pb-3 font-medium text-right">操作</th>
</tr>
</thead>
<tbody>
<tr class="border-b border-gray-100 hover:bg-gray-50"
v-for="article in pendingArticles" :key="article.id">
<td class="py-3 text-sm">
<p class="font-medium">{{ article.title }}</p>
</td>
<td class="py-3 text-sm">
<span v-for="platform in article.platforms" :key="platform.id"
:class="platform.badgeClass"
class="inline-flex items-center px-2 py-1 rounded-full text-xs mr-1">
{{ platform.name }}
</span>
</td>
<td class="py-3 text-sm text-gray-500">{{ article.publishTime }}</td>
<td class="py-3 text-sm">
<span
class="inline-flex items-center px-2 py-1 bg-green-50 text-green-600 rounded-full text-xs">
<i class="fa fa-clock-o mr-1"></i> 已排期
</span>
</td>
<td class="py-3 text-sm text-right">
<div class="flex justify-end space-x-2">
<button class="text-primary hover:text-primary/80" title="编辑"
@click="editArticle(article.id)">
<i class="fa fa-pencil"></i>
</button>
<button class="text-warning hover:text-warning/80" title="调整时间"
@click="adjustArticleTime(article.id)">
<i class="fa fa-calendar"></i>
</button>
<button class="text-danger hover:text-danger/80" title="取消发布"
@click="cancelArticle(article.id)">
<i class="fa fa-trash"></i>
</button>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="mt-4 text-center">
<a href="pending-articles.html" class="text-primary text-sm hover:underline">查看所有待发布文章</a>
</div>
</div>
</div>
</main>
</div>
</div>
<!-- 新增文章弹窗 -->
<div class="fixed inset-0 bg-black/50 z-50 flex items-center justify-center transition-all duration-300"
id="add-article-modal"
:class="activeModal === 'add-article-modal' ? 'opacity-100 visible' : 'opacity-0 invisible'">
<div class="bg-white rounded-xl shadow-xl w-full max-w-2xl max-h-[90vh] overflow-y-auto transform transition-all duration-300"
id="add-article-modal-content"
:class="activeModal === 'add-article-modal' ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-8'">
<div class="p-6 border-b">
<div class="flex items-center justify-between">
<h3 class="text-xl font-bold">新增文章</h3>
<button class="text-gray-500 hover:text-gray-700" @click="closeModal">
<i class="fa fa-times text-xl"></i>
</button>
</div>
</div>
<div class="p-6">
<div class="mb-4">
<label class="block text-sm font-medium text-gray-700 mb-1">文章标题</label>
<input type="text" placeholder="输入文章标题..."
class="w-full px-4 py-2 rounded-lg border border-gray-200 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary"
v-model="newArticle.title">
</div>
<div class="mb-4">
<label class="block text-sm font-medium text-gray-700 mb-1">文章内容</label>
<textarea rows="8" placeholder="输入文章内容..."
class="w-full px-4 py-2 rounded-lg border border-gray-200 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary"
v-model="newArticle.content"></textarea>
</div>
<div class="mb-4">
<label class="block text-sm font-medium text-gray-700 mb-1">文章分类</label>
<select
class="w-full px-4 py-2 rounded-lg border border-gray-200 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary"
v-model="newArticle.category">
<option>产品介绍</option>
<option>行业资讯</option>
<option>技术分享</option>
<option>客户案例</option>
<option>活动推广</option>
</select>
</div>
<div class="mb-4">
<label class="block text-sm font-medium text-gray-700 mb-1">发布平台</label>
<div class="flex flex-wrap gap-2">
<label
class="inline-flex items-center px-3 py-1 border border-gray-200 rounded-full text-sm cursor-pointer hover:bg-gray-50"
v-for="platform in newArticlePlatforms" :key="platform.id">
<input type="checkbox" class="form-checkbox text-primary h-4 w-4 mr-2"
v-model="platform.checked">
<span>{{ platform.name }}</span>
</label>
</div>
</div>
<div class="mb-4">
<label class="block text-sm font-medium text-gray-700 mb-1">发布时间</label>
<input type="datetime-local"
class="w-full px-4 py-2 rounded-lg border border-gray-200 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary"
v-model="newArticle.publishTime">
</div>
<div class="mb-4">
<label class="block text-sm font-medium text-gray-700 mb-1">SEO设置</label>
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<div>
<label class="block text-xs text-gray-500 mb-1">关键词</label>
<input type="text" placeholder="输入关键词,用逗号分隔"
class="w-full px-4 py-2 rounded-lg border border-gray-200 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary"
v-model="newArticle.seo.keywords">
</div>
<div>
<label class="block text-xs text-gray-500 mb-1">描述</label>
<input type="text" placeholder="输入描述信息"
class="w-full px-4 py-2 rounded-lg border border-gray-200 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary"
v-model="newArticle.seo.description">
</div>
</div>
</div>
</div>
<div class="p-6 border-t flex justify-end space-x-3">
<button class="btn-secondary" @click="closeModal">取消</button>
<button class="btn-primary" @click="saveNewArticle">保存并发布</button>
</div>
</div>
</div>
<!-- 新增知识库文档弹窗 -->
<div class="fixed inset-0 bg-black/50 z-50 flex items-center justify-center transition-all duration-300"
id="add-knowledge-modal" v-show="showKnowledgeModal"
:class="activeModal === 'add-knowledge-modal' ? 'opacity-100 visible' : 'opacity-0 invisible'">
<div class="bg-white rounded-xl shadow-xl w-full max-w-md max-h-[90vh] overflow-y-auto transform transition-all duration-300"
id="add-knowledge-modal-content"
:class="activeModal === 'add-knowledge-modal' ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-8'">
<div class="p-6 border-b">
<div class="flex items-center justify-between">
<h3 class="text-xl font-bold">新增知识库文档</h3>
<button class="text-gray-500 hover:text-gray-700" @click="closeModal">
<i class="fa fa-times text-xl"></i>
</button>
</div>
</div>
<div class="p-6">
<div class="mb-4">
<label class="block text-sm font-medium text-gray-700 mb-1">文档标题</label>
<input type="text" placeholder="输入文档标题..."
class="w-full px-4 py-2 rounded-lg border border-gray-200 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary"
v-model="newKnowledgeDoc.title">
</div>
<div class="mb-4">
<label class="block text-sm font-medium text-gray-700 mb-1">文档分类</label>
<select
class="w-full px-4 py-2 rounded-lg border border-gray-200 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary"
v-model="newKnowledgeDoc.category">
<option>产品手册</option>
<option>行业报告</option>
<option>客户案例</option>
<option>营销素材</option>
<option>其他文档</option>
</select>
</div>
<div class="mb-4">
<label class="block text-sm font-medium text-gray-700 mb-1">上传文档</label>
<div
class="border-2 border-dashed border-gray-200 rounded-lg p-6 text-center hover:bg-gray-50 cursor-pointer">
<i class="fa fa-cloud-upload text-3xl text-gray-400 mb-2"></i>
<p class="text-sm text-gray-500">点击或拖拽文件至此处上传</p>
<p class="text-xs text-gray-400 mt-1">支持 PDF, Word, Excel, PPT 格式</p>
<input type="file" class="hidden" id="file-upload" @change="handleFileUpload">
</div>
<p class="text-xs text-gray-500 mt-2" v-if="newKnowledgeDoc.fileName">{{ newKnowledgeDoc.fileName }}
</p>
</div>
</div>
<div class="p-6 border-t flex justify-end space-x-3">
<button class="btn-secondary" @click="closeModal">取消</button>
<button class="btn-primary" @click="saveNewKnowledgeDoc"
:disabled="!newKnowledgeDoc.fileName">上传文档</button>
</div>
</div>
</div>
</template>
<script setup>
import siderbar from '@/components/siderbar.vue';
import { ref, onMounted } from 'vue';
import { Chart, registerables } from 'chart.js';
Chart.register(...registerables);
// 状态管理
const userDropdownOpen = ref(false);
const mobileMenuOpen = ref(false);
const activeModal = ref('');
const currentDate = ref('');
const showKnowledgeModal = ref(false);
// 文章生成表单数据
const articleGeneration = ref({
topic: '',
style: '专业严谨',
knowledgeBase: '全部文档'
});
// 发布平台数据
const publishPlatforms = ref([
{ id: 1, name: '官网博客', checked: true },
{ id: 2, name: '微信公众号', checked: true },
{ id: 3, name: '今日头条', checked: false }
]);
// 发布频率数据
const publishFrequency = ref({
count: 2,
period: '工作日发布'
});
// 最近活动数据
const recentActivities = ref([
{
id: 1,
description: '生成了2篇关于"夏季促销"的软文',
time: '今天 09:45',
bgClass: 'bg-primary/10 flex items-center justify-center text-primary flex-shrink-0',
iconClass: 'fa-file-text-o'
},
{
id: 2,
description: '成功发布3篇文章到官网博客',
time: '昨天 15:30',
bgClass: 'bg-success/10 flex items-center justify-center text-success flex-shrink-0',
iconClass: 'fa-check-circle-o'
},
{
id: 3,
description: '上传了5份产品手册到知识库',
time: '昨天 10:15',
bgClass: 'bg-secondary/10 flex items-center justify-center text-secondary flex-shrink-0',
iconClass: 'fa-upload'
},
{
id: 4,
description: '设置了未来7天的发布计划',
time: '2023-06-12 16:40',
bgClass: 'bg-warning/10 flex items-center justify-center text-warning flex-shrink-0',
iconClass: 'fa-calendar'
},
{
id: 5,
description: '2篇文章发布失败,请检查',
time: '2023-06-11 08:25',
bgClass: 'bg-danger/10 flex items-center justify-center text-danger flex-shrink-0',
iconClass: 'fa-exclamation-circle'
}
]);
// 知识库文档数据
const knowledgeDocs = ref([
{
id: 1,
name: '2023产品手册.pdf',
size: '2.4MB',
date: '2023-05-18',
iconBgClass: 'bg-primary/10 flex items-center justify-center text-primary',
iconClass: 'fa-file-pdf-o'
},
{
id: 2,
name: '行业分析报告.docx',
size: '1.8MB',
date: '2023-06-02',
iconBgClass: 'bg-secondary/10 flex items-center justify-center text-secondary',
iconClass: 'fa-file-word-o'
},
{
id: 3,
name: '客户案例数据.xlsx',
size: '3.2MB',
date: '2023-06-05',
iconBgClass: 'bg-warning/10 flex items-center justify-center text-warning',
iconClass: 'fa-file-excel-o'
},
{
id: 4,
name: '产品介绍.pptx',
size: '5.7MB',
date: '2023-06-10',
iconBgClass: 'bg-success/10 flex items-center justify-center text-success',
iconClass: 'fa-file-powerpoint-o'
}
]);
// 待发布文章数据
const pendingArticles = ref([
{
id: 1,
title: '2023夏季新品发布会亮点回顾',
platforms: [
{ id: 1, name: '官网博客', badgeClass: 'bg-blue-50 text-blue-600' }
],
publishTime: '2023-06-15 10:00'
},
{
id: 2,
title: '如何选择适合您的产品解决方案',
platforms: [
{ id: 2, name: '微信公众号', badgeClass: 'bg-green-50 text-green-600' }
],
publishTime: '2023-06-15 15:30'
},
{
id: 3,
title: '行业趋势分析:未来五年发展预测',
platforms: [
{ id: 1, name: '官网博客', badgeClass: 'bg-blue-50 text-blue-600' },
{ id: 3, name: '今日头条', badgeClass: 'bg-orange-50 text-orange-600' }
],
publishTime: '2023-06-16 09:30'
}
]);
// 新文章表单数据
const newArticle = ref({
title: '',
content: '',
category: '产品介绍',
publishTime: '',
seo: {
keywords: '',
description: ''
}
});
// 新文章发布平台
const newArticlePlatforms = ref([
{ id: 1, name: '官网博客', checked: true },
{ id: 2, name: '微信公众号', checked: true },
{ id: 3, name: '今日头条', checked: false },
{ id: 4, name: '微博', checked: false }
]);
// 新知识库文档数据
const newKnowledgeDoc = ref({
title: '',
category: '产品手册',
fileName: ''
});
// 方法
const toggleUserDropdown = () => {
userDropdownOpen.value = !userDropdownOpen.value;
};
const toggleMobileMenu = () => {
mobileMenuOpen.value = !mobileMenuOpen.value;
};
const openModal = (modalId) => {
activeModal.value = modalId;
// 设置默认发布时间为当前时间加1小时
if (modalId === 'add-article-modal') {
const now = new Date();
now.setHours(now.getHours() + 1);
newArticle.value.publishTime = now.toISOString().slice(0, 16);
}
};
const closeModal = () => {
activeModal.value = '';
};
const generateArticle = () => {
// 生成文章逻辑
alert(`正在生成关于"${articleGeneration.value.topic}"的${articleGeneration.value.style}风格文章...`);
};
const setupSchedule = () => {
// 设置发布计划逻辑
// const platforms = publishPlatforms.value
// .filter(p => p.checked)
// .map(p => p.name)
// .join(', ');
// alert(`已设置发布计划:每天${publishFrequency.value.count}篇,发布到${platforms},${publishFrequency.value.period}`);
showKnowledgeModal.value = true
};
const editKnowledgeDoc = (id) => {
// 编辑知识库文档逻辑
const doc = knowledgeDocs.value.find(d => d.id === id);
alert(`编辑文档:${doc.name}`);
};
const deleteKnowledgeDoc = (id) => {
// 删除知识库文档逻辑
const doc = knowledgeDocs.value.find(d => d.id === id);
if (confirm(`确定要删除文档"${doc.name}"吗?`)) {
knowledgeDocs.value = knowledgeDocs.value.filter(d => d.id !== id);
}
};
const editArticle = (id) => {
// 编辑文章逻辑
const article = pendingArticles.value.find(a => a.id === id);
alert(`编辑文章:${article.title}`);
};
const adjustArticleTime = (id) => {
// 调整文章发布时间逻辑
const article = pendingArticles.value.find(a => a.id === id);
alert(`调整文章"${article.title}"的发布时间,当前时间:${article.publishTime}`);
};
const cancelArticle = (id) => {
// 取消发布文章逻辑
const article = pendingArticles.value.find(a => a.id === id);
if (confirm(`确定要取消发布文章"${article.title}"吗?`)) {
pendingArticles.value = pendingArticles.value.filter(a => a.id !== id);
}
};
const saveNewArticle = () => {
// 保存新文章逻辑
if (!newArticle.value.title) {
alert('请输入文章标题');
return;
}
if (!newArticle.value.content) {
alert('请输入文章内容');
return;
}
const selectedPlatforms = newArticlePlatforms.value
.filter(p => p.checked)
.map(p => ({
id: p.id,
name: p.name,
badgeClass: p.id === 1 ? 'bg-blue-50 text-blue-600' :
p.id === 2 ? 'bg-green-50 text-green-600' :
p.id === 3 ? 'bg-orange-50 text-orange-600' :
'bg-purple-50 text-purple-600'
}));
if (selectedPlatforms.length === 0) {
alert('请至少选择一个发布平台');
return;
}
pendingArticles.value.push({
id: pendingArticles.value.length + 1,
title: newArticle.value.title,
platforms: selectedPlatforms,
publishTime: newArticle.value.publishTime
});
// 重置表单并关闭弹窗
newArticle.value = {
title: '',
content: '',
category: '产品介绍',
publishTime: '',
seo: {
keywords: '',
description: ''
}
};
newArticlePlatforms.value.forEach(p => p.checked = false);
closeModal();
alert('文章已保存并加入发布计划');
};
const handleFileUpload = (e) => {
// 处理文件上传逻辑
if (e.target.files && e.target.files[0]) {
newKnowledgeDoc.value.fileName = e.target.files[0].name;
}
};
const saveNewKnowledgeDoc = () => {
// 保存新知识库文档逻辑
if (!newKnowledgeDoc.value.title) {
alert('请输入文档标题');
return;
}
if (!newKnowledgeDoc.value.fileName) {
alert('请上传文档');
return;
}
// 确定图标样式
let iconBgClass, iconClass;
if (newKnowledgeDoc.value.fileName.endsWith('.pdf')) {
iconBgClass = 'bg-primary/10 flex items-center justify-center text-primary';
iconClass = 'fa-file-pdf-o';
} else if (newKnowledgeDoc.value.fileName.endsWith('.docx') || newKnowledgeDoc.value.fileName.endsWith('.doc')) {
iconBgClass = 'bg-secondary/10 flex items-center justify-center text-secondary';
iconClass = 'fa-file-word-o';
} else if (newKnowledgeDoc.value.fileName.endsWith('.xlsx') || newKnowledgeDoc.value.fileName.endsWith('.xls')) {
iconBgClass = 'bg-warning/10 flex items-center justify-center text-warning';
iconClass = 'fa-file-excel-o';
} else if (newKnowledgeDoc.value.fileName.endsWith('.pptx') || newKnowledgeDoc.value.fileName.endsWith('.ppt')) {
iconBgClass = 'bg-success/10 flex items-center justify-center text-success';
iconClass = 'fa-file-powerpoint-o';
} else {
iconBgClass = 'bg-gray-100 flex items-center justify-center text-gray-500';
iconClass = 'fa-file-o';
}
// 添加到知识库
knowledgeDocs.value.push({
id: knowledgeDocs.value.length + 1,
name: newKnowledgeDoc.value.fileName,
size: '2.1MB', // 示例大小
date: new Date().toISOString().split('T')[0],
iconBgClass,
iconClass
});
// 重置表单并关闭弹窗
newKnowledgeDoc.value = {
title: '',
category: '产品手册',
fileName: ''
};
document.getElementById('file-upload').value = '';
closeModal();
alert('文档已上传到知识库');
};
// 初始化日期显示
const formatDate = (date) => {
const options = { year: 'numeric', month: 'long', day: 'numeric', weekday: 'long' };
return date.toLocaleDateString('zh-CN', options);
};
// 初始化图表
const initChart = () => {
const ctx = document.getElementById('contentTrendChart').getContext('2d');
// 生成过去7天的日期标签
const labels = [];
const today = new Date();
for (let i = 6; i >= 0; i--) {
const date = new Date(today);
date.setDate(today.getDate() - i);
labels.push(date.toLocaleDateString('zh-CN', { month: 'short', day: 'numeric' }));
}
new Chart(ctx, {
type: 'line',
data: {
labels: labels,
datasets: [
{
label: '生成文章',
data: [12, 19, 15, 20, 18, 25, 22],
borderColor: '#165DFF',
backgroundColor: 'rgba(22, 93, 255, 0.1)',
tension: 0.4,
fill: true
},
{
label: '发布文章',
data: [8, 15, 10, 18, 14, 20, 16],
borderColor: '#36CFC9',
backgroundColor: 'rgba(54, 207, 201, 0.1)',
tension: 0.4,
fill: true
}
]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: {
position: 'top',
}
},
scales: {
y: {
beginAtZero: true,
grid: {
drawBorder: false
}
},
x: {
grid: {
display: false
}
}
}
}
});
};
// 挂载时初始化
onMounted(() => {
currentDate.value = formatDate(new Date());
initChart();
// 点击外部关闭下拉菜单
document.addEventListener('click', (e) => {
const userMenu = document.getElementById('user-menu-container');
if (!userMenu.contains(e.target)) {
userDropdownOpen.value = false;
}
});
});
tailwind.config = {
theme: {
extend: {
colors: {
primary: '#165DFF',
secondary: '#36CFC9',
success: '#52C41A',
warning: '#FAAD14',
danger: '#FF4D4F',
dark: '#1D2129',
'gray-light': '#F2F3F5',
'gray-medium': '#C9CDD4'
},
fontFamily: {
inter: ['Inter', 'system-ui', 'sans-serif'],
},
},
}
}
</script>
<style scoped>
@import 'tailwindcss/base';
@import 'tailwindcss/components';
@import 'tailwindcss/utilities';
@layer utilities {
.content-auto {
content-visibility: auto;
}
.sidebar-item-active {
@apply bg-primary/10 text-primary border-l-4 border-primary;
}
.card-hover {
@apply transition-all duration-300 hover:shadow-lg hover:-translate-y-1;
}
.btn-primary {
@apply bg-primary text-white px-4 py-2 rounded-lg hover:bg-primary/90 transition-all duration-200 shadow-md hover:shadow-lg;
}
.btn-secondary {
@apply bg-white text-primary border border-primary px-4 py-2 rounded-lg hover:bg-primary/5 transition-all duration-200;
}
.scrollbar-hide {
scrollbar-width: none;
-ms-overflow-style: none;
}
.scrollbar-hide::-webkit-scrollbar {
display: none;
}
.dropdown-active {
@apply opacity-100 visible translate-y-0;
}
.modal-active {
@apply opacity-100 visible;
}
.modal-content-active {
@apply opacity-100 translate-y-0;
}
}
.btn-primary {
background-color: rgb(0, 119, 255);
}
</style>
... ...
<template>
<div class="bg-light text-dark font-sans min-h-screen">
<!-- 顶部导航栏 -->
<header class="bg-white border-b border-neutral-200 sticky top-0 z-50 transition-all duration-300 shadow-sm">
<div class="container mx-auto px-4 h-16 flex items-center justify-between">
<div class="flex items-center space-x-2">
<div
class="w-10 h-10 rounded-lg bg-primary flex items-center justify-center shadow-md shadow-primary/20">
<i class="fa fa-robot text-white text-xl"></i>
</div>
<h1 class="text-xl font-bold text-dark">AI工贸内容自动化平台</h1>
</div>
<!-- 主导航 -->
<nav class="hidden md:flex items-center space-x-8">
<a href="#" class="text-primary font-medium flex items-center relative group">
<i class="fa fa-file-text-o mr-1.5"></i> 内容创作
<span
class="absolute -bottom-6 left-0 w-full h-0.5 bg-primary transform scale-x-0 group-hover:scale-x-100 transition-transform origin-left duration-300"></span>
</a>
<a href="#"
class="text-neutral-500 hover:text-primary transition-custom flex items-center relative group">
<i class="fa fa-calendar-check-o mr-1.5"></i> 自动化任务
<span
class="absolute -bottom-6 left-0 w-full h-0.5 bg-primary transform scale-x-0 group-hover:scale-x-100 transition-transform origin-left duration-300"></span>
</a>
<a href="#"
class="text-neutral-500 hover:text-primary transition-custom flex items-center relative group">
<i class="fa fa-bar-chart mr-1.5"></i> 数据分析
<span
class="absolute -bottom-6 left-0 w-full h-0.5 bg-primary transform scale-x-0 group-hover:scale-x-100 transition-transform origin-left duration-300"></span>
</a>
<a href="#"
class="text-neutral-500 hover:text-primary transition-custom flex items-center relative group">
<i class="fa fa-cog mr-1.5"></i> 设置
<span
class="absolute -bottom-6 left-0 w-full h-0.5 bg-primary transform scale-x-0 group-hover:scale-x-100 transition-transform origin-left duration-300"></span>
</a>
</nav>
<!-- 用户区域 -->
<div class="flex items-center space-x-4">
<button
class="text-neutral-500 hover:text-primary transition-custom relative p-2 rounded-full hover:bg-neutral-100">
<i class="fa fa-bell-o text-xl"></i>
<span
class="absolute -top-1 -right-1 w-4 h-4 bg-secondary rounded-full text-white text-xs flex items-center justify-center animate-pulse">3</span>
</button>
<div class="flex items-center space-x-2 group relative">
<div
class="w-8 h-8 rounded-full bg-neutral-200 overflow-hidden border-2 border-transparent group-hover:border-primary transition-custom">
<img src="https://picsum.photos/200/200" alt="用户头像" class="w-full h-full object-cover">
</div>
<span class="hidden md:inline text-sm font-medium">张经理</span>
<i
class="fa fa-angle-down text-xs text-neutral-400 group-hover:text-primary transition-custom"></i>
<!-- 用户下拉菜单 -->
<div
class="absolute right-0 top-full mt-2 w-48 bg-white rounded-lg shadow-elevated border border-neutral-200 opacity-0 invisible group-hover:opacity-100 group-hover:visible transition-all duration-300 transform translate-y-2 group-hover:translate-y-0 z-50">
<div class="p-3 border-b border-neutral-100">
<p class="font-medium text-sm">张经理</p>
<p class="text-xs text-neutral-500">zhang@example.com</p>
</div>
<div class="py-1">
<a href="#"
class="block px-4 py-2 text-sm text-neutral-700 hover:bg-neutral-100 hover:text-primary transition-custom">
<i class="fa fa-user-o mr-2"></i>个人资料
</a>
<a href="#"
class="block px-4 py-2 text-sm text-neutral-700 hover:bg-neutral-100 hover:text-primary transition-custom">
<i class="fa fa-cog mr-2"></i>账户设置
</a>
<a href="#"
class="block px-4 py-2 text-sm text-neutral-700 hover:bg-neutral-100 hover:text-primary transition-custom">
<i class="fa fa-question-circle-o mr-2"></i>帮助中心
</a>
<a href="#"
class="block px-4 py-2 text-sm text-red-600 hover:bg-red-50 transition-custom">
<i class="fa fa-sign-out mr-2"></i>退出登录
</a>
</div>
</div>
</div>
</div>
</div>
</header>
<main class="container mx-auto px-4 py-6 max-w-7xl">
<!-- 页面标题与状态 -->
<div class="mb-8">
<div class="flex flex-col md:flex-row md:items-center md:justify-between">
<div>
<h2
class="text-[clamp(1.5rem,3vw,2rem)] font-bold mb-1 bg-clip-text text-transparent bg-gradient-to-r from-dark to-neutral-500">
智能文章创作中心</h2>
<p class="text-neutral-500">高效生成符合Google标准的工贸企业专业内容</p>
</div>
<div class="mt-4 md:mt-0 flex items-center space-x-3">
<div
class="flex items-center text-sm text-neutral-500 bg-white px-3 py-1.5 rounded-full border border-neutral-200">
<span class="w-2 h-2 bg-green-500 rounded-full mr-2"></span>
系统正常运行中
</div>
<button
class="text-primary hover:text-primary/80 text-sm font-medium flex items-center bg-primary/5 px-3 py-1.5 rounded-full transition-custom hover:bg-primary/10">
<i class="fa fa-question-circle mr-1"></i> 帮助
</button>
</div>
</div>
</div>
<!-- 主内容区 -->
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
<!-- 左侧功能区 -->
<div class="lg:col-span-1 space-y-6">
<!-- 内容创作卡片 -->
<div
class="bg-white rounded-xl shadow-card hover:shadow-card-hover transition-all duration-300 p-5 border border-neutral-200 card-gradient">
<h3 class="text-lg font-semibold mb-4 flex items-center">
<i class="fa fa-pencil-square-o text-primary mr-2"></i>内容创作设置
</h3>
<!-- 关键词输入 -->
<div class="mb-5">
<label class="block text-sm font-medium text-neutral-500 mb-1.5">核心关键词</label>
<div class="relative">
<input type="text" placeholder="输入产品名、行业术语等"
class="w-full px-3.5 py-2.5 border border-neutral-300 rounded-lg focus:ring-2 focus:ring-primary/30 focus:border-primary outline-none transition-custom"
v-model="form.keywords">
<button
class="absolute right-2 top-1/2 -translate-y-1/2 text-neutral-400 hover:text-primary transition-custom">
<i class="fa fa-times-circle"></i>
</button>
</div>
</div>
<!-- 模型选择 -->
<div class="mb-5">
<label class="block text-sm font-medium text-neutral-500 mb-1.5">AI模型选择</label>
<select
class="w-full px-3.5 py-2.5 border border-neutral-300 rounded-lg focus:ring-2 focus:ring-primary/30 focus:border-primary outline-none transition-custom appearance-none bg-white"
v-model="form.model">
<option v-for="model in models" :key="model" :value="model">{{ model }}</option>
</select>
</div>
<!-- 文章类型选择 -->
<div class="mb-5">
<label class="block text-sm font-medium text-neutral-500 mb-1.5">文章类型</label>
<select
class="w-full px-3.5 py-2.5 border border-neutral-300 rounded-lg focus:ring-2 focus:ring-primary/30 focus:border-primary outline-none transition-custom appearance-none bg-white"
v-model="form.articleType">
<option v-for="type in articleTypes" :key="type" :value="type">{{ type }}</option>
</select>
</div>
<!-- 话题参考来源 -->
<div class="mb-5">
<label class="block text-sm font-medium text-neutral-500 mb-1.5">话题参考来源</label>
<div class="flex flex-wrap gap-2">
<label v-for="source in sources" :key="source.name"
class="inline-flex flex items-center px-3 py-1.5 border border-neutral-300 rounded-lg cursor cursor-pointer hover:border-primary transition-custom bg-white transition-custom">
<input type="checkbox" class="mr-2 accent-primary" v-model="source.checked">
<span class="text-sm">{{ source.name }}</span>
</label>
</div>
</div>
<!-- 语言选择 -->
<div class="mb-5">
<label class="block text-sm font-medium text-neutral-500 mb-1.5">目标语言</label>
<select
class="w-full px-3.5 py-2.5 border border-neutral-300 rounded-lg focus:ring-2 focus:ring-primary/30 focus:border-primary outline-none transition-custom appearance-none bg-white"
v-model="form.language">
<option v-for="lang in languages" :key="lang" :value="lang">{{ lang }}</option>
</select>
</div>
<!-- 文章应用平台 -->
<div class="mb-5">
<label class="block text-sm font-medium text-neutral-500 mb-1.5">文章应用平台</label>
<div class="grid grid-cols-2 gap-2">
<label v-for="platform in platforms" :key="platform"
class="inline-flex items-center px-3 py-2 border border-neutral-300 rounded-lg cursor-pointer hover:border-primary transition-custom bg-white">
<input type="radio" name="platform" class="mr-2 accent-primary" :value="platform"
v-model="form.selectedPlatform">
<span class="text-sm">{{ platform }}</span>
</label>
</div>
</div>
<!-- 文章长度 -->
<div class="mb-5">
<div class="flex justify-between items-center mb-1.5">
<label class="block text-sm font-medium text-neutral-500">文章长度</label>
<span class="text-xs font-medium text-primary">{{ form.articleLength }}字</span>
</div>
<input type="range" min="300" max="2000" step="100"
class="w-full h-2 bg-neutral-200 rounded-lg appearance-none cursor-pointer accent-primary"
v-model.number="form.articleLength">
<div class="flex justify-between mt-1">
<span class="text-xs text-neutral-500">短</span>
<span class="text-xs text-neutral-500">中</span>
<span class="text-xs text-neutral-500">长</span>
</div>
</div>
<!-- 生成按钮 -->
<button
class="w-full bg-primary hover:bg-primary/90 text-white py-2.5 px-4 rounded-lg font-medium transition-custom flex items-center justify-center shadow-md shadow-primary/20 hover:shadow-lg hover:shadow-primary/30 transform hover:-translate-y-0.5 active:translate-y-0"
@click="generateArticle" :disabled="isGenerating">
<i :class="isGenerating ? 'fa fa-circle-o-notch fa-spin mr-2' : 'fa fa-magic mr-2'"></i>
{{ isGenerating ? '生成中...' : '生成文章' }}
</button>
</div>
<!-- 自动化任务卡片 -->
<div
class="bg-white rounded-xl shadow-card hover:shadow-card-hover transition-all duration-300 p-5 border border-neutral-200">
<div class="flex justify-between items-center mb-4">
<h3 class="text-lg font-semibold flex items-center">
<i class="fa fa-calendar-plus-o text-secondary mr-2"></i>自动化任务
</h3>
<button
class="text-xs bg-secondary/10 hover:bg-secondary/20 text-secondary px-2.5 py-1 rounded transition-custom transform hover:-translate-y-0.5 active:translate-y-0"
@click="addNewTask">
<i class="fa fa-plus mr-1"></i> 新建任务
</button>
</div>
<!-- 任务列表 -->
<div
class="space-y-3 max-h-64 overflow-y-auto pr-1 scrollbar-thin scrollbar-thumb-neutral-300 scrollbar-track-transparent">
<div v-for="task in tasks" :key="task.id"
class="border border-neutral-200 rounded-lg p-3 hover:border-primary/50 transition-custom hover-lift bg-white">
<div class="flex justify-between items-start">
<div>
<h4 class="font-medium text-sm">{{ task.name }}</h4>
<p class="text-xs text-neutral-500 mt-0.5">{{ task.schedule }}</p>
</div>
<span
:class="task.status === '运行中' ? 'px-2 py-0.5 text-xs bg-green-100 text-green-800 rounded-full' : 'px-2 py-0.5 text-xs bg-neutral-100 text-neutral-600 rounded-full'">
{{ task.status }}
</span>
</div>
<div class="flex justify-between items-center mt-2">
<span class="text-xs text-neutral-500">类型: {{ task.type }}</span>
<div class="flex space-x-1">
<button
class="text-neutral-400 hover:text-primary p-1.5 rounded-full hover:bg-primary/5 transition-custom">
<i class="fa fa-pencil text-xs"></i>
</button>
<button
class="text-neutral-400 hover:text-red-500 p-1.5 rounded-full hover:bg-red-50 transition-custom">
<i class="fa fa-trash-o text-xs"></i>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 右侧预览与编辑区 -->
<div class="lg:col-span-2 space-y-6">
<!-- 文章预览卡片 -->
<div
class="bg-white rounded-xl shadow-card hover:shadow-card-hover transition-all duration-300 p-5 border border-neutral-200">
<div class="flex flex-wrap justify-between items-center mb-5 gap-3">
<h3 class="text-lg font-semibold flex items-center">
<i class="fa fa-eye text-primary mr-2"></i>文章预览
</h3>
<div class="flex space-x-2">
<button
class="text-neutral-500 hover:text-primary p-2 rounded-full hover:bg-neutral-100 transition-custom transform hover:-translate-y-0.5 active:translate-y-0">
<i class="fa fa-expand"></i>
</button>
<button
class="text-neutral-500 hover:text-primary p-2 rounded-full hover:bg-neutral-100 transition-custom transform hover:-translate-y-0.5 active:translate-y-0">
<i class="fa fa-refresh"></i>
</button>
<button
class="text-neutral-500 hover:text-primary p-2 rounded-full hover:bg-neutral-100 transition-custom transform hover:-translate-y-0.5 active:translate-y-0">
<i class="fa fa-cog"></i>
</button>
</div>
</div>
<!-- 文章内容预览 -->
<div class="border border-neutral-200 rounded-lg bg-neutral-100/50 p-6 h-96 overflow-y-auto scrollbar-thin scrollbar-thumb-neutral-300 scrollbar-track-transparent"
:class="{ 'ring-2 ring-primary/30': showPreviewHighlight }">
<div class="flex flex-wrap gap-2 mb-4">
<span class="px-2.5 py-0.5 text-xs bg-primary/10 text-primary rounded-full">行业分析</span>
<span
class="px-2.5 py-0.5 text-xs bg-green-100 text-green-700 rounded-full">SEO优化</span>
<span class="px-2.5 py-0.5 text-xs bg-blue-100 text-blue-700 rounded-full">英语</span>
</div>
<h1 class="text-2xl font-bold mb-5">不锈钢厨具跨境出口市场分析</h1>
<p class="mb-4 text-neutral-700 leading-relaxed">
随着全球经济的复苏,不锈钢厨具的跨境出口市场呈现出稳步增长的趋势。消费者对于高品质、耐用性强的厨房用品需求持续上升,特别是在欧美市场。
</p>
<p class="mb-6 text-neutral-700 leading-relaxed">
根据最新的行业报告,北美和欧洲仍然是不锈钢厨具的主要消费市场,尤其是美国、德国和法国等发达国家。这些地区的消费者更注重产品质量和环保性能,愿意为高品质产品支付溢价。
</p>
<div
class="bg-primary/5 border-l-4 border-primary p-4 rounded-r-lg mb-6 transform hover:translate-x-1 transition-transform">
<p class="text-sm text-primary/80 italic">
跨境电商平台的数据显示,具有环保特性和多功能设计的不锈钢厨具更受消费者青睐,这类产品的复购率比普通产品高出25%,客户评价也普遍高出0.5-1个星级。
</p>
</div>
<h2 class="text-xl font-semibold mb-3 mt-6">2023年市场趋势分析</h2>
<ul class="space-y-3 mb-6 pl-1">
<li class="flex items-start group">
<span
class="w-5 h-5 rounded-full bg-primary text-white text-xs flex items-center justify-center mt-0.5 mr-2 flex-shrink-0 group-hover:scale-110 transition-transform"></span>
<p class="text-neutral-700 leading-relaxed">
可持续发展理念推动环保型不锈钢厨具需求增长,可回收材料制成的产品销量同比增长18%,尤其在欧洲市场表现突出。</p>
</li>
<li class="flex items-start group">
<span
class="w-5 h-5 rounded-full bg-primary text-white text-xs flex items-center justify-center mt-0.5 mr-2 flex-shrink-0 group-hover:scale-110 transition-transform"></span>
<p class="text-neutral-700 leading-relaxed">
智能化成为新的产品发展方向,智能不锈钢厨具的出口量同比增长30%,特别是带有温度控制和自动清洁功能的产品在北美市场供不应求。</p>
</li>
<li class="flex items-start group">
<span
class="w-5 h-5 rounded-full bg-primary text-white text-xs flex items-center justify-center mt-0.5 mr-2 flex-shrink-0 group-hover:scale-110 transition-transform"></span>
<p class="text-neutral-700 leading-relaxed">
定制化需求上升,针对不同地区饮食习惯设计的专用厨具更受欢迎,例如亚洲市场偏好的小型炊具和欧洲市场偏好的大型烤箱用具。</p>
</li>
</ul>
<!-- 新增内容 - 市场数据图表 -->
<div class="mt-8 bg-white p-4 rounded-lg border border-neutral-200 shadow-sm">
<h3 class="text-base font-medium mb-3">主要出口市场占比</h3>
<div class="h-48">
<!-- 这里是图表占位 -->
<div class="w-full h-full flex items-end justify-around gap-2">
<div class="flex flex-col items-center w-1/5">
<div class="bg-primary rounded-t-lg w-full" style="height: 85%"></div>
<span class="text-xs mt-1">北美 35%</span>
</div>
<div class="flex flex-col items-center w-1/5">
<div class="bg-secondary rounded-t-lg w-full" style="height: 70%"></div>
<span class="text-xs mt-1">欧洲 30%</span>
</div>
<div class="flex flex-col items-center w-1/5">
<div class="bg-green-500 rounded-t-lg w-full" style="height: 45%"></div>
<span class="text-xs mt-1">东南亚 18%</span>
</div>
<div class="flex flex-col items-center w-1/5">
<div class="bg-purple-500 rounded-t-lg w-full" style="height: 30%"></div>
<span class="text-xs mt-1">中东 12%</span>
</div>
<div class="flex flex-col items-center w-1/5">
<div class="bg-yellow-500 rounded-t-lg w-full" style="height: 20%"></div>
<span class="text-xs mt-1">其他 5%</span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 编辑与发布工具栏 -->
<div
class="bg-white rounded-xl shadow-card hover:shadow-card-hover transition-all duration-300 p-5 border border-neutral-200">
<h3 class="text-lg font-semibold mb-4">内容操作</h3>
<div class="grid grid-cols-2 md:grid-cols-4 gap-3 mb-4">
<button
class="border border-neutral-200 rounded-lg p-3 text-center hover:border-primary hover:bg-primary/5 transition-custom transform hover:-translate-y-0.5 active:translate-y-0">
<i class="fa fa-paragraph text-primary block mb-1.5"></i>
<span class="text-sm">段落调整</span>
</button>
<button
class="border border-neutral-200 rounded-lg p-3 text-center hover:border-primary hover:bg-primary/5 transition-custom transform hover:-translate-y-0.5 active:translate-y-0">
<i class="fa fa-key text-primary block mb-1.5"></i>
<span class="text-sm">关键词优化</span>
</button>
<button
class="border border-neutral-200 rounded-lg p-3 text-center hover:border-primary hover:bg-primary/5 transition-custom transform hover:-translate-y-0.5 active:translate-y-0">
<i class="fa fa-language text-primary block mb-1.5"></i>
<span class="text-sm">多语言翻译</span>
</button>
<button
class="border border-neutral-200 rounded-lg p-3 text-center hover:border-primary hover:bg-primary/5 transition-custom transform hover:-translate-y-0.5 active:translate-y-0">
<i class="fa fa-file-pdf-o text-primary block mb-1.5"></i>
<span class="text-sm">导出文档</span>
</button>
</div>
<div class="flex flex-col sm:flex-row gap-3">
<button
class="flex-1 bg-white border border-secondary text-secondary hover:bg-secondary/5 font-medium py-2.5 px-4 rounded-lg transition-custom flex items-center justify-center transform hover:-translate-y-0.5 active:translate-y-0">
<i class="fa fa-calendar mr-2"></i> 添加到自动化任务
</button>
<button
class="flex-1 bg-secondary hover:bg-secondary/90 text-white font-medium py-2.5 px-4 rounded-lg transition-custom flex items-center justify-center shadow-md shadow-secondary/20 hover:shadow-lg hover:shadow-secondary/30 transform hover:-translate-y-0.5 active:translate-y-0">
<i class="fa fa-paper-plane mr-2"></i> 发布到平台
</button>
</div>
</div>
<!-- 内容质量分析 -->
<div
class="bg-white rounded-xl shadow-card hover:shadow-card-hover transition-all duration-300 p-5 border border-neutral-200">
<h3 class="text-lg font-semibold mb-4">内容质量分析</h3>
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
<!-- 原创度 -->
<div
class="border border-neutral-200 rounded-lg p-4 hover:border-green-500/50 transition-custom group">
<div class="flex justify-between items-start mb-2">
<h4 class="text-sm font-medium">原创度评分</h4>
<span
class="text-lg font-bold text-green-600 group-hover:scale-110 transition-transform">96%</span>
</div>
<div class="w-full bg-neutral-200 rounded-full h-2 overflow-hidden">
<div class="bg-green-600 h-2 rounded-full"
:style="{ width: '96%', transition: 'width 1s ease-out' }"></div>
</div>
<p class="text-xs text-neutral-500 mt-2">符合Google原创性标准</p>
</div>
<!-- SEO评分 -->
<div
class="border border-neutral-200 rounded-lg p-4 hover:border-primary/50 transition-custom group">
<div class="flex justify-between items-start mb-2">
<h4 class="text-sm font-medium">SEO优化评分</h4>
<span
class="text-lg font-bold text-primary group-hover:scale-110 transition-transform">92/100</span>
</div>
<div class="w-full bg-neutral-200 rounded-full h-2 overflow-hidden">
<div class="bg-primary h-2 rounded-full"
:style="{ width: '92%', transition: 'width 1s ease-out' }"></div>
</div>
<p class="text-xs text-neutral-500 mt-2">关键词密度: 2.3% (最佳范围)</p>
</div>
<!-- 可读性 -->
<div
class="border border-neutral-200 rounded-lg p-4 hover:border-secondary/50 transition-custom group">
<div class="flex justify-between items-start mb-2">
<h4 class="text-sm font-medium">可读性评分</h4>
<span
class="text-lg font-bold text-secondary group-hover:scale-110 transition-transform">87/100</span>
</div>
<div class="w-full bg-neutral-200 rounded-full h-2 overflow-hidden">
<div class="bg-secondary h-2 rounded-full"
:style="{ width: '87%', transition: 'width 1s ease-out' }"></div>
</div>
<p class="text-xs text-neutral-500 mt-2">适合目标市场阅读水平</p>
</div>
</div>
<!-- 新增:详细分析按钮 -->
<div class="mt-4 text-center">
<button
class="text-primary hover:text-primary/80 text-sm font-medium flex items-center mx-auto transition-custom">
<i class="fa fa-bar-chart mr-1.5"></i> 查看详细分析报告
<i class="fa fa-angle-right ml-1 text-xs"></i>
</button>
</div>
</div>
</div>
</div>
</main>
<!-- 页脚 -->
<footer class="bg-white border-t border-neutral-200 mt-10 py-6">
<div class="container mx-auto px-4 max-w-7xl">
<div class="flex flex-col md:flex-row justify-between items-center">
<div class="flex items-center mb-4 md:mb-0">
<div class="w-8 h-8 rounded-lg bg-primary flex items-center justify-center mr-2">
<i class="fa fa-robot text-white text-sm"></i>
</div>
<span class="text-sm text-neutral-500">© 2023 AI工贸内容自动化平台</span>
</div>
<div class="flex flex-wrap justify-center gap-x-6 gap-y-2">
<a href="#" class="text-sm text-neutral-500 hover:text-primary transition-custom">使用条款</a>
<a href="#" class="text-sm text-neutral-500 hover:text-primary transition-custom">隐私政策</a>
<a href="#" class="text-sm text-neutral-500 hover:text-primary transition-custom">联系支持</a>
<a href="#" class="text-sm text-neutral-500 hover:text-primary transition-custom">API文档</a>
</div>
</div>
</div>
</footer>
</div>
</template>
<script>
import { ref, onMounted, nextTick } from 'vue'
export default {
name: 'ContentAutomationPlatform',
setup() {
// 表单数据
const form = ref({
keywords: '不锈钢厨具 跨境出口',
model: 'GPT-4',
articleType: '行业趋势分析',
language: '英语',
selectedPlatform: '官网',
articleLength: 800
})
// 下拉选项数据
const models = ref(['GPT-4', 'GPT-3.5 Turbo', 'Claude 2', '文心一言', '通义千问'])
const articleTypes = ref(['产品介绍', '行业趋势分析', '跨境电商Listing', '售后指南'])
const languages = ref(['英语', '中文', '西班牙语', '法语'])
const platforms = ref(['官网', '微信公众号', 'LinkedIn', '小红书'])
const sources = ref([
{ name: 'Google', checked: true },
{ name: '百度', checked: true },
{ name: '新闻', checked: false },
{ name: '行业报告', checked: false }
])
// 任务数据
const tasks = ref([
{
id: 1,
name: '每周行业分析',
schedule: '每周一 9:00 生成',
status: '运行中',
type: '行业趋势分析'
},
{
id: 2,
name: '产品介绍更新',
schedule: '每月1日 10:00 生成',
status: '运行中',
type: '产品介绍'
},
{
id: 3,
name: '亚马逊Listing优化',
schedule: '每两周周五 14:00',
status: '已暂停',
type: '跨境电商Listing'
}
])
// 状态管理
const isGenerating = ref(false)
const showPreviewHighlight = ref(false)
// 方法
const generateArticle = () => {
isGenerating.value = true
// 模拟生成过程
setTimeout(() => {
isGenerating.value = false
// 生成完成后,给文章预览区域添加高亮动画
showPreviewHighlight.value = true
setTimeout(() => {
showPreviewHighlight.value = false
}, 2000)
}, 2000)
}
const addNewTask = () => {
alert('新建自动化任务面板将在这里打开')
}
// 页面滚动效果
const handleScroll = () => {
const header = document.querySelector('header')
if (window.scrollY > 10) {
header.classList.add('shadow-md')
header.classList.remove('shadow-sm')
} else {
header.classList.remove('shadow-md')
header.classList.add('shadow-sm')
}
}
// 按钮点击效果
const handleButtonClick = (event) => {
const button = event.target.closest('button')
if (button) {
button.classList.add('scale-98')
setTimeout(() => {
button.classList.remove('scale-98')
}, 150)
}
}
onMounted(() => {
window.addEventListener('scroll', handleScroll)
document.addEventListener('click', handleButtonClick)
// 为评分条添加动画效果
setTimeout(() => {
const progressBars = document.querySelectorAll('.rounded-full.h-2:not(.bg-neutral-200)')
progressBars.forEach(bar => {
const width = bar.style.width
bar.style.width = '0%'
setTimeout(() => {
bar.style.width = width
}, 300)
})
}, 500)
})
return {
form,
models,
articleTypes,
languages,
platforms,
sources,
tasks,
isGenerating,
showPreviewHighlight,
generateArticle,
addNewTask
}
}
}
</script>
<style>
@import url('https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css');
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
:root {
--primary: #165DFF;
--secondary: #FF7D00;
--dark: #1D2939;
--light: #F9FAFB;
--neutral-100: #F3F4F6;
--neutral-200: #E5E7EB;
--neutral-300: #D1D5DB;
--neutral-400: #9CA3AF;
--neutral-500: #6B7280;
--shadow-card: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
--shadow-card-hover: 0 10px 15px -3px rgba(0, 0, 0, 0.05), 0 4px 6px -2px rgba(0, 0, 0, 0.03);
--shadow-elevated: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
}
body {
font-family: 'Inter', 'system-ui', 'sans-serif';
}
.content-auto {
content-visibility: auto;
}
.text-balance {
text-wrap: balance;
}
.transition-custom {
transition: all 0.25s ease;
}
.hover-lift:hover {
transform: translateY(-0.25rem);
transition: all 0.3s ease;
}
.card-gradient {
background: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, rgba(22, 93, 255, 0.03) 100%);
}
/* 滚动条样式 */
.scrollbar-thin::-webkit-scrollbar {
width: 6px;
}
.scrollbar-thin::-webkit-scrollbar-track {
background: transparent;
}
.scrollbar-thin::-webkit-scrollbar-thumb {
background: var(--neutral-300);
border-radius: 3px;
}
.scrollbar-thin::-webkit-scrollbar-thumb:hover {
background: var(--neutral-400);
}
</style>
\ No newline at end of file
... ...
/** @type {import('tailwindcss').Config} */
export default {
mode: 'jit',
content: [
"./index.html",
"./src/**/*.{vue,js,ts,jsx,tsx}",
],
theme: {
extend: {
colors: {
primary: '#3B82F6', // Example blue color
}
}
},
plugins: [],
}
... ...
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))
},
},
})
... ...