非低代码,我写了一个比ChatGPT还牛的CRUD代码生成器

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 
  • 原创 | Java 2021 超神之路,很肝~

  • 中文详细注释的开源项目

  • RPC 框架 Dubbo 源码解析

  • 网络应用框架 Netty 源码解析

  • 消息中间件 RocketMQ 源码解析

  • 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析

  • 作业调度中间件 Elastic-Job 源码解析

  • 分布式事务中间件 TCC-Transaction 源码解析

  • Eureka 和 Hystrix 源码解析

  • Java 并发源码

来源:juejin.cn/post/

7197237024972144697

  • 缘起

  • 使用演示

  • 通用性的思考

  • 代码生成的原理

  • 代码模版参考

  • 动态参数

  • 动态代码块


缘起

大家好呀,我是架构师业余草。

最近在做一个项目,需要新建20多张表

相信大多数同学应该和我一样,都是比较讨厌创建新表这个工作的,因为每创建一张表,都要去创建实体类、创建增删改查的接口、编写增删改查的SQL代码等等,把这些事情做完,2个小时也就过去了

我就在思考啊,每一张表,就要耗费两个小时,20多张表,那就是40多个小时,一周的时间就这样过去了。

d310db8a96e37255cc5ceacb730b25eb.jpeg
思考

这谁受得了呀,所以我打算写一个工具,把这些代码都自动生成出来!

741e62daca2581cd7392c82c488ded91.gif

代码都自动生成出来

在连续爆肝了5个晚上之后,我做出了这款自动生成业务代码的工具!

534d21c6e64d2c091b34ede087c454c7.jpeg
自动生成业务代码

我把它放在了我的工具站上,大家可以访问这个域名直接使用https://utilsbox.cn/?app=bizcode

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

使用演示

下面给大家演示一下

假设我们现在创建一个商品表

首先填写表名和表的中文名称

然后我们添加商品表对应的字段,这些操作和我们日常使用的数据库工具差不多

把字段填写好了之后,点击“一键生成代码”

b5e973287440ee39f4bff746486b9d66.jpeg
完成表信息编辑

高潮的地方来了

DB层、业务层、甚至是controller层的代码,工具都帮我们自动生成了!

来看下代码,建表sql、增删改查sql、表对应的实体类、DB层的接口类、业务层的实体类、业务层的接口类、业务接口的实现类、业务层实体类和db层实体类的转换器,最后是controller层,这些代码全都帮我们生成好了。

949a271531938d645be096dca4c5ba13.gif

代码全都帮我们生成好了

这是什么概念呢

现在我们只需要把这些代码拷贝到项目里,简单设置一下类的引用,增删改查这些基本功能,就已经可以直接给前端去调用了。

34e25b60672fb5d2372e497c83c04c07.jpeg
CRUD

很多同学可能会问,如果是现有的数据表,再来这里添加一次感觉太麻烦了

这个问题我也遇到了,所以我做了一个识别建表SQL的功能,常见的数据库工具对于已经创建好的表,都提供建表语句的复制功能,只需要把建表SQL粘贴到这个文本框里。

点击“识别”按钮,这个SQL的信息会自动识别过来,这时候只需要把表的中文名称填写上去,点击“一键生成代码”,就可以马上得到这个表的业务代码。

021c502de34a34dcf74fdea2eea29e66.jpeg
业务代码生成器

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

通用性的思考

不知道大家觉得怎么样哈,如果只是我自己用,我觉着已经非常好了,但既然是开放出来给大家用,通用性肯定还是不够的。

因为现在看到的这一套自动生成的代码,可能只是适合我,但不同的人、不同的公司,它们项目结构的分层、代码的细节,都是不一样的

所以,我还开发了代码模版配置的功能

点击“代码模版配置”按钮,在这个弹窗里,我们可以新增、删除代码的分类。同样的,也可以新增、删除和编辑具体的代码模版。

d4e9550b1b4bffe34622f0b92bd4895e.jpeg
代码模版

代码生成的原理

在说代码模版具体怎么配置之前,先给大家讲一下代码自动生成的原理

它由代码模版和动态参数组成,核心就是匹配 - 替换

首先,工具提供了很多动态参数,这些动态参数,对应的是我们填写的表名、字段名等等这些信息的原始值,或者处理过后的值。

然后,代码模版由用户自行定义,在代码的关键位置,插入动态参数,即可形成一份代码模版。

