5)一个登录注册的小练习

配置好maven和tomcat环境下

1、新建一个maven项目

在这里插入图片描述
选择你的安装的maven地址
在这里插入图片描述

2、新建几个文件夹

在这里插入图片描述

  • test测试文件夹:存放一些测试的代码
  • java文件夹:主要存放代码的地方
    – Java文件夹下建一个mapper(mybatis需要用的映射文件)和pojo(实体类)
  • resource文件夹:资源文件
    – resource文件夹下新建一个mapper文件夹,存放.xml映射文件。
  • webapp:一些网页的代码

3、使用mybatis

在resource下新建一个mybatis-config.xml文件,这个文件主要是存数据库的连接的东西

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <typeAliases>
        <package name="pojo"/>
    </typeAliases>

    <!--
    environments:配置数据库连接环境信息。可以配置多个environment,通过default属性切换不同的environment
    -->
    <environments default="test">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--数据库连接信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///mybatis?useSSL=false&amp;useServerPrepStmts=true"/>
                <property name="username" value="root"/>
                <property name="password" value="111111"/>
            </dataSource>
        </environment>

        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--数据库连接信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///db1?useSSL=false&amp;useServerPrepStmts=true"/>
                <property name="username" value="root"/>
                <property name="password" value="111111"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
       <!-- 加载sql映射文件
        <mapper resource="mapper/UserMapper.xml"/>
        <mapper resource="mapper/BrandMapper.xml"/>-->

        <!--Mapper代理方式-->
        <package name="mapper"/>
    </mappers>
</configuration>

这个是实体类的地址
在这里插入图片描述
可以点击pojo文件夹右击copy path/reference,找到路径
在这里插入图片描述
在这里插入图片描述
url是你的数据库的地址,一般只需要改///后面的名字
username是数据库的用户名,一般都是root
password就是你数据库的密码
defaullt标签指的是默认使用哪个数据库

在pom.xml中添加依赖

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <!--mybatis依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.5</version>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.46</version>
    </dependency>

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jcl-over-slf4j</artifactId>
      <version>1.7.20</version>
    </dependency>

    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
    </dependency>

    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>1.2.3</version>
    </dependency>
  </dependencies>

这是我添加的依赖,junit是一个测试用的,还蛮好用具体可以参见这个
https://blog.csdn.net/qq_45764141/article/details/123485142?spm=1001.2014.3001.5502

4、写有关的mybatis代码

1)使用navicat在你的连接的那个数据库里面创建表

-- 创建用户表
CREATE TABLE tb_user(
	id int primary key auto_increment,
	username varchar(20) unique,
	password varchar(32)
);

-- 添加数据
INSERT INTO tb_user(username,password) values('zhangsan','123'),('lisi','234');

SELECT * FROM tb_user;



2)根据你的表建立一个用户User的实体类存放在pojo文件夹里

package pojo;

public class User {
    private Integer id;
    private String username;
    private String password;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

右键generate可以自动创建getter,setter和toString方法。

3)在resource/mapper文件夹创建有关用户的映射表UserMapper.xml。在java/mapper文件夹下创建UserMapper.java.
我们需要查询所有数据,根据用户名和密码查询数据,根据姓名查询数据,插入一个数据

