Initial commit: Telegram Management System
Some checks failed
Deploy / deploy (push) Has been cancelled

Full-stack web application for Telegram management
- Frontend: Vue 3 + Vben Admin
- Backend: NestJS
- Features: User management, group broadcast, statistics

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
你的用户名
2025-11-04 15:37:50 +08:00
commit 237c7802e5
3674 changed files with 525172 additions and 0 deletions

View File

@@ -0,0 +1,289 @@
import request from '@/utils/request'
// Subscriptions
export function getSubscriptions() {
return request({
url: '/api/v1/billing/subscriptions',
method: 'get'
})
}
export function getSubscription(id) {
return request({
url: `/api/v1/billing/subscriptions/${id}`,
method: 'get'
})
}
export function createSubscription(data) {
return request({
url: '/api/v1/billing/subscriptions',
method: 'post',
data
})
}
export function updateSubscription(id, data) {
return request({
url: `/api/v1/billing/subscriptions/${id}`,
method: 'patch',
data
})
}
export function cancelSubscription(id, data) {
return request({
url: `/api/v1/billing/subscriptions/${id}/cancel`,
method: 'post',
data
})
}
export function reactivateSubscription(id) {
return request({
url: `/api/v1/billing/subscriptions/${id}/reactivate`,
method: 'post'
})
}
export function recordUsage(id, data) {
return request({
url: `/api/v1/billing/subscriptions/${id}/usage`,
method: 'post',
data
})
}
export function getSubscriptionUsage(id, params) {
return request({
url: `/api/v1/billing/subscriptions/${id}/usage`,
method: 'get',
params
})
}
export function applyDiscount(id, data) {
return request({
url: `/api/v1/billing/subscriptions/${id}/discount`,
method: 'post',
data
})
}
// Invoices
export function getInvoices(params) {
return request({
url: '/api/v1/billing/invoices',
method: 'get',
params
})
}
export function getInvoice(id) {
return request({
url: `/api/v1/billing/invoices/${id}`,
method: 'get'
})
}
export function createInvoice(data) {
return request({
url: '/api/v1/billing/invoices',
method: 'post',
data
})
}
export function updateInvoice(id, data) {
return request({
url: `/api/v1/billing/invoices/${id}`,
method: 'patch',
data
})
}
export function finalizeInvoice(id) {
return request({
url: `/api/v1/billing/invoices/${id}/finalize`,
method: 'post'
})
}
export function payInvoice(id, data) {
return request({
url: `/api/v1/billing/invoices/${id}/pay`,
method: 'post',
data
})
}
export function voidInvoice(id, data) {
return request({
url: `/api/v1/billing/invoices/${id}/void`,
method: 'post',
data
})
}
export function downloadInvoice(id) {
return request({
url: `/api/v1/billing/invoices/${id}/pdf`,
method: 'get',
responseType: 'blob'
})
}
export function sendInvoiceReminder(id) {
return request({
url: `/api/v1/billing/invoices/${id}/remind`,
method: 'post'
})
}
export function getUnpaidInvoices() {
return request({
url: '/api/v1/billing/invoices/unpaid',
method: 'get'
})
}
export function getOverdueInvoices() {
return request({
url: '/api/v1/billing/invoices/overdue',
method: 'get'
})
}
// Payment Methods
export function getPaymentMethods() {
return request({
url: '/api/v1/billing/payment-methods',
method: 'get'
})
}
export function getPaymentMethod(id) {
return request({
url: `/api/v1/billing/payment-methods/${id}`,
method: 'get'
})
}
export function addPaymentMethod(data) {
return request({
url: '/api/v1/billing/payment-methods',
method: 'post',
data
})
}
export function updatePaymentMethod(id, data) {
return request({
url: `/api/v1/billing/payment-methods/${id}`,
method: 'patch',
data
})
}
export function setDefaultPaymentMethod(id) {
return request({
url: `/api/v1/billing/payment-methods/${id}/default`,
method: 'post'
})
}
export function removePaymentMethod(id) {
return request({
url: `/api/v1/billing/payment-methods/${id}`,
method: 'delete'
})
}
export function verifyPaymentMethod(id, data) {
return request({
url: `/api/v1/billing/payment-methods/${id}/verify`,
method: 'post',
data
})
}
// Transactions
export function getTransactions(params) {
return request({
url: '/api/v1/billing/transactions',
method: 'get',
params
})
}
export function getTransaction(id) {
return request({
url: `/api/v1/billing/transactions/${id}`,
method: 'get'
})
}
export function createRefund(id, data) {
return request({
url: `/api/v1/billing/transactions/${id}/refund`,
method: 'post',
data
})
}
export function getTransactionSummary(period, params) {
return request({
url: `/api/v1/billing/transactions/summary/${period}`,
method: 'get',
params
})
}
export function exportTransactions(format, params) {
return request({
url: `/api/v1/billing/transactions/export/${format}`,
method: 'get',
params,
responseType: 'blob'
})
}
export function createAdjustment(data) {
return request({
url: '/api/v1/billing/transactions/adjustment',
method: 'post',
data
})
}
// Plans
export function getPlans() {
return request({
url: '/api/v1/billing/plans',
method: 'get'
})
}
export function getPlan(id) {
return request({
url: `/api/v1/billing/plans/${id}`,
method: 'get'
})
}
// Coupons
export function validateCoupon(code) {
return request({
url: '/api/v1/billing/coupons/validate',
method: 'post',
data: { code }
})
}
// Stripe Customer Portal
export function createCustomerPortalSession() {
return request({
url: '/api/v1/billing/customer-portal',
method: 'post'
})
}

