新增订单推荐人和邀请码功能,优化支付流程中的订单插入逻辑,确保订单记录准确。更新小程序支付请求,支持传递邀请码以便于分销归属和对账。同时,调整数据库结构以支持新字段,提升系统的稳定性和用户体验。
This commit is contained in:
137
scripts/migrate-to-prisma.js
Normal file
137
scripts/migrate-to-prisma.js
Normal file
@@ -0,0 +1,137 @@
|
||||
/**
|
||||
* 批量迁移脚本:将旧的 query() 调用替换为 Prisma
|
||||
*
|
||||
* 使用方法:
|
||||
* node scripts/migrate-to-prisma.js
|
||||
*/
|
||||
|
||||
const fs = require('fs')
|
||||
const path = require('path')
|
||||
|
||||
// 需要迁移的API文件路径列表
|
||||
const API_FILES = [
|
||||
'app/api/referral/bind/route.ts',
|
||||
'app/api/referral/visit/route.ts',
|
||||
'app/api/miniprogram/pay/route.ts',
|
||||
'app/api/miniprogram/pay/notify/route.ts',
|
||||
'app/api/user/check-purchased/route.ts',
|
||||
'app/api/user/purchase-status/route.ts',
|
||||
'app/api/user/reading-progress/route.ts',
|
||||
'app/api/user/track/route.ts',
|
||||
'app/api/db/config/route.ts',
|
||||
'app/api/book/all-chapters/route.ts',
|
||||
'app/api/book/hot/route.ts',
|
||||
'app/api/book/chapter/[id]/route.ts',
|
||||
'app/api/match/users/route.ts',
|
||||
'app/api/match/config/route.ts',
|
||||
'app/api/search/route.ts'
|
||||
]
|
||||
|
||||
/**
|
||||
* 自动替换规则
|
||||
*/
|
||||
const REPLACE_RULES = [
|
||||
{
|
||||
// 替换 import
|
||||
from: /from '@\/lib\/db'/g,
|
||||
to: "from '@/lib/prisma'"
|
||||
},
|
||||
{
|
||||
// 替换 query 导入为 prisma
|
||||
from: /import \{ query(.*?) \} from '@\/lib\/prisma'/g,
|
||||
to: "import { prisma } from '@/lib/prisma'"
|
||||
},
|
||||
{
|
||||
// 替换 getConfig 导入
|
||||
from: /import \{ getConfig \} from '@\/lib\/db'/g,
|
||||
to: "import { getPrismaConfig } from '@/lib/prisma-helpers'"
|
||||
},
|
||||
{
|
||||
// 替换 getConfig 调用
|
||||
from: /getConfig\(/g,
|
||||
to: "getPrismaConfig("
|
||||
}
|
||||
]
|
||||
|
||||
/**
|
||||
* 添加 Prisma 注释
|
||||
*/
|
||||
function addPrismaComment(content) {
|
||||
if (content.includes('使用 Prisma ORM')) return content
|
||||
|
||||
const lines = content.split('\n')
|
||||
let commentIndex = -1
|
||||
|
||||
// 找到文件头注释
|
||||
for (let i = 0; i < lines.length; i++) {
|
||||
if (lines[i].includes('*/')) {
|
||||
commentIndex = i
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if (commentIndex > 0) {
|
||||
lines.splice(commentIndex, 0, ' * 使用 Prisma ORM(安全,防SQL注入)')
|
||||
}
|
||||
|
||||
return lines.join('\n')
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理单个文件
|
||||
*/
|
||||
function migrateFile(filePath) {
|
||||
const fullPath = path.join(__dirname, '..', filePath)
|
||||
|
||||
if (!fs.existsSync(fullPath)) {
|
||||
console.log(`❌ 文件不存在: ${filePath}`)
|
||||
return false
|
||||
}
|
||||
|
||||
let content = fs.readFileSync(fullPath, 'utf-8')
|
||||
|
||||
// 如果已经迁移过,跳过
|
||||
if (content.includes('from \'@/lib/prisma\'')) {
|
||||
console.log(`⏭️ 已迁移,跳过: ${filePath}`)
|
||||
return false
|
||||
}
|
||||
|
||||
// 应用替换规则
|
||||
REPLACE_RULES.forEach(rule => {
|
||||
content = content.replace(rule.from, rule.to)
|
||||
})
|
||||
|
||||
// 添加注释
|
||||
content = addPrismaComment(content)
|
||||
|
||||
// 写回文件
|
||||
fs.writeFileSync(fullPath, content, 'utf-8')
|
||||
console.log(`✅ 已迁移: ${filePath}`)
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
* 主函数
|
||||
*/
|
||||
function main() {
|
||||
console.log('🚀 开始批量迁移到 Prisma ORM...\n')
|
||||
|
||||
let successCount = 0
|
||||
let skipCount = 0
|
||||
|
||||
API_FILES.forEach(filePath => {
|
||||
const result = migrateFile(filePath)
|
||||
if (result) {
|
||||
successCount++
|
||||
} else {
|
||||
skipCount++
|
||||
}
|
||||
})
|
||||
|
||||
console.log(`\n✨ 迁移完成!`)
|
||||
console.log(` - 成功迁移: ${successCount} 个文件`)
|
||||
console.log(` - 跳过: ${skipCount} 个文件`)
|
||||
console.log(`\n⚠️ 注意:批量迁移只处理简单替换,复杂的SQL查询需要手动迁移!`)
|
||||
}
|
||||
|
||||
main()
|
||||
Reference in New Issue
Block a user