// ROUTES FOR OUR APIselectClassStudent // ============================================================================= const express = require("express"); const request = require("request"); const bcrypt = require("bcryptjs"); const router = express.Router(); // get an instance of the express Router const querystring = require("querystring"); var mysql = require("./mysql"); // const _mysqlLabor = ["123.58.32.151", "pbl"]; //edu數據庫信息 // const _mysqluser = ["123.58.32.151", "cocorobouser"]; //用户数据库信息 // const _getmysqlLabor = ["123.58.32.151", "pbl"]; //edu數據庫信息 // const _getmysqluser = ["123.58.32.151", "cocorobouser"]; //edu數據庫信息 const _mysqlLabor = ["172.16.12.5", "pbl"]; //edu數據庫信息 const _mysqluser = ["172.16.12.5", "cocorobouser"]; //edu數據庫信息 // const _getmysqlLabor = ["172.16.12.5", "pbl"]; //edu數據庫信息 // const _getmysqluser = ["172.16.12.5", "cocorobouser"]; //edu數據庫信息 const _getmysqlLabor2 = ["172.16.12.7", "pbl"]; //edu數據庫信息 const _getmysqlLabor = ["172.16.12.7", "pbl"]; //edu數據庫信息 const _getmysqluser = ["172.16.12.7", "cocorobouser"]; //edu數據庫信息 const _localhost = ["127.0.0.1", "pbl"]; //edu數據庫信息 const crypto = require("crypto"); const https = require("https"); const { Pool } = require('pg'); const axios = require('axios'); const multer = require("multer"); const loginHandler = require('./login'); // 确保路径正确 const { r2rClient } = require("r2r-js"); const client = new r2rClient("https://r2rserver.cocorobo.cn/"); // 配置 multer 存储选项 const storage = multer.diskStorage({ destination: function (req, file, cb) { req.setEncoding('utf-8'); cb(null, 'uploads/'); // 文件上传目录 }, filename: function (req, file, cb) { req.setEncoding('utf-8'); // 使用 Buffer 处理文件名,确保编码正确 const fileExtension = file.originalname.split('.').pop(); // 获取文件后缀 const fileNameWithoutExt = Buffer.from(file.originalname.slice(0, -(fileExtension.length + 1)), 'latin1').toString('utf8'); // 转换编码 cb(null, fileNameWithoutExt + '-' + Date.now() + '.' + fileExtension); // 使用时间戳和原始文件名 } }); const upload = multer({ storage: storage, limits: { fileSize: 100 * 1024 * 1024 // 100MB } }); router.route("/login").all(async (req, res, next) => { loginHandler(req, res) }); router.route("/logout").all(async (req, res, next) => { try { const response = await client.users.logout(); res.status(200).json({result: response.results}); } catch (error) { res.status(500).json({error: error instanceof Error ? error.message : "An error occurred"}); } }); //获取文档列表 router.route("/getDocument").all(async (req, res, next) => { try { const response = await client.documents.list({ limit: 10, offset: 0, }); console.log(response); res.status(200).json({ result: response.results }); } catch (error) { res.status(500).json({ error: error instanceof Error ? error.message : "An error occurred" }); } }); //列出文档块 router.route("/listChunks").all(async (req, res, next) => { try { const response = await client.documents.listChunks({ id: "5111165f-965c-5d61-89e3-1f74b0178032", }); console.log(response); res.status(200).json({ result: response.results }); } catch (error) { res.status(500).json({ error: error instanceof Error ? error.message : "An error occurred" }); } }); //提取实体和关系 router.route("/extract").all(async (req, res, next) => { try { const response = await client.documents.extract({ id: "5111165f-965c-5d61-89e3-1f74b0178032" }) console.log(response); res.status(200).json({ result: response.results }); } catch (error) { res.status(500).json({ error: error instanceof Error ? error.message : "An error occurred" }); } }); router.route("/selectUser").all((req, res, next) => { var json = queryString(req.url); getmysql(req, res, "selectUser", json["userid"]); }); // 文件上传接口 router.post('/upload', upload.single('file'), async (req, res) => { req.setEncoding('utf-8') try { console.log(req.file); // 打印上传的文件信息 console.log(`File path: uploads/${req.file.filename}`); const path = require('path'); const filePath = path.resolve(__dirname, 'uploads', req.file.filename); console.log(filePath); let filename = Buffer.from(req.file.originalname, 'latin1').toString('utf8'); const fs = require('fs'); const file = new File([fs.readFileSync('./uploads/q-1739170522767.doc')], filename, { type: req.file.mimetype }); const response = await client.documents.create({ file: file, metadata: { title: filename } }); console.log(response); res.status(200).json({ message: 'File uploaded successfully', file: req.file }); } catch (error) { res.status(500).json({ error: error instanceof Error ? error.message : "An error occurred" }); } }); //获取文档列表 router.route("/getFile").all(async (req, res, next) => { //mode的处理 if (req.body[0]) { p = Object.values(req.body[0]); p.unshift(_mysqlLabor[0], _mysqlLabor[1], "getFile"); mysql.usselect(p, async function(ret) { let data = ret[0]; // const array = data.map(item => item.documentid); try { const response = await client.documents.list({ collection_ids: [req.body[0].folderid] }); // console.log(response); let data2 = response.results.map(doc => { doc.documentid = doc.id; delete doc.id; return doc; }); // 合并data和data2,根据documentid const mergedData = data.map(item => { const correspondingDoc = data2.find(doc => doc.documentid === item.documentid); return { ...item, ...correspondingDoc }; }); res.status(200).json({ result: mergedData }); } catch (error) { res.status(500).json({ error: error instanceof Error ? error.message : "An error occurred" }); } }); } }); //获取文档列表2 router.route("/getFileP").all(async (req, res, next) => { //mode的处理 if (req.body) { p = [req.body.uid, req.body.folderid, req.body.n, req.body.page, req.body.num]; p.unshift(_mysqlLabor[0], _mysqlLabor[1], "getFile"); mysql.usselect(p, async function(ret) { let data = ret[0]; // const array = data.map(item => item.documentid); try { const response = await client.documents.list({ collection_ids: [req.body.folderid] }); // console.log(response); let data2 = response.results.map(doc => { doc.documentid = doc.id; delete doc.id; return doc; }); // 合并data和data2,根据documentid const mergedData = data.map(item => { const correspondingDoc = data2.find(doc => doc.documentid === item.documentid); return { ...item, ...correspondingDoc }; }); res.status(200).json({ result: mergedData }); } catch (error) { res.status(500).json({ error: error instanceof Error ? error.message : "An error occurred" }); } }); } }); //获取能关联的文件 router.route("/getFile2").all(async (req, res, next) => { //mode的处理 if (req.body[0]) { p = Object.values(req.body[0]); p.unshift(_mysqlLabor[0], _mysqlLabor[1], "getFile2"); mysql.usselect(p, async function(ret) { let data = ret[0]; // const array = data.map(item => item.documentid); try { const response = await client.documents.list({ collection_ids: [req.body[0].folderid] }); // console.log(response); let data2 = response.results.map(doc => { doc.documentid = doc.id; delete doc.id; return doc; }); // 合并data和data2,根据documentid const mergedData = data.map(item => { const correspondingDoc = data2.find(doc => doc.documentid === item.documentid); return { ...item, ...correspondingDoc }; }); res.status(200).json({ result: mergedData }); } catch (error) { res.status(500).json({ error: error instanceof Error ? error.message : "An error occurred" }); } }); } }); //添加文件夹 router.route("/addFolder").all(async (req, res, next) => { //mode的处理 if (req.body[0]) { try { const response = await client.collections.create({ name: decodeURIComponent(req.body[0].n), description: decodeURIComponent(req.body[0].fd) }); p = [...Object.values(req.body[0]), response.results.id]; p.unshift(_mysqlLabor[0], _mysqlLabor[1], "addFolder"); mysql.usselect(p, async function(ret) { res.end(JSON.stringify(ret)); }); } catch (error) { res.status(500).json({ error: error instanceof Error ? error.message : "An error occurred" }); } } }); //删除文件夹 router.route("/deleteFolder").all(async (req, res, next) => { //mode的处理 if (req.body[0]) { try { let folderids = decodeURIComponent(req.body[0].folderids).split(",") let ids = req.body[0].ids await Promise.all(folderids.map(folderid => client.collections.delete({ id: folderid }))); p = [ids]; p.unshift(_mysqlLabor[0], _mysqlLabor[1], "deleteFolder"); mysql.usselect(p, async function(ret) { res.end(JSON.stringify(ret)); }); } catch (error) { res.status(500).json({ error: error instanceof Error ? error.message : "An error occurred" }); } } }); //修改文件夹 router.route("/updateFolder").all(async (req, res, next) => { //mode的处理 if (req.body[0]) { try { const { folderid, ...folderData } = req.body[0]; // 解构赋值,排除folderid const response = await client.collections.update({ id: folderid, description: decodeURIComponent(req.body[0].d) }); p = Object.values(folderData); // 获取剩余属性的键 p.unshift(_mysqlLabor[0], _mysqlLabor[1], "updateFolder"); mysql.usselect(p, async function(ret) { res.end(JSON.stringify(ret)); }); } catch (error) { res.status(500).json({ error: error instanceof Error ? error.message : "An error occurred" }); } } }); //移除文件 router.route("/removeFile").all(async (req, res, next) => { if (req.body[0]) { try { let documentids = decodeURIComponent(req.body[0].documentids).split(",") let folderid = req.body[0].folderid let ids = req.body[0].ids documentids.map(documentid => client.collections.removeDocument({ id: folderid, documentId: documentid }) ) // await Promise.all(documentids.map(documentid => // client.collections.removeDocument({ id: folderid, documentId: documentid }) // )); p = [ids, folderid]; p.unshift(_mysqlLabor[0], _mysqlLabor[1], "removeFile"); mysql.usselect(p, async function(ret) { res.end(JSON.stringify(ret)); }); } catch (error) { res.status(500).json({ error: error instanceof Error ? error.message : "An error occurred" }); } } }); //移入文件 router.route("/moveFile").all(async (req, res, next) => { if (req.body[0]) { try { let documentids = decodeURIComponent(req.body[0].documentids).split(",") let folderid = req.body[0].folderid let ids = decodeURIComponent(req.body[0].ids).split(",") documentids.map(documentid => client.collections.addDocument({ id: folderid, documentId: documentid })) // const results = await Promise.all(documentids.map(documentid => client.collections.addDocument({ // id: folderid, // documentId: documentid // }))); // console.log("每一条接口返回的值:", results); // 查看每一条接口返回来的值 for (const id of ids) { p = [id, folderid]; p.unshift(_mysqlLabor[0], _mysqlLabor[1], "moveFile"); const ret = await mysql.usselect(p, async function(ret) {}); } res.status(200).json({ messages: "移动成功" }); } catch (error) { res.status(500).json({ error: error instanceof Error ? error.message : "An error occurred" }); } } }); //移入文件 router.route("/deleteFile").all(async (req, res, next) => { if (req.body[0]) { try { let documentids = decodeURIComponent(req.body[0].documentids).split(",") let ids = req.body[0].ids documentids.map(documentid => client.documents.delete({ id: documentid, })) // const results = await Promise.all(documentids.map(documentid => client.documents.delete({ // id: documentid, // }))); // console.log("每一条接口返回的值:", results); // 查看每一条接口返回来的值 p = [ids]; p.unshift(_mysqlLabor[0], _mysqlLabor[1], "deleteFile"); mysql.usselect(p, async function(ret) { res.end(JSON.stringify(ret)); }); } catch (error) { res.status(500).json({ error: error instanceof Error ? error.message : "An error occurred" }); } } }); router.route("/getFolder").all((req, res, next) => { getmysql2(req, res, "getFolder", req.body.uid); }); //search文件 router.route("/searchFile").all(async (req, res, next) => { if (req.body) { try { let filters = {} if(req.body.type == 1){ filters = {"document_id": {"$in": req.body.ids}} }else if(req.body.type == 2){ filters = {"collection_ids": {"$in": req.body.ids}} } const response = await client.retrieval.search({ query: req.body.query, search_settings: { filters: filters, useSemanticSearch: true, chunkSettings: { limit: req.body.limit ? req.body.limit : 10, enabled: true }, } }); res.status(200).json({ result: response.results }); } catch (error) { res.status(500).json({ error: error instanceof Error ? error.message : "An error occurred" }); } } }); //提取文件实体 router.route("/extractFile").all(async (req, res, next) => { if (req.body) { try { const response = client.documents.extract({ id:req.body.id }) res.status(200).json({ result: response.results }); } catch (error) { res.status(500).json({ error: error instanceof Error ? error.message : "An error occurred" }); } } }); //添加上传好的知识库文件 router.route("/addFile").all((req,res,next)=>{ getmysql2(req, res, "add_file", req.body.n, req.body.did, req.body.uid, req.body.fid, req.body.mofid); }) function generateAPIKey(username) { let timeStamp = new Date().getTime(); let hashStr = timeStamp + username; let digest = crypto .createHash("sha256") .update(hashStr, "utf8") .digest("hex"); return digest; } queryString = function(url) { var a = url.split("?"); var json = querystring.parse(a[1]); return json; }; //post存儲過程處理 postmysql = function(req, res, functionname) { //mode的處理 if (req.body[0]) { p = Object.values(req.body[0]); p.unshift(_mysqlLabor[0], _mysqlLabor[1], functionname); //執行存儲過程 mysql.usselect(p, function(ret) { res.end(JSON.stringify(ret)); }); } }; //post存儲過程處理 postmysql2 = function(req, res, functionname) { //mode的處理 if (req.body) { p = Object.values(req.body)[0].split(","); p.unshift(_mysqlLabor[0], _mysqlLabor[1], functionname); //執行存儲過程 mysql.usselect(p, function(ret) { res.end(JSON.stringify(ret)); }); } }; //post存儲過程處理 postmysql3 = function(req, res, functionname) { //mode的處理 if (req.body) { console.log(req); p = Object.values(req.body); p.unshift(_mysqlLabor[0], _mysqlLabor[1], functionname); //執行存儲過程 mysql.usselect(p, function(ret) { res.end(JSON.stringify(ret)); }); } }; //get獲取數據庫信息 getmysql = function(req, res, functionname, ...p) { p = p || []; p.unshift(_getmysqlLabor[0], _getmysqlLabor[1], functionname); //執行存儲過程 mysql.usselect(p, function(ret) { res.end(JSON.stringify(ret)); }); // }; //get獲取數據庫信息 getmysql2 = function(req, res, functionname, ...p) { p = p || []; p.unshift(_mysqlLabor[0], _mysqlLabor[1], functionname); //執行存儲過程 mysql.usselect(p, function(ret) { res.end(JSON.stringify(ret)); }); // }; //get獲取數據庫信息 getmysql3 = function(req, res, functionname, ...p) { p = p || []; p.unshift(_getmysqlLabor2[0], _getmysqlLabor2[1], functionname); //執行存儲過程 mysql.usselect(p, function(ret) { res.end(JSON.stringify(ret)); }); // }; //post存储过程处理 userpostmysql = function(req, res, functionname) { //mode的处理 if (req.body.mode) { p = req.body.mode.split(","); p.unshift(_mysqluser[0], _mysqluser[1], functionname); //执行存储过程 mysql.usselect(p, function(ret) { res.end(JSON.stringify(ret)); }); } }; //get获取数据库信息 usergetmysql = function(req, res, functionname, ...p) { p = p || []; p.unshift(_mysqluser[0], _mysqluser[1], functionname); //执行存储过程 mysql.usselect(p, function(ret) { res.end(JSON.stringify(ret)); }); // }; //post存儲過程處理 postmysqlLocal = function(req, res) { //mode的處理 if (req.body[0]) { p = Object.values(req.body[0]); p.unshift(_localhost[0], _localhost[1]); //執行存儲過程 mysql.usselect(p, function(ret) { res.end(JSON.stringify(ret)); }); } }; postmysqlOnline = function(req, res) { //mode的處理 if (req.body[0]) { p = Object.values(req.body[0]); p.unshift(_mysqlLabor[0], _mysqlLabor[1]); //執行存儲過程 mysql.usselect(p, function(ret) { res.end(JSON.stringify(ret)); }); } }; module.exports = router;