SrpingMVC+Mybatis+MySql+bootstrap

       最近感觉自己工作内容涉及颇多,web前后端与app都有,虽说有很多共通之处,但是还是想花时间把自己所学的自己重头写一遍来把一些知识内容整理下,写的不咋滴,当做记事本吧,各位看官如有发现问题,请及时指出,我会修改,不然坑了别人就不好了偷笑

       初学的可以看看自己尝试,自己搭建过程中会遇到很多问题,看书看多了还是得多动手实践不是... ...

好了,废话就此打住,接下来上菜:

一、项目目录结构,前端目录,jar包,总体就是这样的


二、创建用户实体

UserEntity

<span style="font-size:14px;">public class UserEntity {
	
    private int id;  
    private String age;  
    private String userName;
    private String account;
    private String password;
    private String sex;
    private String state;
    private String address;
    private String tel;//移动电话
    private String phone;//固定电话
    private Date insertTime;//创建时间
    private String email;//邮箱
    private String addTime;
    
	public String getAddTime() {
		return addTime;
	}

	public void setAddTime(String addTime) {
		this.addTime = addTime;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Date getInsertTime() {
		return insertTime;
	}

	public void setInsertTime(Date insertTime) {
		this.insertTime = insertTime;
	}

	public UserEntity() {
		super();
	}
	
	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getState() {
		return state;
	}

	public void setState(String state) {
		this.state = state;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String getTel() {
		return tel;
	}

	public void setTel(String tel) {
		this.tel = tel;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getAccount() {
		return account;
	}
	public void setAccount(String account) {
		this.account = account;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
    
}</span>

三、控制器 Controller

前端发出请求 跳转 到控制器

<span style="font-size:14px;">package lxc.design.controller;

import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import lxc.design.entity.UserEntity;
import lxc.design.service.UserService;

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.ResponseBody;
/**
 *lxc.design.controller.UserController
 * Description :用户管理控制器
 * @author lxc 
 * Create at 2016年9月1日 上午10:55:03
 */
@Controller
@RequestMapping("/user")
public class UserController {
	
	@Autowired
	private UserService userService;
	private int row = 0;;
	
	/**
	 * Description :根据账号查询密码
	 * @author lxc
	 * Create at @2016年8月30日.上午9:54:48
	 */
	@RequestMapping("/selectPwByAccount")
	public String selectPwByAccount(String account,String password,HttpServletRequest request){
		System.out.println("account---"+account+"  ==password--"+password);
		UserEntity user = userService.selectPwByAccount(account);
		if(user != null && !"".equals(user.getPassword()) && password.equals(user.getPassword())){
			return "redirect:/user/index.jsp";
		}else{
			return "/login";
		}
	}
	
	/**
	 * Description :查询用户信息
	 * @author lxc
	 * Create at @2016年8月30日.上午9:54:27
	 */
	@RequestMapping("/selectUserInfo")
	@ResponseBody
	public List<UserEntity> selectUserInfo(HttpServletRequest request){
		List<UserEntity> list =  userService.selectUserInfo();
		System.out.println("list"+list.size());
		return list;
	}
	
	/**
	 * Description :添加用户
	 * @author lxc
	 * Create at @2016年8月30日.上午9:54:15
	 */
	@RequestMapping("/inserUser")
	@ResponseBody
	public int inserUser(UserEntity user){
		//UserModel users
//		UserEntity user = new UserEntity();
//		List<UserEntity> userList = users.getUsers();
//		if(userList.size() > 0 && userList != null){
//			user.setAccount(userList.get(0).getAccount());
//			user.setUserName(userList.get(0).getUserName());
//		}
		if(user != null){
//			user.setInsertTime(Utils.formatterDate(new Date(), "yyyy-MM-dd HH:mm:ss"));
			user.setInsertTime(new Date());
			row = userService.inserUser(user);
		}
		return row;
	}
	
	/**
	 * Description :删除用户
	 * @author lxc
	 * Create at @2016年8月30日.上午9:54:01
	 */
	@RequestMapping("/delete")
	@ResponseBody
	public int delete(UserEntity user){
		row = userService.delete(user.getId());
		return row;
	}
	
	/**
	 * Description :更新用户信息
	 * @author lxc
	 * Create at @2016年9月1日.上午9:22:50
	 */
	@RequestMapping("/updateInfo")
	@ResponseBody
	public int updateInfo(UserEntity user){
		if(user != null){
			row = userService.updateInfo(user);
		}
		return row;
	}
	
	/**
	 * Description :根据用户id 查询用户信息
	 * @author lxc
	 * Create at @2016年9月1日.上午9:23:06
	 */
	@RequestMapping("/selectUserInfoById")
	@ResponseBody
	public UserEntity selectUserInfoById(HttpServletRequest request,UserEntity user){
		UserEntity bean = userService.selectUserInfoById(user.getId());
		return bean;
	}

}</span>

四、Service层 处理用户业务逻辑 然后跟数据库交互,再把数据返回到Service,再返回到控制器

先定义一个Service接口  然后再实现这个接口

package lxc.design.service;
import java.util.List;
import lxc.design.entity.UserEntity;
/**
*lxc.design.service.UserService
* Description :用户信息服务接口
* @author lxc
* Create at 2016年9月1日 上午10:56:36
*/
public interface UserService {
UserEntity selectPwByAccount(String account);
List<UserEntity> selectUserInfo();
int inserUser(UserEntity user);
int delete(int id);
int updateInfo(UserEntity user);
UserEntity selectUserInfoById(int id);
}

五、UserServiceImpl  实现接口方法

<span style="font-size:14px;">package lxc.design.service.impl;

import java.util.List;

import javax.annotation.Resource;

import lxc.design.entity.UserEntity;
import lxc.design.mapper.UserMapper;
import lxc.design.service.UserService;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
 *lxc.design.service.impl.UserServiceImpl
 * Description :UserServiceImpl 实现接口方法
 * @author lxc 
 * Create at 2016年9月1日 上午10:57:32
 */
@Service
@Transactional  //此处不再进行创建SqlSession和提交事务,都已交由spring去管理了
public class UserServiceImpl implements UserService{
	
	@Resource
	private UserMapper userMapper;
	
	public UserEntity selectPwByAccount(String account) {
		UserEntity user = userMapper.selectPwByAccount(account);
		return user;
	}

	@Override
	public List<UserEntity> selectUserInfo() {
		List<UserEntity> list = userMapper.selectUserInfo();
		return list;
	}

	@Override
	public int inserUser(UserEntity user) {
		return userMapper.inserUser(user);
	}

	@Override
	public int delete(int id) {
		return userMapper.delete(id);
	}

	@Override
	public int updateInfo(UserEntity user) {
		return userMapper.updateInfo(user);
	}

	@Override
	public UserEntity selectUserInfoById(int id) {
		return userMapper.selectUserInfoById(id);
	}

}</span>

六、数据库接口  interface  UserMapper.java

<span style="font-size:14px;">package lxc.design.mapper;

import java.util.List;

import lxc.design.entity.UserEntity;

/**
 * lxc.design.mapper.UserMapper
 * Description :Dao层
 * @author lxc 
 * Create at 2016年8月11日 下午2:58:05
 */
public interface UserMapper {
	
	UserEntity selectPwByAccount(String account);

	List<UserEntity> selectUserInfo();

	int inserUser(UserEntity user);

	int delete(int id);

	int updateInfo(UserEntity user);

	UserEntity selectUserInfoById(int id);
}</span>

七、数据库sql语句

<span style="font-size:14px;"><?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">  
<!--   
    namespace:必须与对应的接口全类名一致  
    id:必须与对应接口的某个对应的方法名一致  
 --> 
 
 <mapper namespace="lxc.design.mapper.UserMapper">
 	
 	<select id="selectPwByAccount" resultType="User" parameterType="String">
 		select 
 			user_id id,user_name userName,user_age age,
 			user_account account,user_password password,
 			user_sex sex,user_address address,user_state state,
 			user_tel tel,user_phone phone,user_time insertTime,
 			user_email email
 		from
 			t_user
 		where
 			user_account = #{account,jdbcType=VARCHAR}
 	</select>
 	
 	<select id="selectUserInfo" resultType="User">
 		select 
 			user_id id,user_name userName,user_age age,
 			user_account account,user_password password,
 			user_sex sex,user_address address,user_state state,
 			user_tel tel,user_phone phone,user_time insertTime,
 			user_email email,
 			date_format(user_time,'%Y-%m-%d %H:%i:%s') addTime
 		from
 			t_user
 		order by user_time desc
 	</select>
 	
 	<insert id="inserUser" parameterType="User">
 		insert into t_user(
 			user_name ,user_age ,
 			user_account ,user_password ,
 			user_sex ,user_address ,
 			user_state ,user_tel ,
 			user_phone,user_time,
 			user_email 
 		)values(
 			#{userName,jdbcType=VARCHAR},#{age,jdbcType=VARCHAR},
 			#{account,jdbcType=VARCHAR},#{password,jdbcType=VARCHAR},
 			#{sex,jdbcType=VARCHAR},#{address,jdbcType=VARCHAR},
 			#{state,jdbcType=VARCHAR},#{tel,jdbcType=VARCHAR},
 			#{phone,jdbcType=VARCHAR},#{insertTime},
 			#{email,jdbcType=VARCHAR}
 		)
 	</insert>
 	
 	<delete id="delete" parameterType="int">
 		delete from t_user where user_id = #{id,jdbcType=INTEGER}
 	</delete>
 	
 	<update id="updateInfo" parameterType="User">
 		update t_user 
 		set
 			user_name = #{userName,jdbcType=VARCHAR},
 			user_age = #{age,jdbcType=VARCHAR},
 			user_account = #{account,jdbcType=VARCHAR},
 			user_sex = #{sex,jdbcType=VARCHAR},
 			user_address = #{address,jdbcType=VARCHAR},
 			user_state = #{state,jdbcType=VARCHAR},
 			user_tel = #{tel,jdbcType=VARCHAR},
 			user_phone = #{phone,jdbcType=VARCHAR},
 			user_email = #{email,jdbcType=VARCHAR}
 		where 
 			user_id = #{id,jdbcType=INTEGER}
 	</update>
 	
 	<select id="selectUserInfoById" parameterType="int" resultType="User">
 		select 
 			user_id id,user_name userName,user_age age,
 			user_account account,user_password password,
 			user_sex sex,user_address address,user_state state,
 			user_tel tel,user_phone phone,user_time insertTime,
 			user_email email,
 			date_format(user_time,'%Y-%m-%d %H:%i:%s') addTime
 		from
 			t_user
 		where 
 		 	user_id = #{id,jdbcType=INTEGER}
 	</select>
  
 </mapper></span>

八、接下来是配置文件

spring-mvc.xml

<span style="font-size:14px;"><?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:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-4.0.xsd
	http://www.springframework.org/schema/mvc
	http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
	<!-- 注解扫描包 -->
	<context:component-scan base-package="lxc.design" />

	<!-- 开启注解 -->
	<mvc:annotation-driven />

	<!-- 配置静态资源,直接映射到对应的文件夹,不被DispatcherServlet处理,3.04新增功能,需要重新设置spring-mvc-3.0.xsd -->
	<!-- 静态资源访问 -->
	<mvc:resources location="/js/" mapping="/js/**" />
	<mvc:resources location="/assets/" mapping="/assets/**" />
	<mvc:resources location="/css/" mapping="/css/**" />
	<mvc:resources location="/font/" mapping="/font/**" />
	<mvc:resources location="/images/" mapping="/images/**" />
	<mvc:resources location="/js/" mapping="/js/**" />
	<mvc:resources location="/base/" mapping="/base/**" />
	<mvc:resources location="/user/" mapping="/user/**" />


	<!-- 定义跳转的文件的前后缀 ,视图模式配置 -->
	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!-- 自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址 -->
		<property name="prefix" value="/" />
		<property name="suffix" value=".jsp" />
	</bean>

</beans></span>

九、spring-common.xml

注意:  数据库url后面添加

<span style="font-size:14px;">?useUnicode=true&characterEncoding=UTF-8</span>
<span style="font-size:14px;">是因为数据从前端传到后端没有乱码,但是从后端传到数据库就乱码了,添加则可以防止乱码,之前比较过项目编码与数据库编码,都一致,尝试了其他的方法只有这个可以,每个人遇到的不一样吧,代码永无止境,无处不BUG,尽量减少避免BUG,哈哈~~~</span>

<span style="font-size:14px;"><?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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-4.0.xsd
		http://www.springframework.org/schema/tx
		http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
		
	<!-- 1. 数据源 : DriverManagerDataSource -->
	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://localhost:3306/design?useUnicode=true&characterEncoding=UTF-8" />
		<property name="username" value="lxc" />
		<property name="password" value="123456" />
	</bean>
	
	<!--
		2. mybatis的SqlSession的工厂: SqlSessionFactoryBean dataSource:引用数据源
		MyBatis定义数据源,同意加载配置
	-->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
		<property name="configLocation" value="classpath:config/mybatis-config.xml" /> 
	</bean>
	
	<!--
		3. mybatis自动扫描加载Sql映射文件/接口 : MapperScannerConfigurer sqlSessionFactory
		basePackage:指定sql映射文件/接口所在的包(自动扫描)
	-->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="lxc.design.mapper"></property>
		<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
	</bean>
	
	<!--
		4. 事务管理 : DataSourceTransactionManager dataSource:引用上面定义的数据源
	-->
	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>

	<!-- 5. 使用声明式事务 transaction-manager:引用上面定义的事务管理器 -->
	<tx:annotation-driven transaction-manager="txManager" />
	
		
</beans></span>

十、mybatis-config.xml

别名   User  在项目中或者mapper.xml数据库sql中直接使用别名

<span style="font-size:14px;"><?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>
		<typeAlias type="lxc.design.entity.UserEntity" alias="User"/>
	</typeAliases>
	
	<!-- 实体接口映射资源 -->
	<!--
		说明:如果xxMapper.xml配置文件放在和xxMapper.java统一目录下,mappers也可以省略,因为org.mybatis.spring.mapper.MapperFactoryBean默认会去查找与xxMapper.java相同目录和名称的xxMapper.xml
	-->
	<mappers>
		<mapper resource="lxc/design/mapper/UserMapper.xml" />
	</mappers>
	
</configuration></span>

十一、log4j.xml日志

在控制台中打印出想要的信息,例如执行的sql语句,错误信息,以便于我们判断问题所在

<span style="font-size:14px;">DEBUG  打印的等级,打印等级越低,所打印出来的信息越多,</span>
<span style="font-size:14px;">INFO  强调应用程序的运行过程</span>
<span style="font-size:14px;">WARN  潜在的错误</span>
<span style="font-size:14px;">ERROR 虽然发生错误事件,但是不影响系统执行</span>
<span style="font-size:14px;">基本也就开发常用的DEBUG、INFO</span>

<span style="font-size:14px;"><?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

	<!-- DEBUG < INFO < WARN < ERROR < FATAL -->
	  
	<appender name="myConsole" class="org.apache.log4j.ConsoleAppender">  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern"     
                value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />  
        </layout>  
        <filter class="org.apache.log4j.varia.LevelRangeFilter">  
            <param name="AcceptOnMatch" value="true" />
        </filter>  
    </appender>  
 
    <root>
        <priority value="DEBUG" />
        <appender-ref ref="myConsole" />
    </root>
       
</log4j:configuration></span>

lo4j.properties

<span style="font-size:14px;">D:/logs/log.log  日志输出文件形式</span>
<span style="font-size:14px;">其实在tomcat里面的日志也可查看系统运行错误</span>

<span style="font-size:14px;">### set log levels ### 
log4j.rootLogger = info , Console , D
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.com.ibatis=INFO
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=INFO
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=INFO
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=INFO
log4j.logger.java.sql.Connection=INFO
log4j.logger.java.sql.Statement=INFO
log4j.logger.java.sql.PreparedStatement=INFO
#output2file
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender 
log4j.appender.D.File = D:/logs/log.log 
log4j.appender.D.Append = true 
log4j.appender.D.Threshold = INFO ## 输出info级别以上的日志 
log4j.appender.D.layout = org.apache.log4j.PatternLayout 
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n </span>
 


十二、web.xml

<span style="font-size:14px;"><?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>mvc_m_bs</display-name>
  
  <!-- 加载Spring容器配置 -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
  <!-- 设置Spring容器加载所有的配置文件的路径 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath*:config/spring-*.xml</param-value>
	</context-param>

	<!-- 配置SpringMVC核心控制器 -->
	<servlet>
		<servlet-name>spring</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- 配置初始配置化文件,前面contextConfigLocation看情况二选一 -->  
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath*:config/spring-mvc.xml</param-value>
		</init-param>
		<!-- 启动加载一次 -->  
		<load-on-startup>1</load-on-startup>
	</servlet>
	
	<!-- 解决工程编码过滤器 -->
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>utf-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<!--为DispatcherServlet建立映射 -->
	<servlet-mapping>
		<servlet-name>spring</servlet-name>
		<!-- 此处可以可以配置成*.do,对应struts的后缀习惯 -->
		<url-pattern>/</url-pattern>
	</servlet-mapping>

	<!-- 防止Spring内存溢出监听器 -->
	<listener>
		<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
	</listener>

	
	
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
  
</web-app></span>

前端bootstrap整体框架是网上下载的模板,然后自己修改了一些

十三、login.jsp

获取项目相对地址action="<%=basePath%>user/selectPwByAccount">  相当于http://127.0.0.1:8080/mvc_m_bs/

<span style="font-size:14px;"><%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%></span>

十四、运行项目

http://127.0.0.1:8080/mvc_m_bs/user/login.jsp


十五、数据库mysql


本文代码可能有参考涉及其他大神,请见谅哈,写这个文章无商业用途,纯属当做笔记了,我也是看大神们博客"成大的",在此谢谢各位大大们了


项目下载地址,如有问题请留言

http://download.csdn.net/detail/liumang_it/9621821


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值