同步操作将从 唛盟开源/低代码开发平台-唛盟lcode 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
唛盟(mdp-lcode):多功能、高效率、低代码的前后端一体化、智能化的开发工具
0.1-唛盟-唛盟生态1+n架构无限扩展、丝滑部署、永不下线
8.2.唛盟-后端工程开发-控制层、服务层、dao层开发详细介绍
10.1-唛盟-复杂查询、多主键crud的实现方案、原理解析
唛盟低代码开发平台简称唛盟或者mdp. 👉唛盟-总体介绍
唛盟旨在为企业开发业务系统提供一整套解决方案,唛盟具有高效率、低代码、功能丰富等特点。企业可以在唛盟工程之上,加入更多其它业务功能;也可以以唛盟作为模板,创建新的工程,用于开发其它业务。使用唛盟构建应用,您不用考虑多租户、登录、统一认证中心、权限、菜单管理、系统管理、公共组件、公共api、代码冗余、数据字典、图片库、文件库、智能表单、工作流、微服务互相调用、全局跟踪定位bug、多主键crud,复杂sql查询等各种问题,这些问题的解决方案都作为扩展功能内置唛盟工程中了。
💪给你一个使用唛盟的理由:代码大量减少、开发so easy、前后端MIT协议、全部开源、永久免费
💪唛盟生态遵循 “一个底座+N个专业子系统” 的架构,基于同一个底座的各个专业子系统可以任意组合形成一个大的业务系统。👉聊聊唛盟生态1+n架构
一个底座: mdp-core
N个专业子系统: 低代码mdp-lcode、
账户、权限、组织管理mdp-sys、
第三方支付登录等mdp-tpa、
统一认证中心mdp-oauth2、
内容管理mdp-arc、
工作流mdp-workflow、
工作流流程编辑器mdp-workflow-modeler-ui-web、
短信mdp-sms、
代码生成器mdp-code 、
研发项目管理xm、
即时通讯mdp-im、
财务ac、
协同办公oa
上述专业子系统全部开源
⚠️工程分类:主体工程、基础配套工程、高级配套工程、拓展应用工程、辅助开发工具五大类。
主体工程:本系统业务工程,用于书写本系统相关的业务代码;
基础配套工程:业务工程运行所需的必要工程;如开发底座,系统管理相关功能包
高级配套工程:高级应用,比如需要将业务工程接入oauth2环境、将业务工程发布到cloud环境,才需要下载安装高级配套工程
拓展应用工程: 基于唛盟低代码平台拓展的应用工程,其后端可以单体发布,也可以以微服务方式发布,也可以打成jar被唛盟其它应用引入
辅助开发工具:指开发用到的一些工具
⚠️工程命名规范:业务名称+工程属性
工程属性如下:
-ui: 页面工程
-web: pc端运行的浏览器工程
-backend: 后端服务
-app: 安卓、ios等原生app工程
-uniapp: 基于uniapp开发的应用
-minapp: 小程序
-cloud: 微服务cloud环境
-oauth2: 统一认证中心
-bootstrap: 打包部署工程
唛盟属于前后端严格分离的一套系统,分为前端工程、后端工程两部分
mdp-cloud-backend 非必须
该工程作为spring cloud的扩展工程,如果需要将系统发布到spring cloud环境,需要下载该工程重新打包,不包含任何的业务功能,仅作为后端接入cloud环境使用
mdp-oauth2-backend 非必须
该工程为统一认证中心,作为spring oauth2的扩展工程,如果需要将系统接入oauth2环境,需要下载该工程重新打包,该工程实现分布式单点登陆;支持微信、支付宝、短信、账户密码等多种登陆方式
完全开源、永久免费的企业级开发底座
统一的开发模式
足够灵活的权限管理机制
基于领域驱动设计(DDD)的框架及代码生成器
提供完整的编程规范说明
提供强大的元数据(数据字典)管理机制
整合了最新版本的强大的flowable工作流引擎
提供强大的国际化解决方案
整合了强大的微服务框架
强大的DAO层
强大的web ui
提供自定义表单解决方案
整合了微信支付、支付宝支付、paypal支付
整合了oauth2.0框架
角色权限
├── 角色管理 => 角色crud、分配菜单、分配权限
├── 权限定义 => 权限crud
├── 菜单管理 => 菜单(按钮)crud、分配菜单(按钮)给角色、
├── 模块管理 => 模块crud
├── 已开模块 => 查看企业(个人)已开通的模块
组织管理
├── 机构管理 => 企业信息维护、管理员维护、账户信息维护、企业产品维护、
├── 用户管理 => 用户的crud、分配岗位、分配部门、重置密码、邀请
├── 部门管理 => 部门curd、分配岗位到部门、查看部门用户
├── 公司管理 => 公司curd(超级管理员使用)
├── 岗位管理 => 岗位curd、分配角色到岗位、岗位人员查看
├── 注销审核 => 审核用户的注销申请
平台管理
├── 平台配置 => 配置平台的信息
├── 个人认证审核 => 审核个人的实名认证请求
├── 企业认证审核 => 审核企业的实名认证请求
元数据管理
├── 字典管理 => 数据字典的crud
├── 列表维护 => 下拉列表数据项的crud
├── 参数定义 => 公共系统参数的crud
审批中心
├── 待执行 => 我的待执行任务查询、任务执行
├── 日历任务 => 我的待执行任务查询、任务执行
├── 发起流程 => 发起流程
审批监控
├── 我发起的流程 => 查询我发起的流程
├── 我监控的流程 => 查询我监控的流程、催办
├── 我参与的流程 => 查询我参与过的流程
流程模型
├── 流程编辑器 => 在线流程编辑器
├── 模型发布 => 流程模型发布
├── 模型设置 => 设置流程与智能表单的关联、模型的启动条件、审批人、权限等
低代码
├── 表单中心 => 智能表单的门户
├── 表单设计 => 进行智能表单设计、权限设置、在线查看源代码等
├── 数据录入、查询 => 查询表单已录入的数据
├── 代码生成器 => 在线生成crud的前端页面代码(表单、表格、api),后端代码(控制层、服务层、dao层代码),前后端0修改即可正常运行
mdp封装了几十个ui组件,使用mdp-ui与不使用mdp-ui的区别:写100行代码还是写1行代码的区别,代码量的减少立竿见影
⚠️注意:先行体验一把mdp-ui组件效果预览
找到main.js 添加下面代码
//mdp-ui 基础组件
import MdpComponents from '@/components/mdp-ui/index.js'
Vue.use(MdpComponents)
//mdp-ui-ext拓展的组件
import MdpUiExtComponents from '@/components/mdp-ui-ext/index.js'
Vue.use(MdpUiExtComponents)
// 公共api
import mdp from "@/api/mdp_pub";
Vue.prototype.$mdp = mdp;
弹框,可以把任意页面装配成弹框,无须定义多余的变量及函数
表格,内置了增、删、改、查、高级查询、重置查询、导出、列配置、分页、批量编辑等功能、内置了对按钮权限的控制机制
功能非常强大,懂的都懂。
下拉列表,支持对数据字典、元数据的引用,支持对任意小表表格数据的引用,支持参数化加载后台数据,对后台加载的数据进行缓存
超大表格下拉列表,与mdp-select相比,该组件具有分页查询功能
用户选择下拉列表,与mdp-select-table组件类似,仅仅针对用户的头像做了特殊处理
输入框
日期
区间日期
数字输入
高级查询,可以由用户自定义任意复杂的查询条件
表格配置,用于控制表格的列显示与否
穿梭框
文档、文章目录树
智能表单相关组件
自动扩展字段信息
图片库,图片的增删改查、上传、下载
图片选择器,支持图片的上传下载、上传后的统一管理、共享
部门选择,支持树状机构,异步加载,支持分页查询,任意大数据量
附件库,支持附件的上传下载、上传后的统一管理、共享
文档、文章目录树选择器
标签库,支持标签的统一管理、共享
元数据管理库、支持元数据的crud
元数据管理库-列表数据组件、支持列表数据的crud
富文本编辑器,整合了mdp-select-image作为插件
公共api总入口,注册到vue全局函数中,可以在页面中任意地方直接使用,公共api总入口,如需要添加公共api,请在此文件添加
为mdp框架核心的与后端交互的api,自动注册为全局公共函数,可通过$mdp.xxx调用,可改,但不要新增,删除任何一个api.
为mdp扩展的组件与后端交互的api,自动注册为全局公共函数,可通过$mdp.xxx调用,可改,但不要新增,删除任何一个api.
为mdp扩展的组件与后端交互的api,自动注册为全局公共函数,可通过$mdp.xxx调用,可改,可新增必要的api.
前端工程的一些公共配置项,主要配置每一类api对接哪个后端微服务 根据不同的环境,需要修改部分内容,主要如下:
//登录相关,如果后端启用oauth2,则返回oauth2client,如果后端不启用oauth2,后端账户使用mdp-lcode服务,则返回lcode,如果使用mdp-sys提供服务,则返回sys
getOauth2LoginContext:function(){
return "oauth2client"
},
//模块订单 如果后端使用mdp-lcode提供订单服务,则返回lcode,如果使用mdp-sys服务,则返回sys
getMoContext(){
return 'lcode'
},
// 如果后端使用mdp-lcode提供账户管理服务,则返回lcode,如果使用mdp-sys提供服务,则返回sys
getSysContext: function() {
return 'lcode'
},
// 图片内容服务api路径,如果后端使用mdp-lcode提供图片文件服务,则返回lcode,如果使用mdp-arc提供图片文件服务,则返回arc
getArcContext: function() {
return 'arc'
},
// 表单服务api路径,如果后端使用mdp-lcode提供表单服务,则返回lcode,如果使用mdp-form提供服务,则返回form
getFormContext: function() {
return 'lcode'
},
<el-button @click="$mdp.xxxApi()"/>
this.$mdp.xxxApi()
<el-table v-adaptive="{bottomOffset:30}"/>
vue全家桶 + element-ui + axios
⚠️注意:该项目使用 element-ui@2.3.0+ 版本,所以最低兼容 vue@2.5.0+ nodejs版本v14.21.3
你的本地环境需要安装 node 和 git。我们的技术栈基于 ES2015+、vue、vuex、vue-router and element-ui,提前了解和学习这些知识会对使用本项目有很大的帮助。
该项目属于网页版前端项目,所有api由 mdp-lcode-backend提供,请下载该项目
代码生成器下载 mdp-code-generator 也可以在低代码平台在线生成
# 克隆项目
git clone https://gitee.com/maimengcloud/mdp-lcode-ui-web.git
# 安装依赖
npm install
# 启动服务
npm run dev
浏览器访问 http://localhost:8015
登录api,对接后台接口有两种方式,分别为对接统一认证中心、对接mdp-lcode-backend 默认对接mdp-lcode-backend中的登录模块,如果想切换,更改mdp_config.js中的getOauth2LoginContext函数即可
getOauth2LoginContext:function(){
return "oauth2client"
}
getOauth2LoginContext:function(){
return "lcode"
}
内容相关接口默认打包进mdp-lcode,所以内容相关接口可以直接对接lcode即可,如果内容相关的服务使用独立的第三方开源工程,独立部署,比如直接使用 mdp-arc-backend,则更改mdp_config.js中的getArcContext函数即可快速切换
getArcContext:function(){
return "arc"
}
getArcContext:function(){
return "lcode"
}
开发的时候前后端对接有两种情况:
'/api/m1/lcode': {
target: 'http://localhost:7014',
changeOrigin: true,
pathRewrite: {
'^/api/m1/lcode': '/'
}
},
上述代理实现把以/api/m1/lcode开头的请求地址(举例/api/m1/lcode/user/list)替换为/user/list,并转发到http://localhost:7014地址
2.只启动前端页面工程,后端工程不启动,后端工程使用服务器上的已启动的服务 此种情况下前端如何把请求转发到服务上起的后端服务?主要修改./config/index.js中的代理实现
'/api/m1/lcode': {
target: 'http://192.168.117.1:7014',
changeOrigin: true,
pathRewrite: {
'^/api/m1/lcode': '/'
}
},
上述代理实现把以/api/m1/lcode开头的请求地址(举例/api/m1/lcode/user/list)替换为/user/list,并转发到http://192.168.117.1:7014地址
流程编辑器下载工作流流程编辑器mdp-workflow-modeler-ui-web,
流程编辑器的整合分两种使用场景:
1.本地开发调试运行
将mdp-workflow-modeler-ui-web/modeler-ui整个目录拷贝到
mdp-lcode-ui-web/static/下
并配置页面代理
'/workflow/m1/modeler-ui/': {
target: 'http://localhost:8015',
changeOrigin: true,
pathRewrite: {
'^/workflow/m1/modeler-ui/': '/modeler-ui/'
}
},
还需要配置工作流api请求代理 假设mdp-workflow 本地启动并监听 7080 端口
'/api/m1/workflow': {
target: 'http://localhost:7080',
changeOrigin: true,
pathRewrite: {
'^/api/m1/workflow': '/'
}
},
此代理实现将/api/m1/workflow/开头的请求转发到/http://localhost:7080/下
2.服务器上运行 将mdp-workflow-modeler-ui-web/modeler-ui整个目录拷贝到服务器上,如果是nginx,建议放在nginx/html/下 如果是nginx,需要配置请求地址/workflow/m1/modeler-ui/->到nginx/html/modeler-ui/的映射关系
# 构建测试环境
npm run build:sit
# 构建生产环境
npm run build:prod
假设:
1.应用服务器(sit1-backend),ip为192.168.0.222,端口7014
2.静态资源服务器(sit1-static),ip为192.168.0.111
3.反向代理使用nginx
4.静态资源部署到服务器sit1-static的/data/nginx/html/lcode/m1/下
5.本地*ui-web目录在C:/Users/xxx/IdeaProjects/mdp-lcode-ui-web/
# 1.首先登录sit1-static并进入/data/nginx/html/lcode/m1/下
cd /data/nginx/html/lcode/m1/
# 如果有dist.rar需要先删除
rm -rf dist.rar
# 2.执行rz命令,弹框选择本地dist文件上传到sit1-static服务器
rz
# 3.在弹出的目录选择器中进入C:\Users\xxx\IdeaProjects\mdp-lcode-ui-web\dist\目录下
全选所有文件->右键->添加到dist.rar->选中dist.rar->上传到服务器商/data/nginx/html/lcode/m1/目录下
# 4.执行解压缩命令,至此静态资源发布完成
unrar x dist.rar
解压后m1目录下一般有css、fonts、images、img、js、tinymce、favicon.icon、index.html等文件或者文件夹
location ~*/(mk|mallm|arc|im|sms|workflow|oa|ac|audit|xm|tpa|crowd|lcode)/m1 {
root /usr/share/nginx/html;
index index.html;
expires 30d;
}
upstream api-gate-lcode {
server 192.168.0.222:7014;
}
location /api/m1/lcode/ {
#proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://api-gate-lcode/;
proxy_connect_timeout 65s;
proxy_send_timeout 65s;
proxy_read_timeout 65s;
proxy_next_upstream_tries 1;
}
需要特别注意的是 http://api-gate-lcode/后面的这个/不能省略,带/代表将“/api/m1/lcode/”替换成“/”,再转发上送到目标服务器
upstream api-gate-wf {
server 192.168.0.222:7080;
}
location /api/m1/wf/ {
#proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://api-gate-wf/;
proxy_connect_timeout 65s;
proxy_send_timeout 65s;
proxy_read_timeout 65s;
proxy_next_upstream_tries 1;
}
假设 spring cloud gate部署在192.168.0.222,监听6101端口 下面的目标服务器改为cloud gate的地址端口. 注意cloud环境下不需要像单体般每个子系统api单独配置映射关系。因为所有的api都是经过gate再转发的
upstream api-gate {
server 192.168.0.222:6101;
}
location /api/m1/ {
#proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://api-gate/;
proxy_connect_timeout 65s;
proxy_send_timeout 65s;
proxy_read_timeout 65s;
proxy_next_upstream_tries 1;
}
具体以mdp-lcode-backend中发布描述为准
日常查询问题,主要通过查询前后端日志,分析出具体原因,再进行针对性解决。
唛盟平台具有多个子业务系统,每个子业务系统都有独立日志,一个前端请求,可能日志散落在多个日志文件,如何才能凑齐这些日志,进行统一分析交易执行情况,进而定位问题?
答复:唛盟平台在每个请求到达服务端的时候,会检测gloNo是否存在,如果不存在,则会自动创建一个gloNo,并注入到日志上下文中,并打印到每一行代码中,另外请求结束,还会把gloNo返回到前端,如果交易中间涉及调用其他子系统,同样会自动上送gloNo,对方交易子系统同样执行上诉逻辑。因此,可以看见,gloNo是能够把所有日志串联起来的。我们只需要在日志文件目录下执行grep命令即可找出对应日志
操作步骤:
1.下面是典型的唛盟接口返回的数据结果集 gloNo就存放在res.data.tips.gloNo中。
{
"total" : 1,
"data" : [ {
"bizFlowState" : null,
"deptName" : null,
"projectCnt" : 1,
"admUserid" : "4hinb8m16",
"del" : "0",
"budgetNouserAt" : null,
"productName" : "唛盟云-财务系统",
"baselineId" : "2022-01-01-base-01",
}],
"tips" : {
"msg" : "成功",
"gloNo" : "20240312200013556UWJZKV",
"isOk" : true,
"reqNo" : "20240312200013556JM3WKN",
"tipscode" : "ok"
}
}
grep "20240312200013556UWJZKV" *.log
consule 的默认控制台 http://ip:8500/
可以调用/bin/service-deregister.sh进行
可以在crontab中配置定时任务,定时调用bin/clear-log.sh即可完成7天循环自动清理及备份日志
使用举例:
# 打开定时任务编辑器
crontab -e
# 查看定时任务
crontab -l
# 增加定时清理备份日志任务
0 1 * * * /bin/bash /home/mall/m1/bin/clear-log.sh
mdp 3.0 版本已经开始规划更新了,尽请期待新版本的诞生吧 3.0将全面升级到vue3 + element plus + ts,并初步实现部分ai功能
升级前必看:CHANGELOG.md
⚠️ 注意:以下拓展的框架或者子系统,由mdp开源团队基于项目经验进行总结抽取,可用可不用,可以以jar包方式合并到现有工程进行发布,也可单独发布成单体应用、微服务应用
第三方支付框架,整合了微信支付、支付宝支付、paypal支付
即时通讯框架
统一认证中心框架 2. mdp-oauth2-backend 后端
微服务框架
工作流管理子系统
低代码平台
内容管理子系统
短信子系统
项目管理子系统
财务管理子系统
答复:
1.请排查index.js中的代理是否配置正确,详细配置说明参考前面关于前后端对接的说明;
2.请检查后端服务是否已启动,并查看配置文件关于服务监听端口是否与代理配置的端口一致;
答复:
1.请排查node的版本是否是前面描述的指定版本;
2.请检查package.json是否被重置,如果是,请恢复到原始模样,至少要保证package.json中的vue版本与
vue-template-compiler版本一致,目前唛盟官方推荐版本均为^2.6.14;
答复:设置国内镜像
npm cache clean --force
npm config set registry https://registry.npmmirror.com
npm config get registry
如果返回https://registry.npmmirror.com/,说明配置的是淘宝镜像。
答复:okr相关错误由于版本兼容性,有些版本代码放dist下,有些放在模块根目录下。 修改以下文件中的代码src\views\xm\core\xmGroup\XmGroupMng.vue
//如果甘特图样式有问题,尝试按以下方法之一引入样式,采用哪种取决于vue-okr-tree.css是存放在根目录还是dist目录下
//import 'vue-okr-tree/dist/vue-okr-tree.css'
//import 'vue-okr-tree/vue-okr-tree.css'
答复:账户为: demo-branch-01 密码为: 888888
答复: 账户为: superAdmin 密码为: 888888
答复: 数据库脚本一般存放在后端工程下的sql/文件夹下 低代码的mdp-lcode-backend/mdp-lcode/sql/lcode.sql
mysql的话,建议character set: utf8mb4, collation: utf8mb4_croatian_ci
答复:因为本地跑不需要cloud环境,cloud相关包是部署到cloud环境才需要的。您可以采取以下两种办法之一解决
办法1. 找到根目录下的pom.xm文件,把cloud的模块注释掉
<modules>
<module>mdp-arc-mate</module>
<module>mdp-arc-pub</module>
<module>mdp-sys</module>
<module>mdp-lcode</module>
<module>mdp-lcode-bootstrap</module>
<!-- <module>mdp-lcode-cloud-bootstrap</module> -->
</modules>
办法2. 下载mdp-cloud-backend工程,进行安装
答复:需要的,原因:1.研发管理系统采用低代码中的框架开发,各种组件的使用说明,框架的说明介绍等都是放在低代码平台中。2.研发管理系统中的账户、角色权限、组织、字典、菜单等都是直接采用低代码平台的功能,研发管理系统必须结合低代码平台才能算是一个完整的产品。
答复:请参考以下文章nvm介绍、安装、报错处理以及使用
注意:请用管理员身份打开cmd命令窗口
1.查看本地安装所有版本以及当前使用的版本,有可选参数available,显示所有可下载的版本
nvm list [available]
2.查看到 node 版本后,推荐使用 LTS 中任意一个版本进行安装,命令中版本自定义,例如下
nvm install 14.21.3
3.使用 nvm 进行切换 node 版本使用特定版本
nvm use 14.21.3
答复:唛盟属于企业级开发平台,企业可以用唛盟开发任何业务系统,在企业内部来讲,最终可能演变成1底座+n个专业子系统的最终形态。唛盟采用1+n架构正是由目前大部分企业的这种形态决定的,唛盟为适应1+n的架构做了最佳的工程划分实践,在很多项目实战中获得了巨大成功。1代表核心底座mdp-core,地位非常重要,任何改动有可能影响所有产品的正确运行,一般由架构师团队维护,不建议开放给各个业务组,所以mdp-core有完全独立开来的需要。n代表各个子系统,子系统之间高内聚,低耦合。每个子系统完全可以独立运行的。在管理上,可能每个子系统属于不同的产品团队或者不同的项目团队进行管理。工程包完全独立,方便管理,避免权责不清,互相交叉等问题。
答复:可以的,唛盟设计之初就考虑到了需要具备可合可分的这种灵活性。唛盟采用1+n架构,具体体现为至少有n个jar包,jar包是可以互相引入的,可以在-bootstrap的工程中通过pom引入的方式把他们合并成一个大的发布包。最终发布到服务器的时候,发布一个jar包就可以了。
mdp 作为开源项目,离不开社区的支持,欢迎任何人修改和提出建议。贡献无论大小,你的贡献会帮助背后成千上万的使用者以及开发者,你做出的贡献也会永远的保留在项目的贡献者名单中,这也是开源项目的意义所在!
为了保证项目代码的质量与规范,以及帮助你更快的了解项目的结构,请在贡献之前阅读:
Fork 本仓库。
Fork 后会在你的帐号下多了一个和本仓库一模一样的仓库,把你帐号的仓库 clone 到本地。
注意替换掉链接中的分支名
和用户名
。
如果是贡献代码,分支名填 dev
;如果是贡献文档,分支名填 docs
git clone -b 分支名 https://gitee.com/用户名/mdp-lcode-ui-web.git
修改代码/文档,修改后提交上来。
# 把修改的文件添加到暂存区
git add .
# 提交到本地仓库,说明你具体做了什么修改
git commit -m '填写你做了什么修改'
# 推送到远程仓库,分支名替换成 dev 或者 docs
git push origin 分支名
登录你的仓库,然后会看到一条 PR 请求,点击请求合并,等待管理员把你的代码合并进来。
分支 | 说明 |
---|---|
master | 主分支,受保护分支,此分支不接受 PR。在 dev 分支后经过测试没问题后会合并到此分支。 |
dev | 开发分支,接受 PR,PR 请提交到 dev 分支。 |
感谢所有赞赏以及参与贡献的小伙伴,你们的支持是我们不断更新前进的动力!微信扫一扫,赏杯咖啡呗!
序号 | 合作项目 | 详细介绍 | 费用说明 |
---|---|---|---|
1. | 打赏获得赞助商名额 | 在赞助商列表展示(添加微信沟通) | 不限额度 |
2. | 新组件开发 | 提供组件扩展、优化服务 | 视复杂程度而定 |
3. | 开发问题解答 | 如果使用该产品遇到棘手问题需要解决,添加微信进行沟通解决 | 免费 |
4. | 开发培训 | 提供开发流程介绍、技术介绍、功能介绍、部署流程介绍,仅限线上培训 | 加微信详聊 |
5. | 扩展问题解答 | 如果需要使用该产品进行自有业务系统研发,需要我方提供意见建议,我方收取一定费用后提供相应服务 | 加微信详聊 |
6. | 广告合作 | 广告位(精品项目推荐、赞助商展位) | 加微信沟通 |
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。