前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >插件框架web-platform 如何开发前端界面

插件框架web-platform 如何开发前端界面

作者头像
用户2936994
发布2022-07-21 13:53:25
4560
发布2022-07-21 13:53:25
举报
文章被收录于专栏:祝威廉祝威廉

正常前后端是独立开发的,一般而言前端使用reactjs/vuejs,独立部署在nginx服务器上。web-platform目前支持前者,当然也支持直接打包前端到web-platform插件里,这样就没有前端部署的烦恼。值得一提的是,因为有sfcli工具的支持,前端同学也可以很容易启动后端的web服务,方便在本地测试。 web-platform现阶段默认集成reactjs支持。

本文目标:

开发一个简单的的带有web界面的插件

基础知识

大家可以先看这篇文章了解一个插件的流程

祝威廉:如何基于web-platform开发一个插件

开发过程

首先,使用sfcli 创建插件:

代码语言:javascript
复制
sfcli create --name ar_runtime_web_console --include_ui

--include_ui 指示需要创建前端页面。你需要在系统中安装create-react-app命令。系统创建完成后,根目录下会多一个web_console目录,该目录是一个标准的reactjs项目。

后端部分

先提供一个Action,方便前端调用测试:

代码语言:javascript
复制
/**
 * Action logical
 */
class HelloWorldAction extends CustomAction {
  override def run(params: Map[String, String]): String = {
    JSONTool.toJsonStr(Map("msg" -> "hello world"))
  }
}

/**
 * Action Info
 */
object HelloWorldAction {
  def action = "hello_world"

  def plugin = PluginItem(HelloWorldAction.action,
    classOf[HelloWorldAction].getName, PluginType.action, None)
}

现在可以访问 http://127.0.0.1:9007/run?action=hello_world 得到结果了。在安装插件时,我们需要告诉应用容器如何加载这个静态资源。这个可以通过实现CustomApp接口实现:

代码语言:javascript
复制
class ArRuntimeWebConsoleApp extends CustomApp {
  override def run(params: Map[Any, Any]): Any = {
    if (ServiceFramwork.injector == null) return ""
    val httpServer = ServiceFramwork.injector.getInstance(classOf[HttpServer])
    val server = ReflectHelper.field(httpServer, "server").asInstanceOf[Server]
    val server_handler = server.getHandler.asInstanceOf[HandlerList]

    if (!ReflectHelper.field(server_handler, "_mutableWhenRunning").asInstanceOf[Boolean]) {
      ReflectHelper.field(server_handler, "_mutableWhenRunning", true)
    }
    val resource_handler = new ResourceHandler
    resource_handler.setDirectoriesListed(false)
    val webDir = this.getClass().getClassLoader().getResource(PluginDB.plugin_name).toExternalForm()
    resource_handler.setResourceBase(webDir);
    val origin = server_handler.getHandlers.filterNot { item =>
      item.isInstanceOf[ResourceHandler] && item.asInstanceOf[ResourceHandler].getBaseResource.getName.split("/").last == PluginDB.plugin_name
    }
    server_handler.setHandlers(Array(resource_handler) ++ origin);

  }

  override def phase: StartupPhase = BeforeHTTPPhase
}

object ArRuntimeWebConsoleApp {
  def action = PluginDB.plugin_name

  def plugin = PluginItem(ArRuntimeWebConsoleApp.action,
    classOf[ArRuntimeWebConsoleApp].getName, PluginType.app, Option(AfterHTTPPhase))
}

该代码主要是往已有的http容器里动态添加了一个静态资源处理器。代码有点hacker,理论上其他项目拷贝过去就行。

到目前为止,后端已经开发完成。

前端部分

新建一个Hello.js:

代码语言:javascript
复制
import React from 'react'
import {Action,Method,Backend} from '@allwefantasy/web-platform-ui'


export default class Hello extends React.Component{
    constructor(props) {
        super(props)
        this.state = {}
    }
        
    componentDidMount(){
       const backend = new Backend()       
       backend.request(Action.HELLO,Method.GET,{},(s)=>{           
           this.setState({hello:s.msg})
       },(s)=>{})
    }

    render(){
    return <div>{this.state.hello}</div>
    }
    
}

其中@allwefantasy/web-platform-ui 库是我开发的一个辅助库,利用里面的backend可以直接访问后端。

将Hello放到 App.js里。前端开发完成。

发布成插件(并运行)

打包:

代码语言:javascript
复制
sfcli release

启动一个应用容器:

代码语言:javascript
复制
sfcli create --name test-project --empty true
cd test-project
sfcli runtime

安装插件:

代码语言:javascript
复制
sfcli plugin 
--add ar_runtime_web_console-bin_2.11-1.0.0.jar 
--token xxxxxx

访问地址:

代码语言:javascript
复制
http://127.0.0.1:9007/ar_runtime_web_console/index.html

其中ar_runtime_web_console为插件名称。

页面如下:

插件代码看这里:

https://github.com/allwefantasy/ar_runtime_web_console

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档