【thingsboard】第一章 thingsboard新增后台模块实现curd(包含源码实现)

本文详细介绍了在thingsboard中如何新增后台模块,并实现了CRUD操作。涵盖了从控制器ProjectController到Service层ProjectService,再到实体类ProjectEntity和持久层ProjectRepository的一系列修改和实现过程。

1. 修改的文件

        modified:   application/src/main/java/org/thingsboard/server/controller/ProjectController.java
        modified:   common/dao-api/src/main/java/org/thingsboard/server/dao/project/ProjectService.java
        modified:   common/data/src/main/java/org/thingsboard/server/common/data/EntityType.java
        modified:   common/data/src/main/java/org/thingsboard/server/common/data/id/ProjectId.java
        modified:   common/data/src/main/java/org/thingsboard/server/common/data/project/Project.java
        modified:   dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java
        modified:   dao/src/main/java/org/thingsboard/server/dao/model/sql/ProjectEntity.java
        modified:   dao/src/main/java/org/thingsboard/server/dao/project/ProjectDao.java
        modified:   dao/src/main/java/org/thingsboard/server/dao/project/ProjectServiceImpl.java
        modified:   dao/src/main/java/org/thingsboard/server/dao/sql/project/JpaProjectDao.java
        modified:   dao/src/main/java/org/thingsboard/server/dao/sql/project/ProjectRepository.java

ProjectController.java 控制器

package org.thingsboard.server.controller;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.*;
import org.thingsboard.server.common.data.exception.ThingsboardException;
import org.thingsboard.server.common.data.id.ProjectId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.project.Project;
import org.thingsboard.server.dao.project.ProjectService;


import java.util.UUID;

import static org.thingsboard.server.controller.ControllerConstants.SYSTEM_AUTHORITY_PARAGRAPH;
import static org.thingsboard.server.controller.ControllerConstants.TENANT_AUTHORITY_PARAGRAPH;

@RestController
@RequestMapping("/api")
@Service
public class ProjectController extends BaseController {

    @Autowired
    private ProjectService projectService;

    @ApiOperation(value = "Get Tenant Customer by Customer title (getTenantCustomer)",
            notes = "Get the Customer using Customer Title. " + TENANT_AUTHORITY_PARAGRAPH)
    @RequestMapping(value = "/project", params = {"projectIdStr"}, method = RequestMethod.GET)
    @ResponseBody
    public Project findById(
        @ApiParam(value = "A string value representing the Project title.")
        @RequestParam String projectIdStr) throws ThingsboardException {
            try {
                ProjectId projectId = new ProjectId(UUID.fromString(projectIdStr));
                return projectService.findProjectsById(TenantId.SYS_TENANT_ID, projectId);
            } catch (Exception e) {
                System.out.println(e.getMessage());
                System.out.println("dddddddddddddd");
                throw handleException(e);
            }
    }

    @ApiOperation(value = "Get the Administration Settings object using key (getAdminSettings)",
            notes = "Creates or Updates the Administration Settings. Platform generates random Administration Settings Id during settings creation. " +
                    "The Administration Settings Id will be present in the response. Specify the Administration Settings Id when you would like to update the Administration Settings. " +
                    "Referencing non-existing Administration Settings Id will cause an error." + SYSTEM_AUTHORITY_PARAGRAPH)
    @PreAuthorize("hasAuthority('TENANT_ADMIN')")
    @RequestMapping(value = "/project", method = RequestMethod.POST)
    @ResponseBody
    public Project saveProject(
            @ApiParam(value = "A JSON value representing the Administration Settings.")
            @RequestBody Project project) throws ThingsboardException {
        try {
            project.setTenantId(getTenantId());
            project = checkNotNull(projectService.saveProject(TenantId.SYS_TENANT_ID, project));
            return project;
        } catch (Exception e) {
            throw handleException(e);
        }
    }

    @ApiOperation(value = "Get Tenant Customer by Customer title (getTenantCustomer)",
            notes = "Get the Customer using Customer Title. " + TENANT_AUTHORITY_PARAGRAPH)
    @RequestMapping(value = "/projects", params = {"projectIdStr"}, method = RequestMethod.GET)
    @ResponseBody
    public Project getProject(
            @ApiParam(value = "A string value representing the Customer title.")
            @RequestParam String projectIdStr) throws ThingsboardException {
        try {
            ProjectId projectId = new ProjectId(UUID.fromString(projectIdStr));
            return checkNotNull(projectService.findProjectById(projectId), "Customer with id [" + projectIdStr + "] is not found");
        } catch (Exception e) {
            System.out.println(e.getMessage());
            System.out.println("dddddddddddddd");
            throw handleException(e);
        }
    }
}

ProjectService.java

package org.thingsboard.server.dao.project;


import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.project.Project;
import org.thingsboard.server.common.data.id.ProjectId;

import java.util.Optional;

public interface ProjectService {

    Optional<Project> findProjectById(ProjectId projectId);

