feat: 重构前后端架构,添加Go后端和Python Agent服务

- 新增 Go 语言后端服务(server/),包含用户认证、Agent管理、数据库连接等API
- 新增 Python Agent 服务(agent/),实现Agent核心逻辑和工具集
- 前端从原生HTML迁移到Vue.js框架(web/src/)
- 添加 Docker Compose 支持(docker-compose.yml)
- 添加项目架构文档(docs/ARCHITECTURE.md)
- 添加环境变量示例(.env.example)和本地启动脚本(start-local.ps1)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-06 16:39:42 +08:00
parent 6fe3c412f4
commit b2bc9988a9
90 changed files with 9317 additions and 469 deletions

View File

@@ -231,7 +231,7 @@ const statusClass = (status: string) => {
<i class="fa-solid fa-robot text-gray-400"></i>
<span class="font-medium">Agents</span>
</div>
<button @click="openCreate" class="bg-gradient-to-r from-primary-orange to-red-500 hover:from-orange-500 hover:to-red-600 text-white px-4 py-2 rounded-lg font-medium flex items-center gap-2 transition-all">
<button @click="openCreate" class="btn-primary">
<i class="fa-solid fa-plus"></i>
New Agent
</button>
@@ -245,7 +245,7 @@ const statusClass = (status: string) => {
v-model="searchQuery"
type="text"
placeholder="Search agents..."
class="w-full bg-dark-600 border border-dark-500 rounded-lg py-2 pl-10 pr-4 text-white placeholder-gray-500 focus:outline-none focus:border-primary-orange"
class="search-input w-full"
>
</div>
<el-select v-model="filterStatus" placeholder="Select" class="w-40" size="large">
@@ -271,7 +271,7 @@ const statusClass = (status: string) => {
</tr>
</thead>
<tbody>
<tr v-for="agent in filteredAgents()" :key="agent.id" class="border-t border-dark-600 hover:bg-dark-600/50 transition-colors">
<tr v-for="agent in filteredAgents()" :key="agent.id" class="table-row">
<td class="px-5 py-4">
<div class="font-medium">{{ agent.name }}</div>
<div class="text-sm text-gray-500">{{ agent.description }}</div>
@@ -294,21 +294,21 @@ const statusClass = (status: string) => {
<div class="flex items-center justify-end gap-2">
<button
@click="toggleStatus(agent)"
class="p-2 rounded-lg hover:bg-dark-500 transition-colors"
class="btn-icon"
:title="agent.status === 'running' ? 'Stop' : 'Start'"
>
<i :class="['fa-solid', agent.status === 'running' ? 'fa-stop' : 'fa-play', 'text-gray-400 hover:text-white']"></i>
<i :class="['fa-solid', agent.status === 'running' ? 'fa-stop' : 'fa-play', 'text-gray-400']"></i>
</button>
<button
@click="openEdit(agent)"
class="p-2 rounded-lg hover:bg-dark-500 transition-colors"
class="btn-icon"
title="Edit"
>
<i class="fa-solid fa-pen text-gray-400 hover:text-white"></i>
<i class="fa-solid fa-pen text-gray-400"></i>
</button>
<button
@click="deleteAgent(agent.id)"
class="p-2 rounded-lg hover:bg-dark-500 transition-colors"
class="btn-icon"
title="Delete"
>
<i class="fa-solid fa-trash text-gray-400 hover:text-primary-danger"></i>
@@ -328,7 +328,7 @@ const statusClass = (status: string) => {
<!-- 编辑弹窗 -->
<Teleport to="body">
<div v-if="isEditing" class="fixed inset-0 bg-black/60 flex items-center justify-center z-50" @click.self="cancelEdit">
<div v-if="isEditing" class="fixed inset-0 bg-black/60 flex items-center justify-center z-50">
<div class="bg-dark-700 rounded-2xl w-full max-w-lg border border-dark-500 shadow-2xl">
<!-- 弹窗头部 -->
<div class="flex items-center justify-between p-5 border-b border-dark-500">
@@ -345,7 +345,7 @@ const statusClass = (status: string) => {
<input
v-model="editForm.name"
type="text"
class="w-full bg-dark-600 border border-dark-500 rounded-lg px-4 py-2.5 text-white focus:outline-none focus:border-primary-orange"
class="input-field"
>
</div>
@@ -374,7 +374,7 @@ const statusClass = (status: string) => {
<textarea
v-model="editForm.description"
rows="3"
class="w-full bg-dark-600 border border-dark-500 rounded-lg px-4 py-2.5 text-white focus:outline-none focus:border-primary-orange resize-none"
class="input-field resize-none"
></textarea>
</div>
</div>
@@ -383,13 +383,13 @@ const statusClass = (status: string) => {
<div class="flex items-center justify-end gap-3 p-5 border-t border-dark-500">
<button
@click="cancelEdit"
class="px-4 py-2 rounded-lg bg-dark-600 text-gray-300 hover:bg-dark-500 transition-colors"
class="btn-secondary"
>
Cancel
</button>
<button
@click="saveEdit"
class="px-4 py-2 rounded-lg bg-gradient-to-r from-primary-orange to-red-500 text-white hover:from-orange-500 hover:to-red-600 transition-all"
class="btn-primary"
>
Save Changes
</button>
@@ -400,7 +400,7 @@ const statusClass = (status: string) => {
<!-- 新建 Agent 模态框 -->
<Teleport to="body">
<div v-if="isCreating" class="fixed inset-0 bg-black/80 flex items-center justify-center z-50 p-4" @click.self="closeCreate">
<div v-if="isCreating" class="fixed inset-0 bg-black/80 flex items-center justify-center z-50 p-4">
<div class="bg-dark-800 rounded-2xl w-full max-w-6xl h-[85vh] border border-dark-600 shadow-2xl overflow-hidden flex flex-col animate-modal-in">
<!-- 模态框头部 -->
<div class="flex items-center justify-between p-5 border-b border-dark-600 bg-dark-700/50">
@@ -625,13 +625,13 @@ const statusClass = (status: string) => {
<div class="flex items-center gap-3">
<button
@click="closeCreate"
class="px-6 py-2.5 rounded-xl bg-dark-600 text-gray-300 hover:bg-dark-500 border border-dark-500 transition-all hover:scale-105"
class="btn-secondary px-6 py-2.5"
>
Cancel
</button>
<button
@click="saveNewAgent"
class="px-6 py-2.5 rounded-xl bg-gradient-to-r from-primary-orange to-red-500 text-white hover:from-orange-500 hover:to-red-600 transition-all hover:scale-105 shadow-lg shadow-primary-orange/30 flex items-center gap-2"
class="btn-primary px-6 py-2.5"
>
<i class="fa-solid fa-plus"></i>
Create Agent