thinksboard新建菜单

1.打开目录\thingsboard\ui-ngx\src\app\modules\home\pages新增npages文件夹

2.新增npages.module.ts以及npages-routing.module.ts控制文件,以及页面展示文件npages.component.html,npages.component.scss,npages.component.ts

3.打开npages.component.ts文件,构建html和css绑定,生成npagesComponent,供下面使用


import { Component, OnInit } from '@angular/core';
import { UserService } from '@core/http/user.service';
import { AuthUser, User } from '@shared/models/user.model';
import { Authority } from '@shared/models/authority.enum';
import { PageComponent } from '@shared/components/page.component';
import { Store } from '@ngrx/store';
import { AppState } from '@core/core.state';
import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
import { HasConfirmForm } from '@core/guards/confirm-on-exit.guard';
import { ActionAuthUpdateUserDetails } from '@core/auth/auth.actions';
import { environment as env } from '@env/environment';
import { TranslateService } from '@ngx-translate/core';
import { ActionSettingsChangeLanguage } from '@core/settings/settings.actions';
import { ActivatedRoute } from '@angular/router';
import { isDefinedAndNotNull } from '@core/utils';
import { getCurrentAuthUser } from '@core/auth/auth.selectors';
import { AuthService } from '@core/auth/auth.service';@Component({selector: 'tb-npages',templateUrl: './npages.component.html',styleUrls: ['./npages.component.scss']
})
export class npagesComponent extends PageComponent implements OnInit, HasConfirmForm {authorities = Authority;profile: UntypedFormGroup;user: User;languageList = env.supportedLangs;private readonly authUser: AuthUser;constructor(protected store: Store<AppState>,private route: ActivatedRoute,private userService: UserService,private authService: AuthService,private translate: TranslateService,public fb: UntypedFormBuilder) {super(store);this.authUser = getCurrentAuthUser(this.store);}ngOnInit() {// this.buildProfileForm();// this.userLoaded(this.route.snapshot.data.user);}private buildProfileForm() {this.profile = this.fb.group({email: ['', [Validators.required, Validators.email]],firstName: [''],lastName: [''],phone: [''],language: [''],homeDashboardId: [null],homeDashboardHideToolbar: [true]});}save(): void {this.user = {...this.user, ...this.profile.value};if (!this.user.additionalInfo) {this.user.additionalInfo = {};}this.user.additionalInfo.lang = this.profile.get('language').value;this.user.additionalInfo.homeDashboardId = this.profile.get('homeDashboardId').value;this.user.additionalInfo.homeDashboardHideToolbar = this.profile.get('homeDashboardHideToolbar').value;this.userService.saveUser(this.user).subscribe((user) => {this.userLoaded(user);this.store.dispatch(new ActionAuthUpdateUserDetails({ userDetails: {additionalInfo: {...user.additionalInfo},authority: user.authority,createdTime: user.createdTime,tenantId: user.tenantId,customerId: user.customerId,email: user.email,phone: user.phone,firstName: user.firstName,id: user.id,lastName: user.lastName,} }));this.store.dispatch(new ActionSettingsChangeLanguage({ userLang: user.additionalInfo.lang }));this.authService.refreshJwtToken(false);});}private userLoaded(user: User) {this.user = user;this.profile.reset(user);let lang;let homeDashboardId;let homeDashboardHideToolbar = true;if (user.additionalInfo) {if (user.additionalInfo.lang) {lang = user.additionalInfo.lang;}homeDashboardId = user.additionalInfo.homeDashboardId;if (isDefinedAndNotNull(user.additionalInfo.homeDashboardHideToolbar)) {homeDashboardHideToolbar = user.additionalInfo.homeDashboardHideToolbar;}}if (!lang) {lang = this.translate.currentLang;}this.profile.get('language').setValue(lang);this.profile.get('homeDashboardId').setValue(homeDashboardId);this.profile.get('homeDashboardHideToolbar').setValue(homeDashboardHideToolbar);}confirmForm(): UntypedFormGroup {return this.profile;}isSysAdmin(): boolean {return this.authUser.authority === Authority.SYS_ADMIN;}
}

4.打开npages-routing.module.ts文件,引用npagesComponent组件,设置routes

import { Injectable, NgModule } from '@angular/core';
import { Resolve, RouterModule, Routes } from '@angular/router';
import { Authority } from '@shared/models/authority.enum';
import { Observable } from 'rxjs';
import { OAuth2Service } from '@core/http/oauth2.service';
import { npagesComponent } from './npages.component';
import { AlarmsMode } from '@shared/models/alarm.models';@Injectable()
export class OAuth2LoginProcessingUrlResolver implements Resolve<string> {constructor(private oauth2Service: OAuth2Service) {}resolve(): Observable<string> {return this.oauth2Service.getLoginProcessingUrl();}
}const routes: Routes = [{path: 'npages',component: npagesComponent,data: {auth: [Authority.TENANT_ADMIN, Authority.CUSTOMER_USER],title: 'npages.npages',breadcrumb: {label: 'npages.npages',icon: 'mdi:alert-outline'},isPage: true,alarmsMode: AlarmsMode.ALL}}
];@NgModule({imports: [RouterModule.forChild(routes)],exports: [RouterModule],providers: []
})
export class npagesRoutingModule { }

5.打开npages.module.ts文件,配置npages的module类,供外部调用

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { SharedModule } from '@shared/shared.module';
import { npagesComponent } from './npages.component';
import { HomeDialogsModule } from '../../dialogs/home-dialogs.module';
import { HomeComponentsModule } from '@modules/home/components/home-components.module';
import { npagesRoutingModule } from '@home/pages/npages/npages-routing.module';@NgModule({declarations: [npagesComponent],imports: [CommonModule,SharedModule,HomeComponentsModule,HomeDialogsModule,npagesRoutingModule]
})
export class NpagesModule { }

6.打开目录\thingsboard\ui-ngx\src\app\modules\home\pages文件下的home-pages.module.ts.添加新的菜单

import { NgModule } from '@angular/core';import { AdminModule } from './admin/admin.module';
import { HomeLinksModule } from './home-links/home-links.module';
import { ProfileModule } from './profile/profile.module';
import { SecurityModule } from '@home/pages/security/security.module';
import { TenantModule } from '@modules/home/pages/tenant/tenant.module';
import { CustomerModule } from '@modules/home/pages/customer/customer.module';
import { AuditLogModule } from '@modules/home/pages/audit-log/audit-log.module';
import { UserModule } from '@modules/home/pages/user/user.module';
import { DeviceModule } from '@modules/home/pages/device/device.module';
import { AssetModule } from '@modules/home/pages/asset/asset.module';
import { EntityViewModule } from '@modules/home/pages/entity-view/entity-view.module';
import { RuleChainModule } from '@modules/home/pages/rulechain/rulechain.module';
import { WidgetLibraryModule } from '@modules/home/pages/widget/widget-library.module';
import { DashboardModule } from '@modules/home/pages/dashboard/dashboard.module';
import { TenantProfileModule } from './tenant-profile/tenant-profile.module';
import { DeviceProfileModule } from './device-profile/device-profile.module';
import { ApiUsageModule } from '@home/pages/api-usage/api-usage.module';
import { EdgeModule } from '@home/pages/edge/edge.module';
import { OtaUpdateModule } from '@home/pages/ota-update/ota-update.module';
import { VcModule } from '@home/pages/vc/vc.module';
import { AssetProfileModule } from '@home/pages/asset-profile/asset-profile.module';
import { ProfilesModule } from '@home/pages/profiles/profiles.module';
import { AlarmModule } from '@home/pages/alarm/alarm.module';
import { EntitiesModule } from '@home/pages/entities/entities.module';
import { FeaturesModule } from '@home/pages/features/features.module';
import { NotificationModule } from '@home/pages/notification/notification.module';
import { AccountModule } from '@home/pages/account/account.module';
import { NpagesModule } from '@home/pages/npages/npages.module';@NgModule({exports: [AdminModule,HomeLinksModule,ProfileModule,SecurityModule,TenantProfileModule,TenantModule,DeviceProfileModule,AssetProfileModule,ProfilesModule,EntitiesModule,FeaturesModule,NotificationModule,DeviceModule,AssetModule,AlarmModule,EdgeModule,EntityViewModule,CustomerModule,RuleChainModule,WidgetLibraryModule,DashboardModule,AuditLogModule,ApiUsageModule,OtaUpdateModule,UserModule,VcModule,AccountModule,NpagesModule]
})
export class HomePagesModule { }

7.文字本地化处理,打开\thingsboard\ui-ngx\src\assets\locale\local.constant_zh_CN.json.自定义即可

8.打开C:\thinksboard\thingsboard-3.6\ui-ngx\src\app\modules\home\components\menu.service.ts文件,设置npages文件路径

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/34862.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最新AI智能聊天对话问答系统源码(详细图文搭建部署教程)+AI绘画系统,DALL-E3文生图, Whisper TTS 语音识别,文档分析

一、人工智能 随着人工智能技术的持续进步&#xff0c;AI绘画已经发展成为一个日益成熟的领域。越来越多的人开始尝试使用AI绘画软件来创作艺术作品。尽管这些AI绘画软件对绘画领域产生了显著影响&#xff0c;但它们并不会完全取代画师。与传统手绘不同&#xff0c;AI绘画可以…

【第2章】MyBatis-Plus代码生成器

文章目录 前言一、安装二、生成方式1.DefaultQuery (元数据查询)2.存在问题 三、快速生成1. 生成代码2. 目录结构 四、交互式总结 前言 全新的 MyBatis-Plus 代码生成器&#xff0c;通过 builder 模式可以快速生成你想要的代码&#xff0c;快速且优雅&#xff0c;跟随下面的代…

Pikachu 靶场 SSRF 通关解析

前言 Pikachu靶场是一种常见的网络安全训练平台&#xff0c;用于模拟真实世界中的网络攻击和防御场景。它提供了一系列的实验室环境&#xff0c;供安全专业人士、学生和爱好者练习和测试他们的技能。 Pikachu靶场的目的是帮助用户了解和掌握网络攻击的原理和技术&#xff0c;…

揭秘软文发稿秘诀:打造高效推广营销

你是否有在看一篇文章时&#xff0c;可能明知道它是一则广告但仍心甘情愿的继续了解下去&#xff0c;这样的文章大概率就是一篇软文&#xff0c;在当今信息爆炸的时代&#xff0c;软文作为一种有效的推广营销手段&#xff0c;已经成为各大企业、品牌争相使用的利器。然而&#…

关于VMware遇到的一些问题

问题一&#xff1a;打不开磁盘…或它所依赖的某个快照磁盘&#xff0c;开启模块DiskEarly的操作失败&#xff0c;未能启动虚拟机 解决方法&#xff1a; 首先将centos 7关机&#xff0c;然后把快照1删掉 然后打开虚拟机所在目录&#xff0c;把提示的000001.vmdk全部删除&…

Linux:系统引导过程与服务控制

目录 一、linux 系统引导过程 1.1、引导过程总览 1.2、系统初始化进程 &#xff08;centos 6和7 的区别&#xff09; 1.2.1、centos 6 的引导过程 init 进程 1.2.2、centos 7(systemd进程) 二、MBR、GRUB菜单、忘记密码故障修复 2.1、修复MBR扇区故障 模拟故障 重启…

迭代器模式观察者模式

文章目录 1.引出迭代器模式1.展示院系结构2.传统方式 2.迭代器模式解决院系结构展示问题1.基本介绍2.原理类图3.类图4.代码实现1.Department.java 存储信息的对象2.College.java 被迭代的类型接口3.ComputerCollege.java 被迭代的具体实现类&#xff0c;存储数据并将其在创建迭…

CNware虚拟化平台功能介绍:虚拟机业务连续性保护,确保核心业务持续运行,构筑稳健的数字防线

全球数字化转型的大潮中&#xff0c;虚拟化技术已成为企业IT架构的基石。据Gartner预测&#xff0c;到2026年&#xff0c;全球90%以上的组织将采用某种形式的虚拟化技术。虚拟化环境的广泛应用&#xff0c;不仅提升了资源利用率、降低了成本&#xff0c;更极大地增强了业务灵活…

“管式加热炉简单控制系统和串级控制系统设计与Matlab仿真”,高分资源,匠心制作,下载可用。强烈推荐!!!

“管式加热炉简单控制系统和串级控制系统设计与Matlab仿真”毕业设计&#xff0c;高分资源&#xff0c;匠心制作&#xff0c;下载可用。强烈推荐&#xff01;&#xff01;&#xff01; 1.控制目标 加热炉的任务是把原油加热到一定温度&#xff0c;以保证下道工艺的顺利进行。…

企业如何通过数据资产入表与融资加速数字化转型

数据作为五大生产要素之一&#xff0c;是数字经济发展的基础。如何对数据资产进行确权、核算和变现&#xff0c;已成为数字经济时代的难点和热点。随着“数据资产入表”的提出与实践&#xff0c;这一领域迎来了新的变化与机遇。 一、什么是数据资产入表 在我国&#xff0c;数据…

二种方法轻松提取音频中的钢琴声音

在音乐制作、音频编辑或是纯粹的音乐爱好者的世界里&#xff0c;有时我们需要从复杂的音乐编排中抽取出特定乐器的声音&#xff0c;比如那悠扬的钢琴旋律。这不仅能帮助我们更好地理解音乐的结构&#xff0c;还能在创作过程中提供灵感。本文将介绍两种简单有效的方法&#xff0…

如何在Windows 11上设置默认麦克风和相机?这里有详细步骤

如果你的Windows 11计算机上连接了多个麦克风或网络摄像头&#xff0c;并且希望自动使用特定设备&#xff0c;而不必每次都在设置中乱动&#xff0c;则必须将首选设备设置为默认设备。我们将向你展示如何做到这一点。 如何在Windows 11上更改默认麦克风 有两种方法可以将麦克…

第 28 篇 : SSH秘钥登录

1 生成秘钥 ssh-keygen -t rsa ls -a ./.ssh/一直回车就行了 2. 修改配置 vi /etc/ssh/sshd_config放开注释 公钥的位置修改 关闭密码登录 PubkeyAuthentication yes AuthorizedKeysFile .ssh/id_rsa.pub PasswordAuthentication no3. 下载id_rsa私钥, 自行解决 注意…

selenium爬取boss直聘招聘岗位数据

selenium爬取boss直聘招聘岗位数据 一、爬取流程二、完整代码一、爬取流程 先来看一下爬取到的数据情况: 再来看一下boss直聘的页面,这时需要我们已经完成了城市的选择,将岗位名称输入到搜索框中,点击搜索之后切换到第2页。这时我们将url复制。第2页的url为:https://www.…

Mybatis 系列全解(2)——全网免费最细最全,手把手教,学完就可做项目!

Mybatis 系列全解&#xff08;2&#xff09; 1. ResultMap结果集映射2. 日志2.1 日志工厂2.2 log4j 3. 分页3.1 实现SQL分页3.2 RowBounds 分页3.3 分页插件 4. 使用注解开发4.1 面向接口编程4.2 使用注解4.3 Mybatis 详细执行过程4.4 CRUD 增删改查 5. Lombok 1. ResultMap结果…

2-17 基于matlab的改进的遗传算法(IGA)对城市交通信号优化分析

基于matlab的改进的遗传算法&#xff08;IGA&#xff09;对城市交通信号优化分析。根据交通流量以及饱和流量&#xff0c;对城市道路交叉口交通信号灯实施合理优化控制&#xff0c;考虑到交通状况的动态变化&#xff0c;及每个交叉口的唯一性。通过实时监测交通流量&#xff0c…

【Text2SQL 论文】MCS-SQL:利用多样 prompts + 多项选择来做 Text2SQL

论文&#xff1a;MCS-SQL: Leveraging Multiple Prompts and Multiple-Choice Selection For Text-to-SQL Generation ⭐⭐⭐ arXiv:2405.07467 一、论文速读 已有研究指出&#xff0c;在使用 LLM 使用 ICL 时&#xff0c;ICL 的 few-shot exemplars 的内容、呈现顺序都会敏感…

设备智能化:中国星坤线缆组件的解决方案!

在当今快速发展的电子行业中&#xff0c;产品小型化和成本效益是制造商追求的两大目标。中国星坤端子电缆组件以其灵活性和高效性&#xff0c;为电子设备制造商提供了一种理想的解决方案。本文将探讨星坤端子电缆组件的优势以及其在不同电子设备中的应用。 端子线&#xff1a;小…

数学建模--Matlab求解线性规划问题两种类型实际应用

1.约束条件的符号一致 &#xff08;1&#xff09;约束条件的符号一致的意思就是指的是这个约束条件里面的&#xff0c;像这个下面的实例里面的三个约束条件&#xff0c;都是小于号&#xff0c;这个我称之为约束条件符号一致&#xff1b; &#xff08;2&#xff09;下面的就是上…

我的3次软考高项通关之旅

1、缘起 初次听说软考是在2022年下半年了&#xff0c;软考的高级分为很多种&#xff0c;我起先想报考高级架构师&#xff0c;但是架构师一年才考一次&#xff0c;如果一次考不过得再准备一年&#xff0c;时间对我来说太长了&#xff0c;于是我决定报考一年考两次的高项。对于国…