    Project findProjectsById(TenantId tenantId, ProjectId projectId);

    Project saveProject(TenantId tenantId, Project project);
}


EntityType.java

/**
 * Copyright © 2016-2022 The Thingsboard Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.thingsboard.server.common.data;

/**
// 增加了 PROJECT 这个类型
 * @author Andrew Shvayka
 */
public enum EntityType {
    TENANT, CUSTOMER,PROJECT, USER, DASHBOARD, ASSET, DEVICE, ALARM, RULE_CHAIN, RULE_NODE, ENTITY_VIEW, WIDGETS_BUNDLE, WIDGET_TYPE, TENANT_PROFILE, DEVICE_PROFILE, API_USAGE_STATE, TB_RESOURCE, OTA_PACKAGE, EDGE, RPC, QUEUE;
}

ProjectId.java

package org.thingsboard.server.common.data.id;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.thingsboard.server.common.data.EntityType;

import java.util.UUID;

@ApiModel
public final class ProjectId extends UUIDBased{

    private static final long serialVersionUID = 1L;

    @JsonCreator
    public ProjectId(@JsonProperty("id") UUID id) {
        super(id);
    }

    public static ProjectId fromString(String projectId) {
        return new ProjectId(UUID.fromString(projectId));
    }

}

ModelConstants.java

    public static final String USER_COLUMN_FAMILY_NAME = "user";
    public static final String USER_PG_HIBERNATE_COLUMN_FAMILY_NAME = "tb_user";
    **public static final String USER_PG_PROJECT_NAME = "project";**
    public static final String USER_TENANT_ID_PROPERTY = TENANT_ID_PROPERTY;
    public static final String USER_CUSTOMER_ID_PROPERTY = CUSTOMER_ID_PROPERTY;
    public static final String USER_EMAIL_PROPERTY = "email";
    public static final String USER_AUTHORITY_PROPERTY = "authority";
    public static final String USER_FIRST_NAME_PROPERTY = "first_name";
    public static final String USER_LAST_NAME_PROPERTY = "last_name";
    public static final String USER_ADDITIONAL_INFO_PROPERTY = ADDITIONAL_INFO_PROPERTY;

ProjectEntity.java

package org.thingsboard.server.dao.model.sql;


import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.annotations.TypeDef;
import org.thingsboard.server.common.data.OtaPackage;
import org.thingsboard.server.common.data.id.*;
import org.thingsboard.server.common.data.project.Project;
import org.thingsboard.server.common.data.rpc.Rpc;
import org.thingsboard.server.dao.model.BaseEntity;
import org.thingsboard.server.dao.model.BaseSqlEntity;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import org.thingsboard.server.dao.util.mapping.JsonStringType;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;

import java.util.UUID;

import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TENANT_ID_COLUMN;
import static org.thingsboard.server.dao.model.ModelConstants.USER_PG_PROJECT_NAME;

@Data
@EqualsAndHashCode(callSuper = true)
@Entity
@TypeDef(name = "json", typeClass = JsonStringType.class)
@Table(name = USER_PG_PROJECT_NAME)
public class ProjectEntity  extends BaseSqlEntity<Project> implements SearchTextEntity<Project> {

    private static final ObjectMapper mapper = new ObjectMapper();

    @Column(name = ModelConstants.WIDGETS_BUNDLE_TITLE_PROPERTY)
    private String title;

    @Column(name = OTA_PACKAGE_TENANT_ID_COLUMN)
    private UUID tenantId;

    public ProjectEntity() {
        super();
    }

    // 加上这两个 为什么实现 SearchTextEntity, 因为在保存数据的 调用了SearchTextEntity ,转为这个 SearchTextEntity 这个实例
    @Override
    public String getSearchTextSource() {
        return title;
    }

    @Override
    public void setSearchText(String searchText) {

    }


    @Override
    public Project toData() {
        Project project = new Project(new ProjectId(this.getUuid()));
        project.setTitle(title);
        project.setTenantId(TenantId.fromUUID(tenantId));
        project.setCreatedTime(createdTime);
        return project;
    }

    public ProjectEntity(Project project) {
        this.setUuid(project.getUuidId());
        this.tenantId = project.getTenantId().getId();
        this.createdTime = project.getCreatedTime();
        this.title = project.getTitle();
    }
}

ProjectDao.java

package org.thingsboard.server.dao.project;

import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.project.Project;
import org.thingsboard.server.dao.Dao;

import java.util.Optional;
import java.util.UUID;

public interface ProjectDao extends Dao<Project> {

    /**
     * Find customers by tenantId and customer title.
     *
     * @param projectId the projectId
     * @return the optional project object
     */
    Optional<Project> findProjectById(UUID projectId);

    /**
     * Save or update project object
     *
     * @param project the admin settings object
     * @return saved project object
     */
    Project save(TenantId tenantId, Project project);
}


ProjectServiceImpl.java

package org.thingsboard.server.dao.project;


