总共有一个数据库 两个表 一个user表是用户的登录注册数据 表单验证用
另一个表是小组成员表C8205 增加删除使用

模块

image.png

config index.js

image.png

  1. const Router = require("koa-router")
  2. const requireDir = require("require-directory")
  3. const render = require("koa-art-template")
  4. const koaBody = require("koa-body")
  5. const static = require("koa-static")
  6. const path = require("path")
  7. function initProject(app) {
  8. app.use(koaBody({
  9. multipart: true,
  10. formidable: {
  11. maxFileSize: 200 * 1024 * 1024,
  12. keepExtensions: true
  13. }
  14. }))
  15. app.use(async (ctx, next) => {
  16. ctx.set("Access-Control-Allow-Origin", "*");
  17. await next();
  18. })
  19. app.use(async (ctx, next) => {
  20. if (ctx.path == "/login" || ctx.path == "/doLogin" || ctx.path == "/registered" || ctx.path == "/doregistered") {
  21. await next()
  22. } else {
  23. if (ctx.cookies.get("login")) {
  24. await next()
  25. } else {
  26. await ctx.redirect("/login")
  27. }
  28. }
  29. })
  30. requireDir(module, "../routers", { visit: loadRouters })
  31. function loadRouters(obj) {
  32. if (obj instanceof Router) {
  33. app.use(obj.routes())
  34. }
  35. }
  36. render(app, {
  37. root: path.join(process.cwd(), "pages"),
  38. extname: '.html',
  39. debug: process.env.NODE_ENV !== 'production'
  40. })
  41. app.use(static(path.join(process.cwd(), "static")))
  42. }
  43. module.exports = initProject

models index.js

image.png

const { MongoClient } = require('mongodb')
const url = 'mongodb://121.36.222.9:12021' 
const client = new MongoClient(url)
const dbName = 'Student';
async function main(table) {
  await client.connect();
  console.log('Connected successfully to server');
  const db = client.db(dbName);
  const collection = db.collection(table);
  return collection;
}
module.exports = main;

index.js

const koa = require("koa")
const app = new koa()
const initProject = require("./config")
initProject(app)
app.listen(1000)

routers

data.js

小程序拿接口用

const router = require("koa-router")()
const  main=require("../models")
router.get("/data", async ctx => {
    var table = await main("C8205")
    var res=await table.find().toArray()
    ctx.body=res
})
module.exports=router

delete.js

const router = require("koa-router")()
const main = require("../models")
const { ObjectId}=require("mongodb")
router.get("/delete/:id", async ctx => {
    console.log(ctx.params);
    var { id } = ctx.params
    var table = await main("C8205")
    var res = await table.deleteOne({ _id: ObjectId(id) })
    await ctx.redirect("/home")
})
module.exports=router

detail.js

const router = require("koa-router")()
const main = require("../models")
const { ObjectId}=require("mongodb")
router.get("/detail/:id", async ctx => {
    var { id } = ctx.params
    var table = await main("C8205")
    var res = await table.find({ _id: ObjectId(id) }).toArray()
    ctx.body=res
})
module.exports = router

doForm.js

const router = require("koa-router")()
const fs = require("fs")
const path = require("path")
const main = require("../models");
router.post("/doForm", async ctx => {
    var { name, age, like } = ctx.request.body
    age = Number(age)
    console.log(name);
    var filename=ctx.request.files.logo.path
    var reader = fs.createReadStream(filename);
    var uploadFile = `./static/${path.basename(filename)}`;
    var writer = fs.createWriteStream(uploadFile);
    reader.pipe(writer);
    var logo = ctx.origin + "/" + path.basename(filename);
    const collection = await main("C8205");
    await collection.insertOne({ name, age, like, logo });    
    await ctx.redirect("/home")
})
module.exports=router

doLogin.js

const router = require("koa-router")()
const main = require("../models")
router.post("/doLogin", async ctx => {
    console.log(ctx.request.body);
    var { username,pwd}=ctx.request.body
    var table = await main("user")
    var res = await table.find({ username, pwd }).toArray()
    if (res.length) {
        ctx.cookies.set("login", "success")
        await ctx.redirect("/form")
    } else {
        ctx.body="<script>alert('用户名或密码错误');location.href='/login'</script>"
    }


})
module.exports = router

doregistered.js

