多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # 目录结构 ~~~bash ├── api // 接口 ├── config // 项目配置 │ ├─ development.config.env │ ├─ env.js │ └─ production.config.env ├── controllers // 接口逻辑 ├── logs // 日志输出 ├── middlewares // 中间件 ├── models // 表 ├── routes // 路由 ├── sql // sql语句 ├── utils // 通用方法 ├── test // 测试 ├── app.js // 入口文件 ├── .evt // 环境配置文件 ,不需要内容 ├── package.json └── README.md ~~~ <br> # api ~~~ import db from '../database/db.js' // 引入user的表结构 const todoModel = '../models/list.js' const TodolistDb = db.Todolist // 引入数据库 const Todolist = TodolistDb.import(todoModel) const getTodolistById = async (id) => { // 获取某个用户的全部todolist const todolist = await Todolist.findAll({ // 查找全部的todolist where: { user_id: id }, attributes: ['id','content','status'] // 只需返回这三个字段的结果即可 }) return todolist // 返回数据 } const createTodolist = async (data) => { // 给某个用户创建一条todolist await Todolist.create({ user_id: data.id, // 用户的id,用来确定给哪个用户创建 content: data.content, status: data.status }) return true } export default { getTodolistById, createTodolist } ~~~ <br> # config 加载配置 ~~~ // config/development.config.env PORT = 3000 # 数据库配置 DB_HOST=localhost DB_USER=root DB_PASS=123456 DB_NAME=todolist DB_PORT=3306 # 登录密钥 SECRET = vue-koa-demo ~~~ <br> ~~~ // config/env.js // 参考自 https://segmentfault.com/a/1190000010613033 var NODE_ENV = process.env.NODE_ENV || 'development' const path = require('path') const resolve = path.resolve const join = path.join const currentDir = resolve(__dirname) const rootDir = join(currentDir, '..') const dotenv = require('dotenv') // 读取默认配置文件 const globalDotEnv = dotenv.config({ path: join(rootDir, '.env'), silent: true // 如果找不到该文件,则不会抛出异常 }); // 读取环境变量对应的配置文件 const envDotEnv = dotenv.config({ path: join(currentDir, NODE_ENV + `.config.env`), silent: true }) // 合并变量 const allVars = Object.assign({}, { 'NODE_ENV': NODE_ENV }, globalDotEnv, envDotEnv) // 创建一个包含所有环境变量的新对象,并对每个值进行清理 const initialVariableObject = Object.keys(allVars) .reduce((memo, key) => { memo['process.env.' + key.toUpperCase()] = JSON.stringify(allVars[key]) return memo }, {}) export default initialVariableObject ~~~ <br> # controller ~~~ import todoList from '../api/todolist' const getTodolist = async (req, res, next) => { // 获取某个用户的所有todolist const id = req.params.id // 获取url里传过来的参数里的id const result = await todoList.getTodolistById(id) // 通过yield “同步”地返回查询结果 res.send(result) } const createTodolist = async (req, res, next) => { // 给某个用户创建一条todolist const data = req.body // post请求,数据是在request.body里的 const result = await todoList.createTodolist(data) res.send({ success: true }) } export default { getTodolist, createTodolist } ~~~ <br> # database 连接数据库 ~~~ // db.js import Sequelize from 'sequelize' const Todolist = new Sequelize( process.env.DB_NAME, // 数据库名 process.env.DB_USER, // 用户名 process.env.DB_PASS, // 用户密码 { host: process.env.DB_HOST, // 数据库使用mysql port: process.env.DB_PORT, // 数据库服务器ip dialect: 'mysql', // 数据库服务器端口 define: { timestamps: false // 取消Sequelzie自动给数据表加入时间戳(createdAt以及updatedAt) } } ) console.log('数据库链接成功'); export default { Todolist // 将Todolist暴露出接口方便Model调用 } ~~~ # model ~~~ // list.js export default function(sequelize, DataTypes) { return sequelize.define('list', { id: { type: DataTypes.INTEGER(11), allowNull: false, primaryKey: true, autoIncrement: true }, user_id: { type: DataTypes.INTEGER(11), allowNull: false, references: { model: 'user', key: 'id' } }, }, { tableName: 'list' }); }; ~~~ <br> # router ~~~ // index.js 'use strict' import auth from './auth' import api from './api' export default app => { app.use('/auth', auth) app.use('/api', api) } ~~~ ~~~ // api.js import express from 'express' import api from '../controller/todolist' const router = express.Router() router.get('/todolist/:id', api.getTodolist) router.post('/todolist', api.createTodolist) router.post('/todolist/:userId/:id', api.removeTodolist) router.post('/todolist/:userId/:id/:status', api.updateTodolist) module.exports = router; // 导出router规则 ~~~