diff --git a/certificate.html b/certificate.html index c63a758..ec98c9f 100644 --- a/certificate.html +++ b/certificate.html @@ -948,6 +948,19 @@ const sessionId = getSessionId(); urlEncodedData.append('sessionId', sessionId); + // 从URL参数中获取邀请者信息 + const urlParams = new URLSearchParams(window.location.search); + const inviter = urlParams.get('inviter'); + const inviterPhone = urlParams.get('inviterPhone'); + + // 添加邀请者信息 + if (inviter) { + urlEncodedData.append('inviter', inviter); + } + if (inviterPhone) { + urlEncodedData.append('inviterPhone', inviterPhone); + } + // 发送数据到服务器 fetch('/submit', { method: 'POST', diff --git a/invite.html b/invite.html index ca99423..44fde5d 100644 --- a/invite.html +++ b/invite.html @@ -154,6 +154,14 @@
+
+

登录信息

+
+

姓名:未登录

+

电话:未登录

+
+
+

生成邀请二维码

创建一个二维码,邀请他人填写合格证信息

@@ -187,11 +195,42 @@
diff --git a/login.html b/login.html new file mode 100644 index 0000000..03631e9 --- /dev/null +++ b/login.html @@ -0,0 +1,202 @@ + + + + + + 登录 + + + +
+
+

登录

+

请输入您的用户名和密码

