好记性不如烂,看了几天stf的源码,记录总结一下。
启动命令是:stf local, 在终端输入该命令,项目就启动起来了。 stf是该项目设置的一个命令,就好像npm一样。在终端输入:stf --help 就可以看到都有哪些命令
/bin 是项目的启动文件,查看文件内容,最终我们定位到了lib/cli/index.js。然后,不知道在哪里配置的,或者是什么机制,通过local命令,我们启动项目使用的配置参数用的是lib/cli/local/index.js中配置的参数。
stf有多种登录方式,通过stf local命令,启动的是mock 方式,这个在lib/cli/local/index.js有写,如下图所示
我们在启动的时候,我们可以修改这里的默认的登录方式,或者在启动时通过命令修改,采用ldap方式登录,启动时输入:stf local --auth-type ldap 即可
/lib 是后端代码
项目启动后(我们采用stf local命令启动,登录方式是默认的mock方式),在浏览器中输入http://localhost:7100 ,传到服务器,如果还未登录,就会被后端的拦截器拦住。在lib/cli/auth/mock.js中79行可以找到如下代码,登录后就会被路径为“/”的路由器拦截,然后重定向到路径为“/auth/mock/”的路由器,然后返回index页面。
app.get('/', function(req, res) {
res.redirect('/auth/mock/')
})
app.get('/auth/mock/', function(req, res) {
res.render('index')
})
然后就是前端的代码了 /res 是前端web的代码
不知道什么规则,然后返回的前端页面应该就是/res/auth/mock模块了,指的应该是/views了,我们看里面的代码
首先是/views/index.pug 里面的ng-app = “app”指令定义了一个名为app的angularJS应用程序,然后是/mock/scripts/entry.js文件,在文件中
angular.module('app', [
'ngRoute',
'ngTouch',
require('gettext').name,
require('./signin').name
])
为app模块引入了别的文件,其中就包括/signin下的所有文件,我们再回到/views/index.pug文件,第9行代码,div(ng-view),ng-view命令的意思就是把/mock/scripts/signin/signin.pug文件内容放到这个div中。在登录页面点击提交时,就触发了SignInCtrl中的submit方法,代码中访问了/auth/api/v1/mock后端方法,然后就被拦截器拦截
app.post('/auth/api/v1/mock', function(req, res) {
var log = logger.createLogger('auth-mock')
log.setLocalIdentifier(req.ip)
switch (req.accepts(['json'])) {
case 'json':
requtil.validate(req, function() {
req.checkBody('name').notEmpty()
req.checkBody('email').isEmail()
})
.then(function() {
log.info('Authenticated "%s"', req.body.email)
var token = jwtutil.encode({
payload: {
email: req.body.email
, name: req.body.name
}
, secret: options.secret
, header: {
exp: Date.now() + 24 * 3600
}
})
res.status(200)
.json({
success: true
, redirect: urlutil.addParams(options.appUrl, {
jwt: token
})
})
})
.catch(requtil.ValidationError, function(err) {
res.status(400)
.json({
success: false
, error: 'ValidationError'
, validationErrors: err.errors
})
})
.catch(function(err) {
log.error('Unexpected error', err.stack)
res.status(500)
.json({
success: false
, error: 'ServerError'
})
})
break
default:
res.send(406)
break
}
})
如果验证通过就进入stf中了