WeBASE实训插件方案

    2 插件使用形态

    WeBASE实训插件方案主要的目的是:将WeBASE管理台的部分功能作为插件嵌入到具体的实训系统中,辅助实训系统完成其区块链相关的一些实训功能。

    1. 侧边栏默认收起
    2. 陆页面获取参数配置,根据配置判断是否支持iframe嵌入,允许哪些域名嵌入deploy
    3. 满足iframe嵌入的条件下,如果是iframe嵌入,则自动登录
    4. 自动登录的用户取消使用引导
    5. 自动登录的用户隐藏修改密码功能(包括首次登陆、右上角修改密码入口)
    6. 自动登录跳转到指定的router

    4 使用方法和二次开发

    使用到的子系统有WeBASE-Front、WeBASE-Node-Manager、WeBASE-Sign、 WeBASE-Web。WeBASE-Web使用dev-sx分支,WeBASE-Front、WeBASE-Node-Manager、WeBASE-Sign 使用v1.5.1及上版本。

    4.2.1 WeBASE-Node-Manager数据库中插入参数设置数据,脚本如下:

    1. INSERT INTO `tb_config`(`config_name`, `config_type`, `config_value`, `create_time`, `modify_time`) VALUES ('IframeSupportHostList', 3, 'baidu.com|163.com', '2020-09-22 17:14:23', '2020-09-22 17:14:23');

    其中,SupportIframe设置为1,表示开启iframe嵌入支持;IframeSupportHostList为iframe嵌入支持的host白名单列表。

    1. http://127.0.0.1:5001/WeBASE-Node-Manager/config/list?type=2

    4.2.2 WeBASE-Node-Manager配置

    修改webase-node-manager/conf/application.yml。

    • 修改constant.permitUrlArray:
    1. permitUrlArray: /account/login,/account/pictureCheckCode,/login,/user/privateKey/**,/config/encrypt,/config/version,/front/refresh,/api/*,/config/list
    • 修改constant.verificationCodeMaxAge,设置为与你的系统的session时间一致。
    • 修改constant.enableVerificationCode=false,设置为false,用以固定验证constant.verificationCodeValue=”8888”,为固定的验证码值,不需要修改
    • 修改constant.developerModeEnable,设置为true,开启开发者模式。
    • 重启WeBASE-Node-Manager服务。

    这些配置主要的作用是:

    1. 开发者模式主要是为了做学员间的合约和私钥隔离。
    2. 固定校验码为了实现单点登录
    3. permitUrlArray配置是为了放开接口访问权限

    在适当的位置使用iframe嵌入,嵌入时直接使用WeBASE-Node-Manager的login页面。 如:

    向子页面传递参数(router, user, password),实现自动登录。其中,用户的账号及密码,为WeBASE-Node-Manager平台已添加的账户信息,建议账户类型为开发者;router为指定跳转后定位到的页面

    1. router清单:
    2. /home 首页
    3. /contract 合约IDE
    4. /contractList 合约列表
    5. /cnsManagement CNS查询
    6. /CRUDServiceManagement CURD
    7. /privateKeyManagement 私钥管理
    1. <script>
    2. export default {
    3. data() {
    4. return {};
    5. },
    6. created() {},
    7. mounted() {
    8. this.iframeInit();
    9. },
    10. computed: {},
    11. methods: {
    12. iframeInit() {
    13. let myFrame = this.$refs["myFrame"];
    14. if (myFrame.attachEvent) {
    15. //兼容浏览器判断
    16. myFrame.attachEvent("onload", function () {
    17. let iframeWin = myFrame.contentWindow;
    18. iframeWin.postMessage(
    19. { router: "/contract", user: "admin", password: "123456" },
    20. "*"
    21. );
    22. //data传递的参数 *写成子页面的域名或者是ip
    23. });
    24. } else {
    25. myFrame.onload = function () {
    26. let iframeWin = myFrame.contentWindow;
    27. iframeWin.postMessage(
    28. { router: "/contract", user: "admin", password: "123456" },
    29. "*"
    30. );
    31. };
    32. }
    33. },
    34. },
    35. };
    36. </script>

    在适当的位置使用iframe嵌入 嵌入示例

    1. <template>
    2. <div style="height:100%">
    3. <div>
    4. <div style="height:100%;width: 10%;float: left;background: #0B243B;">
    5. <div style="width: 100%;float: left;border-bottom:1px">
    6. <div style="padding-left: 35px;padding-top: 40px;">
    7. <span style="font-size: 14px;color: #37eef2;">学生</span>
    8. </div>
    9. </div>
    10. <div style="width: 100%;height:250px;float: left;">
    11. <div style="padding-top: 50px;padding-left: 60px;">
    12. <span style="font-size: 14px;color: #37eef2;text-align: left;">结束实验</span>
    13. <div style="padding-top: 50px;padding-left: 60px;">
    14. <span style="font-size: 14px;color: #37eef2;text-align: left;">下个实验</span>
    15. </div>
    16. <div style="padding-top: 50px;padding-left: 60px;">
    17. <span style="font-size: 14px;color: #37eef2;text-align: left;">关闭页面</span>
    18. </div>
    19. </div>
    20. <div style="width: 100%;height:250px;float: left;">
    21. <div style="padding-top: 50px;padding-left: 5px;">
    22. <span style="font-size: 14px;color: #9da2ab;text-align: left;">实验名称:
    23. <span style="color: #37eef2;">
    24. 智能合约编辑器2.0
    25. </span>
    26. </span>
    27. </div>
    28. <div style="padding-top: 50px;padding-left: 5px;">
    29. <span style="font-size: 14px;color: #9da2ab;text-align: left;">实验时间:
    30. 1小时
    31. </span>
    32. </span>
    33. </div>
    34. <div style="padding-top: 50px;padding-left: 5px;">
    35. <span style="font-size: 14px;color: #9da2ab;text-align: left;">倒计时:
    36. <span style="color: #37eef2;">
    37. 50分32秒
    38. </span>
    39. </span>
    40. </div>
    41. </div>
    42. <div style="width: 100%;height:421px;float: left;">
    43. <div style="padding-top: 50px;padding-left: 5px;">
    44. <span style="font-size: 14px;color: #37eef2;text-align: left;">智能合约编辑器2.0</span>
    45. </div>
    46. <div style="padding-top: 50px;padding-left: 5px;">
    47. <span style="font-size: 14px;color: #9da2ab;text-align: left;">测试实验1</span>
    48. </div>
    49. </div>
    50. </div>
    51. <div style="float:left;width: 90%;height:100%;">
    52. <iframe
    53. ref="myFrame"
    54. src="http://127.0.0.1:3006/#/login"
    55. frameborder="0"
    56. width="100%"
    57. height="980"
    58. ></iframe>
    59. </div>
    60. </div>
    61. </div>
    62. </template>
    63. <script>
    64. export default {
    65. data() {
    66. return {};
    67. },
    68. created() {},
    69. mounted() {
    70. this.iframeInit();
    71. },
    72. computed: {},
    73. methods: {
    74. iframeInit() {
    75. let myFrame = this.$refs["myFrame"];
    76. if (myFrame.attachEvent) {
    77. //兼容浏览器判断
    78. myFrame.attachEvent("onload", function () {
    79. let iframeWin = myFrame.contentWindow;
    80. iframeWin.postMessage(
    81. { router: "/contract", user:localStorage.getItem("userName"), password: localStorage.getItem("passWord")},
    82. "*"
    83. );
    84. //data传递的参数 *写成子页面的域名或者是ip
    85. });
    86. } else {
    87. myFrame.onload = function () {
    88. let iframeWin = myFrame.contentWindow;
    89. iframeWin.postMessage(
    90. { router: "/contract", user: localStorage.getItem("userName"),password: localStorage.getItem("passWord")},
    91. "*"
    92. );
    93. };
    94. }
    95. },
    96. },
    97. };
    98. </script>
    99. .main {
    100. width: 100%;
    101. min-width: 1200px;
    102. }
    103. .el-message__content {
    104. display: inline-block;
    105. }
    106. display: inline-block !important;
    107. vertical-align: middle !important;
    108. line-height: 0 !important;
    109. }
    110. .home-center {
    111. margin-right: 20px;
    112. }
    113. </style>

    1.下载安装包

    1. 解压包
    1. unzip sx-deploy.zip
    2. cd webase-front

    3.修改common.properties文件

    1. sx.web.version = v1.5.1sx
    2. webase.web.version=v1.5.1sx
    3. webase.mgr.version=v1.5.1sx
    4. webase.sign.version=v1.5.1
    5. webase.front.version=v1.5.1
    6. # 节点管理子系统mysql数据库配置
    7. mysql.ip=127.0.0.1
    8. mysql.port=3306
    9. mysql.user=dbUsername
    10. mysql.password=dbPassword
    11. mysql.database=webasenodemanager
    12. # 签名服务子系统mysql数据库配置
    13. sign.mysql.ip=localhost
    14. sign.mysql.port=3306
    15. sign.mysql.user=dbUsername
    16. sign.mysql.password=dbPassword
    17. sign.mysql.database=webasesign
    18. # 节点前置子系统h2数据库名和所属机构
    19. front.h2.name=webasefront
    20. front.org=fisco
    21. # sxWEB管理平台服务端口
    22. sxweb.port=5110
    23. # WeBASE管理平台服务端口
    24. web.port=5000
    25. # 节点管理子系统服务端口
    26. mgr.port=5001
    27. # 节点前置子系统端口
    28. front.port=5002
    29. # 签名服务子系统端口
    30. sign.port=5004
    31. # 节点监听Ip
    32. node.listenIp=127.0.0.1
    33. # 节点p2p端口
    34. node.p2pPort=30300
    35. # 节点链上链下端口
    36. node.channelPort=20200
    37. # 节点rpc端口
    38. node.rpcPort=8545
    39. # 加密类型 (0: ECDSA算法, 1: 国密算法)
    40. encrypt.type=0
    41. # SSL连接加密类型 (0: ECDSA SSL, 1: 国密SSL)
    42. # 只有国密链才能使用国密SSL
    43. encrypt.sslType=0
    44. # 是否使用已有的链(yes/no)
    45. if.exist.fisco=no
    46. # 使用已有链时需配置
    47. # 已有链的路径,start_all.sh脚本所在路径
    48. # 路径下要存在sdk目录(sdk目录中包含了SSL所需的证书,即ca.crt、sdk.crt、sdk.key和gm目录(包含国密SSL证书,gmca.crt、gmsdk.crt、gmsdk.key、gmensdk.crt和gmensdk.key)
    49. fisco.dir=/data/app/nodes/127.0.0.1
    50. # 前置所连接节点的绝对路径
    51. # 节点路径下要存在conf文件夹,conf里存放节点证书(ca.crt、node.crt和node.key)
    52. node.dir=/data/app/nodes/127.0.0.1/node0
    53. # 搭建新链时需配置
    54. # FISCO-BCOS版本
    55. fisco.version=2.7.2
    56. # 搭建节点个数(默认两个)
    57. node.counts=nodeCounts

    4.部署并启动所有服务

    1. python3 deploy.py installAll

    6 启动和停止所有服务

    1. python3 deploy.py stopAll

    用户名密码需要登录节点管理子系统添加

    8 本方案贡献者