const http = require('http'); const server = http.createServer(); const mongoose = require('mongoose'); const url = require('url') const mime = require('mime') const querystring = require('querystring') mongoose.connect('mongodb://localhost/play', { useNewUrlParser: true, useUnifiedTopology: true }) .then(result => console.log('连接成功')) .catch(err => console.log(err, '连接失败')) // 创建用户集合 const userSchema = new mongoose.Schema({ name: { type: String, required: true, minlength: 2, maxlength: 20 }, age: { type: Number, min: 18, max: 80 }, password: String, email: String, hobbies: [String] }) const User = mongoose.model('User', userSchema) server.listen(8000) server.on('request', async(req, res) => { const method = req.method; const { pathname, query } = url.parse(req.url, true) let type = mime.getType(pathname) let hobby = ['足球', '篮球', '橄榄球 ', '敲代码 ', '抽烟', '喝酒 ', '烫头'] if (method == 'GET') { if (pathname == '/list') { // 查询用户信息,为了让能用户信息先拿到,再执行后面的代码,需要用异步函数。 let users = await User.find() let list = `<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>用户列表</title> <link rel="stylesheet" href="css/bootstrap.min.css"> <!-- <script src="js/bootstrap.min.js"></script> --> </head> <body> <div class="container"> <a href="/add" class="btn btn-primary margin-top" type="button"> 添加用户 </a> <form action="localhost:8090"> <table> <tr> <th>用户名</th> <th>年龄</th> <th>爱好</th> <th>邮箱</th> <th>操作</th> </tr> `; // 对数据进行循环操作 users.forEach((item) => { list += `<tr> <td>${item.name}</td> <td>${item.age}</td> <td>` item.hobbies.forEach(item => { list += `<span>${item}</span>` }) list += ` </td> <td>${item.email}</td> <td><a href="delete?id=${item._id}" >删除</a><a href="modify?id=${item._id}" >修改</a></td> </tr>` }) list += ` </table> </form> </div> <script> var button = document.querySelector('button') button.onclick = function() { console.log(11) } </script> </body> </html>` res.end(list) } else if (pathname == '/add') { let add = `<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>添加用户t</title> <link rel="stylesheet" href="css/bootstrap.min.css"> <style> label { margin-top: 10px; display: block; font-size: 16px; } input { outline: none; } button { display: block !important; margin-top: 10px; } </style> </head> <div class="container"> <h3>添加用户</h3> <form method="post" action="/add" > <label for="username">用户名</label> <input type="text" value='请填写用户名' name='name'> <label for="password">密码</label> <input type="password" value='请输入密码' name='password'> <label for="age">年龄</label> <input type="text" value='请填写年龄' name='age'> <label for="email">邮箱</label> <input type="text" value='请填写邮箱' name='email'> <label>请选择爱好</label> <input type="checkbox" name="hobbies" value="足球">足球 <input type="checkbox" name="hobbies" value="篮球">篮球 <input type="checkbox" name="hobbies" value="橄榄球">橄榄球 <input type="checkbox" name="hobbies" value="敲代码">敲代码 <input type="checkbox" name="hobbies" value="抽烟">抽烟 <input type="checkbox" name="hobbies" value="喝酒">喝酒 <input type="checkbox" name="hobbies" value="烫头">烫头 <input type="submit" class="btn btn-primary margin-top" value="添加用户"> </form> <script> var checkboxs = document.querySelectorAll('input') for (var i = 0; i < checkboxs.length; i++) { if (checkboxs[i].type != 'checkbox') { checkboxs[i].style.width = '100%'; } } </script> </div> <body> </body> </html>` res.end(add) } else if (pathname == '/modify') { let user = await User.findOne({ _id: query.id }) let modify = `<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>修改用户t</title> <link rel="stylesheet" href="css/bootstrap.min.css"> </head> <div class="container"> <h3>修改用户</h3> <form method="post" action="/modify?id=${user._id}" > <label for="username">用户名</label> <input type="text" value='${user.name}' name='name'> <label for="password">密码</label> <input type="password" value='${user.password}' name='password'> <label for="age">年龄</label> <input type="text" value='${user.age}' name='age'> <label for="email">邮箱</label> <input type="text" value='${user.email}' name='email'> <label>请选择爱好</label>` hobby.forEach(item => { console.log(user.hobbies) let ishobby = user.hobbies.includes(item) if (ishobby) { modify += `<input type = "checkbox" name = "hobbies" value = "${item}" checked=checked > ${item} ` } else { modify += `<input type = "checkbox" name = "hobbies" value = "${item}"> ${item} ` } }) modify += ` <div> <input type="submit" class="btn btn-primary margin-top" value="修改用户"> </div> </form> <script> var checkboxs = document.querySelectorAll('input') for (var i = 0; i < checkboxs.length; i++) { if (checkboxs[i].type != 'checkbox') { checkboxs[i].style.width = '100%'; } } </script> </div> <body> </body> </html>` res.end(modify) } else if (pathname == '/delete') { console.log(query.id) await User.findOneAndDelete({ _id: query.id }) res.writeHead(301, { Location: '/list' }) res.end() } } else if (method == 'POST') { if (pathname == '/add') { let formDatas = '' req.on('data', (param) => { formDatas = formDatas + param }) req.on('end', async() => { let user = querystring.parse(formDatas) console.log(user) await User.create(user) // 301代表重定向 res.writeHead(301, { Location: '/list' }) res.end() }) } else if (pathname == '/modify') { let formDatas = '' req.on('data', (param) => { formDatas = formDatas + param }) req.on('end', async() => { let user = querystring.parse(formDatas) await User.updateOne({ _id: query.id }, user) // 301代表重定向 res.writeHead(301, { Location: '/list' }) res.end() }) } } res.writeHead(200, { 'Content-Type': type }) })