精华内容
下载资源
问答
  • Activiti结合VUE实现前后端分离、权限管理、路由动态挂载、流程审批简介技术点后端项目目录前端代码目录预览地址:加QQ索要图片预览:购买须知购买理由疑问解惑 简介 本框架是基于十多年项目开发经验积累,用最佳...

    Activiti、Vue、Element-ui实现前后端分离、权限管理、路由动态挂载、流程审批


    element-ui

    简介

    本框架是基于十多年项目开发经验积累,用最佳实践和流行技术开发现代前后端分离的通用项目模板。适合web应用,微信、手机应用管理端及服务端。使用springboot,activiti,mybatis,vue elementui、nodejs开发的后台管理系统(包含权限管理、工作流等功能),真正前后端分离的微服务架构,经过很多项目实战、淬炼、软件开发公司主流技术的集大成者。

    技术点

    前端采用vue element ui框架,后端spring boot,mybatis开发框架,数据库:mysql,前后端分离。
    流程提供发起、跳转、任务处理,人员角色获取、角色类型获取、会签等功能。
    采用activiti工作流工作流框架,自定义流程设计采用activiti工作流工作流框架,自定义流程设计。
    采用安全框架 JWt、shiro(登录授权)实现组织机构、角色,人员、功能权限、数据权限功能。
    后端多模块项目(基础设施子项目、基础功能子项目、业务功能子项目),结构清晰、各子项目独立扩展、升级。
    后端系统组件化,提供分页、树形、通用查询数据结构,封装系统复杂度,只需要写出简单的业务代码,即能完成一个复杂的功能。
    前端项目多模块(基础组件、通用框架、基础功能,业务功能),结构清晰,子项目独立。
    前后端完美结合,很简单的代码即可以实现分页列表、树形等复杂页面。
    前端提供数字输入、货币输入(输入时自动中文货币提示)、百分比输入、整数输入、字典下拉、日期快捷输入、日期范围输入表单控件。
    前端自定义验证,简单HTML标签即可实现前端验证,提供必输,长度、数字,身份证号码等验证标记。
    前端提供身份证号解析年龄,性别、出生日期、户籍地信息功能。
    前端提供通用表格组件(支持树形,分页、合计、列筛选,排序、全部数据导出)、
    前端提供通用表格编辑组件,支持新增、删除、行编辑、行验证。
    前端提供通用树组件、支持多选、筛选、增加子结点,删除,自定义结点。间;

    后端项目目录

    在这里插入图片描述

    前端代码目录

    在这里插入图片描述

    图片预览:

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    树形表格:
    在这里插入图片描述
    ## 项目图片预览:
    在这里插入图片描述

    购买须知

    QQ:2024973690 (添加QQ,价格面议,咸鱼交易)

    预览地址

    http://49.232.110.29/ (首次加载较慢,密码加扣扣问作者)

    购买理由

    公司买来自己用、市面上买套流程引擎项目,轻则上万。即使买来UI,还得费时费力的让员工开发出基础模块,搭建起完善的框架, 节约的成本你自己算!

    买来学习用(覆盖java主流新技术,前后端分离、互联网、软件公司工业级框架)模仿代码做一遍增删改查,研究下功能模块,学习下编程思路,会进步很快,少走弯路!

    疑问解惑

    购买的东西都包过哪些?
    答复:源码 + 文档。可以做辅助性讲解

    代码有无加密和自己封装的jar?
    答复:没有打jar,没有加密

    系统稳定吗?经过实际项目?
    答复:公司主要做产品研发,此框架抽离于公司产品,自主研发使用流行技术。

    是否集群,负载均衡?
    答复:支持缓存保存在redis,系统,sping-cache等

    支持那些数据库呢?
    答复:现在仅支持Mysql。

    前后台接口交互方式是?支持springcloud吗?
    答复:系统前后台使用json传输,支持springcloud。

    可以开具发票吗?
    答复:个人,无法开具发票。

    代码更新以后免费提供吗?
    答复:提供,会在系统功能升级后,发送到您登记的邮箱。

    系统支持那些浏览器?
    答复:IE10+,chrome,360,百度。

    展开全文
  • 本项目使用:Springboot vue-element-admin shiro activiti前后端分离,流程审批,权限管理框架 技术说明: java版本:jdk1.8 Springboot:2.0.5 activiti:6.0.0 id生成采用雪花算法高效生成,适用于分布式系统 ...

    本项目使用:Springboot vue-element-admin shiro activiti前后端分离,流程审批,权限管理框架

    技术说明:

    1. java版本:jdk1.8
    2. Springboot:2.0.5
    3. activiti:6.0.0
    4. id生成采用雪花算法高效生成,适用于分布式系统
    5. 数据库:mysql-5.7.14
    6. 权限shiro:1.4.0
    7. swagger:1.8.0
    8. 前端:vue-2.6.1
    9. 前端 element-ui:2.7.0
      10.前端框架:vue-element-admin

    功能点、技术点:

    • 前端采用vue-element-admin框架,后端springboot,mybatis开发框架,数据库:mysql,前后端分离
      流程提供发起、跳转、任务处理,人员角色获取、角色类型获取、会签等功能。
    • 前端采用vue-element-admin框架,后端springboot,mybatis开发框架,数据库:mysql,前后端分离
      流程提供发起、跳转、任务处理,人员角色获取、角色类型获取、会签等功能。
    • 采用安全框架 shiro (登录授权)实现组织机构、角色,人员、功能权限、数据权限功能。
      后端支持分布式集成,如需分布式,请提出,我们会用最新的Springcloud微服务框架来进行集成。并可以给您部署ELK日志收集系统。
    • 目前后端采用Restful接口风格,并集成swagger,更好的服务员测试人员的接入。
      我们没有使用数据库id自增,而采用雪花算法,为了更好的服务于微服务系统,雪花算法效率更高。
    • 我们工作流采用activiti6.0为了更好的去更新工作流框架时更方便,6.x是activiti一个大的变化,砍去了pvm类。
    • 流程跟踪时,已执行节点绿色高亮展示,待执行节点红色高亮展示,未执行节点默认方式展示等。

    预览地址:http://activiti.wzbjsz.cn
    购买地址:咸鱼地址
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

    展开全文
  • 使用springboot,activiti,mybatis,vue elementui开发的后台管理系统(包含权限管理、工作流等功能),真正前后端分离的微服务架构,经过很多项目实战、淬炼、软件开发公司主流技术的集大成者。 有什么用? 在...

    是什么?

    使用springboot,activiti,mybatis,vue elementui开发的后台管理系统(包含权限管理、工作流等功能),真正前后端分离的微服务架构,经过很多项目实战、淬炼、软件开发公司主流技术的集大成者。

    功能点、技术点

    1. 前端采用vue element ui框架,后端spring boot,mybatis开发框架,数据库:mysql,前后端分离。
    2. 采用activiti工作流工作流框架,自定义流程设计
    3. 流程提供发起、跳转、转办、委派、授权、任务处理,人员角色获取、角色类型获取、会签等功能。
    4. 采用安全框架 Spring Security (登录授权)实现组织机构、角色,人员、功能权限、数据权限功能。
    5. 提供页面扩展功能,拖拽及可以扩展页面功能
    6. 后端多模块项目(基础设施子项目、基础功能子项目、业务功能子项目),结构清晰、各子项目独立扩展、升级。
    7. 后端系统组件化,提供分页树形通用查询数据结构,封装系统复杂度,只需要写出简单的业务代码,即能完成一个复杂的功能。
    8. 前端项目多模块(基础组件、通用框架、基础功能,业务功能),结构清晰,子项目独立。
    9. 前后端完美结合,很简单的代码即可以实现分页列表、树形等复杂页面。
    10. 前端提供数字输入、货币输入(输入时自动中文货币提示)、百分比输入、整数输入、字典下拉、日期快捷输入、日期范围输入表单控件。
    11. 前端自定义验证,简单HTML标签即可实现前端验证,提供必输,长度、数字,身份证号码等验证标记。
    12. 前端提供身份证号解析年龄,性别、出生日期、户籍地信息功能。
    13. 前端提供通用表格组件(支持树形,分页、合计、列筛选,排序、全部数据导出)、
    14. 前端提供通用表格编辑组件,支持新增、删除、行编辑、行验证
    15. 前端提供通用树组件、支持多选、筛选、增加子结点,删除,自定义结点。
    16. 前端提供通用文件上传组件、基于百度WebUploader封装文件上传组件、大文件分片并发上传,断点重试;提供批量压缩下载、 图片、PDF、视频、音频在线预览功能。
    17. 前端提供通用excel导入组件,简单代码即可实现功能强大,严密的数据导入功能。
    18. 基于word模板导出word,pdf文件,可批量
    19. 基于mybatis-plus数据扩展框架、通用CRUD操作、内置SQL注入剥离器,有效防护SQL注入功击,支持假删除并发更新冲突检测等功能。
    20. 登录密码加密,验证码,登陆多次错误后账号自动锁定,接口加密身份校验
    21. java Quartz 任务调度,已实现Mysql数据库定时备份功能。
    22. 数据库连接池 阿里的 druid。Druid在监控、可扩展性、稳定性和性能方面都有明显的优势,支持并发
    23. java websocket 即时通讯技术,消息通知
    24. redis 自定义缓存,分布式锁,杜绝重复提交 ,增加系统性能
    25. 提供代码生成工具,支持单实体、主子实体、树型实体结构,根据编写好的类代码元数据,可生成前端、后端、数据库可以直接运行的代码

    预览地址:http://47.94.229.181:81/jrtechapp/

    服务器CPU1核内存1G带宽1M,访问比较慢,望谅解

    截图

    • 自定义流程设计
      流程设计
    • 页面扩展功能
      页面扩展
    • 用户、所属岗位管理
      用户管理
    • 角色、功能权限、数据权限管理
      角色管理
    • 系统日志(记录用户在系统的所有操作,包括方法,参数等;记录系统错误)
      系统日志
    • 数据库字典
      数据库字典
    • api文档
      api文档
    • 定时任务(数据库每日备份)
      定时任务(数据库每日备份)
    • 即时通讯技术,消息通知
      即时通讯技术,消息通知
    • 分页查询一(分页、列筛选,排序、全部数据导出)
      分页、列筛选,排序、全部数据导出
    • 分页查询二(包括时间范围选择控件、下拉、弹出选择)
      分页查询2
    • 录入窗体一(身份证录入,解析)
      录入窗体一(身份证录入,解析)
    • 录入窗体二(下拉、百分比) 录入窗体二(下拉、货币、百分比)
    • 录入窗体三 货币输入(输入时自动中文货币提示)货币输入自动大写显示
    • 录入窗体四(弹出选择)
      录入窗体四(弹出选择)
    • 表格编辑组件,支持新增、删除、行编辑、行验证
      表格编辑组件,支持新增、删除、行编辑、行验证
    • word,pdf模板打印导出
      word,pdf模板打印导出
    • word,pdf模板批量打印导出
      word,pdf模板批量打印导出
    • 大文件批量上传
      大文件上传
    • 文件打包压缩下载、缩略图显示
      文件打包压缩下载、缩略图显示
    • 图片、PDF、视频、音频在线预览
      图片在线预览图片在线预览
      PDF在线预览PDF在线预览
      视频在线预览视频在线预览
    • Excel通用数据导入
      Excel通用数据导入
    • 审批历史,流程跟踪
      审批历史,流程跟踪
    • 代码生成工具
      在这里插入图片描述
    展开全文
  • 集成Activiti 5.22,考虑到文档资料较多未选用新版本(模型设计器改动较大)或Flowable 集成的工作流编辑器在后台静态资源中,记得在系统配置中设置访问域名,开发时直接填后台请求地址前缀 ...
    
    

    集成Activiti 5.22,考虑到文档资料较多未选用新版本(模型设计器改动较大)或Flowable

    集成的工作流编辑器在后台静态资源中,记得在系统配置中设置访问域名,开发时直接填后台请求地址前缀 http://localhost:8888 即可

    几大常用接口

    1. RepositoryService:提供一系列管理流程部署和流程定义的API
    2. RuntimeService:在流程运行时对流程实例进行管理与控制
    3. TaskService:对流程任务进行管理,例如任务提醒、任务完成和创建任务等
    4. IdentityService:提供对流程角色数据进行管理的API,这些角色数据包括用户组、用户及它们之间的关系
    5. HistoryService:对流程的历史数据进行操作,包括查询、删除这些历史数据

    25张表

    1、act_ge_ 通用数据表,ge是general的缩写
    2、act_hi_ 历史数据表,hi是history的缩写,对应HistoryService接口
    3、act_id_ 身份数据表,id是identity的缩写,对应IdentityService接口
    4、act_re_ 流程存储表,re是repository的缩写,对应RepositoryService接口,存储流程部署和流程定义等静态数据
    5、act_ru_ 运行时数据表,ru是runtime的缩写,对应RuntimeService接口和TaskService接口,存储流程实例和用户任务等动态数

    XBoot扩展基本开发指南

    • 通用流程状态表t_act_bussiness,其中table_id字段存储关联的表单ID

    • 后台仅需开发相应表单增删改接口,存储至单张表中,如t_leave,唯一需注意的地方为新增接口(添加新数据时)需关联业务act_buniess表,向其添加流程和表ID等信息,参考LeaveController

    • 前台仅需开发相应单个表单页面(可以通过路由传参实现相应按钮显示),参考leave.vue(以菜单中配置的该路由名name跳转),记得在src/router/router.js中添加路由

    • 最后记得在系统中配置相应流程信息

      • 数据字典"业务表"中添加相应业务表名,如"t_leave";“业务表单路由"中添加相应前端表单组件路由名,如"leave”
      • 流程管理中编辑填写关联刚开发的表单信息,业务表的作用主要为用户删除申请时关联删除相应表单数据,表单路由名作用为跳转显示刚前端开发的表单页面

      QQ截图20190113212518.png

    • 流程节点审批人可根据角色、部门负责人、人员设置多个,设置后默认勾选,为或签(任意一人审批,流程进入下一步,即先到先审)

    • 如何实现会签?

      • 请增加审批节点!

      QQ截图20190118111505.png

    • 分支网关设定

      • 注意:暂仅支持互斥(排他)网关设置。为保证工作流简单性,建议仅使用开始、结束、任务节点和单向连线,设置分支后流程将变得不灵活,用户容易编辑出错。

    若部署后流程图中文字符无法显示,是因为服务器环境jdk中无相应中文字体,百度安装即可(配置文件已配置微软雅黑,若未配置默认宋体)

    互斥(排他)网关设定

    顾名思义,当出现多个分支时仅选择一个满足条件的分支流转

    WX20190523-221422@2x.png

    • 点击互斥网关后的连线设置流转条件的条件UEL表达式 https://www.activiti.org/userguide/#apiExpressions
      WX20190523-221523@2x.png

    • 注意勾选默认网关后不得设置流转条件,否则无法部署成功
      WX20190523-221700@2x.png

    • 启动流程时或完成一个任务节点时务必加入该变量(否则配置了流转条件变量的流程会报错),示例:

    // 启动流程时添加变量,详见ActBusinessController的apply或start方法,在ActBusiness中设置params
    actBusiness.getParams().put("duration", 36);
    
    // 或者完成任务节点时加入变量
    Map<String, Object> params = new HashMap<>(16);
    taskService.complete(id, params);
    

    绑定监听器示例

    常见的业务需求需要完成一个审批流程后改变原数据状态、通知审批结果消息或执行其他操作,在结束节点上绑定监听器即可,一旦结束说明流程全部通过,触发自定义业务。

    • 绘制流程图填写定义的监听器类
    • 监听器示例代码
    @Slf4j
    public class MyListener implements ExecutionListener {
    
        @Override
        public void notify(DelegateExecution delegateExecution) throws Exception {
    
            // 获取关联业务表ID变量(启动流程代码里已存入tableId,此处直接获取即可)
            String tableId = (String) delegateExecution.getVariable("tableId");
            log.info(tableId);
            LeaveService leaveService = SpringContextUtil.getBean(LeaveService.class);
            Leave leave = leaveService.get(tableId);
            ... ...
        }
    }
    

    使用发起流程组件示例

    • 前端vue示例,注意各状态下仅能显示的各操作按钮
    <template>
        <process-start
            ref="processStart"
            @on-submit="submitedProcess"
            @on-loading="processLoading=true"
            @on-loaded="processLoading=false"
        />
        <process-cancel ref="processCancel" @on-submit="submitedProcess"/>
    </template>
    
    <script>
    ...
    import processStart from '../../../views/my-components/xboot/process-start'
    import processCancel from '../../../views/my-components/xboot/process-cancel'
    
    export default {
      name: 'demo',
      components: {
        processStart,
        processCancel
      },
      data () {
        return {
          ...
          columns: [
            // 表头
            {
              title: '申请状态',
              key: 'status',
              sortable: true,
              minWidth: 110,
              fixed: 'right',
              render: (h, params) => {
                let text = '未知',
                  color = ''
                if (params.row.status === 0) {
                  text = '草稿'
                  color = 'default'
                } else if (params.row.status === 1) {
                  text = '处理中'
                  color = 'orange'
                } else if (params.row.status === 2) {
                  text = '已结束'
                  color = 'blue'
                }
                return h('div', [
                  h(
                    'Tag',
                    {
                      props: {
                        color: color,
                      },
                    },
                    text,
                  ),
                ])
              },
            },
            {
              title: '申请结果',
              key: 'result',
              sortable: true,
              minWidth: 110,
              fixed: 'right',
              render: (h, params) => {
                let text = '未知',
                  color = ''
                if (params.row.result == 0) {
                  text = '未提交'
                  color = 'default'
                } else if (params.row.result == 1) {
                  text = '处理中'
                  color = 'orange'
                } else if (params.row.result == 2) {
                  text = '已通过'
                  color = 'green'
                } else if (params.row.result == 3) {
                  text = '已驳回'
                  color = 'red'
                }
                return h('div', [
                  h(
                    'Tag',
                    {
                      props: {
                        color: color,
                      },
                    },
                    text,
                  ),
                ])
              },
            },
            {
              title: '操作',
              key: 'action',
              align: 'center',
              fixed: 'right',
              width: 260,
              render: (h, params) => {
                let result = params.row.result
                if (result == 0) {
                  return h('div', [
                    h(
                      'Button',
                      {
                        props: {
                          type: 'primary',
                          size: 'small',
                        },
                        style: {
                          marginRight: '5px',
                        },
                        on: {
                          click: () => {
                            this.showProcess(params.row)
                          },
                        },
                      },
                      '发起申请',
                    ),
                    h(
                      'Button',
                      {
                        props: {
                          size: 'small',
                          icon: 'ios-create-outline',
                        },
                        style: {
                          marginRight: '5px',
                        },
                        on: {
                          click: () => {
                            this.edit(params.row)
                          },
                        },
                      },
                      '编辑',
                    ),
                    h(
                      'Button',
                      {
                        props: {
                          type: 'error',
                          size: 'small',
                          icon: 'md-trash',
                        },
                        on: {
                          click: () => {
                            this.remove(params.row)
                          },
                        },
                      },
                      '删除',
                    ),
                  ])
                }
                if (result == 1) {
                  return h('div', [
                    h(
                      'Button',
                      {
                        props: {
                          size: 'small',
                          type: 'warning',
                        },
                        style: {
                          marginRight: '5px',
                        },
                        on: {
                          click: () => {
                            this.cancelProcess(params.row)
                          },
                        },
                      },
                      '撤回申请',
                    ),
                    h(
                      'Button',
                      {
                        props: {
                          size: 'small',
                        },
                        style: {
                          marginRight: '5px',
                        },
                        on: {
                          click: () => {
                            this.history(params.row)
                          },
                        },
                      },
                      '审批历史',
                    ),
                  ])
                }
                if (result == 2) {
                    h(
                      'Button',
                      {
                        props: {
                          size: 'small',
                        },
                        style: {
                          marginRight: '5px',
                        },
                        on: {
                          click: () => {
                            this.history(params.row)
                          },
                        },
                      },
                      '审批历史',
                    ),
                  ])
                }
                if (result === 3) {
                  return h('div', [
                    h(
                      'Button',
                      {
                        props: {
                          type: 'primary',
                          size: 'small',
                        },
                        style: {
                          marginRight: '5px',
                        },
                        on: {
                          click: () => {
                            this.showProcess(params.row)
                          },
                        },
                      },
                      '重新申请',
                    ),
                    h(
                      'Button',
                      {
                        props: {
                          size: 'small',
                          icon: 'ios-create-outline',
                        },
                        style: {
                          marginRight: '5px',
                        },
                        on: {
                          click: () => {
                            this.edit(params.row)
                          },
                        },
                      },
                      '编辑',
                    ),
                  ])
                }
              },
            },
          ]
        }
      },
      methods: {
        ...
        showProcess (v) {
          // 显示通过key发起流程组件
          this.$refs.processStart.show('demand', v.actBusinessId)
        },
        cancelProcess (v) {
          // 取消流程
          this.$refs.processCancel.show(v.actBusinessId, v.procInstId)
        },
        submitedProcess () {
          // 进行流程操作后刷新表单数据显示流程状态
          this.getDataList()
        },
        history (v) {
          // 审批历史
          if (!v.procInstId) {
            this.$Message.error('流程实例ID不存在')
            return
          }
          let query = { id: v.procInstId, backRoute: this.$route.name }
          this.$router.push({
            name: 'historic_detail',
            query: query,
          })
        }}
      }
    }
    
    • 后端业务接口,注意与“工作流程-我的申请”中已有请假示例LeaveController示例中的区别,这里无需传入流程定义ID,ActBussines表与业务表两两关联记录对方ID方便查询
        @RequestMapping(value = "/add",method = RequestMethod.POST)
        @ApiOperation(value = "添加审批需求")
        public Result<Object> add(@ModelAttribute Demand demand){
    
            Demand d = demandService.save(demand);
            // 保存至我的申请业务
            String userId = securityUtil.getCurrUser().getId();
            ActBusiness actBusiness = new ActBusiness();
            actBusiness.setUserId(userId);
            // 记录关联业务表ID
            actBusiness.setTableId(d.getId());
            ActBusiness a = actBusinessService.save(actBusiness);
            // 记录关联流程状态表ID
            d.setActBusinessId(a.getId());
            demandService.update(d);
            return new ResultUtil<Object>().setSuccessMsg("操作成功");
        }
    
    • 效果预览
    展开全文
  • 使用springboot,activiti,mybatis,vue elementui开发的后台管理系统(包含权限管理、工作流等功能),真正前后端分离的微服务架构,经过很多项目实战、淬炼、软件开发公司主流技术的集大成者。功能点、技术点前端采用...
  • 考虑到文档资料较多未选用新版本(模型设计器改动较大)或Flowable 整合Activiti 5.22 添加依赖,因项目已使用Mybatis-Plus,需在这里排除其mybatis依赖 <dependency> <groupId>org.activitigroupId> <artifactId>...
  • 宣传官网 xb.exrick.cn 在线Demo xboot.exrick.cn 开源版Github地址 github.com/Exrick/x-bo… ... Stomp是一种简单(流)文本定向消息协议,提供了一个可互操作的链接格式。允许stomp客户端与任意sto...
  • 宣传官网 http://xb.exrick.cn 在线Demo http://xboot.exrick.cn 开源版Github地址 https://github.com/Exrick/x-boot 开发文档 https://www.kancloud.cn/exrick/xboot/1009234 获取完整版 ... ...
  • 宣传官网 http://xb.exrick.cn 在线Demo http://xboot.exrick.cn 开源版Github地址 https://github.com/Exrick/x-boot 开发文档 https://www.kancloud.cn/exrick/xboot/1009234 ... Stomp是一...
  • 基于Spring Boot 2.x的前后端分离开发平台X-Boot 前端:Vue+iView Admin 后端:Spring Boot 2.x/Spring Security/JWT/Spring Data JPA+Mybatis-Plus/Redis/Elasticsearch/Activiti 分布式限流/同步锁/验证码/...
  • .zip,基于Spring Boot 2.x的前后端分离开发平台X-Boot 前端:Vue iView Admin 后端:Spring Boot 2.x/Spring Security/JWT/Spring Data JPA Mybatis-Plus/Redis/Elasticsearch/Activiti 分布式限流/同步锁/验证码/...
  • 况且,目前都采用前后端分离的方式,前端框架也比较成熟和流行,我们还把html放在后端,从前端、后端、部署三个层面都显的很鸡肋,后面零零散散找了一些资料,踩了很多坑,奋斗了几个晚上,终于集成完毕。...
  • 前后端分离项目,前端使用的VUE,后端是SpringBoot框架2.1.3 首先pom文件下添加activiti依赖 后端项目启动后可以正常登陆,但是当访问到activiti模块下的页面的时候报跨域的问题,如下图所示 当把pom文件里的上图...

空空如也

空空如也

1 2
收藏数 36
精华内容 14
关键字:

activitivue前后端分离

vue 订阅