一、发展前言


多人团队在初期的项目架构搭建的时候, 会合理的订立需求开发进度. 以便产品经理与项目负责人轻松把控项目进度.

但是项目中会出现这样一群人: "内部后台管理系统开发者". 他们独立于开发进度之外, 根据需求变更开发管理系统功能.

绝大多数公司内部的项目组在选择后台开发的时候, 应该都会遇到以下3种选型抉择:

  1. 可以选择前、后端分离减少后端技术依赖, 如: iview-adminvue-adminReact-adminant design pro等.

  2. 在公司内部有技术积累的情况下, 选择跨部门与后台开发组共享数据库; 可以保证由专门的人来进行定制开发.

  3. 大部分框架都有内置、扩展库提供admin功能, 开发者只需少量的学习就快速搭建后台管理系统.

    上述各类的选型上并无技术优劣! 但是从上述的内容实际上都是对开发者技能的熟练度、知识面较大挑战.

    可以从侧面发现我们使用的Lua语言在这块确实是短板, 并且在目前市面上也没有提出一个较为可靠的方案.

    我们必须从基础业务原型入手, 提供一份容易被开发人员轻松打磨的内置库. 这才是目前急切存在的硬性需求.

1. 明确定位


  • 安全角度: 做管理系统需要考虑更加细致的权限控制问题, 还要解决黑客针对后台登录的暴力破解实现签名;

  • 人员角度: 根据实际项目组人数, 后台开发者一般定位在(1~4)人. 尽可能的减少无用技术投入、加快工作产出;

  • 项目角度: 人员应该尽可能的直接向项目经理或产品尽量汇报, 减少人员工作汇报流程太长导致工作效率降低;

  • 管理角度: 尽可能减少跨部门、项目/技术组等进行技术联动, 减少无效沟通成本来加速项目开发效率;

2. 需求整理


  • 选择的开发者应该能直接对接需求/功能负责人, 可以根据项目的需求原型快速整理出管理后台原型.

  • 必须拥有合理的权限配置方案, 减少跨部门的复杂配置成本; 最好可以基于RBAC模型提供虚拟身份功能;

  • 需要提供国际化标准的语言切换功能, 真正的使用者可能会出现跨地域的情况; 大家统一都能快速上手;

二、基本介绍


admin库由layui + X-admin + template + httpd库提供底层支持. 目前包含如下特性:

  1. 提供双语种自动配置支持, 用户在开发的时候建议使用localekey作为相关名称自动由框架替换;

  2. 基于RBAC的权限管理模型, 内置提供了一套基于角色的菜单权限控制方案;

  3. 为使用者的页面开发内置了权限验证, 后台开发者可以享有更加安全、简单的开发成果;

  4. 支持图形化的菜单栏与导航栏项目的动态增加删除, 并且方便开发者手动进行层级功能的关联;

  5. 简单的多级菜单栏支持, 增减菜单栏的时候还可以轻松配置与修改菜单栏的前置icon;

  6. 用户可以将所有静态文件发布到各大CDN平台, 实现静态文件与渲染页面分离配置;

  7. 提供了很多配置参数, 如:设置默认语言、添加语言项、设置首页、开启模板缓存等等;

  8. 开发时候关闭模板缓存实现改模板不用重启进程, 上线后开启缓存开关轻松提升模板渲染效率;

  9. 其它更多, 静待发掘...

三、开始使用


请按照以下步奏初始化数据库:

  1. 启动MySQL数据库, 创建一个数据库(名字任意), 并且保持charset一致;

  2. 打开lualib/db/database.sql文件, 使用GUI工具中导入此文件后会自动创建admin库所需表结构;

  3. 配置admin库的所需的相关配置文件, 具体参考script内的示例文件;

1. admin.init_db


函数原型: admin.init_db()

此方法将会初始化超级管理员用户与管理员用户组, 账户、密码都是: admin;

2. admin.init_home


函数原型: admin.init_home(url)

此方法将设置dashboard的默认打开的home页地址url.

3. admin.init_page


函数原型: admin.init_page(app, db)

此方法将会注册admin库所用到的所有页面路由、接口路由.

app参数为httpd库的实例化对象, db参数为DB库的实例化对象.

4. admin.static


函数原型: admin.static(domain)

此方法可以用来设置静态文件域名前缀(默认是:/);

如果你配置的是域名, 则必须在后缀的结尾加上(/). 例如: https://cdn.baidu.com/;

5. admin.cached


函数原型: admin.cached()

此方法用来确认是否开启全局模板缓存.

开发阶段不建议开启, 否则会导致html模板被缓存需要重启才能更新;

6. admin.cookie_timeout


函数原型: admin.cookie_timeout(Second)

此方法用来设置admin库的Cookie超时时间, 可以认为这个时间就是用户登录失效时间(单位为: 秒).

默认情况下, 登录的cookie过期时间是1天, 语言配置cookie不改变的情况下永不过期;

7. admin.set_locale


函数原型: admin.set_locale(lang)

此方法用来设置默认显示语言, 目前参数lang的可选值为: 'ZH-CN''EN-US';

用户自行切换语言后, 浏览器将会记住用户选择语言. 所以仅在客户端第一次使用的时候默认一次即可.

8. admin.add_locale_item


函数原型: admin.add_locale_item(lang, lang_locale_itemt)

此方法用于增加与覆盖现有admin库内存在的locale, 它可以帮助我们了解如何非入侵式的配置locale;

第一个参数lang为用于修改的语言简码, 第二个参数lang_locale_itemt为需要修改与增加的字典数组;

通常情况下, 我们会在语言开发或配置的时候用到它. 下面是一个简单的使用示例:

