Microi吾码:开源低代码开发平台的高效解决方案

  • 一、什么是 Microi吾码?
  • 二、Microi吾码的核心功能
    • 一,界面介绍
    • 二,流程引擎
    • 三,接口引擎
      • 【参数】:
      • 【业务逻辑】:
      • 【相关微信官方文档】:
    • 四,界面引擎
  • 三,Microi吾码总结

本文只做体验,不是广告

在这里插入图片描述

一、什么是 Microi吾码?

Microi吾码是一款面向开发者的开源低代码平台,旨在通过简化开发流程、提升开发效率来帮助开发者和企业快速搭建高效、灵活的应用程序。它集成了强大的界面引擎、打印引擎等功能,同时提供了开源版、个人版和企业版三种版本,满足不同用户群体的需求。

二、Microi吾码的核心功能

在这里插入图片描述

一,界面介绍

Microi吾码的界面以用户友好和简洁设计为核心,分为以下模块:

  1. 主导航栏:提供快速访问各核心功能的入口,包括流程引擎、接口引擎、界面引擎等。
  2. 工作台:用户可管理任务、流程和接口,实时查看执行状态。
  3. 日志模块:记录引擎运行日志,便于排查问题。
  4. 可视化编辑器:支持拖拽式的流程与界面开发,降低代码量。

在这里插入图片描述

支持自由选择好看的壁纸

在这里插入图片描述

二,流程引擎

流程引擎主要负责业务流程的自动化和可视化管理,支持流程建模、执行和监控,帮助开发者快速实现复杂业务逻辑。

功能:

  • 支持可视化的流程设计,用户通过拖拽即可定义复杂流程。
  • 支持条件分支、循环、定时任务等高级功能。
  • 与接口引擎无缝对接,调用外部服务或触发内部逻辑。
  • 提供实时流程监控,便于调试和优化。
    在这里插入图片描述

适用场景:

  • 数据处理自动化
  • 业务审批流编排
  • 系统间的任务联动

在这里插入图片描述

三,接口引擎

Microi吾码的接口引擎是其核心组件之一,负责在系统内外部之间进行数据交互和业务逻辑调用。通过标准化接口管理,实现不同模块、第三方系统与平台间的无缝对接,提升系统的集成性和扩展性。

在这里插入图片描述

功能:

  • 支持多种协议(HTTP、WebSocket、gRPC等)与数据格式(JSON、XML、SOAP等)。
  • 可对接第三方 API,统一接口管理。
  • 提供接口调试工具,支持参数动态注入。
  • 支持高并发与异步处理,保障接口性能。

在这里插入图片描述

参数:

  • 接口路径、请求方法(GET/POST等)、Header 信息、Body 参数等。
  • 业务逻辑:
  • 对接用户的后端服务或 API,将流程中的数据流与外部系统进行交互。
  • 相关微信官方文档:
  • 如涉及微信支付、公众号或小程序的接口对接,可参考微信开发文档。

比如:[业务]小程序授权登陆或自动注册或绑定已有帐号

【参数】:

  • OsClient、LoginCode(用于无感自动登陆)、Code(用于用户手动授权手机号后登陆 或自动注册 或绑定已有帐号)、
  • Account(可选,用户登陆帐号,若传入了Account+Pwd,表示前端用户操作为【绑定到已有帐号】)
  • Pwd(可选,用户登陆密码,若只传入密码或未传密码,表示前端用户操作为【没有帐号,自动注册新帐号】,未传密码则自动生成密码并返回到前端)

【业务逻辑】:

1、前端进入小程序时调用wx.login获取到code,然后以LoginCode参数调用此接口(此操作无感,无需用户做任何操作,进入小程序时即可执行)

2、此接口根据LoginCode获取到小程序的openid,判断此openid是否已绑定帐号,若已绑定则直接返回用户token登陆信息,小程序则已实现了自动登陆;若未绑定,则小程序需要授权注册

3、若上面openid未绑定账号,则前端用户需要手动点击@getphonenumber事件授权,同意后获取到code,然后以Code参数再次调用此接口。

4、此接口判断缓存中是否存在该小程序的AccessToken(有效期7200秒),若不存在,则通过【获取接口调用凭据】获取AccessToken,并存入缓存