const router = require("koa-router")()
const main=require("../models")
router.post('/doregistered', async ctx => {
    var { username, pwd } = ctx.request.body
    var table = await main("user")
    var res = await table.find({ username }).toArray()
    if (res.length) {
        ctx.body ="<script>alert('用户名已经被注册');location.href='/registered'</script>"
    } else {
        var res = await table.insertOne({ username, pwd })
        ctx.body="<script>alert('注册成功');location.href='/login'</script>"
    }
})
module.exports=router

form.js

const router = require("koa-router")()
router.get("/form", async ctx => {
  await ctx.render("form")
})
module.exports=router

home.js

const router = require("koa-router")()
const main=require("../models")
router.get("/home", async ctx => {
    var table = await main("C8205")
    var C8205 = await table.find().toArray()
    await ctx.render("home",{C8205})
})
module.exports=router

login.js

const router = require("koa-router")()
router.get('/login', async ctx => {
    await ctx.render("login")
})
module.exports=router

registered.js

const router = require("koa-router")()
router.get('/registered', async ctx => {
    await ctx.render("registered")
})
module.exports=router

Pages

form.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" />
    <title>Document</title>
</head>

<body>
    <div class="container">
        <form action="http://localhost:1000/doForm" enctype="multipart/form-data" method="post" role="form">
            <legend>添加小组成员</legend>
            <div class="form-group">
                <label for="">名字</label>
                <input type="text" class="form-control" name="name" placeholder="请输入组员的名字">
            </div>
            <div class="form-group">
                <label for="">年龄</label>
                <input type="text" class="form-control" name="age" placeholder="请输入组员的年龄">
            </div>
            <div class="form-group">
                <label for="">爱好</label>
                <input type="text" class="form-control" name="like" placeholder="请输入组员的性别">
            </div>
            <div class="form-group">
                <label for="">上传头像</label>
                <input type="file" class="form-control" name="logo">
            </div>
            <button type="submit" class="btn btn-primary">添加</button><a href="/home" class="btn btn-primary">查看成员</a>
        </form>

    </div>
</body>

</html>

home.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" />
    <title>Document</title>
    <style>
        img {
            width: 40px;
        }
    </style>
</head>

<body>
    <div class="container">

        <table class="table table-hover">
            <thead>
                <tr>
                    <th>序号</th>
                    <th>姓名</th>
                    <th>年龄</th>
                    <th>爱好</th>
                    <th>logo</th>
                    <th>删除</th>
                </tr>
            </thead>
            <tbody>
                {{each C8205}}
                <tr>
                    <td>{{$index+1}}</td>
                    <td> <a href="/detail/{{@$value._id}}"> {{$value.name}}</a>  </td>
                    <td>{{$value.age}}</td>
                    <td>{{$value.like}}</td>
                    <td><img src="{{@ $value.logo}}" alt=""></td>
                    <td><a href="/delete/{{@$value._id}}"class="btn btn-danger" >删除</a></td>
                </tr>
                {{/each}}
            </tbody>
        </table>
        <a href="/form" class="btn btn-primary ">去添加</a>

    </div>
</body>

</html>

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"/>
    <title>Document</title>
</head>
<body>
    <div class="container">
        <form action="/doLogin" method="post" role="form">
            <legend>登录/注册页面</legend>

            <div class="form-group">
                <label for="">用户名</label>
                <input type="text" class="form-control" name="username" placeholder="请输入用户名">
            </div>
            <div class="form-group">
                <label for="">密码</label>
                <input type="password" class="form-control" name="pwd" placeholder="请输入密码">
            </div>
            <button type="submit" class="btn btn-success">登录</button> 
            <a class="btn btn-primary" href="/registered">快速注册</a>
        </form>

    </div>
</body>
</html>

registered.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"/>
    <title>Document</title>
</head>
<body>
    <div class="container">
        <form action="/doregistered" method="post" role="form">
            <legend>登录/注册页面</legend>

            <div class="form-group">
                <label for="">用户名</label>
                <input type="text" class="form-control" name="username" placeholder="请输入用户名">
            </div>
            <div class="form-group">
                <label for="">密码</label>
                <input type="password" class="form-control" name="pwd" placeholder="请输入密码">
            </div>
            <button type="submit" class="btn btn-success">注册</button> 
        </form>

    </div>
</body>
</html>