markpdfdown 0.1.8-beta.6 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/main/index.js +398 -14
  2. package/dist/preload/index.js +20 -1
  3. package/dist/renderer/assets/{index-yTU2skrN.css → index-B_JfRqwM.css} +54 -0
  4. package/dist/renderer/assets/{index-iEK8qT5k.js → index-wHB9i2kW.js} +623 -320
  5. package/dist/renderer/index.html +2 -2
  6. package/package.json +10 -3
  7. package/dist/app/app.js +0 -49
  8. package/dist/app/controllers/completionController.js +0 -19
  9. package/dist/app/controllers/modelController.js +0 -53
  10. package/dist/app/controllers/providerController.js +0 -120
  11. package/dist/app/dal/modelDal.js +0 -44
  12. package/dist/app/dal/providerDal.js +0 -78
  13. package/dist/app/db/index.js +0 -56
  14. package/dist/app/db/migration.js +0 -157
  15. package/dist/app/logic/llm/AnthropicClient.js +0 -219
  16. package/dist/app/logic/llm/AzureOpenAIClient.js +0 -239
  17. package/dist/app/logic/llm/GeminiClient.js +0 -212
  18. package/dist/app/logic/llm/LLMClient.js +0 -80
  19. package/dist/app/logic/llm/OpenAIClient.js +0 -235
  20. package/dist/app/logic/llm/example-advanced.js +0 -232
  21. package/dist/app/logic/llm/index.js +0 -14
  22. package/dist/app/logic/model.js +0 -27
  23. package/dist/app/middleware/logger.js +0 -23
  24. package/dist/app/routes/routes.js +0 -16
  25. package/dist/app/types/Provider.js +0 -1
  26. package/dist/server/controllers/FileController.js +0 -64
  27. package/dist/server/controllers/TaskController.js +0 -57
  28. package/dist/server/controllers/completionController.js +0 -64
  29. package/dist/server/controllers/modelController.js +0 -74
  30. package/dist/server/controllers/providerController.js +0 -120
  31. package/dist/server/dal/TaskDal.js +0 -67
  32. package/dist/server/dal/modelDal.js +0 -44
  33. package/dist/server/dal/providerDal.js +0 -83
  34. package/dist/server/db/index.js +0 -57
  35. package/dist/server/db/migration.js +0 -157
  36. package/dist/server/index.js +0 -49
  37. package/dist/server/logic/File.js +0 -34
  38. package/dist/server/logic/Task.js +0 -21
  39. package/dist/server/logic/llm/AnthropicClient.js +0 -220
  40. package/dist/server/logic/llm/AzureOpenAIClient.js +0 -239
  41. package/dist/server/logic/llm/GeminiClient.js +0 -213
  42. package/dist/server/logic/llm/LLMClient.js +0 -83
  43. package/dist/server/logic/llm/OllamaClient.js +0 -220
  44. package/dist/server/logic/llm/OpenAIClient.js +0 -235
  45. package/dist/server/logic/llm/example-advanced.js +0 -231
  46. package/dist/server/logic/llm/index.js +0 -15
  47. package/dist/server/logic/model.js +0 -59
  48. package/dist/server/middleware/logger.js +0 -23
  49. package/dist/server/routes/routes.js +0 -30
  50. package/dist/server/types/Provider.js +0 -1
  51. package/dist/server/types/Task.js +0 -1