View File

@@ -0,0 +1,102 @@
import axios from 'axios'
import { ElMessage } from 'element-plus'
import router from '@/router'
// Create axios instance
const request = axios.create({
baseURL: '/api/v1',
timeout: 30000,
headers: {
'Content-Type': 'application/json'
}
})
// Request interceptor
request.interceptors.request.use(
config => {
const token = localStorage.getItem('token')
if (token) {
config.headers.Authorization = `Bearer ${token}`
}
return config
},
error => {
console.error('Request error:', error)
return Promise.reject(error)
}
)
// Response interceptor
request.interceptors.response.use(
response => {
console.log('API Response:', response.config.url, response.data)
return response
},
error => {
if (error.response) {
switch (error.response.status) {
case 401:
localStorage.removeItem('token')
router.push({ name: 'Login' })
ElMessage.error('Authentication expired, please login again')
break
case 403:
ElMessage.error('Access denied')
break
case 404:
ElMessage.error('Resource not found')
break
case 429:
ElMessage.error('Too many requests, please try again later')
break
case 500:
ElMessage.error('Server error, please try again later')
break
default:
ElMessage.error(error.response.data?.error || 'Operation failed')
}
} else if (error.request) {
ElMessage.error('Network error, please check your connection')
} else {
ElMessage.error('Request failed')
}
return Promise.reject(error)
}
)
// API modules
import auth from './modules/auth'
import campaigns from './modules/campaigns'
import analytics from './modules/analytics'
import abTesting from './modules/abTesting'
import accounts from './modules/accounts'
import compliance from './modules/compliance'
import ai from './modules/ai'
import settings from './modules/settings'
import scheduledCampaigns from './modules/scheduledCampaigns'
import segments from './modules/segments'
import templates from './modules/templates'
const api = {
auth,
campaigns,
analytics,
abTesting,
accounts,
compliance,
ai,
settings,
scheduledCampaigns,
segments,
templates,
setAuthToken(token) {
if (token) {
request.defaults.headers.common['Authorization'] = `Bearer ${token}`
} else {
delete request.defaults.headers.common['Authorization']
}
}
}
export { request }
export default api

View File

