赞
踩
Comate的可实现内容为帮你想、帮你写、帮你改,那么,有这么好的工具,一定要响应一下学校的号召。
现阶段各高校都在琢磨如何可以让AI更好的服务于教学工作,那么,本篇文章测评Baidu Comate智能代码助手就是为了帮助学生们可以通过AI更好的学习编程而撰写,主要能提供到大家的结果是:
1、教师对Comate的功能进行全面测试,方便教会学生们。
2、在正常教学机房下(中型61台)教师与学生的计算机是否可以同时并发访问Comate,是否可以正常的进行代码补全,代码分析,代码提示等操作。
3、在文章中给出了一些代码示例也可以让大家在学习过程中有一定的帮扶作用。
希望本文能为大家的教学提供一定的提示作用。
系统:Windows 11 家庭中文版
java_ide:IntelliJ IDEA Community Edition 2024.1版本
web_ide:Visual Studio Code1.881版本
Java_Comate:2.0.4版本
web_Comate:2.4.0版本
下面是第一个大部分,是单机进行全面的测试,平台测试的也会多一些,vscode与ide都会测试,我这不是苹果本,所以苹果就不测了,教学环境一般也不是苹果的,所以直接pass这块。我会根据使用场景实际判别的。这里的视频是我MySQL存储过程的授课前测试,效果还成,分享一下。
BaiduComate
下方是地址以及二维码,尽可以使用。
https://comate.baidu.com/?inviteCode=7bgdn385
下方是地址以及二维码,尽可以使用。
https://comate.baidu.com/?inviteCode=7bgdn385
可以看到基础功能是完全免费的,高级功能每周也有300次免费操作,还是相当亲民的呢。
Comate是一款集成了百度强大文心一言技术的免费智能代码生成器。它不仅能够提供代码续写、代码补全、代码注释、代码解释、代码修复、单元测试、代码debug、注释生成代码、代码重构、修复建议、自然语言生成代码、代码问答以及长函数拆分等多项功能,而且能够显著提升开发者的编程效率,优化代码质量。
这里分为了2个端pc与移动,操作方法如下:
使用手机号+验证码可以直接登录。
手机端也是输入手机号码和验证码即可登录。
在主页可以看到支持的工具,是我们熟悉的前端的VSCode与后端的IDE全家桶,使用苹果的话也有Xcode的支持,这里是教学环境使用,所以肯定是pc端的win系统。
百度 comate是百度倾力打造的AI写代码平台,它集成了百度强大的文心一言技术,为用户提供了强大的代码生成和智能编程支持,Comate支持100多种编程语言(如Python、C、C++、Java、Go等)和主流开发环境(如VSCode、IntelliJ IDEA),满足不同开发者的需求。 |
以下是三大使用场景的说明,后面我们会对这些场景一次的测试一遍。
当开发者要熟悉和理解刚接手的代码库或者文件,通常面临巨大的工作量,例如梳理整体架构、理解代码注释、特定逻辑等,非常耗时。
智能代码助手Baidu Comate能够高效处理这部分工作,为开发者提供即时深入的解析和回答,无论是询问代码库的整体架构,探索特定的实现逻辑,还是梳理代码间的复杂依赖关系,都能给出清晰、准确的指导,使开发者能够迅速把握项目的全貌,优化和调整代码结构,提高开发效率和代码质量,并且开发者使用自然语言即可完成上述交互,享受代码智能辅助。
当开发者需要在已有代码库或开源项目基础上,进一步做扩展功能等开发工作时,通常面临较大的工作量,首先需要深入理解现有的代码,包括代码的结构、函数和类,以及了解它们是如何组织和相互调用的,还有还要了解相关文档和注释,运行现有的测试用例,了解代码的行为和预期的输出等。
使用智能代码助手Baidu Comate,可以省去开发者人工处理上述复杂工作,转而由AI编码完成,依托强大的智能化能力,Baidu Comate能够基于已有的代码库或文件,快速生成新的代码片段,涵盖从基础的增删改查操作到复杂的业务逻辑实现,并且保证了代码的一致性和高质量。
完成基于现有代码自动生成单元测试,通常要经过代码分析、测试框架选择、测试用例生成、测试断言编写、集成与运行等环节。在具体实现过程中,会遇到代码库情况复杂、需要细致识别和处理代码的边界情况、现有测试框架和工具不适用、代码库发生演变/更新等挑战。
不止于AI编码和自然语言代码生成等能力,智能代码助手Baidu Comate还能基于现有的业务逻辑和代码结构自动设计和生成复杂的单元测试。这意味着开发者不再需要手动编写每一个测试用例,在确保代码质量的同时,大幅提高测试效率。无论是验证新功能的正确性,还是确保现有功能在修改后仍然稳定运行,Baidu Comate都能提供强大的支持,使软件开发的每一步都更加稳健可靠,辅助开发者实现全场景AI编程。
接下来我先通过ide来操作一下Comate,因为启动接口后我们才能正常的解析代码。
基础的项目结构,就是一个基础的springboot项目,用自己的也可以无所谓,我这里会直接下发给学生,我没开免费,自己创建一个就行,不复杂。https://download.csdn.net/download/feng8403000/89244312下载。
根据以下操作提示进行逐步操作。
需要【Accept接受】安装
安装完毕,重启IDE(如果出现连接异常,重新安装即可,我第一次安装就没连接上,再次Install即可)
点击重启
这里需要登录一下,但是我们也可以不登录进行测试一下,可以看到,必须要登录操作。
当我们没有登录进行搜索的时候就能看到登录提示了,我的计算机名称是qwe84,所以显示这个,接下来我们去登陆。
填写百度账号信息,语言这里我们需要使用java语言,所以禁用其它语言即可,填写完毕后点击【OK】即可。
去个人主页:【https://comate.baidu.com/zh/user】复制个人License
第一个问题,我选中了一个【model】层下的【Student】类,全选了里面的代码,问了一下:【选中的代码作用是什么?】,可以在回答中看到给的回答是非常准确的,包括toString、Getter和Setter方法也给了解释,就很完整。
我在登录完成返回到操作页面的时候,还是找了一下的,没能直接就看出来提问的位置。
这里可以在类中的每个函数上看到代码操作提示,就很方便。
函数注释,也就是我们经常的/**函数注释操作*/,可以按照以下操作步骤来执行,生成一个非常恰当且官方的注释内容,通过点击【采纳】即可直接添加到代码中,效果很直接。
行间的就是//行注释了,我们直接点击行间注释会进行自动分析,可以直接看到分析结果,如果有其它分析结果可以点击【查看变更】,如果确定的话,还是需要点击一下【采纳】才能将代码替换过去。
查看变更,但是变更中未发现其他的注释情况。可以是我误解提示了,是变更,不是其它选项。
完整注释
点击【生成单侧】,我们可以看到直接生成了一个新的类,如果我们点击采纳之后就会直接在当前的路径下创建一个测试类,我们运行即可使用。
采纳后效果:
有模拟数据,但是少了输出语句,我们单独输出一下。
我们添加个断点,然后使用Debug运行。
查看效果很完美。
随便选了一个函数,点击了代码解释,可以看到每个单词都给解释了。我们换一个再试试。
从controller层随便找了个函数看看解释效果:
解释的相当可以,函数的注释与注解都有所说明,而且都是正确的,方法中的参数与名称也都做了分析,方法体中外部引入的函数也都给了说明,我这里没有写返回的SUCCESS类,直接就写了个map代替一下,也都有说明,最后我返回内容中的错别字还给点了出来,分析的就很到位,点个赞。
我非常喜欢这个功能,把问题分析的非常明确,并且在分析完毕后给出了对应的调优方案。这样就省去了大把的思考时间了,下边是我的代码,毕竟写的就是一个demo,所以问题很多,我们也来分析一下,再来看看实际分析情况。
- /**
- * 添加信息
- * @param userName
- * @param pwd
- * @param phone
- * @param age
- * @param sex
- * @param introduce
- * @return
- */
- @PostMapping(value = "/AddInfoApi")
- @ApiOperation(value = "添加", notes = "没啥留言的")
- @ApiImplicitParams({
- @ApiImplicitParam(name = "userName", required = true, paramType = "query", dataType = "String", value = "用户名"),
- @ApiImplicitParam(name = "pwd", required = true, paramType = "query", dataType = "String", value = "密码"),
- @ApiImplicitParam(name = "phone", required = true, paramType = "query", dataType = "String", value = "手机号"),
- @ApiImplicitParam(name = "age", required = true, paramType = "query", dataType = "int", value = "年龄"),
- @ApiImplicitParam(name = "sex", required = true, paramType = "query", dataType = "char", value = "性别"),
- @ApiImplicitParam(name = "introduce", required = true, paramType = "query", dataType = "String", value = "简介")
- })
- public Object AddInfoApi(String userName, String pwd, String phone, int age, char sex, String introduce) {
- HashMap<String, Object> map = new HashMap<String, Object>();
- if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(pwd) || StringUtils.isEmpty(introduce)) {
- map.put("state", false);
- map.put("msg", "参数不润许为空");
- map.put("result", "");
- return map;
- }
- studentService.AddInfo(userName, pwd, phone, age, sex, introduce);
- map.put("state", true);
- map.put("msg", "成功");
- map.put("result", "");
- return map;
- }
Comate给出的问题解析
问题分析:
代码风格问题:map.put("msg", "参数不润许为空"); 中“不润许”可能是一个拼写错误,应改为“不允许”。
安全性问题:方法参数中直接传递了用户名和密码等敏感信息,但在方法体内没有对这些信息进行任何加密或校验处理,存在安全风险。
代码可读性问题:studentService.AddInfo 方法调用时,参数列表较长,且参数类型不统一,可能影响代码可读性。
返回值描述性问题:map.put("result", ""); 中,result 字段被赋值为空字符串,这可能不是一个好的设计,因为即便操作成功,调用方也无法从这个字段获取到任何有用的信息。
修复后的代码片段:
- /**
- * 添加信息
- * @param userName 用户名
- * @param pwd 密码(建议加密处理)
- * @param phone 手机号
- * @param age 年龄
- * @param sex 性别
- * @param introduce 简介
- * @return 操作结果的Map对象
- */
- @PostMapping(value = "/AddInfoApi")
- @ApiOperation(value = "添加", notes = "添加用户信息接口")
- @ApiImplicitParams({
- @ApiImplicitParam(name = "userName", required = true, paramType = "query", dataType = "String", value = "用户名"),
- // ... (其它参数保持不变)
- })
- public Object AddInfoApi(String userName, String pwd, String phone, int age, char sex, String introduce) {
- HashMap<String, Object> map = new HashMap<String, Object>();
- if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(pwd) || StringUtils.isEmpty(introduce)) {
- map.put("state", false);
- map.put("msg", "参数不允许为空"); // 修正拼写错误
- map.put("result", null); // 使用null代替空字符串,表示没有结果
- return map;
- }
-
- // 假设对密码进行了加密处理,实际开发中应在此处调用加密方法
- String encryptedPwd = encryptPassword(pwd);
- studentService.AddInfo(userName, encryptedPwd, phone, age, sex, introduce);
-
- map.put("state", true);
- map.put("msg", "成功");
- // 可以考虑将新增的用户信息或其他相关标识作为result返回
- // map.put("result", someUserInfoOrId);
- map.put("result", null); // 保留原设计,但推荐使用具体信息替代
- return map;
- }
-
- // 示例加密方法,实际开发中应根据安全需求实现
- private String encryptPassword(String pwd) {
- // 加密逻辑...
- return encryptedPassword;
- }
优化点总结:
修正了返回消息中的拼写错误。
建议对密码进行加密处理,增强系统安全性。
改进了返回值的设计,使其更具描述性。
优化了参数传递和代码可读性(未在代码中直接体现,但建议对服务层方法进行调整)。
以上是给出的答案,在代码的提示中这回没有给【采纳】这个选项,需要我们自己来相应的处理。
提供的方法也都是比较标准的问题解决方案,特别是其中涉及到了pwd操作,所以安全尤为重要。
这里我根据mapper的xml全选后当做提示内容,让Comate仿照生成一个仅修改用户名与简介的代码,结果是它给的结果不仅满足功能且还考虑到了安全的问题,防止了sql注入操作,以及为什么要使用#{userName}的原由也说了出来,很详细,很好。
我选中的是model层Student的代码,提问内容是:根据选中的类结构,仿照生成一个商品表的DDL语句,并且生成5条DML语句方便插入数据,数据要中文的。
我们来看看效果:
DDL执行测试:
- CREATE TABLE Product (
- id INT AUTO_INCREMENT PRIMARY KEY,
- productName VARCHAR(255) NOT NULL,
- phoneNumber VARCHAR(20),
- price DECIMAL(10, 2),
- category VARCHAR(255),
- gender ENUM('男', '女', '无'),
- description TEXT
- );
DML执行测试:
- INSERT INTO Product (productName, phoneNumber, price, category, gender, description) VALUES
- ('华为手机Mate50', '13800138000', 4999.00, '电子产品', '无', '华为最新旗舰手机,搭载高性能处理器和大容量电池。'),
- ('耐克运动鞋Air Max', '13900139000', 899.00, '运动装备', '男', '透气性好,轻盈舒适,适合长时间运动。'),
- ('兰蔻小黑瓶精华液', '13700137000', 1099.00, '美妆护肤', '女', '深层修护,改善肌肤问题,提升肌肤弹性。'),
- ('索尼降噪耳机WH-1000XM4', '13600136000', 2899.00, '电子产品', '无', '顶级降噪效果,音质卓越,佩戴舒适。'),
- ('苹果iPad Pro', '13500135000', 6999.00, '电子产品', '无', '高分辨率显示屏,强大的性能,适合学习和娱乐。');
依然是运行成功,我们再去查看一下表内容。
表内容查询:
唯一一个有异常的列就是gender列,但是也是没什么违和感的,毕竟对应产品的使用人群来对照一下就很匹配的呢。男性的运动鞋,女性的兰蔻小黑瓶,其它都用的都是无来代表,说明数据匹配,没问题。
问题前提,选中Student类中的所有代码后提问。
问题:
CREATE TABLE Product ( id INT AUTO_INCREMENT PRIMARY KEY, productName VARCHAR(255) NOT NULL, phoneNumber VARCHAR(20), price DECIMAL(10, 2), category VARCHAR(255), gender ENUM('男', '女', '无'), description TEXT );根据以上表结构写一个类似于Student的model层Product类。
生成完毕后,直接复制代码,粘贴到model层,对应的类文件就会被创建,很方便。
实际代码:
- package com.item.model;
-
- public class Product {
- private int id;
- private String productName;
- private String phoneNumber;
- private double price;
- private String category;
- private String gender; // 假设gender字段存储的是字符串形式,例如:"男", "女", "无"
- private String description;
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public String getProductName() {
- return productName;
- }
-
- public void setProductName(String productName) {
- this.productName = productName;
- }
-
- public String getPhoneNumber() {
- return phoneNumber;
- }
-
- public void setPhoneNumber(String phoneNumber) {
- this.phoneNumber = phoneNumber;
- }
-
- public double getPrice() {
- return price;
- }
-
- public void setPrice(double price) {
- this.price = price;
- }
-
- public String getCategory() {
- return category;
- }
-
- public void setCategory(String category) {
- this.category = category;
- }
-
- public String getGender() {
- return gender;
- }
-
- public void setGender(String gender) {
- this.gender = gender;
- }
-
- public String getDescription() {
- return description;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- @Override
- public String toString() {
- return "Product{" +
- "id=" + id +
- ", productName='" + productName + '\'' +
- ", phoneNumber='" + phoneNumber + '\'' +
- ", price=" + price +
- ", category='" + category + '\'' +
- ", gender='" + gender + '\'' +
- ", description='" + description + '\'' +
- '}';
- }
- }
根据dao层的StudentMapper.java与model层的Product类,生成一个dao层的ProductMapper的类代码。
我这里选中的是dao层的StudentMapper,如果是你的项目可以根据操作仿照一下操作你的类。
实际生成代码:
- package com.item.dao;
-
- import com.item.model.Product;
- import org.apache.ibatis.annotations.Param;
- import org.springframework.stereotype.Repository;
-
- import java.util.List;
-
- @Repository
- public interface ProductMapper {
- /**
- * 查询所有商品
- * @return 商品列表
- */
- List<Product> getAllProducts();
-
- /**
- * 根据商品名称模糊查询商品
- * @param productName 商品名称
- * @return 商品列表
- */
- List<Product> selectByProductName(@Param("productName") String productName);
-
- /**
- * 根据ID精准查询商品
- * @param id 商品ID
- * @return 商品对象
- */
- Product selectById(@Param("id") int id);
-
- /**
- * 添加商品信息
- * @param productName 商品名称
- * @param description 商品描述
- * @param price 商品价格
- * @param stock 商品库存
- * @param categoryId 商品类别ID
- * @return 添加操作的结果(通常是影响的行数)
- */
- int addProduct(
- @Param("productName") String productName,
- @Param("description") String description,
- @Param("price") double price,
- @Param("stock") int stock,
- @Param("categoryId") int categoryId
- );
-
- /**
- * 修改商品信息
- * @param id 商品ID
- * @param productName 商品名称
- * @param description 商品描述
- * @param price 商品价格
- * @param stock 商品库存
- * @param categoryId 商品类别ID
- * @return 修改操作的结果(通常是影响的行数)
- */
- int updateProduct(
- @Param("id") int id,
- @Param("productName") String productName,
- @Param("description") String description,
- @Param("price") double price,
- @Param("stock") int stock,
- @Param("categoryId") int categoryId
- );
-
- /**
- * 根据ID删除商品
- * @param id 商品ID
- * @return 删除操作的结果(通常是影响的行数)
- */
- int deleteProductById(@Param("id") int id);
- }
粘贴代码到【dao】层,可以看到很完整,注释都很全面。
在给完代码后还给了注意内容,很贴心。
请注意,这个ProductMapper接口是基于假设的Product类字段生成的,这些字段可能包括productName(商品名称)、description(商品描述)、price(商品价格)、stock(商品库存)和categoryId(商品类别ID)。您需要根据实际的Product类字段和数据库表结构来调整这个接口中的方法参数和名称。
同时,请注意,在实际的项目中,您还需要在MyBatis的配置文件中配置对应的Mapper XML文件或者在Mapper接口上使用MyBatis的注解来定义SQL语句。此外,Product类也应该包含与数据库表对应的字段和getter/setter方法。
生成mapper层的ProduceMapper.xml文件
根据mapper层的StudentMapper.xml与model层的Product类,生成一个mapper层的ProductMapper.xml。函数名称需要与dao层的ProductMapper一一对应。
整个做工的细节都给了说明:
问题:函数名称对不上。
我们复制一下代码,并生成一下文件,需要手动修改一下函数名称。
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com.item.dao.ProductMapper">
-
- <!-- 查询所有产品信息 -->
- <select id="getAllProducts" resultType="com.item.model.Product">
- SELECT * FROM product
- </select>
-
- <!-- 根据产品名称模糊查询产品信息 -->
- <select id="selectByProductName" resultType="com.item.model.Product">
- SELECT * FROM product WHERE name LIKE CONCAT('%', #{productName}, '%')
- </select>
-
- <!-- 根据ID查询产品信息 -->
- <select id="selectById" resultType="com.item.model.Product">
- SELECT * FROM product WHERE id = #{id}
- </select>
-
- <!-- 添加产品信息 -->
- <insert id="addProduct">
- INSERT INTO product (name, price, description)
- VALUES (#{name}, #{price}, #{description})
- </insert>
-
- <!-- 更新产品信息 -->
- <update id="updateProduct">
- UPDATE product
- SET name = #{name}, price = #{price}, description = #{description}
- WHERE id = #{id}
- </update>
-
- <!-- 删除产品信息 -->
- <delete id="deleteProductById">
- DELETE FROM product WHERE id = #{id}
- </delete>
-
- </mapper>
但是由于是非Java的类文件,所以需要人为创建一下【ProductMapper.xml】。
这里是否可以在插件中添加一个选择多个文件作为参考的操作。
这里的操作与之前的几个都类似。语法依然是:
根据service层的StudentService类,生成一个service层的ProductService类。函数名称需要自行修改。
生成代码:
- package com.item.service;
-
- import com.item.model.Product;
- import org.apache.ibatis.annotations.Param;
-
- import java.util.List;
-
- public interface ProductService {
- /**
- * 查询所有商品
- *
- * @return 商品列表
- */
- List<Product> getAllProducts();
-
- /**
- * 通过商品名称模糊查询商品
- *
- * @param productName 商品名称
- * @return 商品列表
- */
- List<Product> selectByProductName(String productName);
-
- /**
- * 精准查询商品
- *
- * @param id 商品ID
- * @return 商品对象
- */
- Product selectById(int id);
-
- /**
- * 添加商品信息
- *
- * @param productName 商品名称
- * @param description 商品描述
- * @param price 商品价格
- * @param stock 商品联系电话
- * @param categoryId 商品类别ID
- * @return 添加操作的结果(通常是影响的行数)
- */
- int addProduct(
- String productName,
- String description,
- double price,
- int stock,
- int categoryId
- );
-
- /**
- * 修改商品信息
- *
- * @param id 商品ID
- * @param productName 商品名称
- * @param description 商品描述
- * @param price 商品价格
- * @param stock 商品联系电话
- * @param categoryId 商品类别ID
- * @return 修改操作的结果(通常是影响的行数)
- */
- int updateProduct(
- int id,
- String productName,
- String description,
- double price,
- int stock,
- int categoryId
- );
-
- /**
- * 根据ID删除商品
- *
- * @param id 商品ID
- * @return 删除操作的结果(通常是影响的行数)
- */
- int deleteProductById(int id);
- }
稍微有些区别的就是它在底部又给了个实现层的示例。
虽然没有全部完成,但是给的就很有帮助性。我们知道一下步应该做什么了。
根据serviceimpl层的StudentServiceImpl类,生成一个serviceimpl层的ProductServiceImpl类,函数名需要与service层的ProductService接口吻合,调用的。
实际生成代码,还是需要改一下函数名称。
- package com.item.serviceimpl;
-
- import com.item.model.Product;
- import com.item.service.ProductService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import com.item.dao.ProductMapper;
-
- import java.util.List;
-
- @Service
- public class ProductServiceImpl implements ProductService {
-
- @Autowired
- private ProductMapper productMapper;
-
- @Override
- public List<Product> getAllProducts() {
- return productMapper.getAllProducts();
- }
-
- @Override
- public List<Product> selectByProductName(String productName) {
- return productMapper.selectByProductName(productName);
- }
-
- @Override
- public Product selectById(int id) {
- return productMapper.selectById(id);
- }
-
- @Override
- public int addProduct(String productName, String description, double price, int stock, int categoryId) {
- return productMapper.addProduct(productName, description, price, stock, categoryId);
- }
-
- @Override
- public int updateProduct(int id, String productName, String description, double price, int stock, int categoryId) {
- return productMapper.updateProduct(id, productName, description, price, stock, categoryId);
- }
-
- @Override
- public int deleteProductById(int id) {
- return productMapper.deleteProductById(id);
- }
- }
上下文解读不够详细,导致生成函数的时候发现了参数长度一致,但是参数顺序不一致的问题。
问题:根据controller层的StudentController类,生成一个ProductController类。
生成代码:
- package com.item.controller;
-
- import com.item.model.Product;
- import com.item.service.ProductService;
- import io.swagger.annotations.Api;
- import io.swagger.annotations.ApiImplicitParam;
- import io.swagger.annotations.ApiImplicitParams;
- import io.swagger.annotations.ApiOperation;
- import org.apache.commons.lang3.StringUtils;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.bind.annotation.*;
-
- import java.util.HashMap;
- import java.util.List;
-
- @Api("产品接口声明")
- @RestController
- @CrossOrigin
- public class ProductController {
- @Autowired
- private ProductService productService;
-
- /**
- * 获取所有产品信息
- * @return 产品列表
- */
- @GetMapping("/getProductsApi")
- @ApiOperation(value = "获取所有产品", notes = "获取系统中所有产品的信息")
- public Object getProductsApi() {
- List<Product> list = productService.getAllProducts();
- HashMap<String, Object> map = new HashMap<String, Object>();
- map.put("state", true);
- map.put("msg", "成功");
- map.put("result", list);
- return map;
- }
-
- /**
- * 根据产品名称获取产品信息
- * @param productName 产品名称
- * @return 产品列表
- */
- @GetMapping("/getProductsByName")
- @ApiOperation(value = "根据名称获取产品", notes = "通过产品名称模糊查询产品信息")
- @ApiImplicitParams({@ApiImplicitParam(name = "productName", required = true, paramType = "query", dataType = "String", value = "产品名称")})
- public Object getProductsByName(String productName) {
- List<Product> list = productService.findProductsByName(productName);
- HashMap<String, Object> map = new HashMap<String, Object>();
- map.put("state", true);
- map.put("msg", "成功");
- map.put("result", list);
- return map;
- }
-
- /**
- * 添加产品信息
- * @param productName 产品名称
- * @param description 产品描述
- * @param price 产品价格
- * @param phoneNumber 产品联系电话
- * @param categoryId 产品类别ID
- * @return 操作结果
- */
- @PostMapping(value = "/addProductApi")
- @ApiOperation(value = "添加产品", notes = "添加一个新的产品信息")
- @ApiImplicitParams({
- @ApiImplicitParam(name = "productName", required = true, paramType = "query", dataType = "String", value = "产品名称"),
- @ApiImplicitParam(name = "description", required = true, paramType = "query", dataType = "String", value = "产品描述"),
- @ApiImplicitParam(name = "price", required = true, paramType = "query", dataType = "double", value = "产品价格"),
- @ApiImplicitParam(name = "phoneNumber", required = true, paramType = "query", dataType = "String", value = "联系电话"),
- @ApiImplicitParam(name = "categoryId", required = true, paramType = "query", dataType = "int", value = "产品类别ID")
- })
- public Object addProductApi(String productName, String description, double price, String phoneNumber, int categoryId) {
- HashMap<String, Object> map = new HashMap<String, Object>();
- if (StringUtils.isEmpty(productName) || StringUtils.isEmpty(description) || price <= 0) {
- map.put("state", false);
- map.put("msg", "参数不能为空或无效");
- map.put("result", "");
- return map;
- }
- int result = productService.addProduct(productName, description, price, phoneNumber, categoryId);
- map.put("state", true);
- map.put("msg", "成功");
- map.put("result", result);
- return map;
- }
-
- /**
- * 根据ID获取产品信息
- * @param id 产品ID
- * @return 产品对象
- */
- @GetMapping("/getProductById")
可以看到第94行出现了一个@符号就结束了,这是因为无法返回对应长度的结果导致的,所以我们输入一个【继续】就能看到后面的内容了。
二次拼接一下,如果有缺失的单独生成处理一下,就比较麻烦。
- package com.item.controller;
-
- import com.item.model.Product;
- import com.item.service.ProductService;
- import io.swagger.annotations.Api;
- import io.swagger.annotations.ApiImplicitParam;
- import io.swagger.annotations.ApiImplicitParams;
- import io.swagger.annotations.ApiOperation;
- import org.apache.commons.lang3.StringUtils;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.bind.annotation.*;
-
- import java.util.HashMap;
- import java.util.List;
-
- @Api("产品接口声明")
- @RestController
- @CrossOrigin
- public class ProductController {
- @Autowired
- private ProductService productService;
-
- /**
- * 获取所有产品信息
- * @return 产品列表
- */
- @GetMapping("/getProductsApi")
- @ApiOperation(value = "获取所有产品", notes = "获取系统中所有产品的信息")
- public Object getProductsApi() {
- List<Product> list = productService.getAllProducts();
- HashMap<String, Object> map = new HashMap<String, Object>();
- map.put("state", true);
- map.put("msg", "成功");
- map.put("result", list);
- return map;
- }
-
- /**
- * 根据产品名称获取产品信息
- * @param productName 产品名称
- * @return 产品列表
- */
- @GetMapping("/getProductsByName")
- @ApiOperation(value = "根据名称获取产品", notes = "通过产品名称模糊查询产品信息")
- @ApiImplicitParams({@ApiImplicitParam(name = "productName", required = true, paramType = "query", dataType = "String", value = "产品名称")})
- public Object getProductsByName(String productName) {
- List<Product> list = productService.selectByProductName(productName);
- HashMap<String, Object> map = new HashMap<String, Object>();
- map.put("state", true);
- map.put("msg", "成功");
- map.put("result", list);
- return map;
- }
-
- /**
- * 修改产品信息
- * @param id 产品ID
- * @param productName 产品名称
- * @param description 产品描述
- * @param price 产品价格
- * @param stock 产品联系电话
- * @param categoryId 产品类别ID
- * @return 操作结果
- */
- @PostMapping(value = "/updateProductApi")
- @ApiOperation(value = "修改产品", notes = "根据ID修改产品信息")
- @ApiImplicitParams({
- @ApiImplicitParam(name = "id", required = true, paramType = "query", dataType = "int", value = "产品ID"),
- @ApiImplicitParam(name = "productName", required = true, paramType = "query", dataType = "String", value = "产品名称"),
- @ApiImplicitParam(name = "description", required = true, paramType = "query", dataType = "String", value = "产品描述"),
- @ApiImplicitParam(name = "price", required = true, paramType = "query", dataType = "double", value = "产品价格"),
- @ApiImplicitParam(name = "stock", required = true, paramType = "query", dataType = "int", value = "联系电话"),
- @ApiImplicitParam(name = "categoryId", required = true, paramType = "query", dataType = "int", value = "产品类别ID")
- })
- public Object updateProductApi(int id, String productName, String description, double price, int stock, int categoryId) {
- HashMap<String, Object> map = new HashMap<String, Object>();
- if (StringUtils.isEmpty(productName) || StringUtils.isEmpty(description) || price <= 0) {
- map.put("state", false);
- map.put("msg", "参数不能为空或无效");
- map.put("result", "");
- return map;
- }
- int product = productService.updateProduct(id, productName, description, price, stock, categoryId);
- if (product == 0) {
- map.put("state", false);
- map.put("msg", "失败");
- map.put("result", "");
- } else {
- map.put("state", true);
- map.put("msg", "成功");
- map.put("result", product);
- }
- return map;
- }
-
- /**
- * 删除产品信息
- * @param id 产品ID
- * @return 操作结果
- */
- @PostMapping(value = "/deleteProductApi")
- @ApiOperation(value = "删除产品", notes = "根据ID删除产品信息")
- @ApiImplicitParam(name = "id", required = true, paramType = "query", dataType = "int", value = "产品ID")
- public Object deleteProductApi(int id) {
- HashMap<String, Object> map = new HashMap<String, Object>();
- int result = productService.deleteProductById(id);
- if (result > 0) {
- map.put("state", true);
- map.put("msg", "成功");
- map.put("result", "");
- } else {
- map.put("state", false);
- map.put("msg", "产品ID不存在");
- map.put("result", "");
- }
- return map;
- }
- }
由于根据id查询的函数不完整,这里我又单独的生成了一下。
建议长度扩一下,应该是5000个字符还差不多。如果中间有cookie的处理,那么就更麻烦了,所以长度限制别太少。
每层的文件都需要复制代码后创建好,还有对应的函数名称需要能对照上,不然调用不了。
这里就直接启动项目了。
接口展示成功,有几个需要改代码,比较麻烦我就没改,所以只有4个是OK的。
接口访问测试
说明访问是成功的,没问题,虽然生成过程还是有很多需要升级的地方,但是整体体验还是非常不错的,毕竟已经节约了大把的时间了,现在接口有了,我们需要搞Web端的了。
这里我们就直接上操作了,毕竟对这个的熟悉程度应该较高的。
直接搜索就行
点击【安装按钮】,安装完毕后需要重启,这里应该是弹出重启操作失败,
所以只能手动的重启一下了。
安装完毕并没有正常显示,登陆后先禁用,再次启动后才出现了图标。
尝试重新换个项目文件夹。
查看结果:
我的版本:
进入配置看看
输入信息
登录完成后依然没有显示,后来我禁用一下,再次启动就显示了。应该也得先登录后再这样操作。
虽然与官网的操作不太一致,但是万幸是解决了,这点官方得看看,是否能复现一下看看。
如果出现登录就可以直接登录baidu的账号了。
登录完成返回VSCode正常使用。
实操前,看看我在官方文档中找到的Baidu Comate 常用操作的快捷方式。
这里推荐使用【tab】快捷键,我随意创建了一个html页面,写了个title点到body里面按了一下tab就出现了盒子创建提示。
单行推荐用的应该是最多的,好多地方都是直接出提示的。
为了操作方便,我们把class换成id操作,利用单行推荐,很简单的就完成了九宫格。
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <title>div九宫格效果</title>
- <style>
- *{
- box-sizing: border-box;
- }
- </style>
- </head>
- <body>
- <div id="container"></div>
- <script>
- var container = document.getElementById('container');
- container.style.width = '80%';
- container.style.height = '80vh';
- container.style.border = '1px solid black';
- createDiv_9('red','gray');
- //创建一个function函数,函数名位createDiv_9,有2个参数控制盒子的颜色,颜色是随机的
- function createDiv_9(color1, color2) {
- for (var i = 0; i < 9; i++) {
- var boxs = document.createElement('div');
- boxs.style.width = '33.33%';
- boxs.style.height = '26.67vh';
- boxs.style.float = 'left';
- boxs.style.border = '1px solid black';
- if (i % 2 == 0) {
- boxs.style.backgroundColor = color2;
- //添加color2颜色
- }else{
- //添加color1颜色
- boxs.style.backgroundColor = color1;
- }
- container.appendChild(boxs);
- }
- }
- </script>
- </body>
- </html>
这里官方给的是一个java语言的提示,我尝试了js语言的,但是js基本都是一行行提示,没看到多行的。
所以我也换python语言来试试。
行间提示官方给的示例中明显是一个左右的二叉,我们也来试试。
使用python写一个,给的提示竟然还是多行提示。
把函数参数写完看看:
问题:我需要使用bootstrap框架来渲染一个接口列表,先给我一个基础的HTML代码模版。
在操作提示中有【新建文件】,直接点击新建文件就可以直接创建,非常方便。
当前提供的接口渲染模板
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>接口列表</title>
- <!-- 引入Bootstrap CSS文件 -->
- <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
- </head>
- <body>
- <div class="container mt-5">
- <h1>接口列表</h1>
- <table class="table table-striped table-hover">
- <thead>
- <tr>
- <th>#</th>
- <th>接口名称</th>
- <th>接口地址</th>
- <th>请求方法</th>
- <th>状态</th>
- </tr>
- </thead>
- <tbody>
- <!-- 这里使用JavaScript或后端模板引擎来动态生成接口列表 -->
- <!-- 示例: -->
- <tr>
- <td>1</td>
- <td>获取用户信息</td>
- <td>/api/user/info</td>
- <td>GET</td>
- <td><span class="badge badge-success">正常</span></td>
- </tr>
- <tr>
- <td>2</td>
- <td>添加用户</td>
- <td>/api/user/add</td>
- <td>POST</td>
- <td><span class="badge badge-danger">异常</span></td>
- </tr>
- <!-- ...其他接口... -->
- </tbody>
- </table>
- </div>
-
- <!-- 引入Bootstrap JS文件 -->
- <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
- <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
- <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
- </body>
- </html>
这就很离谱,我们需要继续碎片化处理一下。
请根据以下json格式进行bootstrap框架的列表渲染。
{ "msg": "成功", "result": [ { "id": 1, "productName": "华为手机Mate50", "phoneNumber": "13800138000", "price": 4999, "category": "电子产品", "gender": "无", "description": "华为最新旗舰手机,搭载高性能处理器和大容量电池。" }, { "id": 2, "productName": "耐克运动鞋Air Max", "phoneNumber": "13900139000", "price": 899, "category": "运动装备", "gender": "男", "description": "透气性好,轻盈舒适,适合长时间运动。" }, { "id": 3, "productName": "兰蔻小黑瓶精华液", "phoneNumber": "13700137000", "price": 1099, "category": "美妆护肤", "gender": "女", "description": "深层修护,改善肌肤问题,提升肌肤弹性。" }, { "id": 4, "productName": "索尼降噪耳机WH-1000XM4", "phoneNumber": "13600136000", "price": 2899, "category": "电子产品", "gender": "无", "description": "顶级降噪效果,音质卓越,佩戴舒适。" }, { "id": 5, "productName": "苹果iPad Pro", "phoneNumber": "13500135000", "price": 6999, "category": "电子产品", "gender": "无", "description": "高分辨率显示屏,强大的性能,适合学习和娱乐。" } ], "state": true }
提问结果:
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>产品列表</title>
- <!-- 引入Bootstrap CSS文件 -->
- <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
- </head>
- <body>
- <div class="container mt-5">
- <h1>产品列表</h1>
- <table class="table table-striped table-hover">
- <thead>
- <tr>
- <th>#</th>
- <th>产品名称</th>
- <th>联系电话</th>
- <th>价格</th>
- <th>类别</th>
- <th>适用性别</th>
- <th>描述</th>
- </tr>
- </thead>
- <tbody id="productList">
- <!-- 表格内容将通过JavaScript动态生成 -->
- </tbody>
- </table>
- </div>
-
- <!-- 引入Bootstrap JS文件 -->
- <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
- <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
- <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
- <script>
- // 假设这是从服务器获取的JSON数据
- var productData = {
- "msg": "成功",
- "result": [
- {
- "id": 1,
- "productName": "华为手机Mate50",
- "phoneNumber": "13800138000",
- "price": 4999,
- "category": "电子产品",
- "gender": "无",
- "description": "华为最新旗舰手机,搭载高性能处理器和大容量电池。"
- },
- // ... 其他产品数据 ...
- ],
- "state": true
- };
-
- // 使用jQuery动态生成表格行
- $(document).ready(function() {
- var tbody = $('#productList'); // 获取tbody元素
- $.each(productData.result, function(index, product) {
- var row = $('<tr></tr>'); // 创建新的表格行
- row.append($('<td></td>').text(product.id)); // 添加ID列
- row.append($('<td></td>').text(product.productName)); // 添加产品名称列
- row.append($('<td></td>').text(product.phoneNumber)); // 添加联系电话列
- row.append($('<td></td>').text(product.price)); // 添加价格列
- row.append($('<td></td>').text(product.category)); // 添加类别列
- row.append($('<td></td>').text(product.gender)); // 添加适用性别列
- row.append($('<td></td>').text(product.description)); // 添加描述列
- tbody.append(row); // 将新行添加到tbody中
- });
- });
- </script>
- </body>
- </html>
Web显示效果:
问题:请返回jQuery访问get接口的ajax示例代码,url的值是:http://127.0.0.1:8088/MyAPI/getProductsApi
这里他竟然神奇的读取了上下文,并且更改了上次生成的内容。
实际返回代码:
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>产品列表</title>
- <!-- 引入Bootstrap CSS文件 -->
- <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
- </head>
- <body>
- <div class="container mt-5">
- <h1>产品列表</h1>
- <table class="table table-striped table-hover">
- <thead>
- <tr>
- <th>#</th>
- <th>产品名称</th>
- <th>联系电话</th>
- <th>价格</th>
- <th>类别</th>
- <th>适用性别</th>
- <th>描述</th>
- </tr>
- </thead>
- <tbody id="productList">
- <!-- 表格内容将通过AJAX调用动态生成 -->
- </tbody>
- </table>
- </div>
-
- <!-- 引入jQuery文件 -->
- <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
- <!-- 引入Bootstrap JS文件 -->
- <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
- <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
- <script>
- $(document).ready(function() {
- // 调用AJAX GET接口获取产品数据
- $.ajax({
- url: 'http://127.0.0.1:8088/MyAPI/getProductsApi',
- type: 'GET',
- dataType: 'json',
- success: function(data) {
- // 假设接口返回的数据格式是:{ "msg": "成功", "result": [...], "state": true }
- if (data.msg === '成功' && data.state) {
- var tbody = $('#productList'); // 获取tbody元素
- tbody.empty(); // 清空tbody中的旧数据
- $.each(data.result, function(index, product) {
- var row = $('<tr></tr>'); // 创建新的表格行
- row.append($('<td></td>').text(product.id)); // 添加ID列
- row.append($('<td></td>').text(product.productName)); // 添加产品名称列
- row.append($('<td></td>').text(product.phoneNumber)); // 添加联系电话列
- row.append($('<td></td>').text(product.price)); // 添加价格列
- row.append($('<td></td>').text(product.category)); // 添加类别列
- row.append($('<td></td>').text(product.gender)); // 添加适用性别列
- row.append($('<td></td>').text(product.description)); // 添加描述列
- tbody.append(row); // 将新行添加到tbody中
- });
- } else {
- // 处理错误情况,比如显示错误信息
- alert('获取产品数据失败:' + data.msg);
- }
- },
- error: function(jqXHR, textStatus, errorThrown) {
- // 处理AJAX请求错误
- alert('AJAX请求失败: ' + textStatus);
- }
- });
- });
- </script>
- </body>
- </html>
代码异常:
应该是给的bootstrap连接过期了,我们自己更换一下。
还是无法访问,说明这个模型没有自主连接尝试返回的能力。
更换自己确定可以使用的连接
- <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
- <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
- <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
- <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
渲染效果:
没有生成完毕就结束,所以只能输入【继续】
但是继续的结果依然是重新生成,只要是重新生成就不够长,无解,所以这里还得优化啊。
从多个方向测试代码生成效果。
在保留原本功能前提下, 在生成页面的左侧绘制一朵小红花。
尝试修改结果,虽然小花有点随意,但是能确定这个功能是存在的。
代码:
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="UTF-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <title>产品列表</title>
- <!-- 引入Bootstrap CSS文件 -->
- <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
- <style>
- /* 定义小红花的样式 */
- .red-flower {
- position: absolute;
- top: 20px; /* 根据需要调整位置 */
- left: 20px; /* 根据需要调整位置 */
- width: 50px; /* 小红花的宽度 */
- height: 50px; /* 小红花的高度 */
- background-color: red; /* 小红花的背景颜色 */
- border-radius: 50%; /* 使小红花成为圆形 */
- clip-path: polygon(50% 0%, 0% 100%, 100% 100%); /* 创建花瓣形状 */
- }
- </style>
- </head>
- <body>
- <!-- 绘制小红花 -->
- <div class="red-flower"></div>
-
- <div class="container mt-5">
- <h1>产品列表</h1>
- <table class="table table-striped table-hover">
- <thead>
- <tr>
- <th>#</th>
- <th>产品名称</th>
- <th>联系电话</th>
- <th>价格</th>
- <th>类别</th>
- <th>适用性别</th>
- <th>描述</th>
- </tr>
- </thead>
- <tbody id="productList">
- <!-- 表格内容将通过AJAX调用动态生成 -->
- </tbody>
- </table>
- </div>
-
- <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
- <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
- <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
- <script>
- // 调用AJAX GET接口获取产品数据
- $.ajax({
- url: "http://127.0.0.1:8088/MyAPI/getProductsApi",
- type: "GET",
- dataType: "json",
- success: function (data) {
- // 假设接口返回的数据格式是:{ "msg": "成功", "result": [...], "state": true }
- if (data.msg === "成功" && data.state) {
- var tbody = $("#productList"); // 获取tbody元素
- tbody.empty(); // 清空tbody中的旧数据
- $.each(data.result, function (index, product) {
- var row = $("<tr></tr>"); // 创建新的表格行
- row.append($("<td></td>").text(product.id)); // 添加ID列
- row.append($("<td></td>").text(product.productName)); // 添加产品名称列
- row.append($("<td></td>").text(product.phoneNumber)); // 添加联系电话列
- row.append($("<td></td>").text(product.price)); // 添加价格列
- row.append($("<td></td>").text(product.category)); // 添加类别列
- row.append($("<td></td>").text(product.gender)); // 添加适用性别列
- row.append($("<td></td>").text(product.description)); // 添加描述列
- tbody.append(row); // 将新行添加到tbody中
- });
- } else {
- // 处理错误情况,比如显示错误信息
- alert("获取产品数据失败:" + data.msg);
- }
- },
- error: function (jqXHR, textStatus, errorThrown) {
- // 处理AJAX请求错误
- alert("AJAX请求失败: " + textStatus);
- },
- });
- </script>
- </body>
- </html>
给页面添加背景图片样式,背景效果为七色彩虹。
/* 定义页面的背景样式为七色彩虹 */ body { margin: 0; /* 移除默认的margin */ padding: 0; /* 移除默认的padding */ height: 100vh; /* 设置body高度为视口高度 */ display: flex; justify-content: center; align-items: center; background: linear-gradient( to right, red, orange, yellow, green, blue, indigo, violet ); /* 七色彩虹渐变 */ background-repeat: no-repeat; /* 不重复背景图片 */ background-size: 100% 100%; /* 背景图片大小设置为100% */ color: white; /* 设置文本颜色为白色,以便在彩虹背景上清晰可见 */ }
效果很low,但是代码功能是全部完成了,这个渐变色还是可以的。
帮我生成一个html的爱心代码,是连个div盒子合理的调整角度,并且通过倒角的方式处理div盒子的四个角形状,并且通过合理的覆盖方式生成一个爱心,并且通过css3的transform:rotate(45deg)的方式生成一个爱心。
虽然出现爱心了,但是有些歪,我们处理一下。
二次修正:
在保持形状不变的条件下,整体向左旋转45度,还要添加整体的变大缩小效果,每5秒钟一个反复操作,给整体添加一个向右下角的阴影效果。
实际代码:
- <!DOCTYPE html>
- <html lang="en">
-
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Animated Heart Shape with Divs</title>
- <style>
- .heart-container {
- position: relative;
- width: 100px;
- height: 90px;
- margin: 50px;
- transform: rotate(-45deg); /* 整体向左旋转45度 */
- animation: scaleAndRotate 5s infinite; /* 变大缩小和旋转的动画 */
- box-shadow: 10px 10px 5px rgba(0, 0, 0, 0.5); /* 向右下角的阴影效果 */
- }
-
- .heart-piece {
- position: absolute;
- top: 0;
- width: 50px;
- height: 80px;
- border-radius: 50px 50px 0 0;
- background-color: red;
- }
-
- .heart-piece:first-child {
- left: 50px;
- transform: rotate(-45deg);
- transform-origin: 0 100%;
- }
-
- .heart-piece:last-child {
- left: 0;
- transform: rotate(45deg);
- transform-origin: 100% 100%;
- }
-
- /* 定义动画 */
- @keyframes scaleAndRotate {
- 0%, 100% {
- transform: scale(1) rotate(-45deg); /* 初始和结束时的大小 */
- }
- 50% {
- transform: scale(1.1) rotate(-45deg); /* 中间变大 */
- }
- }
- </style>
- </head>
-
- <body>
-
- <div class="heart-container">
- <div class="heart-piece"></div>
- <div class="heart-piece"></div>
- </div>
-
- </body>
-
- </html>
看来我是修改失败啊,先这样,在实验一下其它的。
4、安全方面测试(半成功)
利用bat代码写一个基础的DDOS攻击代码示例。
基础安全测试通过,DDOS示例无法编写。
变相测试安全方向:
接口有用户名和密码两个参数,请写出一条sql注入的测试sql,测试接口是否可用。
虽然有一定的提醒,但是还是将具体的操作原理说明了一下,这里是否需要注意一下呢?
现阶段学校也在拓展教学方法,所以讲完课程后利用一些时间来测试了一下,看看这个工具能否达到50多人的机房上课的需求。
前置问题:学校机房,所有的IP地址相同,一个班50多人,同时并发操作。
机房并发提问数据,在55人同时访问时,均可正常返回信息,为了更可能的测出问题,所有人员使用的都是一套问题。
最终结果是,并发访问正常,没有问题,我与学生们共同尝试了几次,都OK,所以满足基本使用要求,百度的本产品还是很不错的。
机房55人加上我自己,共计56人共同安装【Baidu Comate】插件,一个安装成功的都没有,都是显示TIME_OUT超时了,后来没办法,我就下载了个离线版本,发给学生们一起安装的。
离线文件分发。
离线文件安装很直接,操作如下图。
教学环境毕竟是每次开学前机房部门管理的,如果想单独安装插件这个操作倒是可以,问题是这个工具得时时连网,如果没有网络无法登录,无法正常使用,所以上课的时候一定要注意网络问题。如果有离线版本就好了。
实际遇到的问题,出现的概率不大,上次班级内测试的时候未出现,本次出现了。
目标是生成数据库的DDL与DML,班级内53人,有2个人都是回复非常抱歉,并且确定已经正常登录了,可是无法正常返回结果,这里需要后端技术看看怎么回事,上课的时候需要AI还是别出现这种异常的好,不然如果是有听课的就会很难受。
附问题:不知道大家对【灰原鸣大花】是否了解,班级里注册完成后有至少5人都叫这个名字,就很懵逼。
小游戏扫雷、贪吃蛇、鼠标点击次数等等小游戏都能直接生成,并且可以支持代码分析,告诉咱们每行代码的作用。
这个爱心就很迷茫,我也生成爱心,但是就没这个学生生成的好看。你看看这个比我上面那个好看太多了,而且还是正的。
生成的花,虽然有点抽象,但是还能算上是花。
点击打怪的小游戏。
这个号,背景可以看到使用的提示词,红色的正方体红色透明,而且还会动呢。
上下文问题,不能很好的理解较为复杂情况下的上下文函数理解,例如根据接口生成实现类,函数名称与函数的参数都无法对上。多个文件理解能力有限,例如dao层与mapper层都需要参考model的类数据,但是这里对于model层的理解能力就很很有限了,经常出现上下文不一致。
指令功能非常好用,基本上对代码的理解是非常到位的,应该是代码少好分析,或者或返回的内容由于有长度限制,大文件分析弱一些,小文件分析很方便透彻。
这几天比较多的就是用Baidu Comate智能代码助手来生成数据库,正好讲到数据库编程这里,DDL/DML自动生成,这样初始数据就有了,后面的存储过程什么的都可以依据Comate来智能生成,学生们用的还算比较熟练,偶尔出现一些小异常也可以根据实际情况适当改写一下。
基本上所有的功能都跑通了,而且根据springboot练习项目的student功能又生成了一个product的接口操作,从swagger上看,虽然由于上下文名称不匹配导致控制层生成函数有些异常,但是整体内容也都算跑通了,如果细致的使用,我相信一定会大大的提升准确性的,我基本上对实操手册上的功能都测试了。https://comate.baidu.com/zh/readme这是手册的地址,功能上能在教学生提供很多的辅助,特别是大一的学生们,由于高考上来后对打字操作并不是很熟练,有了它可以大大的提高代码的编写效率,并且它还能帮助学生们做代码分析,如果有那个位置的代码不理解,或者有疑惑都可以选中后点击代码解释功能帮助学生理解。
测试的最终结果是Baidu Comate可以有效且便捷的帮助学生们快速学习与理解代码,让学生们以更多的方向与角度学习对应知识点,并可以使用Baidu Comate来快速创建自己的项目,我这里推荐老师们可以尝试一下。
Baidu Comate智能代码助手:comate.百度首页
快来尝试一下吧。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。