SSM项目创建

1.项目创建

在这里插入图片描述

2.pom.xml 导入依赖

<properties>
        <spring.version>6.1.11</spring.version>
        <mybatis.version>3.5.16</mybatis.version>
        <mybatis-spring.version>3.0.4</mybatis-spring.version>
        <dbcp2.version>2.12.0</dbcp2.version>
        <log4j2.version>2.19.0</log4j2.version>
        <servlet-api.version>6.0.0</servlet-api.version>
        <jst1.version>2.0.0</jst1.version>
        <taglib.version>1.2.5</taglib.version>
        <jackson.version>2.15.2</jackson.version>
    </properties>

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

        <!--   spring-context spring的ioc依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--   spring-aspects spring的aop依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!--    spring-jdbc 支持数据库操作    -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--   spring-tx 用于事务管理     -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--   mysql驱动包     -->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>8.1.0</version>
        </dependency>
        <!--   mybatis 依赖    -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <!--   spring与mybatis 整合依赖包,Mybatis提供用于Spring和Mybatis进行整合的关键依赖包     -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>${mybatis-spring.version}</version>
        </dependency>
        <!--   commons-dbcp2数据源  能够帮我们进行数据库连接池的管理   -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-dbcp2</artifactId>
            <version>${dbcp2.version}</version>
        </dependency>
        <!--   引入log4j的依赖    -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>${log4j2.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>${log4j2.version}</version>
        </dependency>
        <!--   junit依赖     -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.30</version>
            <scope>provided</scope>
        </dependency>

        <!-- spring-web 使用Spring Mvc 需要的两个依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!-- 注意:由于Spring只支持Tomcat10+,下面的是与之对应的servlet与jst1版本依赖 -->
        <!-- Spring6 依赖 jakarta.servlet-api  -->
        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <version>6.0.0</version>
            <scope>provided</scope>
        </dependency>
        <!-- JSTL 2.0 标签库依赖 -->
        <dependency>
            <groupId>jakarta.servlet.jsp.jstl</groupId>
            <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
            <version>${jst1.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>jakarta.servlet.jsp.jstl</artifactId>
            <version>${jst1.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.taglibs</groupId>
            <artifactId>taglibs-standard-impl</artifactId>
            <version>${taglib.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.taglibs</groupId>
            <artifactId>taglibs-standard-spec</artifactId>
            <version>${taglib.version}</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

        <!--   Jackson是一个常用的JSON处理库,Spring MVC默认使用它来进行JSON转换。     -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>${jackson.version}</version>
        </dependency>

        <!--    日期json格式化    -->
        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>2.0.53</version>
        </dependency>
    </dependencies>

3.配置文件

log4j2.xml

<?xml version="1.0" encoding="UTF-8" ?>
<Configuration status="warn">
    <Appenders>
        <!--  控制台输出配置  -->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
        <!--    文件输出配置    -->
        <File name="FileLog" fileName="logs/ktsms.log" append="true">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <logger name="org.springframework" level="DEBUG"/>
        <logger name="org.mybatis" level="INFO"/>
        <Root level="all">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="FileLog"/>
        </Root>
    </Loggers>
</Configuration>

database.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/数据库名称?userUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
jdbc.username=账号
jdbc.password=密码
# 连接池配置
pool.maxTotal=100
pool.initialSize=20
pool.maxIdle=45
pool.minIdle=15
pool.maxWaitMillis=60000
pool.removeAbandonedOnMaintenance=true
pool.removeAbandonedOnBorrow=true
pool.removeAbandonedTimeout=180

applicationContext-mybatis.xml

org.ktmall 在配置文件表示 项目路径 注意修改
applicationContext-mybatis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!-- mybatis注解扫描service层业务组件   -->
    <context:component-scan base-package="org.ktmall.mapper"/>

    <!--  读取数据库配置文件  -->
    <context:property-placeholder location="classpath:database.properties"/>

    <!--  数据源配置(使用dbcp2连接池)
        driverClassName:数据库驱动类配置
        url:数据库连接地址
        username:数据库用户名
        password:数据库密码
        initialSize:数据库连接池在初始化连接池时,立刻创建的连接数
        maxTotal:连接池最大连接数
        maxIdle:连接池最大空闲连接数
        minIdle:连接池最小空闲连接数
        maxWaitMillis:连接池等待获取连接的最大时间,单位为毫秒,默认-1,表示无限期等待
        removeAbandonedOnMaintenance:在连接池维护线程中,是否检测连接是否已经超时
        removeAbandonedOnBorrow:在获取连接的时候检测,如果空闲时间大于removeAbandonedTimeout设置的值,则关闭老的连接
        removeAbandonedTimeout:连接超过removeAbandonedTimeout设置的时间,则关闭老的连接
     -->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
          p:driverClassName="${jdbc.driver}"
          p:url="${jdbc.url}"
          p:username="${jdbc.username}"
          p:password="${jdbc.password}"
          p:initialSize="${pool.initialSize}"
          p:maxTotal="${pool.maxTotal}"
          p:maxIdle="${pool.maxIdle}"
          p:minIdle="${pool.minIdle}"
          p:maxWaitMillis="${pool.maxWaitMillis}"
          p:removeAbandonedOnMaintenance="${pool.removeAbandonedOnMaintenance}"
          p:removeAbandonedOnBorrow="${pool.removeAbandonedOnBorrow}"
          p:removeAbandonedTimeout="${pool.removeAbandonedTimeout}"
    />

    <!--  配置SqlSessionFactoryBean
      p:configLocation="classpath:applicationContext-mybatis.xml"
      dataSource-ref 属性指定数据源
      typeAliasesPackage:实体类别名 ,指定实体类所在包路径,使用通配符,可以指定多个路径,多个路径之间用“,”隔开
      mapperLocations :指定mapper接口所在包路径,使用通配符,可以指定多个路径,多个路径之间用“,”隔开
      注意:mapperLocations指定的路径,必须是mapper接口所在路径,不能是mapper实现类所在路径
      -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
          p:dataSource-ref="dataSource"
          p:typeAliasesPackage="org.ktmall.entity"
          p:mapperLocations="classpath:mapper/**/*.xml"
          p:configuration-ref="configuration"
    />
    <!-- 1.设置MyBatis框架的运行时行为 -->
    <bean id="configuration" class="org.apache.ibatis.session.Configuration">
        <!-- 设置下划线命名转换为驼峰命名 -->
        <property name="mapUnderscoreToCamelCase" value="true"/>
        <!-- 设置自动映射行为 PARTIAL:嵌套不映射 FULL:嵌套映射-->
        <property name="autoMappingBehavior" value="PARTIAL"/>
    </bean>

    <!-- Mapper扫描器。扫描指定包中所有接口,自动注册对应的MapperFactoryBean对象 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="org.ktmall.mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>
</beans>

applicationContext-service.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
    <!-- mybatis注解扫描service层业务组件   -->
    <context:component-scan base-package="org.ktmall.service"/>

    <import resource="applicationContext-mybatis.xml"/>

    <!--  1.定义事务管理器  -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource"/>
    <!--  使用注解支持事务处理  -->
    <tx:annotation-driven transaction-manager="transactionManager"/>
</beans>

applicationContext.xml (整合导入)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       https://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"
       xmlns:p="http://www.springframework.org/schema/p"
>
	<!-- 导入配置文件 -->
    <import resource="applicationContext-service.xml"/>
</beans>

applicationContext-servlet.xml (或 xxxx-mvc.xml)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       https://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"
       xmlns:p="http://www.springframework.org/schema/p"
>
    <!-- 开启mvc注解驱动  -->
    <mvc:annotation-driven/>
    <!--  注解扫描的包  -->
    <context:component-scan base-package="org.ktmall.controller"/>

    <!--  controller返回值转换为json  -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="mappingJackson2HttpMessageConverter"/>
            </list>
        </property>
    </bean>

    <bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <!-- 处理中文乱码以及避免IE执行AJAX时,返回JSON出现下载文件 -->
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
                <value>text/json;charset=UTF-8</value>
                <value>application/json;charset=UTF-8</value>
            </list>
        </property>
    </bean>

    <!-- 设置spring-mvc的请求拦截 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/do/login"/>
            <mvc:exclude-mapping path="/loginProcess"/>
            <mvc:exclude-mapping path="/resources/**"/>
            <bean class="org.ktmall.interceptor.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
</beans>

修改项目wedapp的web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
         version="6.0">
  <display-name>Archetype Created Web Application</display-name>

  <!-- 使用监听器定义Spring容器 ContextCleanupListener -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <!-- 定义Spring容器的上下文参数 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>

  <!--  Spring MVC的核心是一个Servlet,称为前端控制器  -->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- Spring MVC 的核心配置文件由前端控制器负责加载 -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:applicationContext-servlet.xml</param-value>
    </init-param>
    <!-- 随容器启动,初始化加载配置 -->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!-- 由Spring管理拦截所有请求 -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

4.实现数据库操作

1.创建实体类

(根据自己的数据库创建,不过多描述)

2.创建mapper接口

在这里插入图片描述

import org.apache.ibatis.annotations.Param;
import org.ktmall.entity.User;
import org.springframework.stereotype.Repository;

@Repository
public interface UserMapper {
    User login(@Param("loginName") String loginName, @Param("password") String password);
}

3.创建mapper.xml文件

在这里插入图片描述

<?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="org.ktmall.mapper.UserMapper">
	    <resultMap id="BaseResultMap" type="org.ktmall.entity.User">
            <id property="id" column="id" jdbcType="INTEGER"/>
            <result property="roleId" column="roleId" jdbcType="INTEGER"/>
            <result property="loginName" column="loginName" jdbcType="VARCHAR"/>
            <result property="userName" column="userName" jdbcType="VARCHAR"/>
            <result property="password" column="password" jdbcType="VARCHAR"/>
            <result property="sex" column="sex" jdbcType="INTEGER"/>
            <result property="identityCode" column="identityCode" jdbcType="VARCHAR"/>
            <result property="email" column="email" jdbcType="VARCHAR"/>
            <result property="mobile" column="mobile" jdbcType="VARCHAR"/>
            <result property="enabled" column="enabled" jdbcType="TINYINT"/>
            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
            <result property="avatarImage" column="avatar_image" jdbcType="VARCHAR"/>
    </resultMap>

    <sql id="Base_Column_List">
        id,roleId,loginName,
        userName,password,sex,
        identityCode,email,mobile,
        enabled,create_time,update_time,
        avatar_image
    </sql>
    
    <select id="login" resultType="org.ktmall.entity.User">
        select
        <include refid="Base_Column_List" />
        from t_user
        where loginName = #{loginName} and password = #{password}
    </select>
</mapper>

4.创建service

创建UserService接口
路径:项目名称.service.UserService

public interface UserService {
    User login(String loginName, String password);
}

创建实现类UserServiceImpl6
路径:项目名称.service.impl.UserServiceImpl

@Service("UserService")
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public User login(String loginName, String password) {
        return userMapper.login(loginName,password);
    }
}

5.创建测试类

在这里插入图片描述
UserServiceImplTest.java

import org.junit.Test;
import org.ktmall.KtmallStart;
import org.ktmall.entity.User;
import org.ktmall.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserServiceImplTest {

    @Test
    public void logon() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) context.getBean("userService");
        User user = userService.login("admin", "123456");
        System.out.println(user);
    }
}

运行结果
在这里插入图片描述

3.请求访问

vo类:

AjaxResult.java 数据传输功能

public class AjaxResult {
    private int code;  // 状态码 如:200、401、403、405、500
    private String msg;  //提示信息
    private Object result;  // 返回数据(后端返回给前端的数据)

    public AjaxResult(){}
    public AjaxResult(int code, String msg, Object result) {
        this.code = code;
        this.msg = msg;
        this.result =result;
    }
    /**
     * 成功返回结果
     * @param message 提示信息
     */
    public static AjaxResult success(String message) {
        return new AjaxResult(200, message, null);
    }

    /**
     * 成功返回结果
     * @param message 提示信息
     * @param obj 返回给前端的数据
     */
    public static AjaxResult success(String message, Object obj) {
        return new AjaxResult(200, message, obj);
    }

    /**
     * 失败返回结果
     * @param message 提示信息
     */
    public static AjaxResult error(String message) {
        return new AjaxResult(500, message, null);
    }

    /**
     * 失败返回结果
     * @param message 提示信息
     * @param obj 返回给前端的数据
     */
    public static AjaxResult error(String message, Object obj) {
        return new AjaxResult(500, message, obj);
    }


    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getResult() {
        return result;
    }

    public void setResult(Object result) {
        this.result = result;
    }
}

工具类:

Md5Utils 加密工具类


import java.security.MessageDigest;

public class Md5Utils {
    public static String MD5(String str){
        MessageDigest md = null;
        try {
            md = MessageDigest.getInstance("MD5");
        }catch (Exception e){
            return str;
        }
        byte[] hash = md.digest(str.getBytes());
        StringBuilder hexString = new StringBuilder();
        for (byte b : hash) {
            hexString.append(String.format("%02x", b));
        }
        return hexString.toString();
    }
}

创建 Controller(控制层)

创建:UserController.java
路径:项目名称.controller,UserController.java
代码:

import jakarta.servlet.http.HttpSession;
import org.ktmall.entity.User;
import org.ktmall.service.UserService;
import org.ktmall.utils.Md5Utils;
import org.ktmall.vo.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/do")
public class UserController {

    @Autowired
    private UserService userService;

    @ResponseBody
    @RequestMapping("/login")
    public AjaxResult login(@RequestParam(value = "loginName") String loginName, @RequestParam(value = "password") String password, HttpSession session) {
        User login = userService.login(loginName, Md5Utils.MD5(password));
        if (login != null){
            // 将用户信息存储到session中
            session.setAttribute("user", login);
            return AjaxResult.success("登录成功",login);
        }
        return AjaxResult.error("账号或密码错误,登录失败!");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值