@@ -0,0 +1,71 @@
import { request } from '../index'
export default {
// Experiments
getExperiments(params) {
return request.get('/ab-testing/experiments', { params })
},
getExperiment(id) {
return request.get(`/ab-testing/experiments/${id}`)
},
createExperiment(data) {
return request.post('/ab-testing/experiments', data)
},
updateExperiment(id, data) {
return request.put(`/ab-testing/experiments/${id}`, data)
},
deleteExperiment(id) {
return request.delete(`/ab-testing/experiments/${id}`)
},
// Experiment actions
startExperiment(id) {
return request.post(`/ab-testing/experiments/${id}/start`)
},
pauseExperiment(id) {
return request.post(`/ab-testing/experiments/${id}/pause`)
},
stopExperiment(id) {
return request.post(`/ab-testing/experiments/${id}/stop`)
},
// Variants
getVariants(experimentId) {
return request.get(`/ab-testing/experiments/${experimentId}/variants`)
},
createVariant(experimentId, data) {
return request.post(`/ab-testing/experiments/${experimentId}/variants`, data)
},
updateVariant(experimentId, variantId, data) {
return request.put(`/ab-testing/experiments/${experimentId}/variants/${variantId}`, data)
},
deleteVariant(experimentId, variantId) {
return request.delete(`/ab-testing/experiments/${experimentId}/variants/${variantId}`)
},
// Results
getResults(experimentId) {
return request.get(`/ab-testing/experiments/${experimentId}/results`)
},
// Significance test
runSignificanceTest(experimentId) {
return request.post(`/ab-testing/experiments/${experimentId}/significance-test`)
},
// Winner selection
selectWinner(experimentId, variantId) {
return request.post(`/ab-testing/experiments/${experimentId}/select-winner`, {
variantId
})
}
}

View File

@@ -0,0 +1,104 @@
import { request } from '../index'
export default {
// Get accounts list
getList(params) {
return request.get('/accounts', { params })
},
// Telegram accounts
getAccounts(params) {
return request.get('/gramjs-adapter/accounts', { params })
},
// Connect new Telegram account
connectAccount(data) {
return request.post('/gramjs-adapter/accounts/connect', data)
},
// Verify account with code
verifyAccount(accountId, data) {
return request.post(`/gramjs-adapter/accounts/${accountId}/verify`, data)
},
// Get account connection status
getAccountStatus(accountId) {
return request.get(`/gramjs-adapter/accounts/${accountId}/status`)
},
// Disconnect account
disconnectAccount(accountId) {
return request.delete(`/gramjs-adapter/accounts/${accountId}`)
},
// Reconnect account
reconnectAccount(accountId) {
return request.post(`/gramjs-adapter/accounts/${accountId}/reconnect`)
},
getAccount(id) {
return request.get(`/accounts/${id}`)
},
addAccount(data) {
return request.post('/accounts', data)
},
updateAccount(id, data) {
return request.put(`/accounts/${id}`, data)
},
deleteAccount(id) {
return request.delete(`/accounts/${id}`)
},
// Update account status
updateStatus(id, status) {
return request.put(`/accounts/${id}/status`, { status })
},
// Account actions
activateAccount(id) {
return request.post(`/accounts/${id}/activate`)
},
deactivateAccount(id) {
return request.post(`/accounts/${id}/deactivate`)
},
refreshSession(id) {
return request.post(`/accounts/${id}/refresh-session`)
},
// Groups
getGroups(params) {
return request.get('/groups', { params })
},
getGroup(id) {
return request.get(`/groups/${id}`)
},
syncGroups(accountId) {
return request.post(`/accounts/${accountId}/sync-groups`)
},
// Group members
getGroupMembers(groupId, params) {
return request.get(`/groups/${groupId}/members`, { params })
},
// Account statistics
getAccountStats(id) {
return request.get(`/accounts/${id}/stats`)
},
// Batch operations
batchActivate(accountIds) {
return request.post('/accounts/batch/activate', { accountIds })
},
batchDeactivate(accountIds) {
return request.post('/accounts/batch/deactivate', { accountIds })
}
}

View File

@@ -0,0 +1,50 @@
import { request } from '../index'
export default {
// Strategy generation
generateStrategy(data) {
return request.post('/claude/strategy/generate', data)
},
// Campaign analysis
analyzeCampaign(data) {
return request.post('/claude/analysis/campaign', data)
},
// Content generation
generateContent(data) {
return request.post('/claude/content/generate', data)
},
optimizeContent(data) {
return request.post('/claude/content/optimize', data)
},
// Audience analysis
analyzeAudience(data) {
return request.post('/claude/analysis/audience', data)
},
// Predictions
predictPerformance(data) {
return request.post('/claude/predict/performance', data)
},
predictEngagement(data) {
return request.post('/claude/predict/engagement', data)
},
// Recommendations
getRecommendations(type, params) {
return request.get(`/claude/recommendations/${type}`, { params })
},
// Chat interface
sendMessage(data) {
return request.post('/claude/chat', data)
},
getChatHistory(sessionId) {
return request.get(`/claude/chat/history/${sessionId}`)
}
}