import org.springframework.stereotype.Service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.server.common.data.id.ProjectId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.project.Project;
import org.thingsboard.server.dao.service.Validator;
import java.util.Optional;

@Service
@Slf4j
public class ProjectServiceImpl implements ProjectService {
    @Autowired
    private ProjectDao projectDao;



    @Override
    public Optional<Project> findProjectById(ProjectId projectId) {
        log.trace("Executing findProjectById [{}]", projectId);
        log.info("Executing findProjectById [{}]", projectId);
        return projectDao.findProjectById(projectId.getId());
    }

    @Override
    public Project findProjectsById(TenantId tenantId, ProjectId projectId) {
        log.trace("Executing findProjectsById [{}]", projectId);
        Validator.validateId(projectId, "Incorrect projectId " + projectId);
        return  projectDao.findById(tenantId, projectId.getId());
    }


    @Override
    public Project saveProject(TenantId tenantId, Project project) {
        log.trace("Executing saveAdminSettings [{}]", project);
        if (project.getTenantId() == null) {
            project.setTenantId(TenantId.SYS_TENANT_ID);
        }
        return projectDao.save(tenantId, project);
    }
}

ProjectServiceImpl

package org.thingsboard.server.dao.sql.project;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.project.Project;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.sql.ProjectEntity;
import org.thingsboard.server.dao.project.ProjectDao;
import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;


import java.util.Optional;
import java.util.UUID;

@Component
public class JpaProjectDao extends JpaAbstractSearchTextDao<ProjectEntity, Project> implements ProjectDao {

    @Autowired
    private ProjectRepository projectRepository;

    @Override
    protected Class<ProjectEntity> getEntityClass() {
        return ProjectEntity.class;
    }
    @Override
    protected JpaRepository<ProjectEntity, UUID> getRepository() {
        return projectRepository;
    }

    public Optional<Project> findProjectById(UUID projectId) {
        Project project = DaoUtil.getData(projectRepository.findProjectById(projectId));
        return Optional.ofNullable(project);
    }


    @Override
    public EntityType getEntityType() {
        return EntityType.PROJECT;
    }
}

JpaProjectDao

package org.thingsboard.server.dao.sql.project;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.project.Project;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.sql.ProjectEntity;
import org.thingsboard.server.dao.project.ProjectDao;
import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;


import java.util.Optional;
import java.util.UUID;

@Component
public class JpaProjectDao extends JpaAbstractSearchTextDao<ProjectEntity, Project> implements ProjectDao {

    @Autowired
    private ProjectRepository projectRepository;

    @Override
    protected Class<ProjectEntity> getEntityClass() {
        return ProjectEntity.class;
    }
    @Override
    protected JpaRepository<ProjectEntity, UUID> getRepository() {
        return projectRepository;
    }

    public Optional<Project> findProjectById(UUID projectId) {
        Project project = DaoUtil.getData(projectRepository.findProjectById(projectId));
        return Optional.ofNullable(project);
    }


    @Override
    public EntityType getEntityType() {
        return EntityType.PROJECT;
    }
}

ProjectRepository

package org.thingsboard.server.dao.sql.project;

import org.springframework.data.jpa.repository.JpaRepository;
import org.thingsboard.server.dao.model.sql.ProjectEntity;

import java.util.UUID;


public interface ProjectRepository extends JpaRepository<ProjectEntity, UUID> {

    ProjectEntity findProjectById(UUID projectId);

}

Thingsboard是一个开源的IoT平台,提供了许多基础功能,包括设备管理、数据可视化、规则引擎等。如果需要根据自己的业务需求进行二次开发,可以通过自定义插件、调用API或者直接修改源代码来实现。下面是基于Thingsboard源代码的CURD后端开发流程: 1. 安装并启动Thingsboard 首先需要安装并启动Thingsboard,可以参考官方文档进行操作。 2. 创建新的数据模型 在Thingsboard中,数据模型是指设备、传感器、属性等实体间的关系。如果需要添加新的实体,可以通过创建新的数据模型来实现。具体操作可以参考官方文档。 3. 创建新的REST API 在Thingsboard中,可以通过创建新的REST API来实现CURD操作。具体操作如下: (1)在源代码中创建新的Java类,继承AbstractWebsocketHandler类。 (2)在新的Java类中实现对应的HTTP请求处理方法,比如GET、POST、DELETE等。 (3)在新的Java类中实现对应的数据模型CURD操作,比如查询、新增、修改、删除等。 (4)在新的Java类中定义对应的路由信息,比如URL路径、请求方法等。 (5)在Thingsboard配置文件中定义新的REST API路由信息。 4. 测试新的REST API 完成以上步骤后,可以启动Thingsboard并测试新的REST API是否能够正常工作。可以使用Postman等工具进行测试,也可以在自己的应用中调用该API。 总的来说,通过自定义REST API可以实现Thingsboard的二次开发,满足不同业务需求。当然,需要注意的是,修改源代码可能会影响到系统的稳定性和可维护性,需要谨慎操作。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值