大家好,爱星物联已开源有段时间了,有些小伙伴可能不知道拿到源代码怎么玩转起来,今天将我这边的经验分享下给大家;
爱星物联的源代码开源在Github ubases,你可以通过以下命令克隆代码到本地;
克隆代码到本地
# 克隆平台服务代码
git clone https://github.com/ubases/ubases_iot_community.git
# 克隆前端云管平台代码
git clone https://github.com/ubases/ubases_iot_platform_web.git
# 克隆前端开放平台代码
git clone https://github.com/ubases/ubases_iot_open_web.git
# 克隆APP设备控制面板
git clone https://github.com/ubases/app-device-panel.git
先打开后端代码,了解项目接口,后端是微服务框架,里面已经提供了15个服务和2个服务脚手架项目
要运行项目之前你需要安装第三方服务,这里你可以参考,我的上一篇帖子《我用这个配置把云平台搭建起来了》
MySql、Clickhouse、Nats、Etcd、Redis、Zipkin、Vernemq
你也可以使用Docker方式将所有第三方服务都安装了,纤细可以参考代码目录的deploy中
就当我默认已经将所有服务都已经安装好了,接下来就可以修改配置文件,将服务运行起来了
找到目录bin/conf/open目录
配置文件中配置的容器部署的版本,我们先保留open,复制一份修改名称为local,并将.env文件修改为local
修改 *.yml 文件中的MySql、Clickhouse、Nats、Etcd、Redis、Zipkin、Vernemq、xxlJob的配置,主要大致配置都是一样子的,之前全局替换就好;
MySql
# 修改账号密码
database:
database: iot_app_build
driver: mysql
connstr: root:iLmz8sCXjkTYuh@tcp(mysql:3306)/iot_app_build?charset=utf8mb4&parseTime=True&loc=Local
Clickhouse
# 修改Clickhouse的账号密码
- database: iot_device
driver: clickhouse
connstr: clickhouse://default:123456@clickhouseServer:9000/iot_device?read_timeout=10s&write_timeout=20s
- database: iot_log
driver: clickhouse
connstr: clickhouse://default:123456@clickhouseServer:9000/iot_log?read_timeout=10s&write_timeout=20s
Nats
# 将nats-sesrver修改为你的IP
NATS:
addrs: ["nats://iLmz8sCXjkTYuh@nats-server:4222"]
Zipkin
#将zipkin修改你部署的Ip
zipkin:
url: http://zipkin:9411/api/v2/spans
Etcd
# 将etcd0修改为你部署的Ip
etcd:
address: ["etcd0:2379"]
username: "" password: ""
Redis
# Addrs: ["redis:6379"]修改为Addrs: ["你的IP:6379"]
redis:
Cluster: false
Addrs: ["redis:6379"]
Username:
Password: "iLmz8sCXjkTYuh" Database: 0
MinIdleConns: 5
IdleTimeout: 600
PoolSize: 10
MaxConnAge: 3600
邮件配置
# 根据你选择的邮箱配置
smtp:
host: smtp.exmail.qq.com
port: 465
#############用户名、密码已被删除,请本地用自己的邮箱测试############### userName: [email]XXXXXX@tech-now.com[/email]
password: XXXXXXX
connectTimeout: 10
sendTimeout: 10
helo: "XXX" keepAlive: true
exchange: false #exchange邮箱服务器要设置 authType: 0 #0:AuthPlain; 1:AuthLogin; 3:AuthCRAMMD5; 4:AuthNone ssl: 3 #0:NONE; 3:SSLTLS; 4:STARTTLS; 注意:1和2弃用 from: XXXXXXXXXXXXXXX
短信服务
# 根据你的阿里云短信参数配置
SMS:
provider: Aliyun
accessId: XXXXXXXXXXXXXXXXXXXXXX
accessKey: XXXXXXXXXXXXXXXXXXXXXXXXXXX
sign:
zh: XXX公司
en: "XXXXX"
other: [] #阿里国际短信10dlc
xxlJob
# 根据部署的xxljob进行配置
xxlJob:
enable: true
serverAddr: http://xxl-job-admin:8088/xxl-job-admin
accessToken: abchd@^&#^&uUU
executorIp: iot_statistics_service
executorPort: 9999
registryKey: jobs-statistics
天气服务
# openweather 平台注册获取apiKey
weather:
provider: openweathermap
apikey:
aqicnToken:
qps: 60
interval: 1800 #间隔秒数
IP服务
# appCode而需要修改为你自己阿里云账号购买授权码
ipService:
queryUrl: "https://ips.market.alicloudapi.com/iplocaltion?ip=" appCode: "APPCODE XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
oss
# 平台支持七牛、阿里云oss、亚马逊s3,根据自己选择修改
oss:
useOss: "qiniu"
imgStyle:
productImg: ""
qiniu:
Endpoint: "XXXXXX.YYYYYY.com"
AccessKeyID: "y11X6zb5rSjGZEJz3itOx7k_mi6-XXXXXXXXXXX"
AccessKeySecret: "KGZOrY-xkABwU5GVXJfohgbgEXXXXXXXXXXXXXX"
BucketName: "aithings-docs"
ali:
Endpoint: ""
AccessKeyID: ""
AccessKeySecret: ""
BucketName: ""
s3:
Endpoint: ""
AccessKeyID: ""
AccessKeySecret: ""
BucketName: ""
Region: "us-east-1"
以上配置文件都配置好了,之后,你可以运行了;
找到bin/build.bat,双击运行即可完成所有服务的编译;
编译完成之后,即可在当前目录下看到所有编译好的服务,将所有服务双击运行起来就可以了;
后端服务已运行起来,接下来将前端运行
前端需要nodejs就可以了,主要注意一下nodejs的版本时候18+,我这边的版本如下
先进入到具体前端项目,执行前端编译运行脚本:
npm install
# 运行之前请检查你的vue.config.js的接口地址
npm run serve
环境可以了,接下来就需要进行二次开发了;
下面我们进行二次开发,时间关系我们不做太复杂的扩展了, 这次就先给设备面板增加一个相关产品列表的接口吧;
这里涉及的服务有:
- APP接口服务:iot_app_api_service
- 产品服务:iot_product_service
- proto文件夹:iot_proto
产品服务增加数据查询方法:
我们需要定义方法的参数、返回值和rpc的方法
先找到*_model.proto文件, 定义请求和响应数据结构
rpc GetSimilarProductList(SimilarProductRequest) returns (OpmProductResponse)
SimilarProductRequest:上面定义的请求数据结构
OpmProductResponse:使用已有的响应数据结构,如果想要自定义也可以自己创建
定义好之后,使用平台提供goproto工具生成golang代码
这里有看到这个四个文件,说明已经成功了
方法已经定义完成,可以去产品服务中编写实现
进入到“iot_product_service/handler/opm_product_handler.go”,增加方法“GetSimilarProductList”,注意这里的方法需要和proto文件定义的方法一致,参数和返回值也需要保持一致,否则无法调用;
// GetSimilarProductList 相似产品列表
func (h *OpmProductHandler) GetSimilarProductList(ctx context.Context, req *proto.SimilarProductRequest, resp *proto.OpmProductResponse) error {
s := service.OpmProductSvc{Ctx: ctx}
data, err := s.GetSimilarProductList(req)
if err != nil {
resp.Code = service.ERROR
resp.Message = err.Error()
} else {
resp.Code = service.SUCCESS
resp.Message = "success"
resp.Data = data
}
return nil
}
进入到“iot_product_service/service/opm_product.go”,增加方法“GetSimilarProductList”
// GetSimilarProductList 获取相似产品列表
func (s *OpmProductSvc) GetSimilarProductList(req *proto.SimilarProductRequest) ([]*proto.OpmProduct, error) {
//检查并获取租户Id tenantId, err := CheckTenantId(s.Ctx)
if err != nil {
logger.Errorf("GetSimilarProductList : %s", err.Error())
return nil, err }
t := orm.Use(iotmodel.GetDB()).TOpmProduct do := t.WithContext(context.Background())
do = do.Where(t.TenantId.Eq(tenantId))
if req.ProductKey != "" {
do = do.Where(t.ProductKey.Eq(req.ProductKey))
}
if req.ProductId != 0 {
do = do.Where(t.Id.Eq(req.ProductId))
}
do = do.Where(t.TenantId.Eq(tenantId))
var list []*model.TOpmProduct list, err = do.Select(t.ALL).Find()
if err != nil {
logger.Errorf("GetSimilarProductList error : %s", err.Error())
return nil, err }
result := make([]*proto.OpmProduct, len(list))
for i, v := range list {
result[i] = convert.OpmProduct_db2pb(v)
}
return result, nil
}
服务已经编写完成,接下来进入到产品iot_app_api_service中创建接口;
进入到controls/product/apis/product_controller.go,编写gin接口方法
记得养成好习惯将接口描述编写清楚,方便后面的接口文档生成;
// GetSimilarProductList 获取相似产品列表
// @Summary 获取相似产品列表
// @Description
// @Tags 产品接口
// @Accept application/json
// @Param productKey query string true "产品Key"
// @Success 200 {object} iotgin.ResponseModel 成功返回值
// @Router /v1/platform/app/product/similarList [get]
func (ProductController) GetSimilarProductList(c *gin.Context) {
productKey := c.Query("productKey")
if productKey == "" {
iotgin.ResBadRequest(c, "productKey")
return }
ctx := controls.WithUserContext(c)
proList, err := rpc.ClientOpmProductService.GetSimilarProductList(ctx, &protosService.SimilarProductRequest{
ProductKey: productKey,
})
if err != nil {
iotgin.ResErrCli(c, err)
return }
//将proList.Data转换成前端需要的数据格式,我这里就偷个懒,直接原样返回了
//建议:根据自己的需求将返回值转换后返回给前端,这个可以避免不必要的数据返回
iotgin.ResSuccess(c, proList.Data)
}
进入到controls/router/router.go
admin.GET("/product/similarList", apis.Productcontroller.GetSimilarProductList)
至此,基于当前框架完成了一次二开,依葫芦画瓢你可以修改和新增任何功能;
如果你需要自己创建单独服务,可以将框架里面的脚手架复制一份,修改下名称和引用路径;
脚手架如下:
- iot_demo_service 普通服务项目脚手架
- iot_demo_api_service 接口服务项目脚手架
下面补充几点