View File

@@ -0,0 +1,63 @@
import { request } from '../index'
export default {
// Dashboard metrics
getDashboardMetrics(params) {
return request.get('/analytics/dashboard', { params })
},
// Campaign analytics
getCampaignMetrics(campaignId, params) {
return request.get(`/analytics/campaigns/${campaignId}/metrics`, { params })
},
// Message analytics
getMessageMetrics(params) {
return request.get('/analytics/messages', { params })
},
// Engagement analytics
getEngagementMetrics(params) {
return request.get('/analytics/engagement', { params })
},
// Conversion analytics
getConversionMetrics(params) {
return request.get('/analytics/conversions', { params })
},
// Real-time analytics
getRealTimeMetrics() {
return request.get('/analytics/realtime')
},
// Reports
generateReport(data) {
return request.post('/analytics/reports', data)
},
getReports(params) {
return request.get('/analytics/reports', { params })
},
downloadReport(id) {
return request.get(`/analytics/reports/${id}/download`, {
responseType: 'blob'
})
},
// Custom metrics
trackEvent(data) {
return request.post('/analytics/events', data)
},
// Funnel analytics
getFunnelMetrics(params) {
return request.get('/analytics/funnel', { params })
},
// Cohort analytics
getCohortAnalysis(params) {
return request.get('/analytics/cohorts', { params })
}
}

View File

@@ -0,0 +1,40 @@
import { request } from '../index'
export default {
login(data) {
return request.post('/auth/login', data)
},
register(data) {
return request.post('/auth/register', data)
},
logout() {
return request.post('/auth/logout')
},
getProfile() {
return request.get('/auth/me')
},
updateProfile(data) {
return request.put('/auth/profile', data)
},
changePassword(data) {
return request.post('/auth/change-password', data)
},
// API Key management
getApiKeys() {
return request.get('/auth/api-keys')
},
createApiKey(data) {
return request.post('/auth/api-keys', data)
},
deleteApiKey(id) {
return request.delete(`/auth/api-keys/${id}`)
}
}

View File

@@ -0,0 +1,85 @@
import { request } from '../index'
export default {
// Campaign CRUD
getList(params) {
return request.get('/orchestrator/campaigns', { params })
},
getDetail(id) {
return request.get(`/orchestrator/campaigns/${id}`)
},
create(data) {
return request.post('/orchestrator/campaigns', data)
},
update(id, data) {
return request.put(`/orchestrator/campaigns/${id}`, data)
},
delete(id) {
return request.delete(`/orchestrator/campaigns/${id}`)
},
// Campaign actions
execute(id) {
return request.post(`/orchestrator/campaigns/${id}/execute`)
},
pause(id) {
return request.post(`/orchestrator/campaigns/${id}/pause`)
},
resume(id) {
return request.post(`/orchestrator/campaigns/${id}/resume`)
},
cancel(id) {
return request.post(`/orchestrator/campaigns/${id}/cancel`)
},
clone(id) {
return request.post(`/orchestrator/campaigns/${id}/clone`)
},
// Campaign progress
getProgress(id) {
return request.get(`/orchestrator/campaigns/${id}/progress`)
},
// Campaign statistics
getStatistics(id) {
return request.get(`/orchestrator/campaigns/${id}/statistics`)
},
// Campaign messages
getMessages(id, params) {
return request.get(`/orchestrator/campaigns/${id}/messages`, { params })
},
// Message templates
getTemplates() {
return request.get('/orchestrator/messages/templates')
},
getTemplate(id) {
return request.get(`/orchestrator/messages/templates/${id}`)
},
createTemplate(data) {
return request.post('/orchestrator/messages/templates', data)
},
updateTemplate(id, data) {
return request.put(`/orchestrator/messages/templates/${id}`, data)
},
deleteTemplate(id) {
return request.delete(`/orchestrator/messages/templates/${id}`)
},
previewTemplate(id, variables) {
return request.post(`/orchestrator/messages/templates/${id}/preview`, { variables })
}
}

