app目录结构
-
egg会依据此目录以及其对应的所有约定的子目录。及各个子目录对应的js文件名。构建一个应用的实例对象。该对象通常是在入口处使用,如Vue在main中使用,app更多是在router中使用。因为router解析后会为每个router分配一个ctx,相当于vue中的单页面实例this
-
相当于vue中Vue实例。各个页面中的this。对应egg中各自的ctx。区别是一个是单页面,一个是多页面
-
每个ctx是在路由被解析后但还没被分配具体控制器时就被分配了。同样,全局注入的中间件也是在此时执行。
-
全局注入的中间件 相当于vue-route中的beforEach, 在具体路由里使用,相当于vue页面中的beforeRouteEnter
config
-
相当于vue.config.js ,webpack.config.js等项目一系列的全局配置。如插件的注册plugins.js文件,模板文件的编译配置,相当于v-loader,css-loader。 中间件的注册,以及中间件参数的配置
-
config 的对象会注册在egg的底层架构上。如service。controller 等class类中。所以 可以在所有继承类的类文件中通过this来直接获取config配置
-
对app实例属性的配置扩展
-
plugin.js 中对应的就是vue中的Mixin混入。混入extend,middleware等一系列文件。是应用层面的混入。可以取自本地文件夹。也可以通过npm获取
-
extend是业务层面的混入
-
package.json中通过egg属性指定其framework对应的egg开发框架。
controller 文件视图数据的控制层
-
将视图模型与业务数据绑定。相当于vue中的script,区别是vue中的script只能单视图。而这是一组视图
-
每个js文件返回一个继承Controller类的class,都是一个组视图模型及相关业务数据的集合。
-
ctx.render函数渲染模板。类似于vue中的template。里面包含底层应用的所有全局属性。如helper,ctx,app等.也可以通过参数的形式传入值
extend
-
将js文件中的对象,以文件名方式,扩展到上下文实例对象上对应的属性名的对象上。
-
contxt-ctx,helper-ctx.helper, request:ctx-request, response:ctx-response,application-app,agent-agent
-
extend 是对上下文实例的扩展。
-
所有扩展的属性,在模板中使用{{ 扩展对象名.扩展属性 }}
中间件middleware
-
所谓的中间件,就是给使用者提供自定义过程。类似vue中的钩子函数。gulp中的管道插件等等
-
与service,extend,controller一样,会将目录文件夹下的js文件依据文件层级,在app对象上构建出对象属性
// add your middleware config here 全局注册中间件,所有的请求都会调用
config.middleware = [];
视图模板 view
-
全局或当前视图对象ctx能在模板里直接使用。类似vue中的template
-
模板可以是html或tpl文件
-
在模板中可以直接使用 javascript 条件语句。用<%--%>包裹
-
自动结构出上下文对象上的属性值。即凡是ctx对象上的属性都可以直接使用
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 + '_1620711317285_8121';
// add your middleware config here
config.middleware = [];
config.security = {
csrf: {
enable: false,
},
domainWhiteList: ['*']
};
config.mysql = {
// database configuration
client: {
// host
host: '***',
// port
port: '**',
// username
user: 'root',
// password
password: '***',
// database
database: '**',
timezone: "08:00"
},
// load into app, default is open
app: true,
// load into agent, default is close
agent: false,
};
config.cors = {
// origin: ctx => ctx.get('origin'),
domainWhiteList: ['http://127.0.0.1:9000', 'http://127.0.0.1:3000'],
credentials: true, //允许Cook可以跨域
allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS'
};
// add your user config here
const userConfig = {
// myAppName: 'egg',
};
//接口统一返回格式
config.responseJson = (data, code = 200, msg = '') => ({
data,
code,
msg
})
config.cluster = {
listen: {
path: '',
port: 7000,
hostname: '0.0.0.0',
}
};
config.session = {
key: 'SESSION_ID',
maxAge: 1800000, //过期时间 30分钟
httpOnly: true,
encrypt: true,
renew: true //延长会话有效期
}
return {
...config,
...userConfig,
};
};