feat(asl): Week 2 Day 2 - Excel import with template download and intelligent dedup
Features: - feat: Excel template generation and download (with examples) - feat: Excel file parsing in memory (cloud-native, no disk write) - feat: Field validation (title + abstract required) - feat: Smart deduplication (DOI priority + Title fallback) - feat: Literature preview table with statistics - feat: Complete submission flow (create project + import literatures) Components: - feat: Create excelUtils.ts with full Excel processing toolkit - feat: Enhance TitleScreeningSettings page with upload/preview/submit - feat: Update API interface signatures and export unified aslApi object Dependencies: - chore: Add xlsx library for Excel file processing Ref: Week 2 Frontend Development - Day 2 Scope: ASL Module MVP - Title Abstract Screening Cloud-Native: Memory parsing, no file persistence
This commit is contained in:
@@ -178,3 +178,4 @@ ASL模块基础API开发完成,所有核心功能测试通过。数据库表
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -185,3 +185,4 @@ console.log('Claude-4.5:', claudeResponse.choices[0].message.content);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -188,5 +188,6 @@ main().catch(error => {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -328,3 +328,4 @@ WHERE c.project_id IS NOT NULL;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -302,3 +302,4 @@
|
||||
**下次评估计划**: v1.0.1 Prompt优化后重新测试
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -109,5 +109,6 @@ main()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -117,3 +117,4 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -188,3 +188,4 @@ ${publicationYear ? `**年份:** ${publicationYear}` : ''}
|
||||
现在开始筛选,请严格按照JSON格式输出结果。
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -109,3 +109,4 @@ ${publicationYear ? `**年份:** ${publicationYear}` : ''}
|
||||
现在开始筛选,请严格按照JSON格式输出结果。
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -202,3 +202,4 @@ PICO评估: 全部match
|
||||
现在开始筛选,请严格按照JSON格式输出结果。
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -253,5 +253,6 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -244,5 +244,6 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -20,3 +20,4 @@ if (data.length > 0) {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -57,3 +57,4 @@ createTestUser();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -191,3 +191,4 @@ testAPI();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -131,3 +131,4 @@ if (passed === testCases.length) {
|
||||
console.log('='.repeat(60) + '\n');
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -375,3 +375,4 @@ main().catch(console.error);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -113,3 +113,4 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -203,3 +203,4 @@ async function runTest() {
|
||||
runTest().catch(console.error);
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -97,3 +97,4 @@ async function main() {
|
||||
main().catch(console.error);
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -408,3 +408,4 @@ npm run dev
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
1
backend/src/common/cache/CacheAdapter.ts
vendored
1
backend/src/common/cache/CacheAdapter.ts
vendored
@@ -77,3 +77,4 @@ export interface CacheAdapter {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
1
backend/src/common/cache/CacheFactory.ts
vendored
1
backend/src/common/cache/CacheFactory.ts
vendored
@@ -100,3 +100,4 @@ export class CacheFactory {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
1
backend/src/common/cache/index.ts
vendored
1
backend/src/common/cache/index.ts
vendored
@@ -52,3 +52,4 @@ export const cache = CacheFactory.getInstance()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -27,3 +27,4 @@ export type { HealthCheckResponse } from './healthCheck.js'
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -83,3 +83,4 @@ export class JobFactory {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -90,3 +90,4 @@ export interface JobQueue {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -41,3 +41,4 @@ export class ClaudeAdapter extends CloseAIAdapter {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -38,3 +38,4 @@ export { default } from './logger.js'
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -41,3 +41,4 @@ export { Metrics, requestTimingHook, responseTimingHook } from './metrics.js'
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -67,3 +67,4 @@ export interface StorageAdapter {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -55,3 +55,4 @@ export async function aslRoutes(fastify: FastifyInstance) {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -120,3 +120,4 @@ export interface BatchReviewDto {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -357,3 +357,4 @@ main();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -203,3 +203,4 @@ testPlatformInfrastructure().catch(error => {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -157,3 +157,4 @@ END $$;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -19,3 +19,4 @@ ORDER BY schema_name;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -409,5 +409,6 @@ main().catch(error => {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -81,3 +81,4 @@ Write-Host "下一步:重启后端服务以应用新配置" -ForegroundColor Y
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -63,5 +63,6 @@ pause
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -96,5 +96,6 @@ npm run prisma:studio
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user