gaowei1012 / blog

this is blog
2 stars 0 forks source link

koa项目工程化 #22

Open gaowei1012 opened 4 years ago

gaowei1012 commented 4 years ago

koa项目工程化,搭建属于自己的开发利器!

. ├── app.js ├── config │   └── index.js ├── constant │   └── constant.js ├── controller │   ├── exportExcle.js │   ├── orders.js │   ├── pay.js │   └── upload.js ├── db │   ├── init.js │   └── mysql.js ├── router │   ├── exportExcle.js │   ├── orders.js │   ├── pay.js │   └── upload.js └── utils └── parseXML.js

gaowei1012 commented 4 years ago
// app.js

const Koa = require('koa')
const cors = require('koa-cors');
const logger = require('koa-logger')
const bodyParser = require('koa-bodyparser');
const session = require('koa-session-minimal')
const MysqlStore = require('koa-mysql-session')
const { port, host, database } = require('./config')

// mysql session
const sessionMysqlConfig = {
    user: database.USERNAME,
    password: database.PASSWORD,
    database: database.DATABASE,
    host: database.HOST
}

const app = new Koa()

// middlwares
app
    .use(session({ key: 'USER_SID', store: new MysqlStore(sessionMysqlConfig) }))
    .use(bodyParser({
        enableTypes: ['json', 'form', 'text'],
        extendTypes: {
            text: ['text/xml', 'application/xml']
        }
    }))
    .use(logger())

// 处理跨域
app.use(cors());

// router
app
    .use(require('./router/orders').routes())
    .use(require('./router/exportExcle').routes())
    .use(require('./router/pay').routes())
    .use(require('./router/upload').routes())

app.listen(port, () => {
    console.log(`http://${host}:${port}`)
})
gaowei1012 commented 4 years ago

// utils 工具文件
gaowei1012 commented 4 years ago


// router.js

// 上传文件 路由
const router = require('koa-router')()
const constroller = require('../controller/upload')

router.post('/api/upload/fileUpload', constroller.addUploadImg)

module.exports = router

//
gaowei1012 commented 4 years ago
// controller

// upload.js

const OSS = require('ali-oss')
const xss = require('xss')
const path = require('path')
const { oss } = require('../config/index')
const UplaodFile = require('../db/mysql')

let client = new OSS({
    region: oss.region, // 阿里云对象存储域名
    accessKeyId: oss.accessKeyId, // api 接口id
    accessKeySecret: oss.accessKeySecret, // api 接口密码
    bucket: oss.bucket, // bucket 名称
})

// 长传图片
exports.addUploadImg = async (ctx, next) => {
    let { title, type, detail } = ctx.request.body

    let files = ctx.request.files
    let img = []

    files.forEach((elm, index) => {
        img.push({
            name: elm.originalname,
            url: oss.url + elem.originalname // 1.使用图片上传阿里云,前提是你开通了阿里云对象存储,也创建了bucket(适合开通服务器,并且开通阿里云对象存储的人群)
            // url: 'http://123.56.119.218/server/public/images/' + elem.originalname // 2.图片上传nginx服务器(用nginx服务器存放静态资源,适合开通服务器,没有开通阿里云对象存储的人群)
            // url: 'http://localhost:3000/images/' + elem.originalname // 3.本地开发,图片上传到本地server/public目录中的images文件夹(适合本地启动,即没有开通任何阿里云服务产品)
        })
    })

    // 上面三种情况,仅第1种上传阿里云时,需要执行下面的img.froeach循环,其他两种情况下注释即可
    img.forEach(async (elem, index) => {
      await client.put('images/' + elem.name, path.join(__dirname, '../public/images/') + elem.name)
    })

    // 防 xss 攻击
    title = xss(title)
    detail = xss(detail)
    let create_at = new Date()
    let url = ''
    if ((title && detail && type) !== null) {
        await UplaodFile.insertFile([detail, title, type, url, create_at])
            .then(ret => {
                ctx.body = {
                    code: 1,
                    message: '保存成功',
                    data: ret
                }  
            })
            .catch(err => {
                ctx.body = {
                    code: -2,
                    message: '保存失败',
                    data: err
                }
            })
    } else  {
        ctx.body = {
            code: -2,
            message: '字段非法'
        }
    }
}
gaowei1012 commented 4 years ago
// db

// init.js

const orders = `
    create table if not exists orders(
        id INT NOT NULL AUTO_INCREMENT,
        username VARCHAR(100) NOT NULL COMMENT '用户名',
        phone VARCHAR(100) NOT NULL COMMENT '用户手机号',
        age VARCHAR(50) NOT NULL COMMENT '用户年龄',
        sex VARCHAR(50) NOT NULL COMMENT '用户性别',
        measure VARCHAR(50) NOT NULL COMMENT '用户尺码',
        address VARCHAR(50) NOT NULL COMMENT '用户地址',
        people VARCHAR(50) NOT NULL COMMENT '注册人数',
        order_status VARCHAR(50) NOT NULL COMMENT '订单状态',
        create_at VARCHAR(100) NOT NULL COMMENT '用户创建时间',
        PRIMARY KEY(id)
    ) character set = utf8;
`

module.exports = {
    orders
}

//mysql.js
const mysql = require('mysql')
const { database } = require('../config')
const { orders } = require('./init')

const pool = mysql.createPool({
    host: database.HOST,
    user: database.USERNAME,
    password: database.PASSWORD,
    database: database.DATABASE,
    port: database.PORT
})

// 创建数据库连接
const query = (sql, values) => {
    return new Promise((resolve, reject) => {
        pool.getConnection((err, connection) => {
            if (err) {
                reject(err)
            } else {
                connection.query(sql, values, (err, rows) => {
                    if (err) {
                        reject(err)
                    } else {
                        resolve(rows)
                    }
                    connection.release()
                })
            }
        })
    })
}

// 创建表
const createTable = (sql) => {
    return query(sql, [])
}

createTable(orders)

// 操作数据
exports.insertOrder = (val) => {
    const _sql = 'insert into orders set username=?, phone=?, age=?, sex=?, measure=?, address=?, people=?, order_status=?, create_at=?';
    return query(_sql, val)
}