View File

@@ -0,0 +1,71 @@
import { request } from '../index'
export default {
// Consent management
getConsent(userId) {
return request.get(`/compliance/consent/${userId}`)
},
updateConsent(userId, data) {
return request.put(`/compliance/consent/${userId}`, data)
},
recordConsent(data) {
return request.post('/compliance/consent/record', data)
},
// Privacy rights
requestDataExport(userId) {
return request.post('/compliance/privacy/export', { userId })
},
requestDataDeletion(userId, data) {
return request.post('/compliance/privacy/delete', {
userId,
...data
})
},
getPrivacyRequests(params) {
return request.get('/compliance/privacy/requests', { params })
},
// Audit logs
getAuditLogs(params) {
return request.get('/compliance/audit/logs', { params })
},
generateComplianceReport(data) {
return request.post('/compliance/audit/report', data)
},
// Regulatory compliance
getGDPRStatus() {
return request.get('/compliance/regulatory/gdpr/status')
},
getCCPAStatus() {
return request.get('/compliance/regulatory/ccpa/status')
},
// Data retention
getRetentionPolicies() {
return request.get('/compliance/retention/policies')
},
updateRetentionPolicy(type, data) {
return request.put(`/compliance/retention/policies/${type}`, data)
},
// Do Not Sell
getDoNotSellStatus(userId) {
return request.get(`/compliance/privacy/donotsell/${userId}`)
},
updateDoNotSellStatus(userId, optOut) {
return request.post('/compliance/privacy/donotsell', {
userId,
optOut
})
}
}

View File

@@ -0,0 +1,55 @@
import { request } from '../index'
export default {
// Get all scheduled campaigns
getAll(params) {
return request.get('/scheduled-campaigns', { params })
},
// Get scheduled campaign by ID
get(id) {
return request.get(`/scheduled-campaigns/${id}`)
},
// Create scheduled campaign
create(data) {
return request.post('/scheduled-campaigns', data)
},
// Update scheduled campaign
update(id, data) {
return request.put(`/scheduled-campaigns/${id}`, data)
},
// Delete scheduled campaign
delete(id) {
return request.delete(`/scheduled-campaigns/${id}`)
},
// Get campaign history
getHistory(id, limit = 50) {
return request.get(`/scheduled-campaigns/${id}/history`, {
params: { limit }
})
},
// Pause campaign
pause(id) {
return request.post(`/scheduled-campaigns/${id}/pause`)
},
// Resume campaign
resume(id) {
return request.post(`/scheduled-campaigns/${id}/resume`)
},
// Test campaign
test(id, options) {
return request.post(`/scheduled-campaigns/${id}/test`, options)
},
// Get statistics
getStatistics(period = '7d') {
return request.get(`/scheduled-campaigns/statistics/${period}`)
}
}

View File

@@ -0,0 +1,55 @@
import { request } from '../index'
export default {
// Get all segments
getAll(params) {
return request.get('/segments', { params })
},
// Get segment by ID
get(id) {
return request.get(`/segments/${id}`)
},
// Create segment
create(data) {
return request.post('/segments', data)
},
// Update segment
update(id, data) {
return request.put(`/segments/${id}`, data)
},
// Delete segment
delete(id) {
return request.delete(`/segments/${id}`)
},
// Test segment
test(id) {
return request.post(`/segments/${id}/test`)
},
// Get segment users
getUsers(id, params) {
return request.get(`/segments/${id}/users`, { params })
},
// Export segment users
export(id) {
return request.get(`/segments/${id}/export`, {
responseType: 'blob'
})
},
// Clone segment
clone(id, data) {
return request.post(`/segments/${id}/clone`, data)
},
// Get segment statistics
getStats() {
return request.get('/segments-stats')
}
}

View File