最后,工具通过匹配和替换动态参数,最终生成了代码。

理论上,不论什么语言,你都可以配置专属于你自己的代码模版。

举个简单的栗子:

我们配置了一份这样的代码模版,如下:

/*** $table_desc$Model模型* Created by 创建人 on $current_time$.*/
public class $table_name_hump_A$Model extends ToString{
}

可以看到,模版里分别使用了$table_desc$(表中文名)$current_time$(当前时间)$table_name_hump_A$(表名转首字母大写驼峰) 这三个动态参数。

当我们设置 表名 = goods_order、表中文名 = 商品订单 时,代码生成的结果如下所示:

/*** 商品订单Model模型* Created by 创建人 on 2023-02-05 17:12:32.*/
public class GoodsOrderModel extends ToString{
}

动态参数部分,全部替换成了我们输入的表信息。

最后希望这个项目对大家有用,之后我会开发更多有意思的项目。

由于这个项目都是晚上加班肝出来的,可能会存在一些BUG,发现了我会尽快修复的,也请大家多多包涵。

c0b0014d07dfda99ae692f66bb317a7b.jpeg

代码模版参考

以下是当前工具里默认的代码模版,你可以通过参考这些模版,举一反三,配置出专属于你自己的代码模版。

工具提供了模版的导入和导出功能,如果你创建好了一份非常满意的模版,可以导出,然后发给你的同事直接使用,这样它就不用重复创建了,你也可以忽悠你的同事来创建,然后分享给你。

建表SQL模版

CREATE TABLE `$table_name$` ($create_table_field_list$PRIMARY KEY (`$primary_key$`)
) ENGINE=$db_engine$ DEFAULT CHARSET=$db_encoded$;

实体类模版

主体

/*** $table_desc$DTO模型* Created by 创建人 on $current_time$.*/
public class $table_name_hump_A$DO {$member_param_list$$get_set_method_list$
}

成员代码块 成员变量列表(member_param_list)

/** $field_comment$ */
private $field_type_java$ $field_name_hump$;

成员代码块 GetSet方法列表(get_set_method_list)

public $field_type_java$ get$field_name_hump_A$() {return $field_name_hump$;
}public void set$field_name_hump_A$($field_type_java$ $field_name_hump$) {this.$field_name_hump$ = $field_name_hump$;
}

接口类模版(DB层)

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;import java.util.List;
import java.util.Map;/*** $table_desc$DB接口* Created by 创建人 on $current_time$*/
@Mapper
public interface $table_name_hump_A$DAO {/*** 添加* @param data* return 影响行数*/int insert($table_name_hump_A$DO data);/*** 修改* @param data* return 影响行数*/int update($table_name_hump_A$DO data);/*** 分页查询* @param param* return 结果列表*/List<$table_name_hump_A$DO> pageQuery(Map param);/*** 查询count* @param param* return count条数*/Long pageQueryCount(Map param);/*** 根据ID查询* @param id* return 结果DO对象*/$table_name_hump_A$DO queryById(@Param("$primary_key_hump$") $primary_key_type_java$ $primary_key_hump$);/*** 根据ID查询(带锁)* @param id* return 结果DO对象*/$table_name_hump_A$DO queryByIdLock(@Param("$primary_key_hump$") $primary_key_type_java$ $primary_key_hump$);
}

CRUD SQL模版

<?xml version="1.0" encoding="UTF-8"?>
<!-- $table_name_hump_A$Mapper.xml -->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxx.$table_name_hump_A$DAO"><insert id="insert" useGeneratedKeys="true" keyProperty="id">INSERT INTO $table_name$($insert_field_name_list$)VALUES ($insert_field_value_list$);</insert><update id="update">UPDATE $table_name$ SET$update_field_list$WHERE $primary_key$ = #{$primary_key_hump$};</update><select id="pageQuery" resultType="com.xxx.$table_name_hump_A$DO">SELECT $select_field_list$ FROM $table_name$WHERE 1=1$while_field_list$ORDER BY $primary_key$ DESC<if test="pageIndex != null and pageSize != null">LIMIT #{offset},#{rows}</if></select><select id="pageQueryCount" resultType="java.lang.Long">SELECT COUNT(1) as total FROM $table_name$WHERE 1=1$while_field_list$</select><select id="queryById" resultType="com.xxx.$table_name_hump_A$DO">SELECT $select_field_list$ FROM $table_name$WHERE $primary_key$ = #{$primary_key_hump$};</select><select id="queryByIdLock" resultType="com.xxx.$table_name_hump_A$DO">SELECT $select_field_list$ FROM $table_name$WHERE $primary_key$ = #{$primary_key_hump$} FOR UPDATE;</select></mapper>

