# 其他说明

# 关于 ROOT 账号

ROOT 是dbmeta内置的开发者账号,它不存在于数据库中,而是硬编码在代码中。 ROOT 拥有一切权限。

准确来说ROOT没有任何权限,但是ROOT不鉴权,因此它所有操作畅通无阻。

ROOT的识别不仅通过用户名,还有id, ROOT内置id为0。应当避免业务用户主键也为0,应该是很容易避免的。

只有ROOT才有快捷编辑元数据的直通密道。

另外,若需要更改ROOT用户登录名或密码,可以通过配置:

md:
  app:
    root:
      username: ROOT
      password: 888888

WARNING

  1. 不建议更改ROOT名,对于不必更改的配置, 请保持dbmeta的约定
  2. 线上环境请务必更改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: img.png

img.png

如果需要替换,则更换这两个路由指向的组件即可。具体参见这里: 传送门

# 关于前端其他注意事项

你需要开启: 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标签达到弹窗目的,这种方式我觉得非常不好:

  1. 导致不得不在当前业务组件中加上一个visible属性控制弹窗显隐
  2. 如果dialog中的内容不抽取成单独的组件,那么破坏了当前组件的单一原则。如果抽取单独组件,那弹窗内、外之间还得有数据互通,又不得不定义一些事件和属性来支持
  3. 使用体验不好, dialog应该是一个局部方法,是一个动作,这个动作需要的数据和行为应当封装在这个动作内,而不是污染当前组件全局。

但开启runtimeCompiler也带来了一些问题。希望今后版本能找到更好的方法,解决这个问题。

Last Updated: 5/17/2022, 3:19:38 PM