ThingsBoard添加主题定制功能

B站演示地址https://www.bilibili.com/video/bv1RV41177Gb
此文具体代码在文末语雀链接,需额外付费

效果演示

https://www.bilibili.com/video/bv1RV41177Gb

说明:由于CE版没有权限功能,所以不能主题定制功能不能细分到每个用户一套主题。
本文实现的是:定制主题绑定租户,租户管理员和客户用户继承所属租户的主题,且租户管理员可修改主题;不同租户下的租户管理员和客户用户登录后分别显示自己的主题。这个效果在视频中有演示。
后面会发布关于登录界面的主题定制功能,可为每个租户设置专有域名和对应的登录界面。俩者结合就可以做到,对租户界面的特有定制,不同租户都拥有属于自己的UI界面。

资料

ngrx/store
angular canDeactivate
angular canDeactivate CSDN介绍
angular FormBuilder
angular FormGroup
Material Design 组件库 for Angular
material design icons

思路

  1. 新建菜单组件,ui-ngx/src/app/modules/home/pages/custom-ui/custom-ui.component.ts,scss,html
  2. 添加菜单路由, ui-ngx/src/app/modules/home/pages/home-settings/home-settings-routing.module.ts
    image.png
    其中:canDeactivate: [ConfirmOnExitGuard] 是离开页面时,做出逻辑判断,即下图效果。
    image.png
    实现此效果需要在组件内实现HasDirtyFlag接口,并定义isDirty变量,值为true显示未保存提示,false不显示。自己根据表单控制。详细代码在文末。
  3. 在模块声明组件,ui-ngx/src/app/modules/home/pages/home-settings/home-settings.module.ts
    image.png
  4. 组件表单内容构建,其中图片上传组件可以参考ThingsBoard图片上传组件功能拓展,采用的是tb源码内置的组件
    image.png
  5. 国际化,ui-ngx/src/assets/locale/locale.constant-zh_CN.json中加入国际化信息
  6. 后端接口开发,无需额外建表,主题信息保存到租户的额外信息中。
  7. 前端请求服务开发,为了方便,还是定义到了ui-ngx/src/app/core/http/dashboard.service.ts 和文章的位置一样
  8. store相关开发,ui-ngx/src/app/core/core.state.ts,src/app/core/ui。
    1. 在app.component.ts初始化时请求当前登录用户对应租户的主题信息,没有则展示原始主题。并通过store订阅主题状态,改变则重新渲染。
    2. 登录成功后也需要请求一次后端主题信息,因为退出登录到重新登录,app组件不会再次初始化。
    3. home.component.ts也通过store订阅主题状态,用于改变logo和左下角的平台信息

具体代码

添加下面的代码即可实现此功能。
为减少文章篇幅,优化阅读体验,代码请滚动查看。
内容确实有点多,如果发现有整理遗漏的地方,请联系告知。

新建菜单组件

ui-ngx/src/app/modules/home/pages/custom-ui/下新建
custom-ui.component.ts

import {
    AfterViewInit, Component, OnInit } from '@angular/core';
import {
    FormBuilder, FormGroup } from '@angular/forms';
import {
    environment as env } from '@env/environment';
import {
    TranslateService } from '@ngx-translate/core';
import {
    DashboardService } from '@core/http/dashboard.service';
import {
    UIInfo } from '@shared/models/dashboard.models';
import {
    Store } from '@ngrx/store';
import {
    AppState } from '@core/core.state';
import {
    ActionTenantUIChangeAll } from '@core/ui/tenant-ui.actions';
import {
    HasDirtyFlag } from '@core/guards/confirm-on-exit.guard';
import {
    TenantUIState } from '@core/ui/tenant-ui.models';
import {
    PageComponent } from '@shared/components/page.component';
import {
    initialState } from '@core/ui/tenant-ui.reducer';

@Component({
   
  selector: 'tb-custom-ui',
  templateUrl: './custom-ui.component.html',
  styleUrls: <
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fool_dawei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值