模型转换器模版

不同层级间,可能会有不同的实体类,那么它们相互之间的数据转换,也是一个重复且浪费时间的工作,所以也可以配置一个模版。

import org.springframework.util.CollectionUtils;import java.util.ArrayList;
import java.util.List;/*** $table_desc$模型转换器* Created by 创建人 on $current_time$*/
public class $table_name_hump_A$Converter {/*** dto转do* @param source* return do模型*/public static $table_name_hump_A$DO toDo($table_name_hump_A$DTO source){$table_name_hump_A$DO target = new $table_name_hump_A$DO();$converter_source_to_target_params_list$return target;}/*** do转dto* @param source* return dto模型*/public static $table_name_hump_A$DTO toDto($table_name_hump_A$DO source){$table_name_hump_A$DTO target = new $table_name_hump_A$DTO();$converter_source_to_target_params_list$return target;}/*** do list 转 dto* @param data* return list dto模型*/public static List<$table_name_hump_A$DTO> toDtoList(List<$table_name_hump_A$DO> data){if (CollectionUtils.isEmpty(data)){return null;}List<$table_name_hump_A$DTO> list = new ArrayList<>();for ($table_name_hump_A$DO item : data){list.add($table_name_hump_A$Converter.toDto(item));}return list;}
}

成员代码块 模型转换器参数列表(converter_source_to_target_params_list)

target.set$field_name_hump_A$(source.get$field_name_hump_A$());

业务接口实现类模版

