diff --git a/backend/internal/model/models.go b/backend/internal/model/models.go index 130a83e..89aa970 100644 --- a/backend/internal/model/models.go +++ b/backend/internal/model/models.go @@ -28,7 +28,6 @@ type User struct { ApiToken string `gorm:"size:64" json:"api_token"` ParentAgentID *uint `gorm:"index" json:"parent_agent_id"` - Commission float64 `gorm:"default:0" json:"commission"` CanCreateAgent bool `gorm:"default:false" json:"can_create_agent"` Balance float64 `gorm:"default:0" json:"balance"` @@ -557,7 +556,6 @@ type AgentApplication struct { AgentID uint `json:"agent_id"` ApplicationID uint `json:"application_id"` DeveloperID uint `json:"developer_id"` - Commission float64 `gorm:"default:0.1" json:"commission"` Discount float64 `gorm:"default:1.0" json:"discount"` Status string `gorm:"size:20;default:active" json:"status"` IsReceived bool `gorm:"default:false" json:"is_received"` diff --git a/backend/internal/router/agent/agent.go b/backend/internal/router/agent/agent.go index ec31a68..393423f 100644 --- a/backend/internal/router/agent/agent.go +++ b/backend/internal/router/agent/agent.go @@ -80,7 +80,6 @@ func handleGetApps(c *gin.Context) { "description": aa.Application.Description, "status": aa.Application.Status, "authorized_at": aa.CreatedAt, - "commission": aa.Commission, }) } } @@ -224,7 +223,6 @@ func handleGetFinance(c *gin.Context) { response.Success(c, gin.H{ "balance": user.Balance, - "commission": user.Commission, "records": records, }) } @@ -244,7 +242,6 @@ func handleGetProfile(c *gin.Context) { "email": user.Email, "avatar": user.Avatar, "balance": user.Balance, - "commission": user.Commission, "can_create_agent": user.CanCreateAgent, }) } diff --git a/backend/internal/router/developer/agent_apps.go b/backend/internal/router/developer/agent_apps.go index 88180b3..2e4890d 100644 --- a/backend/internal/router/developer/agent_apps.go +++ b/backend/internal/router/developer/agent_apps.go @@ -137,7 +137,6 @@ func handleGetAgentApps(c *gin.Context) { AgentEmail string `json:"agent_email"` ApplicationID uint `json:"application_id"` AppName string `json:"app_name"` - Commission float64 `json:"commission"` Discount float64 `json:"discount"` Status string `json:"status"` CardTypes []CardTypeResponse `json:"card_types"` @@ -181,7 +180,6 @@ func handleGetAgentApps(c *gin.Context) { AgentEmail: agentEmail, ApplicationID: aa.ApplicationID, AppName: appName, - Commission: aa.Commission, Discount: aa.Discount, Status: aa.Status, CardTypes: cardTypes, @@ -496,7 +494,6 @@ func handleApproveRequest(c *gin.Context) { AgentID: req.AgentID, ApplicationID: req.ApplicationID, DeveloperID: userID, - Commission: 0.1, Discount: 1.0, Status: "active", IsReceived: true, @@ -606,7 +603,6 @@ func handleGetAgentAppDetail(c *gin.Context) { AgentEmail string `json:"agent_email"` ApplicationID uint `json:"application_id"` AppName string `json:"app_name"` - Commission float64 `json:"commission"` Discount float64 `json:"discount"` Status string `json:"status"` CardTypes []CardTypeResponse `json:"card_types"` @@ -629,7 +625,6 @@ func handleGetAgentAppDetail(c *gin.Context) { AgentName: agent.Username, ApplicationID: agentApp.ApplicationID, AppName: application.Name, - Commission: agentApp.Commission, Discount: agentApp.Discount, Status: agentApp.Status, CardTypes: cardTypes, @@ -648,7 +643,6 @@ func handleUpdateAgentApp(c *gin.Context) { agentAppID := c.Param("id") var reqBody struct { - Commission *float64 `json:"commission"` Discount *float64 `json:"discount"` Status *string `json:"status"` } @@ -664,9 +658,6 @@ func handleUpdateAgentApp(c *gin.Context) { } updates := make(map[string]interface{}) - if reqBody.Commission != nil { - updates["commission"] = *reqBody.Commission - } if reqBody.Discount != nil { updates["discount"] = *reqBody.Discount } diff --git a/backend/internal/router/developer/agents.go b/backend/internal/router/developer/agents.go index 39980e0..d031324 100644 --- a/backend/internal/router/developer/agents.go +++ b/backend/internal/router/developer/agents.go @@ -40,7 +40,6 @@ type AgentTreeNode struct { CreatedAt string `json:"created_at"` LastLoginAt string `json:"last_login_at"` Balance float64 `json:"balance"` - Commission float64 `json:"commission"` CanCreateAgent bool `json:"can_create_agent"` CardsCount int `json:"cards_count"` ChildAgentsCount int `json:"child_agents_count"` @@ -69,7 +68,6 @@ func handleGetAgents(c *gin.Context) { CreatedAt string `json:"created_at"` LastLoginAt string `json:"last_login_at"` Balance float64 `json:"balance"` - Commission float64 `json:"commission"` CanCreateAgent bool `json:"can_create_agent"` CardsCount int `json:"cards_count"` ChildAgentsCount int `json:"child_agents_count"` @@ -110,7 +108,6 @@ func handleGetAgents(c *gin.Context) { CreatedAt: user.CreatedAt.Format("2006-01-02 15:04:05"), LastLoginAt: lastLoginAt, Balance: user.Balance, - Commission: user.Commission, CanCreateAgent: user.CanCreateAgent, CardsCount: int(cardsCount), ChildAgentsCount: int(childAgentsCount), @@ -185,7 +182,6 @@ func handleGetAgentsTree(c *gin.Context) { CreatedAt: user.CreatedAt.Format("2006-01-02 15:04:05"), LastLoginAt: lastLoginAt, Balance: user.Balance, - Commission: user.Commission, CanCreateAgent: user.CanCreateAgent, CardsCount: int(cardsCount), ChildAgentsCount: int(childAgentsCount), @@ -217,7 +213,6 @@ func handleCreateAgent(c *gin.Context) { Email string `json:"email"` Password string `json:"password" binding:"required"` ParentAgentID *uint `json:"parent_agent_id"` - Commission float64 `json:"commission"` CanCreateAgent bool `json:"can_create_agent"` Balance float64 `json:"balance"` } @@ -259,7 +254,6 @@ func handleCreateAgent(c *gin.Context) { Role: "agent", Status: "active", ParentAgentID: req.ParentAgentID, - Commission: req.Commission, CanCreateAgent: req.CanCreateAgent, Balance: req.Balance, } @@ -365,7 +359,6 @@ func handleGetAgentDetail(c *gin.Context) { "role": user.Role, "parent_agent_id": user.ParentAgentID, "parent_agent_name": parentAgentName, - "commission": user.Commission, "can_create_agent": user.CanCreateAgent, "balance": user.Balance, "created_at": user.CreatedAt.Format("2006-01-02 15:04:05"), @@ -387,7 +380,6 @@ func handleUpdateAgent(c *gin.Context) { var req struct { ParentAgentID *uint `json:"parent_agent_id"` - Commission *float64 `json:"commission"` Email *string `json:"email"` Password *string `json:"password"` CanCreateAgent *bool `json:"can_create_agent"` @@ -414,9 +406,6 @@ func handleUpdateAgent(c *gin.Context) { if req.Email != nil { user.Email = req.Email } - if req.Commission != nil { - user.Commission = *req.Commission - } if req.Password != nil && *req.Password != "" { hashedPassword, err := bcrypt.GenerateFromPassword([]byte(*req.Password), bcrypt.DefaultCost) if err != nil { diff --git a/backend/scripts/translate_docs_i18n.go b/backend/scripts/translate_docs_i18n.go index 184c88c..a4bf4a9 100644 --- a/backend/scripts/translate_docs_i18n.go +++ b/backend/scripts/translate_docs_i18n.go @@ -153,7 +153,7 @@ func main() { }, "如何实现代理授权?": { TitleEn: "How to Implement Agent Authorization?", - ContentEn: "# How to Implement Agent Authorization?\n\n## Overview\nAgent authorization allows you to delegate application management to agents.\n\n## Setup Steps\n\n### 1. Create Agent Application\n1. Go to Console > Agent Applications\n2. Click \"Create Agent Application\"\n3. Select the application to authorize\n4. Set commission rate\n\n### 2. Generate Agent Link\nAfter creation, you'll get an agent link:\n```\nhttps://platform.com/agent/AGENT_CODE\n```\n\n### 3. Agent Dashboard\nAgents can access their dashboard to:\n- View sales statistics\n- Generate card keys\n- Manage users", + ContentEn: "# How to Implement Agent Authorization?\n\n## Overview\nAgent authorization allows you to delegate application management to agents.\n\n## Setup Steps\n\n### 1. Create Agent Application\n1. Go to Console > Agent Applications\n2. Click \"Create Agent Application\"\n3. Select the application to authorize\n4. Set discount rate\n\n### 2. Generate Agent Link\nAfter creation, you'll get an agent link:\n```\nhttps://platform.com/agent/AGENT_CODE\n```\n\n### 3. Agent Dashboard\nAgents can access their dashboard to:\n- View sales statistics\n- Generate card keys\n- Manage users", }, } diff --git a/backend/scripts/update_doc_translations.go b/backend/scripts/update_doc_translations.go index d6f0c4e..8b0c525 100644 --- a/backend/scripts/update_doc_translations.go +++ b/backend/scripts/update_doc_translations.go @@ -141,7 +141,7 @@ func main() { }, "faq-agent": { TitleEn: "How to Implement Agent Authorization?", - ContentEn: "# How to Implement Agent Authorization?\n\n## What is Agent Authorization?\n\nAgent authorization allows developers to authorize their applications to other developers, who can then generate card keys and sell them.\n\n## Authorization Process\n\n1. **Apply for Authorization**\n - Authorized party submits application to authorizer\n - Enter application ID\n - Wait for authorizer approval\n\n2. **Approve Authorization**\n - Authorizer views application\n - Set card key type permissions after approval\n - Set agent commission and discount\n\n3. **Generate Card Keys**\n - Authorized party selects authorized application\n - Select card key types with permission\n - Generate and sell card keys\n\n4. **Settle Commission**\n - Sales revenue is settled proportionally\n - Authorized party receives commission income\n\n## Permission Management\n\n- Authorizer can modify card key type permissions at any time\n- Can pause or terminate authorization\n- Can view agent's sales data", + ContentEn: "# How to Implement Agent Authorization?\n\n## What is Agent Authorization?\n\nAgent authorization allows developers to authorize their applications to other developers, who can then generate card keys and sell them.\n\n## Authorization Process\n\n1. **Apply for Authorization**\n - Authorized party submits application to authorizer\n - Enter application ID\n - Wait for authorizer approval\n\n2. **Approve Authorization**\n - Authorizer views application\n - Set card key type permissions after approval\n - Set agent discount\n\n3. **Generate Card Keys**\n - Authorized party selects authorized application\n - Select card key types with permission\n - Generate and sell card keys\n\n4. **Settle Revenue**\n - Sales revenue is settled proportionally\n - Authorized party receives income\n\n## Permission Management\n\n- Authorizer can modify card key type permissions at any time\n- Can pause or terminate authorization\n- Can view agent's sales data", SummaryEn: "Implementation process and permission management for agent authorization", }, } diff --git a/frontend/src/components/data-table/date-range-filter.vue b/frontend/src/components/data-table/date-range-filter.vue index 1439a7c..7ff2f59 100644 --- a/frontend/src/components/data-table/date-range-filter.vue +++ b/frontend/src/components/data-table/date-range-filter.vue @@ -35,7 +35,7 @@ const displayValue = computed(() => { return '' }) -const buttonTitle = computed(() => props.title || t('developer.cards.timeRange')) +const buttonTitle = computed(() => props.title || t('admin.cards.timeRange')) function setQuickRange(range: 'today' | 'week' | 'month') { const now = new Date() @@ -83,19 +83,19 @@ function clearFilter() {
- {{ t('developer.cards.selectTimeRange') }} + {{ t('admin.cards.selectTimeRange') }}
~ @@ -103,17 +103,17 @@ function clearFilter() {
- {{ t('developer.cards.today') }} + {{ t('admin.cards.today') }} - {{ t('developer.cards.last7Days') }} + {{ t('admin.cards.last7Days') }} - {{ t('developer.cards.thisMonth') }} + {{ t('admin.cards.thisMonth') }}
- {{ t('developer.cards.reset') }} + {{ t('admin.cards.reset') }}
diff --git a/frontend/src/components/data-table/faceted-filter.vue b/frontend/src/components/data-table/faceted-filter.vue index 2da80c6..b1b226f 100644 --- a/frontend/src/components/data-table/faceted-filter.vue +++ b/frontend/src/components/data-table/faceted-filter.vue @@ -70,7 +70,7 @@ const filterFunction = (list: DataTableFacetedFilter['options'], term: string) = v-for="option in options" :key="option.value" :value="option" - @select="(_e) => { + @select="(_e: any) => { const isSelected = selectedValues.has(option.value) if (isSelected) { selectedValues.delete(option.value) diff --git a/frontend/src/components/developer-sidebar/index.vue b/frontend/src/components/developer-sidebar/index.vue index a0fbc2d..74d3173 100644 --- a/frontend/src/components/developer-sidebar/index.vue +++ b/frontend/src/components/developer-sidebar/index.vue @@ -31,7 +31,7 @@ onMounted(() => { const teams = [ { - name: '开发者后台', + name: '管理后台', logo: Code, plan: 'Developer', }, @@ -43,42 +43,42 @@ const navMain = [ items: [ { title: '控制台', - url: '/developer', + url: '/admin', icon: Gauge, }, { title: '应用管理', - url: '/developer/applications', + url: '/admin/applications', icon: Boxes, }, { title: '卡类管理', - url: '/developer/card-types', + url: '/admin/card-types', icon: Hash, }, { title: '卡密管理', - url: '/developer/cards', + url: '/admin/cards', icon: Key, }, { title: '公告管理', - url: '/developer/announcements', + url: '/admin/announcements', icon: Megaphone, }, { title: '版本管理', - url: '/developer/versions', + url: '/admin/versions', icon: GitBranch, }, { title: '用户管理', - url: '/developer/users', + url: '/admin/users', icon: Users, }, { title: '代理管理', - url: '/developer/agents', + url: '/admin/agents', icon: Network, }, ], @@ -88,17 +88,17 @@ const navMain = [ items: [ { title: '财务管理', - url: '/developer/finance', + url: '/admin/finance', icon: DollarSign, }, { title: '日志记录', - url: '/developer/logs', + url: '/admin/logs', icon: ScrollText, }, { title: '工单系统', - url: '/developer/tickets', + url: '/admin/tickets', icon: MessageSquare, }, ], @@ -108,27 +108,27 @@ const navMain = [ items: [ { title: '云端常量', - url: '/developer/cloud-constants', + url: '/admin/cloud-constants', icon: FileLock, }, { title: '云端变量', - url: '/developer/cloud-variables', + url: '/admin/cloud-variables', icon: Variable, }, { title: '云端函数', - url: '/developer/cloud-function', + url: '/admin/cloud-function', icon: Code, }, { title: '风控管理', - url: '/developer/risk-control', + url: '/admin/risk-control', icon: Shield, }, { title: '扩展配置', - url: '/developer/extension', + url: '/admin/extension', icon: Plug, }, ], diff --git a/frontend/src/components/developer-sidebar/nav-footer.vue b/frontend/src/components/developer-sidebar/nav-footer.vue index f8fa421..53e0c78 100644 --- a/frontend/src/components/developer-sidebar/nav-footer.vue +++ b/frontend/src/components/developer-sidebar/nav-footer.vue @@ -139,11 +139,11 @@ function handleLogout() { - + 个人中心 - + 工单系统 diff --git a/frontend/src/components/marketing-layout/the-header.vue b/frontend/src/components/marketing-layout/the-header.vue index 831e90a..a911b0f 100644 --- a/frontend/src/components/marketing-layout/the-header.vue +++ b/frontend/src/components/marketing-layout/the-header.vue @@ -66,34 +66,34 @@ const developerMenus = computed(() => ({ main: { title: t('nav.mainFeatures'), items: [ - { title: t('nav.console'), url: '/developer', icon: 'lucide:gauge' }, - { title: t('nav.applications'), url: '/developer/applications', icon: 'lucide:boxes' }, - { title: t('nav.cardTypes'), url: '/developer/card-types', icon: 'lucide:hash' }, - { title: t('nav.cards'), url: '/developer/cards', icon: 'lucide:key' }, - { title: t('nav.announcements'), url: '/developer/announcements', icon: 'lucide:megaphone' }, - { title: t('nav.versions'), url: '/developer/versions', icon: 'lucide:git-branch' }, - { title: t('nav.users'), url: '/developer/users', icon: 'lucide:users' }, - { title: t('nav.devices'), url: '/developer/devices', icon: 'lucide:monitor' }, - { title: t('nav.sessions'), url: '/developer/sessions', icon: 'lucide:wifi' }, - { title: t('nav.agentApps'), url: '/developer/agent-apps', icon: 'lucide:share-2' }, + { title: t('nav.console'), url: '/admin', icon: 'lucide:gauge' }, + { title: t('nav.applications'), url: '/admin/applications', icon: 'lucide:boxes' }, + { title: t('nav.cardTypes'), url: '/admin/card-types', icon: 'lucide:hash' }, + { title: t('nav.cards'), url: '/admin/cards', icon: 'lucide:key' }, + { title: t('nav.announcements'), url: '/admin/announcements', icon: 'lucide:megaphone' }, + { title: t('nav.versions'), url: '/admin/versions', icon: 'lucide:git-branch' }, + { title: t('nav.users'), url: '/admin/users', icon: 'lucide:users' }, + { title: t('nav.devices'), url: '/admin/devices', icon: 'lucide:monitor' }, + { title: t('nav.sessions'), url: '/admin/sessions', icon: 'lucide:wifi' }, + { title: t('nav.agentApps'), url: '/admin/agent-apps', icon: 'lucide:share-2' }, ], }, business: { title: t('nav.businessManagement'), items: [ - { title: t('nav.finance'), url: '/developer/finance', icon: 'lucide:dollar-sign' }, - { title: t('nav.logs'), url: '/developer/logs', icon: 'lucide:scroll-text' }, - { title: t('nav.tickets'), url: '/developer/tickets', icon: 'lucide:message-square' }, + { title: t('nav.finance'), url: '/admin/finance', icon: 'lucide:dollar-sign' }, + { title: t('nav.logs'), url: '/admin/logs', icon: 'lucide:scroll-text' }, + { title: t('nav.tickets'), url: '/admin/tickets', icon: 'lucide:message-square' }, ], }, advanced: { title: t('nav.advancedFeatures'), items: [ - { title: t('nav.cloudConstants'), url: '/developer/cloud-constants', icon: 'lucide:file-lock' }, - { title: t('nav.cloudVariables'), url: '/developer/cloud-variables', icon: 'lucide:variable' }, - { title: t('nav.cloudFunction'), url: '/developer/cloud-function', icon: 'lucide:code' }, - { title: t('nav.riskControl'), url: '/developer/risk-control', icon: 'lucide:shield' }, - { title: t('nav.extension'), url: '/developer/extension', icon: 'lucide:plug' }, + { title: t('nav.cloudConstants'), url: '/admin/cloud-constants', icon: 'lucide:file-lock' }, + { title: t('nav.cloudVariables'), url: '/admin/cloud-variables', icon: 'lucide:variable' }, + { title: t('nav.cloudFunction'), url: '/admin/cloud-function', icon: 'lucide:code' }, + { title: t('nav.riskControl'), url: '/admin/risk-control', icon: 'lucide:shield' }, + { title: t('nav.extension'), url: '/admin/extension', icon: 'lucide:plug' }, ], }, })) @@ -334,7 +334,7 @@ watch(route, () => { {{ t('nav.profile') }} - + {{ t('nav.developerDashboard') }} diff --git a/frontend/src/layouts/developer.vue b/frontend/src/layouts/developer.vue index f511e33..2ae69f4 100644 --- a/frontend/src/layouts/developer.vue +++ b/frontend/src/layouts/developer.vue @@ -2,7 +2,7 @@ import { computed } from 'vue' import { useRouter } from 'vue-router' -import DeveloperSidebar from '@/components/developer-sidebar/index.vue' +import AdminSidebar from '@/components/developer-sidebar/index.vue' import LanguageChange from '@/components/language-change.vue' import ThemePopover from '@/components/custom-theme/theme-popover.vue' import ToggleTheme from '@/components/toggle-theme.vue' @@ -12,7 +12,7 @@ const router = useRouter() const breadcrumbs = computed(() => { const path = router.currentRoute.value.path const parts = path.split('/').filter(Boolean) - const crumbs = [{ title: '控制台', path: '/developer' }] + const crumbs = [{ title: '控制台', path: '/admin' }] const titleMap: Record = { applications: '应用管理', @@ -44,7 +44,7 @@ const breadcrumbs = computed(() => { invite: '邀请授权', } - let currentPath = '/developer' + let currentPath = '/admin' for (let i = 1; i < parts.length; i++) { const part = parts[i] currentPath += `/${part}` @@ -69,7 +69,7 @@ const breadcrumbs = computed(() => {