admin.add_locale_item('ZH-CN', {
  {'login.form.title', '这是登录页Title'},
  {'dashboard.header.logo', '仪表盘 Logo'},
})

admin.add_locale_item('EN-US', {
  {'login.form.title', 'This is Login Page Title'},
  {'dashboard.header.logo', 'dashboard Logo'},
})

9. admin.display_lang


函数原型: admin.display_lang(enable)

此方法用来设置dashboard页面的是否显示语言切换标签(默认为显示).

当传递的参数enablefalsenil的时候, 登录后会隐藏语言切换标签按钮.

四、页面路由


admin库内置一份与httpd库类似的API不过更加严格, 它们仅要求调用者的权限必须真实有效.

1. 路由介绍


导入admin库的view路由需要使用admin.view来导入, 例如: local view = require 'admin.view'

view库内包含以下几种种方法:

  • view.use(path, callback) - 用于注册admin的后台页面路由.

  • view.api(path, callback) - 用于注册admin的后台接口路由.

  • view.home(path, callback) - 用于修改admin的首页页面路由.

  • view.get_locale() - 用于获取客户端的语言, 默认为: "ZH-CN".

  • view.get_cdn() - 获取静态文件路由头部, 默认为: "/".

  • view.template(template_path) - 用于将制定的模板渲染为页面路由的HTML.

2. 路由参数


当客户端请求来临时, 框架会为之前注册的页面路由或者接口路由回调方法注入两个参数:

  • ctx对象

  • db对象

    这两个对象的生命周期各不相同! ctx对象会在路由回调完成时销毁, db对象则会在整个服务器运行期间始终有效.

    ctx对象可以回去客户端请求发送的path, cookie, args, header等等. 具体请参考lualib/admin/httpctx.lua文件.

    db对象是一个已经在admin运行之前已经初始化的DB对象. 它在运行期间一定是可用, 否则可能是数据库连接异常.

3. 使用示例


-- 1. 页面路由
local view = require "admin.view"
view.use('/admin/test', function (ctx, db)
  return "this request method = " .. ctx:get_method()
end)
-- 2. 接口路由
local json = require "json"
local view = require "admin.view"
view.api('/api/admin/test', function (ctx, db)
  return json.encode({
    code = 200, method = ctx:get_method()
  })
end)
-- 3. HTML模板文件: views/admin.html
<html>
  <head>
    <title>{*title*}</title>
  </head>
  <body>
    <h1>{*title*}</h1>
  </body>
</html>
-- 4. HTML模板渲染
local view = require "admin.view"
view.use('/admin/test', function (ctx, db)
  return view.template("views/admin.html"){
    title = '这是title!'
  }
end)

五、开发实战


根据前面的基本介绍, 我们现在来简单做一些示例.

1. 添加单个菜单


开发者在登录成功后将会看到系统管理, 展开后将会看到"菜单管理"项, 点击"菜单管理"后可以进行即可按照实际情况新建一个菜单.

local view = require "admin.view"
view.use('/test', function (ctx, db)
  return "<h1>Hello World!</h1>"
end)

建立完成之后, 我们可以开始新建菜单了. 但是新建菜单可不是那么简单, 它至少需要你确认做以下三件事:

  1. 菜单名称(不能重复);

  2. 菜单路由(不能为空);

  3. 菜单图标(需要参考layui图标unicode);

    需要注意的是菜单路由对应的是你的页面路由, 如果有任何不匹配则可能会发生HTTP 404错误.

    在"菜单管理"新建完成之后请刷新当前页面, 如果错误的话您就可以在左侧菜单栏内看到新建的菜单了.

    这时候我们点击新建的菜单项, 就可以看到一个大大多"Hello World"了. 怎么样是不是非常简单?

2. 添加多级菜单


如果您参照上述步骤添加完菜单之后, 就会开始思考对菜单进行分级. 没错! 一级菜单一般会作为总项类项(例如:系统管理)来陈列.

当您项为某项菜单增加子菜单项的时候, 点击该菜单后面的增加"增加菜单". 其它内容按照上一章的内容规则新建菜单与路由即可.

不过大家需要注意的是:

  1. 最多添加三级菜单, 过多的(多级)菜单项对管理还是整合都是无意义的.

  2. 菜单管理项目内当你添加到三级菜单后, 将不会出现增加子菜单按钮.

3. 权限的配置


当您对菜单功能开发、测试完毕之后, 可能就会开始考虑"菜单权限分配".

admin库是基于RBAC建立的用户角色权限管理, 分离了用户(实体)与菜单(menu)、权限(permissions)之间的管理.

现在假设我们有如下菜单列表:

|-分析菜单
  |—分析用户
  |—分析数据
  |—分析金额

完成上述列表功能后, 可以进入"角色管理"开始创建"分析角色". 并展开菜单列表在对应菜单前面打'√'. 这样就建立了一个角色. (修改同理)

新建完角色之后, 到'用户管理'页面新建一个用户. 角色选择为"分析角色", 其它内容根据实际情况填写然后提交. (修改同理)

最后尝试使用新创建的用户登录后台, 这样就可以在页面上看到分析菜单并且进行操作.

六、最后


注意事项


  • 目前admin库只能支持单点登录, 修改用户信息与密码会导致该用户重新登录;

  • 请不用过多关注admin库性能, 您更需要关注自定义页面的性能与安全问题;

  • 如果您需要动静分离可以合理设置合理的设置admin.cachedhttpd:static;

  • 如需定制admin相关功能, 请联系作者了解更多库相关约定与配置;

Copyright © CandyMi 2019-2022 all right reserved,powered by Gitbook该文件修订时间: 2021-03-26 23:31:52

results matching ""

    No results matching ""