import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;/*** $table_desc$业务实现* Created by 创建人 on $current_time$*/
@Service
public class $table_name_hump_A$ServiceImpl implements $table_name_hump_A$Service {private static final Logger LOGGER = LoggerFactory.getLogger($table_name_hump_A$ServiceImpl.class);@Resourceprivate $table_name_hump_A$DAO $table_name_hump$DAO;@Overridepublic CommonResult create(JSONObject request) {// 入参转成对应类型CommonAssert.isNoEmptyObj(request, "请求参数不可空");$table_name_hump_A$DTO dto = JSON.toJavaObject(request, $table_name_hump_A$DTO.class);// 参数校验$biz_check_required_params$// 转成do模型$table_name_hump_A$DO dataDo = $table_name_hump_A$Converter.toDo(dto);// 落库int count = $table_name_hump$DAO.insert(dataDo);CommonAssert.isTrue(count > 0, "创建失败,请重试");// 返回创建成功的ID数据return new CommonResult(dataDo.get$primary_key_hump_A$());}@Overridepublic CommonResult modify(JSONObject request) {// 入参转成对应类型CommonAssert.isNoEmptyObj(request, "请求参数不可空");$table_name_hump_A$DTO dto = JSON.toJavaObject(request, $table_name_hump_A$DTO.class);// 参数校验$biz_check_required_params$// 转成do模型$table_name_hump_A$DO dataDo = $table_name_hump_A$Converter.toDo(dto);// 落库int count = $table_name_hump$DAO.update(dataDo);CommonAssert.greaterThanZero(count, "修改失败,请重试");// 返回修改成功的ID数据return new CommonResult(dataDo.get$primary_key_hump_A$());}@Overridepublic CommonResult pageQuery(JSONObject request) {// 入参基本校验CommonAssert.isNoEmptyObj(request, "请求参数不可空");// 分页信息校验PaginationDO pagination = PaginationDO.setRequestOffsetAndRows(request);CommonAssert.isNoEmptyObj(pagination, "分页参数 $pageIndex、$pageSize 不可空");CommonAssert.isTrue(pagination.getPageSize() <= 100, "单次查询条数不可超过100条");// 取分页列表数据List<$table_name_hump_A$DO> dbResult = $table_name_hump$DAO.pageQuery(request);// 取count数据long count = $table_name_hump$DAO.pageQueryCount(request);// 空返回if (CollectionUtils.isEmpty(dbResult)){return new CommonResult(new PaginationResult(null, request, count));}// 模型转换List<$table_name_hump_A$DTO> list = $table_name_hump_A$Converter.toDtoList(dbResult);// 返回分页结果return new CommonResult(new PaginationResult(list, request, count));}@Overridepublic CommonResult queryById(JSONObject request) {// 取入参CommonAssert.isNoEmptyObj(request, "请求参数不可空");// 根据ID获取数据$primary_key_type_java$ $primary_key_hump$ = request.get$primary_key_type_java$("$primary_key_hump$");CommonAssert.isNoEmptyObj($primary_key_hump$, "参数错误,无法执行查询");$table_name_hump_A$DO dbResult = $table_name_hump$DAO.queryById($primary_key_hump$);// 未查询到结果,返回if (null == dbResult){return new CommonResult();}// 模型转换$table_name_hump_A$DTO result = $table_name_hump_A$Converter.toDto(dbResult);// 返回结果对象return new CommonResult(result);}
}

成员代码块 必填项业务校验(biz_check_required_params)

CommonAssert.$java_type_adapter_assert_method$(dto.get$field_name_hump_A$(), "$field_comment$不可空");

Controller模版

import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;/*** $table_desc$HTTP请求控制器* Created by 创建人 on $current_time$.*/
@CrossOrigin
@RestController
@RequestMapping(value = "/$table_name_hump$/")
public class $table_name_hump_A$Controller {private static final Logger LOGGER = LoggerFactory.getLogger($table_name_hump_A$Controller.class);@Resourceprivate $table_name_hump_A$Service $table_name_hump$Service;/*** 创建* @param request* @return*/@RequestMapping(value = "create.json", method = {RequestMethod.GET, RequestMethod.POST})@ResponseBodypublic Object create(@RequestBody JSONObject request){return CommonTemplate.run(LOGGER, new CommonTemplate() {@Overrideprotected Object business() {return $table_name_hump$Service.create(request);}}, request);}/*** 修改* @param request* @return*/@RequestMapping(value = "modify.json", method = {RequestMethod.GET, RequestMethod.POST})@ResponseBodypublic Object modify(@RequestBody JSONObject request){return CommonTemplate.run(LOGGER, new CommonTemplate() {@Overrideprotected Object business() {return $table_name_hump$Service.modify(request);}}, request);}/*** 分页查询* @param request* @return*/@RequestMapping(value = "pageQuery.json", method = {RequestMethod.GET, RequestMethod.POST})@ResponseBodypublic Object pageQuery(@RequestBody JSONObject request){return CommonTemplate.run(LOGGER, new CommonTemplate() {@Overrideprotected Object business() {return $table_name_hump$Service.pageQuery(request);}}, request);}/*** 通过主键查询* @param request* @return*/@RequestMapping(value = "queryById.json", method = {RequestMethod.GET, RequestMethod.POST})@ResponseBodypublic Object queryById(@RequestBody JSONObject request){return CommonTemplate.run(LOGGER, new CommonTemplate() {@Overrideprotected Object business() {return $table_name_hump$Service.queryById(request);}}, request);}
}

动态参数

原始表名 $table_name$

用户输入的表名,不做任何处理。

表名驼峰首字母小写 $table_name_hump$

用户输入的表名,经过驼峰处理。例如输入:goods_order ,输出:goodsOrder

表名驼峰首字母大写 $table_name_hump_A$

用户输入的表名,经过驼峰处理。例如输入:goods_order ,输出:GoodsOrder

原始字段名 $field_name$

用户输入的表字段名,不做任何处理。

字段名驼峰首字母小写 $field_name_hump$

用户输入的表字段名,经过驼峰处理。例如输入:order_number ,输出:orderNumber

字段名驼峰首字母大写 $field_name_hump_A$

用户输入的表字段名,经过驼峰处理。例如输入:order_number ,输出:OrderNumber

字段说明 $field_comment$

用户输入的表字段说明,不做任何处理。

字段数据类型(对应DB)$field_type_db$

用户选择的表字段类型,不做任何处理。

字段数据类型(对应Java)$field_type_java$

用户选择的表字段类型,会自动匹配对应的Java类型。例如输入:VARCHAR(),输出:String

主键字段名 $primary_key$

用户选择的主键字段,不做任何处理。例如用户定义的主键是id,那么输出就是:id

主键字段名驼峰首字母小写 $primary_key_hump$

用户选择的主键字段,经过驼峰处理。例如输入:order_number ,输出:orderNumber

主键字段名驼峰首字母大写 $primary_key_hump_A$

用户选择的主键字段,经过驼峰处理。例如输入:order_number ,输出:OrderNumber

主键字段数据类型(对应Java)$primary_key_type_java$

用户选择的主键字段类型,会自动匹配对应的Java类型。例如输入:VARCHAR(),输出:String

插入数据sql,字段名列表 $insert_field_name_list$

例如表中有三个字段:id(主键)、goods_name、price,输出:goods_name,price 。会自动排除主键 不仅插入数据时可用,任何需要排除ID,然后使用英文逗号拼接表所有字段信息的地方,都可以使用它

插入数据sql,字段值列表 $insert_field_value_list$

例如表中有三个字段:id(主键)、goods_name、price,输出:#{goodsName},#{price} 。会自动排除主键 不仅插入数据时可用,任何需要排除ID,然后使用英文逗号拼接表所有字段信息的地方,都可以使用它

修改数据sql,字段名列表 $update_field_list$

例如表中有三个字段:id(主键)、goods_name、price 输出(会自动换行,会携带以下缩进,会自动排除主键):

goods_name = #{goodsName},
price = #{price}

查询数据sql,字段名列表 $select_field_list$

例如表中有三个字段:id(主键)、goods_name、price,输出:id,goods_name,price 。带主键

whele字段条件sql,字段名列表 $whele_field_list$

例如表中有三个字段:id(主键)、goods_name、price, 输出(会自动换行,会携带以下缩进):

<if test="id != null">AND id = #{id}
</if>
<if test="goodsName != null">AND goods_name = #{goodsName}
</if>
<if test="price != null">AND price = #{price}
</if>

创建表-表字段列表 $create_table_field_list$

例如表中有三个字段:id(自增主键)、goods_name、price 输出(会自动换行,会携带以下缩进):

`id` INT(11) NOT NULL AUTO_INCREMENT,`goods_name` VARCHAR(128) NOT NULL DEFAULT 'NULL',`price` DECIMAL(10,2) NOT NULL DEFAULT 'NULL'

当前时间 $current_time$

自动获取当前时间,格式:yyyy-MM-DD hh:mm:ss,示例值:2023-02-05 17:31:18

自动根据数据类型,匹配断言方法 $java_type_adapter_assert_method$

对于Java数据类型等于String的字段,使用isNoBlankStr方法,其他的类型都使用isNoEmptyObj方法 这是一个定制化很高的动态参数,可忽略它。

动态代码块

动态代码块由用户自行定义,代码块中也可以设置动态参数,目前仅提供4种明确的动态代码块

成员变量列表 $member_param_list$

例如表中有三个字段:id(主键)、goods_name、price

假设用户定义了如下代码块内容:

/** $field_comment$ */
private $field_type_java$ $field_name_hump$;

输出(会自动根据字段数量,累加输出自定义代码块内容):

/** id */
private Integer id;
/** 商品名称 */
private String goodsName;
/** 商品价格 */
private String price;

GetSet方法列表 $get_set_method_list$

例如表中有三个字段:id(主键)、goods_name、price

假设用户定义了如下代码块内容:

public $field_type_java$ get$field_name_hump_A$() {return $field_name_hump$;
}public void set$field_name_hump_A$($field_type_java$ $field_name_hump$) {this.$field_name_hump$ = $field_name_hump$;
}

输出(会自动根据字段数量,累加输出自定义代码块内容):

public Integer getId() {return id;
}public void setId(Integer id) {this.id = id;
}public String getGoodsName() {return goodsName;
}public void setGoodsName(String goodsName) {this.goodsName = goodsName;
}public String getPrice() {return price;
}public void setPrice(String price) {this.price = price;
}

模型转换器参数列表 $converter_source_to_target_params_list$

例如表中有三个字段:id(主键)、goods_name、price

假设用户定义了如下代码块内容:

target.set$field_name_hump_A$(source.get$field_name_hump_A$());

输出(会自动根据字段数量,累加输出自定义代码块内容):

target.setId(source.getId());
target.setGoodsName(source.getGoodsName());
target.setPrice(source.getPrice());

必填项业务校验 $biz_check_required_params$

例如表中有三个字段:id(主键)、goods_name、price

假设用户定义了如下代码块内容:

CommonAssert.$java_type_adapter_assert_method$(dto.get$field_name_hump_A$(), "$field_comment$不可空");

输出(会自动根据字段数量,累加输出自定义代码块内容):

CommonAssert.isNoBlankStr(dto.getGoodsName(), "goodsName不可空");CommonAssert.isNoBlankStr(dto.getPrice(), "price不可空");

以上思路希望大家都能喜欢,如有更好想法,欢迎评论区交流起来!



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

e7fa08d71c27c16debc1c5785dc7f1e9.png

已在知识星球更新源码解析如下:

4638e02868da9999f51f119c25e04c62.jpeg

053f15075950be484e095e59f63c99fa.jpeg

f0377bace1eac9497a703144adc0b254.jpeg

eeda48fd130446ee06afca61ea4c359b.jpeg

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/6215.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

吴恩达 ChatGPT Prompt Engineering for Developers 系列课程笔记--06 Transforming

06 Transforming 大语言模型&#xff08;LLM&#xff09;很擅于将输入转换为不同格式的输出&#xff0c;比如翻译、拼写校正或HTML格式转化。相比于复杂的正则表达式&#xff0c;Chat GPT实现更加准确和高效。 1) 不同语种的转换 下述语句实现了英文到西班牙语的翻译。 pro…

chatgpt赋能python:用Python发送短信的简单方法

用Python发送短信的简单方法 在今天的数字时代&#xff0c;没有任何事情比即时通讯更方便。然而&#xff0c;短信仍然是一种极为有用的通信方式。 实际上&#xff0c;正如您所看到的&#xff0c;本文将告诉您如何使用Python在几步内轻松地发送短信。 发送短信的三种方法 要发…

新手速成!如何使用ChatGPT成为你的导师

1. 写在前面 最近我发现咱们的团队现在是人手ChatGPT&#xff0c;不光是我们团队&#xff0c;我整个行业的人都在用它解决生活跟工作中遇到的问题。可以看到的是大家也都是对它赞赏度很高 本文我将为大家介绍如何更加高效的使用ChatGPT提高工作效率&#xff0c;面向ChatGPT编程…

留学文书可以彻底被AI取代吗?留学顾问是否会被AI逼到墙角?

近日&#xff0c;ChatGPT再次“进化”&#xff0c;其最新版本ChatGPT-4又掀高潮。其生产者OpenAI 称&#xff0c;“ChatGPT-4是最先进的系统&#xff0c;能生产更安全和更有用的回复。”和上一代相比&#xff0c;GPT-4拥有了更广的知识面和更强的解决问题能力&#xff0c;在创意…

ChatGPT-4来袭,留学申请文书面临挑战如何破局?

近日&#xff0c;ChatGPT再次“进化”&#xff0c;其最新版本ChatGPT-4又掀高潮。其生产者OpenAI 称&#xff0c;“ChatGPT-4是最先进的系统&#xff0c;能生产更安全和更有用的回复。”和上一代相比&#xff0c;GPT-4拥有了更广的知识面和更强的解决问题能力&#xff0c;在创意…

最近爆火的ChatGPT核心技术演进历程

文章目录 1.前言2.初识ChatGPT2.1.什么是ChatGPT2.2.ChatGPT和其他模型对比具有的特性 3.ChatGPT技术演进历程3.1.Transformer&#xff08;转移学习&#xff09;和基础模型3.2.GPT-1&#xff1a;简化模型&#xff0c;使其更适合自然语言生成3.2.1.什么是GPT-13.2.1.GPT-1的优势…

在 Python 中调用 GPT-3 API

〇、效果展示 本文讲解如何调用 openAI 模型 GPT-3 官方 API&#xff0c;各位可以先熟悉熟悉&#xff0c;等 ChatGPT API 出来以后无非就是换一个模型名吧。 而且ChatGPT 是从 GPT-3.5 系列中的模型进行微调来的&#xff0c;而 GPT-3.5 是基于 GPT-3 训练得到的。使用 GPT-3 中…

博彦科技以太机器人平台亮相世界人工智能大会 赋能企业智慧升级

上海2018年9月18日电 /美通社/ -- 2018年9月17日&#xff0c;2018世界人工智能大会首日&#xff0c;在微软全球执行副总裁、微软人工智能及微软研究事业部负责人沈向洋博士的开场主旨演讲中&#xff0c;博彦科技以太机器人平台&#xff0c;作为微软人工智能合作伙伴创新解决方案…

博彦科技offer到手,但甲方变更,程序员只能忍吞苦果吗

面试很快结束了&#xff0c;面试后HR 小姐姐就告诉你面试通过了。由于薪资问题第二天才定下来&#xff0c;offer 在 2020年 5月28晚上就下来了。如下图 很快开始了一系列的入职流程&#xff0c;1 薪资证明 2&#xff0c;离职证明 3&#xff0c;最夸张的是一张表格 ..等。继续上…

博彦科技面试题-最新(上海)

As last blog mentioned&#xff08; 中软面试题-最新&#xff09; ,Some outsourcing company,like chinasoft, beyondsoft, vinceinfo, Hisoft,wicresoft, etc. all the process of interview is the same, if you pass the interview of these company, according to the co…

博彦科技上演蛇吞象并购 股价逆势大涨

“如未来顺利完成该交易&#xff0c;我公司认为将极大地加强公司IT服务外包的交付能力&#xff0c;完善公司的行业布局和客户布局。”博彦科技公司方面如是说。 5月31日消息&#xff0c;继前一交易日大涨5.22%后&#xff0c;博彦科技昨日&#xff08;5月31日&#xff09;逆势冲…

Power bi 4.2 博彦日历

关注微信公共号&#xff1a;小程在线 关注CSDN博客&#xff1a;程志伟的博客 数据集链接见微信公共号底端 1.在Power BI中导入可视化效果&#xff0c; 点击… 选择导入自定义视觉对象&#xff0c;点击导入。 2. 选择我们需要导入的视觉对象。 3. 在可视化就会出现新的图形。 …

北京市经信委主任王刚一行赴博彦科技调研

北京2018年8月7日电 /美通社/ -- 8月3日&#xff0c;北京市经信委主任王刚一行赴位于北京中关村软件园的博彦科技总部调研并与公司领导座谈交流。电子信息处处长顾瑾栩、软件服务处副处长尤靖、智能装备处副处长耿磊等相关领导陪同调研。博彦科技董事长兼首席执行官王斌、副总裁…

博彦科技:区块链建立优质农产品“信任链”|FISCO BCOS 2021 Meetup上海站

公众号对话框回复【阳光农安】获取演讲材料 自古以来&#xff0c;我国就是一个农业大国&#xff0c;农业整体发展状况对社会安定、国民经济增长都起着十分重要的作用。 如今&#xff0c;在多方共同推动下&#xff0c;我国农业正向着精准化、智慧化方向转型升级&#xff0c;农…

博彦科技面试题笔试题

试题一: 博彦科技 姓名: 联系电话: 问题第一部分:(智力) 1 .a, b, c : wear cap(black or white, but not all white), a and b can see, but c is blink; a,b,c in turn answer whether he can know what color he is wearing, a said no , b said no ,c …

博彦科技笔面试-2019春招

19/3/27下午参加了博彦&#xff08;西安&#xff09;的Java技术岗笔试 题目比较简单&#xff0c;不过对我来说有些难&#xff0c;Java好久没碰过了。 根据后序和中序序列重建树&#xff0c;本来会的&#xff0c;但是做错了&#xff08;遗憾&#xff09;。 数据库操作有一个统计…

博彦科技笔面试题

19/3/27下午参加了博彦&#xff08;西安&#xff09;的Java技术岗笔试 题目比较简单&#xff0c;不过对我来说有些难&#xff0c;Java好久没碰过了。 根据后序和中序序列重建树&#xff0c;本来会的&#xff0c;但是做错了&#xff08;遗憾&#xff09;。 数据库操作有一个统计…

博彦科技-搜狗面试

这里写自定义目录标题 Java的基本数据类型是那些&#xff1f;各占多少字节spring 事务的实现方式编程题 Java的基本数据类型是那些&#xff1f;各占多少字节 spring 事务的实现方式 1.编程式事务管理对基于 POJO 的应用来说是唯一选择。我们需要在代码中调用beginTransaction(…

ChatGPT常见问题汇总与解决

常见问题列表 not available in your country Signup is currently unavailable, please try again later Weve detected suspicious behavior from phone numbers similar to yours. Please try again later or contact us through our help center at too many signups f…

用ChatGPT解读非结构化数据【ChatGPT + SQL】

许多现代数据系统都依赖于结构化数据&#xff0c;例如 Postgres DB 或 Snowflake 数据仓库。 LlamaIndex 提供了许多由 LLM 提供支持的高级功能&#xff0c;既可以从非结构化数据创建结构化数据&#xff0c;也可以通过增强的文本到 SQL 功能分析这些结构化数据。 本指南有助于…