+
+ +
+
+ +
+
+ + +
+
+ + +
+ +
+
+ + + + \ No newline at end of file diff --git a/server.js b/server.js index cf77833..81a023e 100644 --- a/server.js +++ b/server.js @@ -76,6 +76,138 @@ const server = http.createServer(async (req, res) => { return; } + // 登录接口 + if (req.method === 'POST' && req.url === '/login') { + try { + let body = ''; + req.on('data', chunk => { + body += chunk.toString(); + }); + + req.on('end', async () => { + try { + // 解析表单数据 + const formData = new URLSearchParams(body); + const userName = formData.get('userName'); + const password = formData.get('password'); + + console.log('接收到的登录请求:', { userName }); + + // 验证输入 + if (!userName || !password) { + res.writeHead(400, { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'POST, GET, OPTIONS', + 'Access-Control-Allow-Headers': 'Content-Type' + }); + res.end(JSON.stringify({ + success: false, + error: '请输入用户名和密码' + })); + return; + } + + // 连接到userlogin数据库 + const userloginPool = mysql.createPool({ + ...dbConfig, + database: 'userlogin' + }); + + // 验证用户名和密码 + const [loginRows] = await userloginPool.execute( + 'SELECT * FROM login WHERE userName = ? AND password = ?', + [userName, password] + ); + + if (loginRows.length === 0) { + res.writeHead(401, { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'POST, GET, OPTIONS', + 'Access-Control-Allow-Headers': 'Content-Type' + }); + res.end(JSON.stringify({ + success: false, + error: '用户名或密码错误' + })); + return; + } + + const loginInfo = loginRows[0]; + const managerId = loginInfo.managerId; + + // 获取用户详细信息 + const [personnelRows] = await userloginPool.execute( + 'SELECT * FROM personnel WHERE managerId = ?', + [managerId] + ); + + let userInfo = { + userName: loginInfo.userName, + projectName: loginInfo.projectName, + managerId: loginInfo.managerId + }; + + if (personnelRows.length > 0) { + const personnelInfo = personnelRows[0]; + userInfo = { + ...userInfo, + name: personnelInfo.name, + phoneNumber: personnelInfo.phoneNumber, + managercompany: personnelInfo.managercompany, + managerdepartment: personnelInfo.managerdepartment, + organization: personnelInfo.organization, + alias: personnelInfo.alias + }; + } + + console.log('登录成功,用户信息:', userInfo); + + // 返回成功响应 + res.writeHead(200, { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'POST, GET, OPTIONS', + 'Access-Control-Allow-Headers': 'Content-Type' + }); + res.end(JSON.stringify({ + success: true, + user: userInfo + })); + + // 关闭临时连接池 + await userloginPool.end(); + } catch (error) { + console.error('处理登录请求失败:', error.message); + res.writeHead(500, { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'POST, GET, OPTIONS', + 'Access-Control-Allow-Headers': 'Content-Type' + }); + res.end(JSON.stringify({ + success: false, + error: '登录失败,请重试' + })); + } + }); + } catch (error) { + console.error('登录请求处理失败:', error.message); + res.writeHead(500, { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'POST, GET, OPTIONS', + 'Access-Control-Allow-Headers': 'Content-Type' + }); + res.end(JSON.stringify({ + success: false, + error: '登录失败,请重试' + })); + } + return; + } + // 处理GET请求,获取最新的合格证信息 if (req.method === 'GET' && req.url.startsWith('/getLatestCertificate')) { try { @@ -88,10 +220,10 @@ const server = http.createServer(async (req, res) => { // 从数据库获取对应会话的最新合格证信息 let query, params; if (sessionId) { - query = 'SELECT company as subjectName, phoneNumber as contact, productName, grossWeight as weight, commitBasis as basis, origin, DATE_FORMAT(issueDate, "%Y-%m-%d") as date, signature, qrCodeUrl FROM certificate WHERE sessionId = ? ORDER BY id DESC LIMIT 1'; + query = 'SELECT company as subjectName, phoneNumber as contact, productName, grossWeight as weight, commitBasis as basis, origin, DATE_FORMAT(issueDate, "%Y-%m-%d") as date, signature, qrCodeUrl, inviter, inviter_phone as inviterPhone FROM certificate WHERE sessionId = ? ORDER BY id DESC LIMIT 1'; params = [sessionId]; } else { - query = 'SELECT company as subjectName, phoneNumber as contact, productName, grossWeight as weight, commitBasis as basis, origin, DATE_FORMAT(issueDate, "%Y-%m-%d") as date, signature, qrCodeUrl FROM certificate WHERE sessionId IS NULL ORDER BY id DESC LIMIT 1'; + query = 'SELECT company as subjectName, phoneNumber as contact, productName, grossWeight as weight, commitBasis as basis, origin, DATE_FORMAT(issueDate, "%Y-%m-%d") as date, signature, qrCodeUrl, inviter, inviter_phone as inviterPhone FROM certificate WHERE sessionId IS NULL ORDER BY id DESC LIMIT 1'; params = []; } @@ -147,7 +279,9 @@ const server = http.createServer(async (req, res) => { origin: formData.get('origin'), date: now, signature: formData.get('signature'), - sessionId: sessionId + sessionId: sessionId, + inviter: formData.get('inviter'), + inviterPhone: formData.get('inviterPhone') }; console.log('接收到的表单数据:', { @@ -159,7 +293,9 @@ const server = http.createServer(async (req, res) => { origin: certificate.origin, date: certificate.date.toISOString(), hasSignature: !!certificate.signature, - sessionId: sessionId + sessionId: sessionId, + inviter: certificate.inviter, + inviterPhone: certificate.inviterPhone }); // 处理手写签名,上传到OSS @@ -218,8 +354,8 @@ const server = http.createServer(async (req, res) => { // 插入数据到数据库 await pool.execute( - 'INSERT INTO certificate (company, phoneNumber, productName, grossWeight, commitBasis, origin, issueDate, signature, sessionId, qrCodeUrl) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', - [certificate.subjectName, certificate.contact, certificate.productName, certificate.weight, certificate.basis, certificate.origin, certificate.date, signatureUrl, certificate.sessionId, qrCodeUrl] + 'INSERT INTO certificate (company, phoneNumber, productName, grossWeight, commitBasis, origin, issueDate, signature, sessionId, qrCodeUrl, inviter, inviter_phone) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', + [certificate.subjectName, certificate.contact, certificate.productName, certificate.weight, certificate.basis, certificate.origin, certificate.date, signatureUrl, certificate.sessionId, qrCodeUrl, certificate.inviter, certificate.inviterPhone] ); console.log('数据插入数据库成功'); @@ -229,6 +365,8 @@ const server = http.createServer(async (req, res) => { ...certificate, signature: signatureUrl, qrCodeUrl: qrCodeUrl, + inviter: certificate.inviter, + inviterPhone: certificate.inviterPhone, // 格式化日期为YYYY-MM-DD格式 date: certificate.date.toISOString().split('T')[0] };