@@ -1,64 +0,0 @@
1
- import path from 'path';
2
- import fs from 'fs';
3
- import multer from 'multer';
4
- import fileLogic from '../logic/File.js';
5
- // 文件上传处理
6
- const uploadFiles = (req, res, next) => {
7
- // 获取taskId参数
8
- const taskId = req.query.taskId;
9
- if (!taskId) {
10
- return res.status(400).json({ message: '缺少任务ID参数' });
11
- }
12
- // 动态配置存储位置
13
- const storage = multer.diskStorage({
14
- destination: (_req, _file, cb) => {
15
- // 获取基础上传目录
16
- const baseUploadDir = fileLogic.getUploadDir();
17
- // 创建任务ID对应的目录
18
- const uploadDir = path.join(baseUploadDir, taskId);
19
- // 确保目录存在
20
- if (!fs.existsSync(uploadDir)) {
21
- fs.mkdirSync(uploadDir, { recursive: true });
22
- }
23
- cb(null, uploadDir);
24
- },
25
- filename: (_req, file, cb) => {
26
- // 使用taskId作为文件名,保留原始扩展名
27
- const extname = path.extname(file.originalname);
28
- cb(null, taskId + extname);
29
- }
30
- });
31
- // 创建multer实例
32
- const upload = multer({ storage }).array('files');
33
- // 使用multer中间件处理上传
34
- upload(req, res, (err) => {
35
- if (err) {
36
- return next(err);
37
- }
38
- try {
39
- const multerReq = req;
40
- // 检查是否上传了文件
41
- if (!multerReq.files || multerReq.files.length === 0) {
42
- return res.status(400).json({ message: '没有上传文件' });
43
- }
44
- const uploadedFiles = multerReq.files.map(file => ({
45
- originalName: file.originalname, // 原始文件名(包含中文)
46
- savedName: path.basename(file.path), // 保存的文件名(taskId + 扩展名)
47
- path: file.path,
48
- size: file.size,
49
- mimetype: file.mimetype,
50
- taskId: taskId
51
- }));
52
- res.status(200).json({
53
- message: '文件上传成功',
54
- files: uploadedFiles
55
- });
56
- }
57
- catch (error) {
58
- next(error);
59
- }
60
- });
61
- };
62
- export default {
63
- uploadFiles,
64
- };
@@ -1,57 +0,0 @@
1
- import taskDal from '../dal/TaskDal.js';
2
- import fileLogic from '../logic/File.js';
3
- // 批量创建任务
4
- const createTasks = async (req, res, next) => {
5
- try {
6
- const tasks = req.body;
7
- // 批量创建任务
8
- const createdTasks = await taskDal.createTasks(tasks);
9
- res.status(201).json(createdTasks);
10
- }
11
- catch (error) {
12
- next(error);
13
- }
14
- };
15
- // 获取所有任务,支持分页
16
- const getAllTasks = async (req, res, next) => {
17
- try {
18
- const { page = 1, pageSize = 10 } = req.query;
19
- const tasks = await taskDal.findAll(Number(page), Number(pageSize));
20
- const total = await taskDal.getTotal();
21
- res.status(200).json({ list: tasks, total });
22
- }
23
- catch (error) {
24
- next(error);
25
- }
26
- };
27
- // 更新任务
28
- const updateTask = async (req, res, next) => {
29
- try {
30
- const { id } = req.params;
31
- const task = req.body;
32
- const updatedTask = await taskDal.update(id, task);
33
- res.status(200).json(updatedTask);
34
- }
35
- catch (error) {
36
- next(error);
37
- }
38
- };
39
- // 删除任务
40
- const deleteTask = async (req, res, next) => {
41
- try {
42
- const { id } = req.params;
43
- const deletedTask = await taskDal.remove(id);
44
- // 删除任务后,删除任务对应的文件
45
- fileLogic.deleteTaskFiles(id);
46
- res.status(200).json(deletedTask);
47
- }
48
- catch (error) {
49
- next(error);
50
- }
51
- };
52
- export default {
53
- createTasks,
54
- getAllTasks,
55
- updateTask,
56
- deleteTask,
57
- };
@@ -1,64 +0,0 @@
1
- import modelLogic from '../logic/Model.js';
2
- // 转换图片为markdown
3
- const markImagedown = async (req, res, next) => {
4
- // 验证请求
5
- if (!req.body.providerId || !req.body.modelId || !req.body.url) {
6
- return res.status(400).json({ message: 'providerId, modelId, url 为必填项' });
7
- }
8
- try {
9
- const message = await modelLogic.transformImageMessage(req.body.url);
10
- const completionOptions = {
11
- messages: message,
12
- model: req.body.modelId,
13
- maxTokens: 204800,
14
- temperature: 0.3,
15
- stream: false
16
- };
17
- const completion = await modelLogic.completion(Number(req.body.providerId), completionOptions);
18
- res.json(completion);
19
- }
20
- catch (error) {
21
- next(error);
22
- }
23
- };
24
- // 测试模型连接
25
- const testConnection = async (req, res, next) => {
26
- // 验证请求
27
- if (!req.body.providerId || !req.body.modelId) {
28
- return res.status(400).json({ message: 'providerId, modelId 为必填项' });
29
- }
30
- try {
31
- const { providerId, modelId } = req.body;
32
- const imageBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAA9lBMVEUAAAD+/v79/f3////7+/v8/Pz29vbe3t7f399GRkb////+/v77+/tiYmL19fX////z8/Pv7+/y8vLl5eXj4+Pe3t7f39/j4+Pd3d3u7u65ubm9vb2wsLCJiYmBgYFcXFxAQED7+/vt7e3Dw8O2trb+/v78/Pz4+Pj29vbz8/Px8fHs7Ozj4+Pt7e3b29vm5ube3t7l5eXr6+vLy8vj4+Pv7+/09PTZ2dnS0tL////Pz8/09PTCwsLFxcW6urqKioqhoaHOzs7KysqQkJCQkJCpqamZmZmQkJC0tLRmZmaTk5N6enrt7e3v7+/s7OzT09PV1dX///8sTJOgAAAAUXRSTlMA/v3+/P3vpqUF+/V/Devy59XUzb27tqyihldMQzQsEgv6rDc0+vPl5OHLyMi5s7CpopuXlZCGgHhybmdlTURCQT4+OjUyMiwnIx0Xw8GwenjtgN1sAAABw0lEQVQ4y5WS13IbMQxFcUGukpVWvXfLknvvcXfiuKfh/38mC3I5I4/tB9+HvShnIFAkfUq9Vn27/3F7H0ZEwEn8fr/AaD+83DY5qj1fD9/2q2bJeRyLDjKF0ev+EOKDrQjYOGgKm6P5/t2yGaj/A3DmKpeR7VLQD0B0wEzAi6FYjLiYhUnENRiiLnhtIc3Hm/qlv1j3/QHbKQkTfeFHzX8z0NJApzrHFXkgl2YnjNk5jE2I8pLtv0oB0G32tNjJs9xkQEd6AaiU7M7upDx2/wvAHqjLUwBsJd07XrENrY8EBQc05D4AJXIqYXKsXsYftQvT9hvrDk65w1Mreqt69mB9saeHAfiaHbGNC80XTVnteILwEylgFLiXhr9oIyO3jV2JiYoVG4AnqTtAGKhqMC7b3R2bqwSgJx0P5G+E2cV7wHfKBWCVf2YAUWLB5zPwSZoH4ArhMpy3YKJfGjyyB6aWBx5Yxze1hc2xftcidFMANY6S8DTYPw13ZkCmbqpuE9S19tIFZ4CfNsDyHc3pCJE0DzaAaMsXoPvPa1SAvnWJY5fmUaU3Gl4/15a4efvy0GYu0PtK2A3CPn2o/na91aPP6D8AojIypyhEagAAAABJRU5ErkJggg==';
33
- const message = [{
34
- role: 'user',
35
- content: [{
36
- type: 'text',
37
- text: 'What is in the picture?'
38
- },
39
- {
40
- type: 'image_url',
41
- image_url: {
42
- url: imageBase64
43
- }
44
- }
45
- ]
46
- }];
47
- const completionOptions = {
48
- messages: message,
49
- model: modelId,
50
- maxTokens: 1024,
51
- temperature: 0.7,
52
- stream: false
53
- };
54
- const test = await modelLogic.completion(Number(providerId), completionOptions);
55
- res.json(test);
56
- }
57
- catch (error) {
58
- next(error);
59
- }
60
- };
61
- export default {
62
- markImagedown,
63
- testConnection
64
- };
@@ -1,74 +0,0 @@
1
- import modelDal from '../dal/ModelDal.js';
2
- import providerDal from '../dal/ProviderDal.js';
3
- // 获取所有启用的模型
4
- const getAllModels = async (_req, res, next) => {
5
- try {
6
- const providers = await providerDal.findAll();
7
- // 遍历providers,获取每个provider的模型
8
- const models = await Promise.all(providers.map(async (provider) => {
9
- const models = await modelDal.findByProviderId(provider.id);
10
- return {
11
- provider: provider.id,
12
- providerName: provider.name,
13
- models: models
14
- };
15
- }));
16
- res.json(models);
17
- }
18
- catch (error) {
19
- next(error);
20
- }
21
- };
22
- // 获取指定服务商的模型列表
23
- const getModelsByProviderId = async (req, res, next) => {
24
- try {
25
- const { provider } = req.params;
26
- const models = await modelDal.findByProviderId(Number(provider));
27
- res.json(models);
28
- }
29
- catch (error) {
30
- next(error);
31
- }
32
- };
33
- // 创建模型
34
- const createModel = async (req, res, next) => {
35
- try {
36
- const { id, provider, name } = req.body;
37
- // 验证请求
38
- if (!provider || !name || !id) {
39
- return res.status(400).json({ message: '模型ID、服务商ID、名称和为必填项' });
40
- }
41
- // 创建模型
42
- const newModel = await modelDal.create({
43
- id,
44
- provider: Number(provider),
45
- name,
46
- });
47
- res.status(201).json(newModel);
48
- }
49
- catch (error) {
50
- next(error);
51
- }
52
- };
53
- // 删除模型
54
- const deleteModel = async (req, res, next) => {
55
- try {
56
- const { id, provider } = req.params;
57
- // 验证请求
58
- if (!id || !provider) {
59
- return res.status(400).json({ message: '模型ID和服务商ID为必填项' });
60
- }
61
- // 删除模型
62
- await modelDal.remove(id, Number(provider));
63
- res.status(204).json({ message: '模型删除成功' });
64
- }
65
- catch (error) {
66
- next(error);
67
- }
68
- };
69
- export default {
70
- getAllModels,
71
- getModelsByProviderId,
72
- createModel,
73
- deleteModel
74
- };
@@ -1,120 +0,0 @@
1
- import providerDal from '../dal/ProviderDal.js';
2
- // 获取所有服务商
3
- const getAllProviders = async (_req, res, next) => {
4
- try {
5
- const providers = await providerDal.findAll();
6
- res.json(providers);
7
- }
8
- catch (error) {
9
- next(error);
10
- }
11
- };
12
- // 根据ID获取服务商
13
- const getProviderById = async (req, res, next) => {
14
- try {
15
- const { id } = req.params;
16
- const provider = await providerDal.findById(Number(id));
17
- if (!provider) {
18
- return res.status(404).json({ message: '服务商不存在' });
19
- }
20
- res.json(provider);
21
- }
22
- catch (error) {
23
- next(error);
24
- }
25
- };
26
- // 创建服务商
27
- const createProvider = async (req, res, next) => {
28
- try {
29
- const { name, type } = req.body;
30
- // 验证请求
31
- if (!name || !type) {
32
- return res.status(400).json({ message: '名称和协议类型为必填项' });
33
- }
34
- // 创建服务商
35
- const newProvider = await providerDal.create({
36
- name,
37
- type,
38
- api_key: '',
39
- base_url: '',
40
- suffix: '',
41
- status: 0 // 默认启用
42
- });
43
- res.status(201).json(newProvider);
44
- }
45
- catch (error) {
46
- next(error);
47
- }
48
- };
49
- // 更新服务商
50
- const updateProvider = async (req, res, next) => {
51
- try {
52
- const { id } = req.params;
53
- const { api_key, base_url, suffix } = req.body;
54
- // 验证服务商存在
55
- const existingProvider = await providerDal.findById(Number(id));
56
- if (!existingProvider) {
57
- return res.status(404).json({ message: '服务商不存在' });
58
- }
59
- // 准备更新数据
60
- const updateData = {};
61
- if (api_key !== undefined)
62
- updateData.api_key = api_key;
63
- if (base_url !== undefined)
64
- updateData.base_url = base_url;
65
- if (suffix !== undefined)
66
- updateData.suffix = suffix;
67
- // 更新服务商
68
- const updatedProvider = await providerDal.update(Number(id), updateData);
69
- res.json(updatedProvider);
70
- }
71
- catch (error) {
72
- next(error);
73
- }
74
- };
75
- // 删除服务商
76
- const deleteProvider = async (req, res, next) => {
77
- try {
78
- const { id } = req.params;
79
- // 验证服务商存在
80
- const existingProvider = await providerDal.findById(Number(id));
81
- if (!existingProvider) {
82
- return res.status(404).json({ message: '服务商不存在' });
83
- }
84
- // 删除服务商
85
- await providerDal.remove(Number(id));
86
- res.status(204).send();
87
- }
88
- catch (error) {
89
- next(error);
90
- }
91
- };
92
- // 更新服务商状态
93
- const updateProviderStatus = async (req, res, next) => {
94
- try {
95
- const { id } = req.params;
96
- const { status } = req.body;
97
- if (status === undefined) {
98
- return res.status(400).json({ message: '状态值不合法' });
99
- }
100
- // 验证服务商存在
101
- const existingProvider = await providerDal.findById(Number(id));
102
- if (!existingProvider) {
103
- return res.status(404).json({ message: '服务商不存在' });
104
- }
105
- // 更新服务商状态
106
- const updatedProvider = await providerDal.updateStatus(Number(id), Number(status));
107
- res.json(updatedProvider);
108
- }
109
- catch (error) {
110
- next(error);
111
- }
112
- };
113
- export default {
114
- getAllProviders,
115
- getProviderById,
116
- createProvider,
117
- updateProvider,
118
- deleteProvider,
119
- updateProviderStatus
120
- };
@@ -1,67 +0,0 @@
1
- import { prisma } from "../db/index.js";
2
- import { v4 as uuidv4 } from 'uuid';
3
- // 查找所有任务,支持分页
4
- const findAll = async (page, pageSize) => {
5
- return await prisma.task.findMany({
6
- skip: (page - 1) * pageSize,
7
- take: pageSize,
8
- orderBy: {
9
- createdAt: 'desc',
10
- },
11
- });
12
- };
13
- // 查询任务总数
14
- const getTotal = async () => {
15
- return await prisma.task.count();
16
- };
17
- // 创建任务
18
- const create = async (task) => {
19
- return await prisma.task.create({
20
- data: {
21
- id: uuidv4(),
22
- filename: task?.filename || '',
23
- type: task?.type || '',
24
- page_range: task?.page_range || '',
25
- pages: task?.pages || 0,
26
- provider: task?.provider || 0,
27
- model: task?.model || '',
28
- model_name: task?.model_name || '',
29
- progress: 0,
30
- status: 0,
31
- }
32
- });
33
- };
34
- // 批量创建任务
35
- const createTasks = async (tasks) => {
36
- const createdTasks = [];
37
- for (const task of tasks) {
38
- const createdTask = await create(task);
39
- createdTasks.push(createdTask);
40
- }
41
- return createdTasks;
42
- };
43
- // 更新任务
44
- const update = async (id, task) => {
45
- return await prisma.task.update({
46
- where: { id },
47
- data: task,
48
- });
49
- };
50
- // 删除任务
51
- const remove = async (id) => {
52
- await prisma.task.delete({
53
- where: { id },
54
- });
55
- // 删除任务对应detail
56
- return await prisma.taskDetail.deleteMany({
57
- where: { task: id },
58
- });
59
- };
60
- export default {
61
- findAll,
62
- create,
63
- createTasks,
64
- getTotal,
65
- update,
66
- remove,
67
- };
@@ -1,44 +0,0 @@
1
- import { prisma } from "../db/index.js";
2
- // 查找所有模型
3
- const findAll = async () => {
4
- return await prisma.model.findMany({
5
- orderBy: [{ createdAt: "desc" }],
6
- });
7
- };
8
- // 根据服务商ID查找模型
9
- const findByProviderId = async (provider) => {
10
- return await prisma.model.findMany({
11
- where: { provider },
12
- orderBy: [{ createdAt: "desc" }],
13
- });
14
- };
15
- // 创建模型
16
- const create = async (modelData) => {
17
- return await prisma.model.create({
18
- data: modelData,
19
- });
20
- };
21
- // 删除模型 根据id和provider删除
22
- const remove = async (id, provider) => {
23
- return await prisma.model.delete({
24
- where: {
25
- id_provider: {
26
- id: id,
27
- provider: provider
28
- }
29
- }
30
- });
31
- };
32
- // 批量删除指定服务商的模型
33
- const removeByProviderId = async (provider) => {
34
- return await prisma.model.deleteMany({
35
- where: { provider },
36
- });
37
- };
38
- export default {
39
- findAll,
40
- findByProviderId,
41
- create,
42
- remove,
43
- removeByProviderId,
44
- };
@@ -1,83 +0,0 @@
1
- import { prisma } from "../db/index.js";
2
- // 查找所有启用的提供商
3
- const findAll = async () => {
4
- return await prisma.provider.findMany({
5
- where: {
6
- status: 0
7
- },
8
- select: {
9
- id: true,
10
- name: true,
11
- type: true,
12
- api_key: true,
13
- base_url: true,
14
- suffix: true,
15
- status: true,
16
- createdAt: true,
17
- updatedAt: true,
18
- },
19
- orderBy: [{ createdAt: "desc" }],
20
- });
21
- };
22
- // 根据ID查找提供商
23
- const findById = async (id) => {
24
- return await prisma.provider.findUnique({
25
- where: { id },
26
- select: {
27
- id: true,
28
- name: true,
29
- type: true,
30
- api_key: true,
31
- base_url: true,
32
- suffix: true,
33
- status: true,
34
- createdAt: true,
35
- updatedAt: true,
36
- },
37
- });
38
- };
39
- // 创建提供商
40
- const create = async (data) => {
41
- return await prisma.provider.create({
42
- data: {
43
- name: data?.name || '',
44
- type: data?.type || '',
45
- api_key: data?.api_key || '',
46
- base_url: data?.base_url || '',
47
- suffix: data?.suffix || '',
48
- status: data?.status || 0,
49
- }
50
- });
51
- };
52
- // 更新提供商
53
- const update = async (id, data) => {
54
- return await prisma.provider.update({
55
- where: { id },
56
- data: data,
57
- });
58
- };
59
- // 删除提供商
60
- const remove = async (id) => {
61
- // 同时删除关联的model
62
- await prisma.model.deleteMany({
63
- where: { provider: id },
64
- });
65
- return await prisma.provider.delete({
66
- where: { id },
67
- });
68
- };
69
- // 更新提供商状态
70
- const updateStatus = async (id, status) => {
71
- return await prisma.provider.update({
72
- where: { id },
73
- data: { status },
74
- });
75
- };
76
- export default {
77
- findAll,
78
- findById,
79
- create,
80
- update,
81
- remove,
82
- updateStatus,
83
- };
@@ -1,57 +0,0 @@
1
- import pkg from '@prisma/client';
2
- const { PrismaClient } = pkg;
3
- import { runMigrations } from './Migration.js';
4
- import path from 'path';
5
- import { app } from 'electron';
6
- import fs from 'fs';
7
- import isDev from 'electron-is-dev';
8
- // 设置和获取数据库URL
9
- function getDatabaseUrl() {
10
- // 否则,为打包应用生成一个默认路径
11
- if (!isDev) {
12
- const userDataPath = app.getPath('userData');
13
- const dbDir = path.join(userDataPath, 'db');
14
- if (!fs.existsSync(dbDir)) {
15
- fs.mkdirSync(dbDir, { recursive: true });
16
- }
17
- console.log('Using userData database path:', `file:${path.join(dbDir, 'app.db')}`);
18
- return `file:${path.join(dbDir, 'app.db')}`;
19
- }
20
- // 开发环境回退路径
21
- console.log('Using default development database path:', `file:${path.join(process.cwd(), 'src', 'server', 'db', 'dev.db')}`);
22
- return `file:${path.join(process.cwd(), 'src', 'server', 'db', 'dev.db')}`;
23
- }
24
- // 获取数据库URL
25
- const dbUrl = getDatabaseUrl();
26
- // 创建Prisma实例,使用环境变量中的数据库URL
27
- const prisma = new PrismaClient({
28
- datasources: {
29
- db: {
30
- url: dbUrl
31
- }
32
- }
33
- });
34
- // 初始化数据库,包括运行迁移
35
- const initDatabase = async () => {
36
- try {
37
- console.log(`Initializing database(url:${dbUrl})...`);
38
- // 验证数据库连接
39
- await prisma.$queryRaw `SELECT 1`;
40
- console.log('Database connection established successfully.');
41
- // 运行迁移,传递现有的prisma实例
42
- await runMigrations(prisma);
43
- return true;
44
- }
45
- catch (error) {
46
- console.error('Database initialization error:', error);
47
- return false;
48
- }
49
- };
50
- /**
51
- * 关闭数据库连接
52
- */
53
- const disconnect = async () => {
54
- await prisma.$disconnect();
55
- console.log('Database connection has been closed');
56
- };
57
- export { prisma, disconnect, initDatabase };