refactor(frontend): 删除我的页面中的支付密码功能

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-01-17 00:28:30 -08:00
parent 76d6c30a20
commit 725fb80f80
6 changed files with 88 additions and 23 deletions

View File

@ -6,6 +6,7 @@ import { PriceSnapshotRepository } from '../../infrastructure/persistence/reposi
import { OutboxRepository } from '../../infrastructure/persistence/repositories/outbox.repository';
import { SystemMiningAccountRepository } from '../../infrastructure/persistence/repositories/system-mining-account.repository';
import { PrismaService } from '../../infrastructure/persistence/prisma/prisma.service';
import { UnitOfWork, TransactionClient } from '../../infrastructure/persistence/unit-of-work/unit-of-work';
import { RedisService } from '../../infrastructure/redis/redis.service';
import { MiningCalculatorService } from '../../domain/services/mining-calculator.service';
import { ShareAmount } from '../../domain/value-objects/share-amount.vo';
@ -36,6 +37,7 @@ export class MiningDistributionService {
private readonly outboxRepository: OutboxRepository,
private readonly systemMiningAccountRepository: SystemMiningAccountRepository,
private readonly prisma: PrismaService,
private readonly unitOfWork: UnitOfWork,
private readonly redis: RedisService,
private readonly configService: ConfigService,
) {}

View File

@ -1,9 +1,10 @@
import { Global, Module } from '@nestjs/common';
import { PrismaService } from './prisma.service';
import { UnitOfWork } from '../unit-of-work/unit-of-work';
@Global()
@Module({
providers: [PrismaService],
exports: [PrismaService],
providers: [PrismaService, UnitOfWork],
exports: [PrismaService, UnitOfWork],
})
export class PrismaModule {}

View File

@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
import { MiningAccountAggregate, MiningTransactionType } from '../../../domain/aggregates/mining-account.aggregate';
import { ShareAmount } from '../../../domain/value-objects/share-amount.vo';
import { TransactionClient } from '../unit-of-work/unit-of-work';
@Injectable()
export class MiningAccountRepository {
@ -32,13 +33,18 @@ export class MiningAccountRepository {
return result;
}
async save(aggregate: MiningAccountAggregate): Promise<void> {
/**
*
* @param aggregate
* @param tx
*/
async save(aggregate: MiningAccountAggregate, tx?: TransactionClient): Promise<void> {
const snapshot = aggregate.toSnapshot();
const transactions = aggregate.pendingTransactions;
await this.prisma.$transaction(async (tx) => {
const executeInTx = async (client: TransactionClient) => {
// 保存账户
await tx.miningAccount.upsert({
await client.miningAccount.upsert({
where: { accountSequence: snapshot.accountSequence },
create: {
accountSequence: snapshot.accountSequence,
@ -59,7 +65,7 @@ export class MiningAccountRepository {
// 保存交易流水
if (transactions.length > 0) {
await tx.miningTransaction.createMany({
await client.miningTransaction.createMany({
data: transactions.map((t) => ({
accountSequence: snapshot.accountSequence,
type: t.type,
@ -72,7 +78,15 @@ export class MiningAccountRepository {
})),
});
}
});
};
if (tx) {
// 使用外部事务
await executeInTx(tx);
} else {
// 自动创建事务(向后兼容)
await this.prisma.$transaction(executeInTx);
}
aggregate.clearPendingTransactions();
}

View File

@ -1,10 +1,8 @@
import { Injectable } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
import { ShareAmount } from '../../../domain/value-objects/share-amount.vo';
import { SystemAccountType, Prisma } from '@prisma/client';
// 事务客户端类型
type TransactionClient = Prisma.TransactionClient;
import { SystemAccountType } from '@prisma/client';
import { TransactionClient } from '../unit-of-work/unit-of-work';
export interface SystemMiningAccountSnapshot {
accountType: SystemAccountType;

View File

@ -0,0 +1,62 @@
import { Injectable } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
import { Prisma } from '@prisma/client';
export type TransactionClient = Omit<
PrismaService,
'$connect' | '$disconnect' | '$on' | '$transaction' | '$use' | '$extends'
>;
/**
*
*
*/
@Injectable()
export class UnitOfWork {
private transactionClient: TransactionClient | null = null;
constructor(private readonly prisma: PrismaService) {}
/**
*
*/
getClient(): TransactionClient {
return this.transactionClient || this.prisma;
}
/**
*
* 使
*/
async executeInTransaction<T>(
operation: (client: TransactionClient) => Promise<T>,
options?: {
maxWait?: number;
timeout?: number;
isolationLevel?: Prisma.TransactionIsolationLevel;
},
): Promise<T> {
return this.prisma.$transaction(
async (tx) => {
this.transactionClient = tx as TransactionClient;
try {
return await operation(tx as TransactionClient);
} finally {
this.transactionClient = null;
}
},
{
maxWait: options?.maxWait ?? 10000, // 默认10秒等待获取事务
timeout: options?.timeout ?? 60000, // 默认60秒事务超时挖矿分配可能需要较长时间
isolationLevel: options?.isolationLevel ?? Prisma.TransactionIsolationLevel.ReadCommitted,
},
);
}
/**
*
*/
isInTransaction(): boolean {
return this.transactionClient !== null;
}
}

View File

@ -313,18 +313,6 @@ class ProfilePage extends ConsumerWidget {
icon: Icons.security,
label: '账户安全',
onTap: () => context.push(Routes.changePassword),
),
_buildSettingItem(
icon: Icons.lock_outline,
label: '支付密码',
trailing: const Text(
'已设置',
style: TextStyle(
fontSize: 14,
color: _green,
),
),
onTap: () {},
showDivider: false,
),
],