# 其他说明
# 关于 ROOT 账号
ROOT 是dbmeta内置的开发者账号,它不存在于数据库中,而是硬编码在代码中。 ROOT 拥有一切权限。
准确来说ROOT没有任何权限,但是ROOT不鉴权,因此它所有操作畅通无阻。
ROOT的识别不仅通过用户名,还有id, ROOT内置id为0。应当避免业务用户主键也为0,应该是很容易避免的。
只有ROOT才有快捷编辑元数据的直通密道。
另外,若需要更改ROOT用户登录名或密码,可以通过配置:
md:
app:
root:
username: ROOT
password: 888888
WARNING
- 不建议更改ROOT名,对于不必更改的配置, 请保持dbmeta的约定
- 线上环境请务必更改ROOT密码!
# 关于dbmeta内置的几个特殊接口
# /app/config
系统配置接口。有些后端配置数据是需要共享到前端的。dbmeta在页面刷新加载时会先调用此接口拿到系统配置,然后完成页面的正确渲染。
前端调用此接口是同步调用
# /user/info
用户信息接口。默认的用户登录服务,提供如下几个用户信息字段:
{
"attrs":{},
"auths":[],
"avatar":"root",
"id":"0",
"roles":[],
"token":"cfcd208495d565ef66e7dff9f98764da",
"username":"ROOT"
}
如需扩展, 请自行实现LoginService接口类,并继承getInfo方法,返回自定义的用户信息类。
自定义的用户信息类只需要继承
LoginVO接口即可。
# /user/login
默认登录页的用户登录接口。采用最基本的账密登录。同样,如需扩展接口返回的数据,则自行实现LoginService接口类,
并继承setLogged方法, 返回自定义的用户信息类即可。
若登录页不能满足需求,则可通过自行设置登录路由,指向自定义登录页。即可,至于登录接口,可以继续用内置的
/user/login,也可以 自己写接口完成登录逻辑。
# /user/logout
登出接口。
# 关于登录状态的维持
dbmeta内置一个已登录用户池,也可以认为是会话池,存放在缓存中。若用户完成登录,则会缓存在此会话池中。考虑内存占用和实际情况,会话最多为 10000个,即最多1万个用户登录。
过期时间,默认7天。暂未提供配置覆盖。
WARNING
由于dbmeta避免增加第三方组件依赖,因此未使用redis作为用户登录信息缓存中间件,而是采用内存缓存。这会导致一个问题: 集群环境下,用户会话池无法共享。 如果开启多个服务节点,可能遇到登录时需要登录好几次才能成功的问题。这时,就需要自定义已登录用户的缓存位置了。
同样是通过LoginService接口实现自定义。需要稍微注意的是,如果改为存放到redis,那么LoginService中取用户,和存用户的地方都要配合改下。
# 关于错误页面
dbmeta内置了两个错误页面。401和404:


如果需要替换,则更换这两个路由指向的组件即可。具体参见这里: 传送门
# 关于前端其他注意事项
你需要开启: runtimeCompiler: true, 如果用的vue.config.js, 如下:
module.exports = {
runtimeCompiler: true
}
如果没用vue.config.js,而是直接webpack,那可能要研究下,怎么开启运行时编译了。
之所以需要开启运行时编译,是因为dbmeta内置的dialog弹窗是基于js动态创建的vue弹窗组件,而不是像ElementUI el-dialog那样,需要在
template中预设el-dialog标签。预设el-dialog我当时难以接受,所以利用运行时编译这个办法创建了一个纯js弹窗的方法。
八成也正是这个原因,dbmeta内置的弹窗打开后,用vue开发者工具无法调试。
这里忍不住吐槽下ElementUI的
el-dialog,必须通过预设el-dialog标签达到弹窗目的,这种方式我觉得非常不好:
- 导致不得不在当前业务组件中加上一个
visible属性控制弹窗显隐- 如果dialog中的内容不抽取成单独的组件,那么破坏了当前组件的单一原则。如果抽取单独组件,那弹窗内、外之间还得有数据互通,又不得不定义一些事件和属性来支持
- 使用体验不好, dialog应该是一个局部方法,是一个动作,这个动作需要的数据和行为应当封装在这个动作内,而不是污染当前组件全局。
但开启
runtimeCompiler也带来了一些问题。希望今后版本能找到更好的方法,解决这个问题。