16 | Successfully imported {subscriptionCount} subscriptions 17 |
18 |{error}
22 | )} 23 |{error.message}
10 | 16 |{file?.name}
16 |17 | {(file?.size && (file.size / 1024).toFixed(1) + " KB") || "Unknown size"} 18 |
19 |Validating file...
25 |{progress}%
26 |Click to upload or drag and drop
18 |19 | CSV or JSON files up to 2MB 20 |
21 |{error}
35 | 38 |47 | {searchTerm ? t('common:noPaymentsFoundSearch') : t('common:noPaymentRecordsFound')} 48 |
49 |{description}
33 | )} 34 | {trend && ( 35 |{t('noSubscriptionsPaidInLast7Days')}
37 |这是一封来自订阅管理系统的测试邮件。如果您收到此邮件,说明邮件通知渠道配置正确。
77 |Send time: ${now}
79 |感谢您的使用!
80 | `; 81 | const text = `订阅管理系统测试邮件\n\n这是一封来自订阅管理系统的测试邮件。如果您收到此邮件,说明邮件通知渠道配置正确。\n\nSend time: ${now}`; 82 | 83 | return this.sendMail({ to, subject, html, text }); 84 | } 85 | } 86 | 87 | module.exports = EmailService; 88 | -------------------------------------------------------------------------------- /src/types/index.ts: -------------------------------------------------------------------------------- 1 | // Subscription related types 2 | export interface Subscription { 3 | id: number; 4 | name: string; 5 | description?: string; 6 | category: string; 7 | price: number; 8 | currency: string; 9 | billingCycle: 'monthly' | 'quarterly' | 'yearly' | 'semiannual'; 10 | status: 'active' | 'trial' | 'cancelled'; 11 | nextBillingDate?: string; 12 | lastBillingDate?: string; 13 | createdAt: string; 14 | updatedAt: string; 15 | autoRenew: boolean; 16 | paymentMethod?: string; 17 | subscriptionPlan?: string; 18 | website?: string; 19 | notes?: string; 20 | } 21 | 22 | // Payment history types 23 | export interface PaymentHistory { 24 | id: number; 25 | subscriptionId: number; 26 | amount: number; 27 | currency: string; 28 | paymentDate: string; 29 | paymentMethod?: string; 30 | status: 'success' | 'failed' | 'pending'; 31 | createdAt: string; 32 | } 33 | 34 | // Category and payment method types 35 | export interface Category { 36 | id: number; 37 | name: string; 38 | description?: string; 39 | } 40 | 41 | export interface PaymentMethod { 42 | id: number; 43 | name: string; 44 | type: string; 45 | } 46 | 47 | export interface SubscriptionPlan { 48 | id: number; 49 | name: string; 50 | description?: string; 51 | } 52 | 53 | // Analytics types 54 | export interface CategoryExpense { 55 | category: string; 56 | amount: number; 57 | count: number; 58 | } 59 | 60 | export interface MonthlyExpense { 61 | month: string; 62 | amount: number; 63 | categories: CategoryExpense[]; 64 | } 65 | 66 | export interface YearlyExpense { 67 | year: number; 68 | amount: number; 69 | months: MonthlyExpense[]; 70 | } 71 | 72 | // Settings types 73 | export interface Settings { 74 | currency: string; 75 | theme: 'light' | 'dark' | 'system'; 76 | exchangeRates?: Record49 | {t('noSpendingDataAvailable')} 50 |
51 |{t('noUpcomingRenewalsNext7Days')}
50 |