Egg.js+MongoDB+uni-app 开发小程序 (一) 项目后台基搭建

相关说明

Egg.js(以下简称Egg)

Express 是 Node.js 社区广泛使用的框架,简单且扩展性强,非常适合做个人项目。但框架本身缺少约定,标准的 MVC 模型会有各种千奇百怪的写法。Egg 按照约定进行开发,奉行『约定优于配置』,团队协作成本低。

Sails 是和 Egg 一样奉行『约定优于配置』的框架,扩展性也非常好。但是相比 Egg,Sails 支持 Blueprint REST API、WaterLine 这样可扩展的 ORM、前端集成、WebSocket 等,但这些功能都是由 Sails 提供的。而 Egg 不直接提供功能,只是集成各种功能插件,比如实现 egg-blueprint,egg-waterline 等这样的插件,再使用 sails-egg 框架整合这些插件就可以替代 Sails 了。

Egg的特性

  • 提供基于 Egg 定制上层框架的能力

  • 高度可扩展的插件机制

  • 内置多进程管理

  • 基于Koa开发,性能优异

  • 框架稳定,测试覆盖率高

  • 渐进式开发

MongoDB(4.2)

MongoDB是一个基于分布式文件存储 [1] 的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引

它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:

  • 面向集合存储,易存储对象类型的数据。

  • mongodb集群参考

  • 模式自由。

  • 支持动态查询。

  • 支持完全索引,包含内部对象。

  • 支持查询。

  • 支持复制和故障恢复。

  • 使用高效的二进制数据存储,包括大型对象(如视频等)。

  • 自动处理碎片,以支持云计算层次的扩展性。

  • 支持 Golang,RUBY,PYTHON,JAVA,C++,PHP,C#, NODE等多种语言。

  • 文件存储格式为BSON(一种JSON的扩展)。

  • 可通过网络访问。

Mongoose

Node.js 的MongoDB ORM

uni-app

uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)、快应用等多个平台。

DCloud公司拥有600万开发者用户,几十万应用案例、12亿手机端月活用户,数千款uni-app插件、70+微信/qq群。阿里小程序工具官方内置uni-app(详见),腾讯课堂官方为uni-app录制培训课程(详见),开发者可以放心选择。

uni-app在手,做啥都不愁。即使不跨端,uni-app也是更好的小程序开发框架(详见)、更好的App跨平台框架、更方便的H5开发框架。不管领导安排什么样的项目,你都可以快速交付,不需要转换开发思维、不需要更改开发习惯。

tree new bee

环境需求

Nodejs 建议选择 LTS 版本,最低要求 8.x
MongoDB 建议使用4.2版本
Redis 最新版本

安装及配置

nodejs 的安装请查看对应的官方文档

Egg 安装

$ mkdir egg-example && cd egg-example
$ npm init egg --type=simple
$ npm i
    ```
```JavaScript
$ npm run dev
$ open http://localhost:7001

MongoDB

提供linux RedHat(CentOS)安装示例:

CentOS 去掉sudo

创建 /etc/yum.repos.d/mongodb-org-4.2.repo

文件内容为:

[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc

安装基础

sudo yum install -y mongodb-org

安装控制

sudo yum install -y mongodb-org-4.2.10 mongodb-org-server-4.2.10 mongodb-org-shell-4.2.10 mongodb-org-mongos-4.2.10 mongodb-org-tools-4.2.10

启动

sudo systemctl start mongod

安装项目所需插件

1.egg-jwt 标准TOKEN生成校验
2.egg-mongoose MongoDB Nodejs ORM
3.egg-cors插件 跨域插件
4.egg-validate 数据校验插件
4.lodash JS函数库
5.momentjs JS时间处理函数库
6.request http处理包(貌似已弃用)
7.request-promise-native request promise化包(也可用nodejs自带)
8.stream-to-array,stream-wormhole egg上传内存销毁相关包

附package.json

  "devDependencies": {
    "autod": "^3.0.1",
    "autod-egg": "^1.1.0",
    "await-stream-ready": "^1.0.1",
    "egg-bin": "^4.11.0",
    "egg-ci": "^1.11.0",
    "egg-cors": "^2.2.3",
    "egg-jwt": "^3.1.7",
    "egg-mock": "^3.21.0",
    "egg-mongoose": "^3.3.0",
    "egg-validate": "^2.0.2",
    "eslint": "^5.13.0",
    "eslint-config-egg": "^7.1.0",
    "lodash": "^4.17.20",
    "moment": "^2.28.0",
    "request": "^2.88.2",
    "request-promise-native": "^1.0.9",
    "stream-to-array": "^2.3.0",
    "stream-wormhole": "^1.1.0"
  },

egg 插件配置文件 /config/plugin.js

'use strict';

/** @type Egg.EggPlugin */
exports.validate = {
    enable: true,
    package: 'egg-validate',
};
exports.mongoose = {
    enable: true,
    package: 'egg-mongoose',
};
exports.jwt = {
    enable: true,
    package: "egg-jwt"
};
exports.cors = {
    enable: true,
    package: 'egg-cors',
};

exports.redis = {
    enable: true,
    package: 'egg-redis',
};

egg 配置文件 /config/

/* eslint valid-jsdoc: "off" */

'use strict';

/**
 * @param {Egg.EggAppInfo} appInfo app info
 */
module.exports = appInfo => {
    /**
     * built-in config
     * @type {Egg.EggAppConfig}
     **/
    const config = exports = {};

    // use for cookie sign key, should change to your own and keep security
    config.keys = appInfo.name + '_1600096669632_8743';

    config.middleware = ['fm', 'errorHandler', 'responseFormatter', 'jwtErrorHandler'];
    // csrf 设置
    config.security = {
        csrf: {
            enable: false,
            ignoreJSON: true
        },
        domainWhiteList: ['http://localhost', 'http://127.0.0.1', '*']
    };
    // 跨域
    config.cors = {
        origin: '*',
        allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS',
        credentials: true,
    };
    // 小程序配置
    config.wxmpCf = {
        appid: '您的小程序APPID',
        secret: '您的小程序密钥'
    };
    // 项目可能回连接多个/多种数据库 这里我们默认只使用mp的MongoDB数据库
    config.mongoose = {
        clients: {
            basic: {
                url: 'mongodb://127.0.0.1:27017/您的数据库名称',
                options: {},
            },
            mp: {
                url: 'mongodb://127.0.0.1:27017/您的数据库名称2',
                options: {},
            }
        },
    };
    // 代理获取真实IP
    config.proxy = true;
    // 地图接口设置
    config.wmap = {
        amap: { key: '高德地图key' },
        txmap: { key: '腾讯地图key' }
    };
    // add your user config here
    const userConfig = {
        // myAppName: 'egg',
    };
    return {
        ...config,
        ...userConfig,
    };
};

项目目录结构

  • app 项目主目录
    • controller 控制目录
    • extend 扩展
    • libs 第三方代码
    • middlewear 中间件
    • model 数据库模型
    • public 静态文件
    • router 路由(路由太多的情况使用)
    • rules 数据校验文件
    • schedule 定时任务
    • service 服务
    • view 页面模板
      router.js 路由文件
  • config
    • config.default.js 项目配置文件
    • plugin egg插件
      app.js
      agent.js
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269