5、根据前端传入的Code+AccessToken通过getuserphonenumber接口获取到真实的手机号。

6、判断上一步获取到的手机号是否存在用户,若已存在,则直接返回用户token登陆信息。

7、若上一步获取到的手机号不存在用户,则直接自动注册帐号,若前端未传入Pwd,则随机生成用户密码,注册成功后则返回到前端让用户自动记录,并且同时返回token登陆信息。

【相关微信官方文档】:

https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html
https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-login/code2Session.html

if(!V8.Param.OsClient || (!V8.Param.LoginCode && !V8.Param.Code)){
  V8.Result = { Code : 0, Msg : '参数错误!' };
  return;
}
var appid = V8.SysConfig.MiniProgramAppId;//多小程序使用Unionid
var secret = V8.SysConfig.MiniProgramSecret;
var userOpenId = '';
//逻辑点1-2:如果传入了LoginCode
var loginCode = V8.Param.LoginCode;
if(loginCode){
  var url = `https://api.weixin.qq.com/sns/jscode2session?appid=${appid}&secret=${secret}&js_code=${loginCode}&grant_type=authorization_code`;
  var getOpenIdResult = V8.Http.Post({
    Url : url
  });
  //httpResult = {"session_key":"qXTqR9aC+1Q1ZeLgBpbXqw==","openid":"ouVQI46Ckf_WzhYnjGIvtvzC2nwo"} {"errcode":40163,"errmsg":"code been used, rid: 6541428b-113748e3-1ee4a651"}
  var getOpenIdResultObj = JSON.parse(getOpenIdResult);
  if(getOpenIdResultObj.errmsg){
    V8.Result = { Code : 0, Msg : `获取openid失败:${getOpenIdResultObj.errcode}-${getOpenIdResultObj.errmsg}`};
    return;
  }
  if(!getOpenIdResultObj.openid){
    V8.Result = { Code : 0, Msg : `获取到的openid为空:${getOpenIdResult}`};
    return;
  }
  userOpenId = getOpenIdResultObj.openid;
  var sysUserResult = V8.FormEngine.GetFormData({
    FormEngineKey : 'sys_user',
    _Where : [{ Name : 'MiniProgramOpenId', Value : getOpenIdResultObj.openid, Type : '=' }]
  });
  if(sysUserResult.Code == 0){
    V8.Result = { Code : 0, Msg : `获取用户信息时出现错误:` + sysUserResult.Msg};
    return;
  }
  //已存在用户,直接返回token登陆信息
  if(sysUserResult.Code == 1){
    V8.Result = V8.Method.GetAccessToken({
      OsClient : V8.Param.OsClient,
      CurrentUser : sysUserResult.Data
    });
    return;
  }
  //不存在用户,则直接返回前端自动登陆失败
  if(!V8.Param.Code){
    V8.Result = { Code : 0, Msg : `小程序openid:[${getOpenIdResultObj.openid}]未绑定帐号!` };
    return;
  }
}
//逻辑点3、4
var accessToken = V8.Cache.Get(`MiniProgramAccessToken:${appid}`);
if(!accessToken){
  var url = `https://api.weixin.qq.com/cgi-bin/token?appid=${appid}&secret=${secret}&grant_type=client_credential`;
  var getAccessTokenResult = V8.Http.Post({
    Url : url
  });
  var getAccessTokenObj = JSON.parse(getAccessTokenResult);
  if(!getAccessTokenObj.access_token){
    V8.Result = { Code : 0, Msg : '获取AccessToken失败:' + getAccessTokenResult };
    return;
  }
  accessToken = getAccessTokenObj.access_token;
  V8.Cache.Set(`MiniProgramAccessToken:${appid}`, accessToken, '0.01:45:00');
}
//逻辑点5
var url = `https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=${accessToken}`;//?code=${V8.Param.Code}&access_token=${accessToken}
var getPhoneResult = V8.Http.Post({
  Url : url,
  PostParam:{
    code : V8.Param.Code
  },
  Headers:{
    "Content-Type" : "application/json",
  },
  ParamType : 'Json'
});
var getPhoneObj = JSON.parse(getPhoneResult);
//"{\"errcode\":0,\"errmsg\":\"ok\",\"phone_info\":{\"phoneNumber\":\"13308098884\",\"purePhoneNumber\":\"13308098884\",\"countryCode\":\"86\",\"watermark\":{\"timestamp\":1698911143,\"appid\":\"wx9649ffe0039af044\"}}}"
if(!getPhoneObj.phone_info || !getPhoneObj.phone_info.phoneNumber){
  V8.Result = { Code : 0, Msg : '获取手机号失败:' + getPhoneResult };
  return;
}
//逻辑点6
var sysUserResult = V8.FormEngine.GetFormData({
  FormEngineKey : 'sys_user',
  _Where : [{ Name : 'Account', Value : getPhoneObj.phone_info.phoneNumber, Type : '=' }]
});
if(sysUserResult.Code == 0){
  V8.Result = { Code : 0, Msg : `获取用户信息时出现错误:` + sysUserResult.Msg};
  return;
}
//如果存在用户,绑定此用户的openid,并返回登陆信息
if(sysUserResult.Code == 1){
  //如果存在oepnid
  if(userOpenId){
    V8.FormEngine.UptFormData({
      FormEngineKey : 'sys_user',
      Id : sysUserResult.Data.Id,
      _RowModel:{
        MiniProgramOpenId : userOpenId
      }
    });
  }
  V8.Result = V8.Method.GetAccessToken({
    OsClient : V8.Param.OsClient,
    CurrentUser : sysUserResult.Data
  });
  return;
}
//如果不存在此用户,若传入了Account+Pwd则绑定帐号,若只传入了Pwd或未传入Pwd,则自动注册
if(!V8.Param.Account){
  var pwd = V8.Param.Pwd;
  if(!pwd){
    pwd = Math.floor(Math.random() * 10000000).toString();//6-7位数字
  }
  //自动注册
  var addSysUserModelResult = V8.FormEngine.AddFormData({
    FormEngineKey : 'Sys_User',
    _RowModel : {
      No : '',//自动编号,目前这里必须要传个空值
      Account : getPhoneObj.phone_info.phoneNumber,//帐号
      Phone : V8.Param.Account,//帐号
      Pwd : V8.EncryptHelper.DESEncode(pwd),//密码
      Name : getPhoneObj.phone_info.phoneNumber,//名称
      DeptId : '36f3ac88-01d6-4874-9b4c-6274371267e7',//组织机构Id:会员(勿删)
      DeptName : '会员',//组织机构名称
      DeptCode : '1-5-',//组织机构代码
      RoleIds : '[{"Id":"021a9216-ae88-4e73-99e0-2c32914583fe","Name":"会员","Level":1}]',//角色
      Level : 1,//级别
      State : 1,//状态
    }
  });
  if(addSysUserModelResult.Code != 1){
    V8.Result = { Code : 0, Msg : '用户自动注册失败:' + addSysUserModelResult.Msg }
    return;
  }
  var result = V8.Method.GetAccessToken({
    OsClient : V8.Param.OsClient,
    CurrentUser : addSysUserModelResult.Data
  });
  result.DataAppend = {
    Pwd : pwd
  };
  V8.Result = result;
  return;
}
//绑定已有帐号
V8.Result = { Code : 0, Msg : '绑定已有帐号功能暂未实现!' };

四,界面引擎

界面引擎是用于生成和渲染前端用户界面的核心模块,通过配置或代码生成的方式,实现高效的页面布局和交互功能,提升开发效率。

特点:

  • 支持基于拖拽的界面设计,无需复杂代码即可生成美观的前端界面。
  • 完美兼容 Vue2,方便开发者快速上手。

在这里插入图片描述
应用场景:

  • 快速搭建管理后台。
  • 动态表单生成。
  • 复杂数据展示。

三,Microi吾码总结

Microi吾码是一款开源低代码开发平台,专注于通过流程引擎、接口引擎和界面引擎等核心功能,简化业务逻辑开发、提升效率和降低技术门槛。其界面引擎支持可视化拖拽式设计,流程引擎实现业务流程的自动化,接口引擎负责高效的数据交互,帮助开发者和企业快速构建灵活、高效的应用程序。无论是后台管理、动态表单生成,还是复杂业务场景整合,Microi吾码都能提供高效解决方案,真正做到开发便捷、灵活扩展。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