分享通过PDManer数据库建模工具实现快速开发(数据库->实体类->服务->接口->页面表单/表格)一键生成,PDManer数据库建模工具实现一键快速开发流程,从数据库到页面表单/表格的实体类生成服务及接口分享

马肤

温馨提示:这篇文章已超过405天没有更新,请注意相关的内容是否还可用!

摘要:使用PDManer数据库建模工具,可以快速实现从数据库到实体类、服务、接口和页面表单/表格的一键生成。这一工具简化了开发流程,提高了开发效率。通过该工具,开发人员能够直观地建立数据库模型,并自动生成与业务逻辑相关的实体类、服务层和接口层代码,最后生成页面表单或表格,大大缩短了开发周期,降低了开发难度。

PDManer数据库建模工具一键生成前后端代码

  • PDManer
    • 功能介绍
    • 资源下载
    • 项目基础框架
    • 操作及注意事项
    • 重点来了!!!
    • 更新日志
      • Java代码生成模板
        • entity.java
        • controller.java
        • mapper.java
        • service.java
        • impl.java
        • dto.java
        • Vue代码生成模板
          • api.ts
          • Table.vue
          • Form.vue
          • index.vue
          • 其他代码
            • Res.Java
            • ResEnum.java
            • BaseBatch.java
            • BaseQuery.java
            • RequestPage.java
            • TableButton.vue
            • layout.ts
            • axios.ts
            • common.ts

              PDManer

              PDManer是一款开源的数据库建模工具,它可以帮助开发人员快速建立和维护数据库模型。PDManer支持多种数据库管理系统,包括MySQL、Oracle、Microsoft SQL Server等。使用PDManer,用户可以通过可视化界面轻松地设计数据库模型,并且可以自动生成SQL脚本和数据库表结构。此外,PDManer还支持代码自动生成,非常适合快速开发。

              官网:http://www.pdmaas.cn/home

              Gitee:https://gitee.com/robergroup/pdmaner

              相关文章:OSChina | 知乎

              分享通过PDManer数据库建模工具实现快速开发(数据库->实体类->服务->接口->页面表单/表格)一键生成,PDManer数据库建模工具实现一键快速开发流程,从数据库到页面表单/表格的实体类生成服务及接口分享 第1张

              功能介绍

              本文主要讲使用PDManer进行快速开发,一键生成代码,主键介绍一下涉及到的功能模块

              1. 数据库连接,字段比对及生成SQL;

                分享通过PDManer数据库建模工具实现快速开发(数据库->实体类->服务->接口->页面表单/表格)一键生成,PDManer数据库建模工具实现一键快速开发流程,从数据库到页面表单/表格的实体类生成服务及接口分享 第2张

                分享通过PDManer数据库建模工具实现快速开发(数据库->实体类->服务->接口->页面表单/表格)一键生成,PDManer数据库建模工具实现一键快速开发流程,从数据库到页面表单/表格的实体类生成服务及接口分享 第3张

              2. 字段类型配置及代码生成模板配置模板语法请参考dot.js语法官网 | 中文参考;

                分享通过PDManer数据库建模工具实现快速开发(数据库->实体类->服务->接口->页面表单/表格)一键生成,PDManer数据库建模工具实现一键快速开发流程,从数据库到页面表单/表格的实体类生成服务及接口分享 第4张

                分享通过PDManer数据库建模工具实现快速开发(数据库->实体类->服务->接口->页面表单/表格)一键生成,PDManer数据库建模工具实现一键快速开发流程,从数据库到页面表单/表格的实体类生成服务及接口分享 第5张

                分享通过PDManer数据库建模工具实现快速开发(数据库->实体类->服务->接口->页面表单/表格)一键生成,PDManer数据库建模工具实现一键快速开发流程,从数据库到页面表单/表格的实体类生成服务及接口分享 第6张

              资源下载

              安装包已经上传到CSDN,也可在Gitee上下载源码自行打包

              [PDManer-win-4.5.1下载]

              [代码生成器配置]

              项目基础框架

              以上功能简单了解完后,来介绍一下项目的基础框架

              后端框架:

              框架描述文档
              SpringBoot基础框架
              Mybatis数据库连接
              Mybatis-Plus增强https://baomidou.com/
              Mybatis-Plus-Join用于联表查询https://ylctmh.com/

              前端框架:

              框架描述文档
              Vue 3基础框架
              Vue-Router路由库
              Pinia状态管理
              Axios网络请求库
              Element-Plus组件库https://element-plus.gitee.io/zh-CN/

              操作及注意事项

              1. 数据库代码:直接复制执行就可以了

                分享通过PDManer数据库建模工具实现快速开发(数据库->实体类->服务->接口->页面表单/表格)一键生成,PDManer数据库建模工具实现一键快速开发流程,从数据库到页面表单/表格的实体类生成服务及接口分享 第7张

              2. 代码生成:如下图配置文件路径及基本参数即可在指定目录生成文件

                分享通过PDManer数据库建模工具实现快速开发(数据库->实体类->服务->接口->页面表单/表格)一键生成,PDManer数据库建模工具实现一键快速开发流程,从数据库到页面表单/表格的实体类生成服务及接口分享 第8张

                分享通过PDManer数据库建模工具实现快速开发(数据库->实体类->服务->接口->页面表单/表格)一键生成,PDManer数据库建模工具实现一键快速开发流程,从数据库到页面表单/表格的实体类生成服务及接口分享 第9张

              重点来了!!!

              不编了,直接贴上我的配置,如有遗漏可以私信我,补上代码

              更新日志

              2023-03-31 初版模板发布

              2023-04-12 增加逻辑删除字段标识;增加Vue表格及表单屏蔽字段设置;增加表单回车事件

              Java代码生成模板

              entity.java
              {{  var pkgName = it.entity.env.base.nameSpace;
                  var appName = pkgName.split('.')[pkgName.split('.').length - 1];
                  var beanName = it.func.camel(it.entity.defKey,false);
                  var beanClass = it.func.camel(it.entity.defKey,true);
                  var exclude = [];
                  var autoInsert = ['created_by','created_time'];
                  var autoUpdate = ['updated_by','updated_time'];
                  var version="version";
                  var deleted='deleted';
                  var extend="";
                  
              }}package {{=pkgName}}.entity;
              $blankline
              import com.baomidou.mybatisplus.annotation.*;
              import lombok.Getter;
              import lombok.Setter;
              import lombok.experimental.Accessors;
              import java.time.LocalDateTime;
              import com.fasterxml.jackson.annotation.JsonFormat;
              import org.springframework.format.annotation.DateTimeFormat;
              $blankline
               /**
               * {{=it.entity.defName}}{{=it.entity.comment}}
               */
              @Getter
              @Setter
              @Accessors(chain = true)
              @TableName("{{=it.entity.defKey}}")
              public class {{= beanClass}}Entity {{? extend != ""}}extends {{=extend}} {{?}}{
                  {{~it.entity.fields:field:index}}{{? exclude.indexOf(field.defKey) == -1}}
                  /** 
                   * {{=it.func.join(field.defName,field.comment,'\n     * ')}}
                   */
                  {{? field.defKey == version}}@Version{{?}}{{? field.defKey == deleted}}@TableLogic{{?}}
                  {{? field.primaryKey }}@TableId{{??}}@TableField{{?}}(value = "{{=field.defKey}}"{{? field.primaryKey }}, type = IdType.ASSIGN_UUID{{?}}{{? autoInsert.indexOf(field.defKey) != -1}}, fill = FieldFill.INSERT{{?}}{{? autoUpdate.indexOf(field.defKey) != -1}},fill = FieldFill.UPDATE{{?}})
                  {{? field.type=="LocalDateTime"}}@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
                  @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8"){{?}}
                  private {{? field.type == 'ENUM'}}{{=beanClass}}{{=it.func.camel(field.defKey,true)}}Enum{{??}}{{=field.type}}{{?}} {{=it.func.camel(field.defKey,false)}};{{?}}{{~}}
              $blankline
              }
              
              controller.java
              // controller.java
              {{  var pkgName = it.entity.env.base.nameSpace;
                  var appName = pkgName.split('.')[pkgName.split('.').length - 1];
                  var beanName = it.func.camel(it.entity.defKey,false);
                  var beanClass = it.func.camel(it.entity.defKey,true);
                  
                  var pkVarName = "undefinedId";
                  it.entity.fields.forEach(function(field){
                      if(field.primaryKey){
                          pkVarName = it.func.camel(field.defKey,true);
                          return;
                      }
                  });
                  
              }}package {{=pkgName}}.controller;
              $blankline
              import {{=pkgName}}.entity.{{=beanClass}}Entity;
              import {{=pkgName}}.service.{{=beanClass}}Service;
              import org.springframework.web.bind.annotation.PostMapping;
              import org.springframework.web.bind.annotation.RequestBody;
              import org.springframework.web.bind.annotation.RequestMapping;
              import org.springframework.web.bind.annotation.RestController;
              import javax.annotation.Resource;
              import java.util.List;
              $blankline
               /**
               * {{=it.entity.defName}}{{=it.entity.comment}}API接口
               */
              @RestController
              @RequestMapping("/{{=appName}}/{{=it.func.camel(it.entity.defKey,false)}}")
              public class {{=beanClass}}Controller {
              $blankline
                  @Resource
                  private {{=beanClass}}Service {{=beanName}}Service;
              $blankline
                   /**
                    * 根据主键获取{{=it.entity.defName}}
                    */
                  @PostMapping("get{{=beanClass}}")
                  public Res{=beanClass}}Entity get{{=beanClass}}(@RequestBody {{=beanClass}}Entity entity) {
                      entity = {{=beanName}}Service.getById(entity.get{{=pkVarName}}());
                      return Res.success(entity);
                  }
              $blankline
                   /**
                    * 分页获取{{=it.entity.defName}}
                    */
                  @PostMapping("get{{=beanClass}}Page")
                  public Res{=beanClass}}DTO get{{=beanClass}}Page(@RequestBody BaseQuery{=beanClass}}DTO request) {
                      MPJLambdaWrapper{=beanClass}}Entity wrapper = new MPJLambdaWrapper{=beanClass}}Entity();
                      IPage{=beanClass}}DTO page = {{=beanName}}Service.selectJoinListPage(request.getPage(), {{=beanClass}}DTO.class, wrapper);
                      return Res.success(page);
                  }
              $blankline
                   /**
                    * 获取全部{{=it.entity.defName}}
                    */
                  @PostMapping("get{{=beanClass}}List")
                  public Res{=beanClass}}Entity get{{=beanClass}}List() {
                      List{=beanClass}}Entity list = {{=beanName}}Service.list();
                      return Res.success(list);
                  }
              $blankline
                   /**
                    * 新增{{=it.entity.defName}}
                    */
                  @PostMapping("save{{=beanClass}}")
                  public Res{=beanClass}}Entity save{{=beanClass}}(@RequestBody {{=beanClass}}Entity entity) {
                      {{=beanName}}Service.save(entity);
                      return Res.success(entity);
                  }
              $blankline
                   /**
                    * 更新{{=it.entity.defName}}
                    */
                  @PostMapping("update{{=beanClass}}")
                  public Res update{{=beanClass}}(@RequestBody {{=beanClass}}Entity entity) {
                      boolean res = {{=beanName}}Service.updateById(entity);
                      return Res.success(res);
                  }
              $blankline
                   /**
                    * 删除{{=it.entity.defName}}
                    */
                  @PostMapping("delete{{=beanClass}}")
                  public Res delete{{=beanClass}}(@RequestBody {{=beanClass}}Entity entity) {
                      boolean res = {{=beanName}}Service.removeById(entity);
                      return Res.success(res);
                  }
              $blankline
                   /**
                    * 批量新增{{=it.entity.defName}}
                    */
                  @PostMapping("save{{=beanClass}}Batch")
                  public Res save{{=beanClass}}Batch(@RequestBody BaseBatch{=beanClass}}Entity batch) {
                      boolean res = {{=beanName}}Service.saveBatch(batch.getList());
                      return Res.success(res);
                  }
              $blankline
                   /**
                    * 批量更新{{=it.entity.defName}}
                    */
                  @PostMapping("update{{=beanClass}}Batch")
                  public Res update{{=beanClass}}Batch(@RequestBody BaseBatch{=beanClass}}Entity batch) {
                      boolean res = {{=beanName}}Service.updateBatchById(batch.getList());
                      return Res.success(res);
                  }
              $blankline
                   /**
                    * 批量删除{{=it.entity.defName}}
                    */
                  @PostMapping("delete{{=beanClass}}Batch")
                  public Res delete{{=beanClass}}Batch(@RequestBody BaseBatch{=beanClass}}Entity batch) {
                      boolean res = {{=beanName}}Service.removeBatchByIds(batch.getList());
                      return Res.success(res);
                  }
              $blankline
              }
              
              mapper.java
              // mapper.java
              {{  var pkgName = it.entity.env.base.nameSpace;
                  var beanClass = it.func.camel(it.entity.defKey,true);
                  
              }}package {{=pkgName}}.mapper;
              $blankline
              import com.github.yulichang.base.MPJBaseMapper;
              import {{=pkgName}}.entity.{{=beanClass}}Entity;
              import org.apache.ibatis.annotations.Mapper;
              $blankline
               /**
               * {{=it.entity.defName}}({{=it.entity.defKey}})表数据库访问层
               */
              @Mapper
              public interface {{=beanClass}}Mapper extends MPJBaseMapper{=beanClass}}Entity {
              }
              
              service.java
              // service.java
              {{  var pkgName = it.entity.env.base.nameSpace;
                  var beanClass = it.func.camel(it.entity.defKey,true);
                  
              }}package {{=pkgName}}.service;
              $blankline
              import com.github.yulichang.base.MPJBaseService;
              import {{=pkgName}}.entity.{{=beanClass}}Entity;
              $blankline
               /**
               * {{=it.entity.defName}}({{=it.entity.defKey}})表服务接口
               */
              public interface {{=beanClass}}Service extends MPJBaseService{=beanClass}}Entity {
              }
              
              impl.java
              // impl.java
              {{  var pkgName = it.entity.env.base.nameSpace;
                  var beanClass = it.func.camel(it.entity.defKey,true);
                  
              }}package {{=pkgName}}.service.impl;
              $blankline
              import com.github.yulichang.base.MPJBaseServiceImpl;
              import {{=pkgName}}.entity.{{=beanClass}}Entity;
              import {{=pkgName}}.mapper.{{=beanClass}}Mapper;
              import {{=pkgName}}.service.{{=beanClass}}Service;
              import org.springframework.stereotype.Service;
              $blankline
               /**
               * {{=it.entity.defName}}({{=it.entity.defKey}})表服务实现类
               */
              @Service
              public class {{=beanClass}}ServiceImpl extends MPJBaseServiceImpl{=beanClass}}Mapper, {{=beanClass}}Entity implements {{=beanClass}}Service {
              }
              
              dto.java
              // dto.java
              {{  var pkgName = it.entity.env.base.nameSpace;
                  var beanClass = it.func.camel(it.entity.defKey,true);
                  
              }}package {{=pkgName}}.dto;
              $blankline
              import {{=pkgName}}.entity.{{=beanClass}}Entity;
              import lombok.Data;
              $blankline
               /**
               * {{=it.entity.defName}}({{=it.entity.defKey}})数据传输对象
               */
              @Data
              public class {{=beanClass}}DTO extends {{=beanClass}}Entity {
              }
              

              Vue代码生成模板

              api.ts
              // api.ts
              {{  var pkgName = it.entity.env.base.nameSpace;
                  var appName = pkgName.split('.')[pkgName.split('.').length - 1];
                  var beanName = it.func.camel(it.entity.defKey,false);
                  var beanClass = it.func.camel(it.entity.defKey,true);
                   
                  var pkVarName = "undefinedId";
                  var pkDataType = "string";
                  it.entity.fields.forEach(function(field){
                      if(field.primaryKey){
                          pkVarName = it.func.camel(field.defKey,false);
                          pkDataType = field.type;
                          return;
                      }
                  });
                  
              }}import { createAxios } from '@/utils/axios'
              $blankline
              // 接口地址
              export const uri = '/{{=appName}}/{{=it.func.camel(it.entity.defKey,false)}}'
              $blankline
              // {{=it.entity.defName}}{{=it.entity.comment}}类型定义
              export interface {{=beanClass}} {
                  {{~it.entity.fields:field:index}}
                  {{=it.func.camel(field.defKey,false)}}?: {{=field.type}}, // {{=field.defName}}{{~}}
              }
              $blankline
              // 根据主键获取{{=it.entity.defName}}
              export const get{{=beanClass}} = ( {{=pkVarName}}: {{=pkDataType}} ) => createAxios({ data: { {{=pkVarName}} }, url: uri + '/get{{=beanClass}}' })
              $blankline
              // 分页获取{{=it.entity.defName}}
              export const get{{=beanClass}}Page = (query: any = {}, page: any = {}) => createAxios({data:{ query, page }, url: uri + '/get{{=beanClass}}Page' })
              $blankline
              // 获取全部{{=it.entity.defName}}
              export const get{{=beanClass}}List = () => createAxios({ url: uri + '/get{{=beanClass}}List' })
              $blankline
              // 新增{{=it.entity.defName}}
              export const save{{=beanClass}} = (data: {{=beanClass}}) => createAxios({ data, url: uri + '/save{{=beanClass}}' }, { successMsg: '新增成功' })
              $blankline
              // 更新{{=it.entity.defName}}
              export const update{{=beanClass}} = (data: {{=beanClass}}) => createAxios({ data, url: uri + '/update{{=beanClass}}' },{ successMsg: '修改成功!' })
              $blankline
              // 删除{{=it.entity.defName}}
              export const delete{{=beanClass}} = (data: {{=beanClass}}) => createAxios({ data, url: uri + '/delete{{=beanClass}}' },{ successMsg: '删除成功!' })
              $blankline
              // 批量新增{{=it.entity.defName}}
              export const save{{=beanClass}}Batch = (list: {{=beanClass}}[]) => createAxios({ data : { list }, url: uri + '/save{{=beanClass}}Batch' }, { successMsg: '新增成功' })
              $blankline
              // 批量更新{{=it.entity.defName}}
              export const update{{=beanClass}}Batch = (list: {{=beanClass}}[]) => createAxios({ data : { list }, url: uri + '/update{{=beanClass}}Batch' },{ successMsg: '修改成功!' })
              $blankline
              // 批量删除{{=it.entity.defName}}
              export const delete{{=beanClass}}Batch = (list: {{=beanClass}}[]) => createAxios({ data : { list }, url: uri + '/delete{{=beanClass}}Batch' },{ successMsg: '删除成功!' })
              $blankline
              
              Table.vue
              // table.vue
              {{  var pkgName = it.entity.env.base.nameSpace;
                  var appName = pkgName.split('.')[pkgName.split('.').length - 1];
                  var beanName = it.func.camel(it.entity.defKey,false);
                  var beanClass = it.func.camel(it.entity.defKey,true);
                  var exclude = ['uid','created_by','created_time','updated_by','updated_time','deleted','sort'];
                  
                  var pkVarName = "undefinedId";
                  it.entity.fields.forEach(function(field){
                      if(field.primaryKey){
                          pkVarName = it.func.camel(field.defKey,false);
                          return;
                      }
                  });
                  
              }}
              import {
                  {{=beanClass}},
                  get{{=beanClass}},
                  get{{=beanClass}}Page,
                  save{{=beanClass}},
                  update{{=beanClass}},
                  delete{{=beanClass}}Batch,
              } from '@/apis/{{=appName}}/{{=beanClass}}'
              import {{=beanClass}}Form from './{{=beanClass}}Form.vue'
              import { computed, onMounted, reactive, ref } from 'vue'
              import { ElTable } from 'element-plus'
              import pinyin from 'pinyin-match'
              import { replaceKeyword } from '@/utils/common'
              import { useLayout } from '@/stores/layout'
              $blankline
              // 主题样式
              const layout = useLayout()
              $blankline
              const emits = defineEmits([''])
              $blankline
              const formRef = ref{=beanClass}}Form()
              const tableRef = ref()
              // 加载状态
              const loading = ref(false)
              // 表格数据定义
              const data = ref({
                  current: 1,
                  size: 50,
                  total: 0,
                  records: [] as {{=beanClass}}[],
              })
              // 查询表单
              const query = reactive({
                  search: ''
              })
              // 弹出表单配置
              const dialog = reactive({
                  show: false,
                  title: '',
                  form: {} as {{=beanClass}},
              })
              $blankline
              // 表格数据过滤
              const tableData = computed(() =>
                  data.value.records.filter(
                      (e) =>
                          !query.search ||
              {{~it.entity.fields:field:index}}{{? exclude.indexOf(field.defKey) == -1}}
                          {{? field.type == 'string'}}(e.{{=it.func.camel(field.defKey,false)}} && pinyin.match(e.{{=it.func.camel(field.defKey,false)}}, query.search)){{? index  {
                  loading.value = true
                  get{{=beanClass}}Page(query, { current: data.value.current, size: data.value.size }).then((res) => {
                      setTimeout(() => { loading.value = false }, 500)
                      data.value = res.data
                  })
              }
              $blankline
              // 新增按钮事件
              const handleAdd = () => {
                  dialog.show = true
                  dialog.title = '新增{{=it.entity.defName}}'
                  dialog.form = {
                  {{~it.entity.fields:field:index}}{{? exclude.indexOf(field.defKey) == -1}}
                  {{=it.func.camel(field.defKey,false)}} : {{=field.defaultValue || "''"}} ,{{?}}{{~}}
                  }
              }
              $blankline
              // 删除按钮事件
              const handleDel = () => {
                  const list = tableRef.value?.getSelectionRows()
                  loading.value = true
                  delete{{=beanClass}}Batch(list).then(() => {
                      getData()
                  })
              }
              $blankline
              // 查询事件
              const handleQuery = () => {
                  getData()
              }
              $blankline
              // 表格行双击事件
              const handleTableDbClick = (row: {{=beanClass}}) => {
                  dialog.title = '{{=it.entity.defName}}'
                  if (row.{{=pkVarName}}) {
                      loading.value = true
                      get{{=beanClass}}(row.{{=pkVarName}}).then((res) => {
                          dialog.form = res.data
                          setTimeout(() => {
                              loading.value = false
                              dialog.show = true
                          }, 500)
                      })
                  }
              }
              $blankline
              // 弹出表单提交事件
              const dialogConfirm = async () => {
                  await formRef.value?.formRef?.validate((valid) => {
                      if (valid) {
                          loading.value = true
                          const fun = dialog.form.id ? update{{=beanClass}} : save{{=beanClass}}
                          fun(dialog.form).then(() => { getData() }).finally(() => { setTimeout(() => { dialog.show = false }, 500) })
                      }
                  })
              }
              $blankline
              onMounted(() => {
                  getData()
              })
              
              $blankline
              
                  
                      
                          
                              
                              
                                  
                                      
                                      
                                      
                                  
                              
                              
                              
                                  
                                      
                                          
                                      
                                      
                                          
                                      
                                  
                              
                          
                      
              $blankline
                      
                      

0
收藏0
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

相关阅读

  • 【研发日记】Matlab/Simulink自动生成代码(二)——五种选择结构实现方法,Matlab/Simulink自动生成代码的五种选择结构实现方法(二),Matlab/Simulink自动生成代码的五种选择结构实现方法详解(二)
  • 超级好用的C++实用库之跨平台实用方法,跨平台实用方法的C++实用库超好用指南,C++跨平台实用库使用指南,超好用实用方法集合,C++跨平台实用库超好用指南,方法与技巧集合
  • 【动态规划】斐波那契数列模型(C++),斐波那契数列模型(C++实现与动态规划解析),斐波那契数列模型解析与C++实现(动态规划)
  • 【C++】,string类底层的模拟实现,C++中string类的模拟底层实现探究
  • uniapp 小程序实现微信授权登录(前端和后端),Uniapp小程序实现微信授权登录全流程(前端后端全攻略),Uniapp小程序微信授权登录全流程攻略,前端后端全指南
  • Vue脚手架的安装(保姆级教程),Vue脚手架保姆级安装教程,Vue脚手架保姆级安装指南,Vue脚手架保姆级安装指南,从零开始教你如何安装Vue脚手架
  • 如何在树莓派 Raspberry Pi中本地部署一个web站点并实现无公网IP远程访问,树莓派上本地部署Web站点及无公网IP远程访问指南,树莓派部署Web站点及无公网IP远程访问指南,本地部署与远程访问实践,树莓派部署Web站点及无公网IP远程访问实践指南,树莓派部署Web站点及无公网IP远程访问实践指南,本地部署与远程访问详解,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南。
  • vue2技术栈实现AI问答机器人功能(流式与非流式两种接口方法),Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法探究,Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法详解
  • 发表评论

    快捷回复:表情:
    评论列表 (暂无评论,0人围观)

    还没有评论,来说两句吧...

    目录[+]

    取消
    微信二维码
    微信二维码
    支付宝二维码