新增 [Eis.Tools (line 1)](C:/Users/BI/Documents/EIS-dotnet/src/Eis.Tools/Program.cs:1),支持 database init/reset/seed。
数据库维护、安全校验和事务逻辑位于 [DatabaseMaintenanceService.cs (line 1)](C:/Users/BI/Documents/EIS-dotnet/src/Eis.Infrastructure/Data/DatabaseMaintenanceService.cs:1)。 内置完整演示数据:1200 名考生、10800 条成绩、2404 条招生记录。 删除旧 import-test-data.mjs 和 reset-dev-database.mjs 运行入口。 Docker 镜像同时包含 Web 和 /app/tools/Eis.Tools.dll。 [package.json (line 11)](C:/Users/BI/Documents/EIS-dotnet/package.json:11) 原数据库命令已改为调用 .NET。 新增统一发布脚本:[publish.ps1 (line 1)](C:/Users/BI/Documents/EIS-dotnet/scripts/publish.ps1:1)。
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
import { pbkdf2Sync } from 'node:crypto';
|
||||
import { writeFile } from 'node:fs/promises';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { dirname, join, resolve } from 'node:path';
|
||||
import { gzipSync } from 'node:zlib';
|
||||
import { buildSeedOperations } from '../database.mjs';
|
||||
import { createSeedDatabase } from '../src/data/seed.mjs';
|
||||
|
||||
const root = resolve(dirname(fileURLToPath(import.meta.url)), '..');
|
||||
const outputPath = join(root, 'src', 'Eis.Infrastructure', 'Data', 'demo-seed-operations.json.gz');
|
||||
const generatedAt = '2026-07-23T00:00:00.000Z';
|
||||
const deterministicSalt = 'eis-dotnet-demo-seed';
|
||||
const hashPassword = password => {
|
||||
const hash = pbkdf2Sync(password, deterministicSalt, 120000, 32, 'sha256').toString('hex');
|
||||
return `${deterministicSalt}:${hash}`;
|
||||
};
|
||||
|
||||
const database = createSeedDatabase({
|
||||
nowIso: () => generatedAt,
|
||||
hashPassword
|
||||
});
|
||||
database.meta.version = 20;
|
||||
const operations = buildSeedOperations(database);
|
||||
const payload = {
|
||||
version: 1,
|
||||
schemaVersion: 20,
|
||||
generatedAt,
|
||||
summary: {
|
||||
schools: database.schools.length,
|
||||
users: database.users.length,
|
||||
candidates: database.candidateProfiles.length,
|
||||
registrations: database.registrations.length,
|
||||
results: database.results.length,
|
||||
admissionRecords: database.admissionRecords.length,
|
||||
firstRoundPreferences: database.admissionRecords.filter(
|
||||
item => item.kind === 'preference' && Number(item.payload?.round || 1) === 1
|
||||
).length,
|
||||
operations: operations.length
|
||||
},
|
||||
operations
|
||||
};
|
||||
const compressed = gzipSync(Buffer.from(JSON.stringify(payload)), { level: 9 });
|
||||
await writeFile(outputPath, compressed);
|
||||
console.log(JSON.stringify({ outputPath, compressedBytes: compressed.length, ...payload.summary }));
|
||||
Reference in New Issue
Block a user