<?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="mapper.UserMapper">

    <select id="selectSign" resultType="pojo.User">
       select * from tb_user where username = #{username} and password = #{password};
    </select>

    <select id="selectByName" resultType="pojo.User">
        select * from tb_user where username = #{username};
    </select>

    <select id="selectAll" resultType="pojo.User">
        select * from tb_user ;
    </select>

    <insert id="add" useGeneratedKeys="true" keyProperty="id">
        insert into tb_user (username,password) values (#{username},#{password}) ;
    </insert>

    <select id="selectById" resultType="pojo.User">
        select * from tb_user where id = #{id};
    </select>

</mapper>

在这里插入图片描述
namespace是你对应的那个映射表的地址
在这里插入图片描述
其他的一些问题就是关于mybatis中sql语言的使用。
当数据库表的字段名称和实体类属性名称不一样,不能自动封装,需要手动封装。
比如:数据库的姓名是brand_name,实体类的姓名是brandName。即数据库表的字段名称和实体类属性名称不一样, 则不能自动封装,需要手动封装。

也可以使用resultMap

一个例子

<resultMap id="brandResultMap" type="brand">
    <!--
            id:完成主键字段的映射
                column:表的列名
                property:实体类的属性名
            result:完成一般字段的映射
                column:表的列名
                property:实体类的属性名
        -->
    <result column="brand_name" property="brandName"/>
    <result column="company_name" property="companyName"/>
</resultMap>

<select id="selectAll" resultMap="brandResultMap">
   select * from tb_brand;
</select> 

为了避免麻烦最好你的东西命名跟你的数据库都一样。

增删改查的一些例子

  <insert id="add" useGeneratedKeys="true" keyProperty="id">
        insert into tb_brand (brand_name, company_name, ordered, description, status)
        values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});
    </insert>
<!--删一个-->
 <delete id="deleteById">
        delete from tb_brand where id = #{id};
    </delete>
----------------------------------------------------
<!--删一堆-->
 <!--
        mybatis会将数组参数.封装为一个Map集合。
          默认: array =数组
          使用@Param注解改变map集合的默认key的名称
    -->
  <delete id="deleteByIds">
        delete from tb_brand where id in
            <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
            </foreach>
    </delete>
-················································----   
   /*根据id删除多行数据*/
   void deleteByIds(@Param("ids") int ids[]);
<update id="update">
        update tb_brand
        <set>
            <if test="brandName != null and brandName != ''">
                brand_name = #{brandName},
            </if>
            <if test="companyName != null and companyName != ''">
                company_name = #{companyName},
            </if>
            <if test="ordered != null">
                ordered = #{ordered},
            </if>
            <if test="description != null and description != ''">
                description = #{description},
            </if>
            <if test="status != null">
                status = #{status}
            </if>
        </set>
        where id = #{id};
    </update>
 <resultMap id="brandResultMap" type="brand">
        <!--
                id:完成主键字段的映射
                    column:表的列名
                    property:实体类的属性名
                result:完成一般字段的映射
                    column:表的列名
                    property:实体类的属性名
            -->
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>
    </resultMap>

    <select id="selectAll" resultMap="brandResultMap">
       select * from tb_brand;
    </select>

----------------------------------------------------
    <select id="selectByCondition" resultMap="brandResultMap">
        select *
        from tb_brand
        <where>
            <if test="status != null">
                and status = #{status}
            </if>
            <if test="companyName != null and companyName != '' ">
                and company_name like #{companyName}
            </if>
            <if test="brandName != null and brandName != '' ">
                and brand_name like #{brandName}
            </if>
        </where>
    </select>
----------------------------------------------------
  <select id="selectByConditionSingle" resultMap="brandResultMap">
        select *
            from tb_brand
            <where>
                <choose><!--相当于switch-->
                    <when test="status != null"><!--相当于case-->
                        status = #{status}
                    </when>
                    <when test="companyName != null and companyName != '' "><!--相当于case-->
                        company_name like #{companyName}
                    </when>
                    <when test="brandName != null and brandName != ''"><!--相当于case-->
                        brand_name like #{brandName}
                    </when>
                </choose>
            </where>
    </select>

4)你的UserMapper.java文件

package mapper;

import org.apache.ibatis.annotations.Param;
import pojo.User;

import java.util.List;
import java.util.Map;

public interface UserMapper {
    User selectSign(@Param("username") String name, @Param("password") String password);

    //根据名字进行查询
    User selectByName(@Param("username") String name);

    //查询所有
    List<User> selectAll();

    //添加
    void add(User user);
}

5)可以在test文件夹中新建文件夹对这些查询语句进行调试,看能不能用

import mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import pojo.User;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class myUserTest {
    @Test
    public void testSelectCondition() throws IOException {
        //接收参数
        String name = "zhangsan";
        String password = "123";

       /* // 如果时模糊查询要处理参数
        name = "%" + name + "%";
        password = "%" + password + "%";*/

        User user = new User();
        user.setUsername("1111");
        user.setPassword("123456789");

        //1. 获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2. 获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3. 获取Mapper接口的代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        //4. 执行方法
        userMapper.add(user);
        //提交
        sqlSession.commit();
        //5. 释放资源
        sqlSession.close();

    }
    
    @Test
    public void testSelectByName() throws IOException {
        String name = "wangwu";
        //1. 获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2. 获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();


        //3. 获取Mapper接口的代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        //4. 执行方法
        User users = userMapper.selectByName(name);
        System.out.println(users);

        //5. 释放资源
        sqlSession.close();

    }
    @Test
    public void testSelectAll() throws IOException {
        int id = 4;
        //1. 获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2. 获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();


        //3. 获取Mapper接口的代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        //4. 执行方法
        List<User> users = userMapper.selectAll();
        System.out.println(users);

        //5. 释放资源
        sqlSession.close();

    }
}

经过调试获取数据没有问题

5、准备服务器环境

tomcat是安装好的
在pom.xml中添加依赖和插件

<dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <!--
        此处为什么需要添加该标签?
        provided指的是在编译和测试过程中有效,最后生成的war包时不会加入
         因为Tomcat的lib目录中已经有servlet-api这个jar包,如果在生成war包的时候生效就会和Tomcat中的jar包冲突,导致报错
      -->
      <scope>provided</scope>
    </dependency>
 <!--Tomcat插件 -->
        <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <version>2.2</version>
          <configuration>
            <port>80</port><!--访问端口号 -->
            <!--项目访问路径
                未配置访问路径: http://localhost:80/tomcat-demo2/a.html
                配置/后访问路径: http://localhost:80/a.html
                如果配置成 /hello,访问路径会变成什么?
                    答案: http://localhost:80/hello/a.html
            -->
            <path>/</path>
          </configuration>
        </plugin>

6、写前端代码

在这里插入图片描述
在webapp下新建如下文件夹

login.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>login</title>
    <link href="css/login.css" rel="stylesheet">
</head>

<body>
<div id="loginDiv">
    <form action="/loginServlet" method="post" id="form">
        <h1 id="loginMsg">LOGIN IN</h1>
        <p>Username:<input id="username" name="username" type="text"></p>

        <p>Password:<input id="password" name="password" type="password"></p>

        <div id="subDiv">
            <input type="submit" class="button" value="login up">
            <input type="reset" class="button" value="reset">&nbsp;&nbsp;&nbsp;
            <a href="register.html">没有账号?点击注册</a>
        </div>
    </form>
</div>

</body>
</html>

register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>欢迎注册</title>
    <link href="css/register.css" rel="stylesheet">
</head>
<body>

<div class="form-div">
    <div class="reg-content">
        <h1>欢迎注册</h1>
        <span>已有帐号?</span> <a href="login.html">登录</a>
    </div>
    <form id="reg-form" action="/registerServlet" method="post">

        <table>

            <tr>
                <td>用户名</td>
                <td class="inputs">
                    <input name="username" type="text" id="username">
                    <br>
                    <span id="username_err" class="err_msg" style="display: none">用户名不太受欢迎</span>
                </td>

            </tr>

            <tr>
                <td>密码</td>
                <td class="inputs">
                    <input name="password" type="password" id="password">
                    <br>
                    <span id="password_err" class="err_msg" style="display: none">密码格式有误</span>
                </td>
            </tr>

        </table>

        <div class="buttons">
            <input value="注 册" type="submit" id="reg_btn">
        </div>
        <br class="clear">
    </form>

</div>
</body>
</html>

页面用css随便优化一下。

7、写跟浏览器进行获取和响应的servlet文件

在这里插入图片描述

package web;


import mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import pojo.User;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.List;

@WebServlet(urlPatterns = "/loginServlet")
public class LoginServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 接收用户名和密码
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        //2. 调用MyBatis完成查询
        //2.1 获取SqlSessionFactory对象
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

       /* SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();*/
        //2.2 获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //2.3 获取Mapper
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //2.4 调用方法
        User user = userMapper.selectSign(username, password);
        //2.5 释放资源
        sqlSession.close();

        //获取字符输出流,并设置content type
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        //3. 判断user释放为null
        if(user != null){
            // 登陆成功
            writer.write("登陆成功");
        }else {
            // 登陆失败
            writer.write("登陆失败");
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      this.doGet(request,response);
    }
}