@@ -0,0 +1,45 @@
import request from '../index'
export default {
// Get user settings
get() {
return request({
url: '/settings',
method: 'get'
})
},
// Update user settings
update(data) {
return request({
url: '/settings',
method: 'put',
data
})
},
// Get API keys
getApiKeys() {
return request({
url: '/settings/api-keys',
method: 'get'
})
},
// Generate new API key
generateApiKey(data) {
return request({
url: '/settings/api-keys',
method: 'post',
data
})
},
// Delete API key
deleteApiKey(id) {
return request({
url: `/settings/api-keys/${id}`,
method: 'delete'
})
}
}

View File

@@ -0,0 +1,53 @@
import { request } from '../index'
export default {
// Get all templates
getAll(params) {
return request.get('/templates', { params })
},
// Get template by ID
get(id) {
return request.get(`/templates/${id}`)
},
// Create template
create(data) {
return request.post('/templates', data)
},
// Update template
update(id, data) {
return request.put(`/templates/${id}`, data)
},
// Delete template
delete(id) {
return request.delete(`/templates/${id}`)
},
// Preview template
preview(id, data) {
return request.post(`/templates/${id}/preview`, data)
},
// Test template
test(id, data) {
return request.post(`/templates/${id}/test`, data)
},
// Clone template
clone(id, data) {
return request.post(`/templates/${id}/clone`, data)
},
// Get template categories
getCategories() {
return request.get('/template-categories')
},
// Get template variables
getVariables() {
return request.get('/template-variables')
}
}

View File

@@ -0,0 +1,166 @@
import request from '@/utils/request'
export const tenantApi = {
// Get current tenant information
getCurrent() {
return request({
url: '/api/v1/tenants/current',
method: 'get'
})
},
// Update tenant basic information
update(data) {
return request({
url: '/api/v1/tenants/current',
method: 'patch',
data
})
},
// Update tenant settings
updateSettings(settings) {
return request({
url: '/api/v1/tenants/current/settings',
method: 'patch',
data: { settings }
})
},
// Update tenant branding
updateBranding(branding) {
return request({
url: '/api/v1/tenants/current/branding',
method: 'patch',
data: { branding }
})
},
// Update tenant compliance settings
updateCompliance(compliance) {
return request({
url: '/api/v1/tenants/current/compliance',
method: 'patch',
data: { compliance }
})
},
// Get tenant usage statistics
getUsage() {
return request({
url: '/api/v1/tenants/current/usage',
method: 'get'
})
},
// Get tenant billing information
getBilling() {
return request({
url: '/api/v1/tenants/current/billing',
method: 'get'
})
},
// List all tenants (superadmin only)
list(params) {
return request({
url: '/api/v1/tenants',
method: 'get',
params
})
},
// Get tenant by ID (superadmin only)
getById(id) {
return request({
url: `/api/v1/tenants/${id}`,
method: 'get'
})
},
// Update tenant by ID (superadmin only)
updateById(id, data) {
return request({
url: `/api/v1/tenants/${id}`,
method: 'patch',
data
})
},
// Delete tenant (superadmin only)
delete(id) {
return request({
url: `/api/v1/tenants/${id}`,
method: 'delete'
})
},
// Create new tenant (public)
signup(data) {
return request({
url: '/api/v1/tenants/signup',
method: 'post',
data
})
},
// Check if slug is available
checkSlug(slug) {
return request({
url: '/api/v1/tenants/check-slug',
method: 'get',
params: { slug }
})
},
// Upload tenant logo
uploadLogo(file) {
const formData = new FormData()
formData.append('logo', file)
return request({
url: '/api/v1/tenants/current/branding/logo',
method: 'post',
data: formData,
headers: {
'Content-Type': 'multipart/form-data'
}
})
},
// Get tenant features
getFeatures() {
return request({
url: '/api/v1/tenants/current/features',
method: 'get'
})
},
// Upgrade tenant plan
upgradePlan(plan, paymentMethod) {
return request({
url: '/api/v1/tenants/current/upgrade',
method: 'post',
data: { plan, paymentMethod }
})
},
// Get tenant audit logs
getAuditLogs(params) {
return request({
url: '/api/v1/tenants/current/audit-logs',
method: 'get',
params
})
},
// Export tenant data
exportData(format = 'json') {
return request({
url: '/api/v1/tenants/current/export',
method: 'get',
params: { format },
responseType: 'blob'
})
}
}