package web;

import mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import pojo.User;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;

@WebServlet("/registerServlet")
public class RegisterServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 接收用户数据
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        //封装用户对象
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);

        //2. 调用mapper 根据用户名查询用户对象
        //2.1 获取SqlSessionFactory对象
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        /*SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();*/

        //2.2 获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //2.3 获取Mapper
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        //2.4 调用方法
        User u = userMapper.selectByName(username);

        //3. 判断用户对象释放为null
        if( u == null){
            // 用户名不存在,添加用户
            userMapper.add(user);
            // 提交事务
            sqlSession.commit();
            // 释放资源
            sqlSession.close();
        }else {
            // 用户名存在,给出提示信息
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().write("用户名已存在");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

在这里插入图片描述
右键运行tomcat
在这里插入图片描述
在这里插入图片描述

到浏览器中输入
在这里插入图片描述
可以正确进行数据的交互

一些问题

1、启动Tomcat报错:A child container failed during start
有可能是你的映射错误
在这里插入图片描述在这里插入图片描述

检查一下格式路径之类的

2、SqlSessionFactory工具类抽取
Mybatis的基础操作中有几句是重复的,可以去封装一下直接调用。
这些重复代码就会造成一些问题:

  • 重复代码不利于后期的维护
  • SqlSessionFactory工厂类进行重复创建
    • 就相当于每次买手机都需要重新创建一个手机生产工厂来给你制造一个手机一样,资源消耗非常大但性能却非常低。所以这么做是不允许的。

那如何来优化呢?

  • 代码重复可以抽取工具类
  • 对指定代码只需要执行一次可以使用静态代码块

在文件夹下新建一个util类

package util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class SqlSessionFactoryUtils {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        //静态代码块会随着类的加载而自动执行,且只执行一次

        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSessionFactory getSqlSessionFactory(){
        return sqlSessionFactory;
    }
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用Spring Boot和Mybatis Plus进行登录注册练习时,可以考虑以下步骤: 1. 首先,在你的项目中引入Spring Boot和Mybatis Plus的相关依赖包。具体依赖包的引入方式可以参考和中提供的文档。 2. 创建一个用户实体类,用于表示用户的信息,例如用户名、密码等。可以使用Mybatis Plus的注解来映射数据库表和实体类之间的关系。 3. 创建一个用户Mapper接口,用于定义数据库操作的方法。通过使用Mybatis Plus的注解,可以轻松地实现常见的增删改查操作。 4. 创建一个用户Service类,用于处理用户相关的业务逻辑。在该类中,可以调用用户Mapper接口中定义的方法来实现对数据库的操作。 5. 在需要进行登录注册的地方,可以创建相应的Controller类来处理用户的登录和注册请求。在登录请求中,可以验证用户输入的用户名和密码是否正确;在注册请求中,可以将用户输入的信息存储到数据库中。 6. 为了增加安全性,你可以考虑使用Spring Security来实现用户的身份认证和授权功能。通过配置Spring Security,你可以限制只有已登录的用户才能访问某些资源或执行某些操作。 7. 最后,你可以使用Bootstrap、Thymeleaf、JQuery和Ajax等技术来美化和增强用户界面的交互体验。 综上所述,使用Spring Boot和Mybatis Plus进行登录注册练习的步骤包括引入相关依赖、创建实体类和Mapper接口、实现Service类和Controller类、配置Spring Security,并使用各种前端技术进行界面设计和交互。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [java课程设计项目:基于SpringBoot的在线订餐系统.zip](https://download.csdn.net/download/qq_35831906/88222416)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【源码解析】SpringBoot整合MybatisPlus框架的源码解析](https://blog.csdn.net/qq_42985872/article/details/129767264)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Springboot集成mybatisplus的问题处理](https://blog.csdn.net/ybb_ymm/article/details/131479434)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值