SMBMS(超市订单管理系统)项目从零开始搭建()

  本篇文章为你整理了SMBMS(超市订单管理系统)项目从零开始搭建()的详细内容,包含有 SMBMS(超市订单管理系统)项目从零开始搭建,希望能帮助你了解 SMBMS(超市订单管理系统)项目从零开始搭建。

  maven的详细创建,及配置请看这篇文章

  https:///twq46/p/16508029.html

  二、配置Tomcat

  Tomcat相关配置详情请看我的这篇文章,关于Tomcat的配置及遇到的问题和解决方法都在文章里

  https:///twq46/p/16508029.html

  三、测试项目是否能够跑起来

  四、导入项目中会遇到的jar包

  比如jsp,Servlet,mysql,jstl,standar.....

  

 !-- servlet的依赖-- 

 

   dependency

   groupId javax.servlet /groupId

   artifactId javax.servlet-api /artifactId

   version 3.1.0 /version

   /dependency

   !--JSP的依赖--

   dependency

   groupId javax.servlet.jsp /groupId

   artifactId javax.servlet.jsp-api /artifactId

   version 2.3.3 /version

   /dependency

   !--standard标签库--

   dependency

   groupId taglibs /groupId

   artifactId standard /artifactId

   version 1.1.2 /version

   /dependency

   !--JSTL表达式的依赖--

   dependency

   groupId javax.servlet.jsp.jstl /groupId

   artifactId jstl /artifactId

   version 1.2 /version

   /dependency

   !--连接数据库--

   dependency

   groupId mysql /groupId

   artifactId mysql-connector-java /artifactId

   version 8.0.28 /version

   /dependency

  

 

  五、创建项目包结构

  六、编写实体(pojo)类

  以下四个实体类必须与数据库中表的字段一一对应

  1.User表的实体类

  

package com.tang.pojo;

 

  import java.util.Date;

  public class User {

   private Integer id; //id

   private String userCode; //用户编码

   private String userName; //用户名称

   private String userPassword; //用户密码

   private Integer gender; //性别

   private Date birthday; //出生日期

   private String phone; //电话

   private String address; //地址

   private Integer userRole; //用户角色

   private Integer createdBy; //创建者

   private Date creationDate; //创建时间

   private Integer modifyBy; //更新者

   private Date modifyDate; //更新时间

   private Integer age;//年龄

   private String userRoleName; //用户角色名称

  
public Integer getAge() {

   /*long time = System.currentTimeMillis()-birthday.getTime();

   Integer age = Long.valueOf(time/365/24/60/60/1000).IntegerValue();*/

   Date date = new Date();

   Integer age = date.getYear()-birthday.getYear();

   return age;

   public Integer getId() {

   return id;

   public void setId(Integer id) {

   this.id = id;

   public String getUserCode() {

   return userCode;

   public void setUserCode(String userCode) {

   this.userCode = userCode;

   public String getUserName() {

   return userName;

   public void setUserName(String userName) {

   this.userName = userName;

   public String getUserPassword() {

   return userPassword;

   public void setUserPassword(String userPassword) {

   this.userPassword = userPassword;

   public Integer getGender() {

   return gender;

   public void setGender(Integer gender) {

   this.gender = gender;

   public Date getBirthday() {

   return birthday;

   public void setBirthday(Date birthday) {

   this.birthday = birthday;

   public String getPhone() {

   return phone;

   public void setPhone(String phone) {

   this.phone = phone;

   public String getAddress() {

   return address;

   public void setAddress(String address) {

   this.address = address;

   public Integer getUserRole() {

   return userRole;

   public void setUserRole(Integer userRole) {

   this.userRole = userRole;

   public Integer getCreatedBy() {

   return createdBy;

   public void setCreatedBy(Integer createdBy) {

   this.createdBy = createdBy;

   public Date getCreationDate() {

   return creationDate;

   public void setCreationDate(Date creationDate) {

   this.creationDate = creationDate;

   public Integer getModifyBy() {

   return modifyBy;

   public void setModifyBy(Integer modifyBy) {

   this.modifyBy = modifyBy;

   public Date getModifyDate() {

   return modifyDate;

   public void setModifyDate(Date modifyDate) {

   this.modifyDate = modifyDate;

  

 

  2.Role表的实体类

  

package com.tang.pojo;

 

  import java.util.Date;

  public class Role {

   private Integer id; //id

   private String roleCode; //角色编码

   private String roleName; //角色名称

   private Integer createdBy; //创建者

   private Date creationDate; //创建时间

   private Integer modifyBy; //更新者

   private Date modifyDate;//更新时间

   public Integer getId() {

   return id;

   public void setId(Integer id) {

   this.id = id;

   public String getRoleCode() {

   return roleCode;

   public void setRoleCode(String roleCode) {

   this.roleCode = roleCode;

   public String getRoleName() {

   return roleName;

   public void setRoleName(String roleName) {

   this.roleName = roleName;

   public Integer getCreatedBy() {

   return createdBy;

   public void setCreatedBy(Integer createdBy) {

   this.createdBy = createdBy;

   public Date getCreationDate() {

   return creationDate;

   public void setCreationDate(Date creationDate) {

   this.creationDate = creationDate;

   public Integer getModifyBy() {

   return modifyBy;

   public void setModifyBy(Integer modifyBy) {

   this.modifyBy = modifyBy;

   public Date getModifyDate() {

   return modifyDate;

   public void setModifyDate(Date modifyDate) {

   this.modifyDate = modifyDate;

  

 

  3.Provider(供应商)表的实体类

  

package com.tang.pojo;

 

  import java.util.Date;

  public class Provider {

   private Integer id; //id

   private String proCode; //供应商编码

   private String proName; //供应商名称

   private String proDesc; //供应商描述

   private String proContact; //供应商联系人

   private String proPhone; //供应商电话

   private String proAddress; //供应商地址

   private String proFax; //供应商传真

   private Integer createdBy; //创建者

   private Date creationDate; //创建时间

   private Integer modifyBy; //更新者

   private Date modifyDate;//更新时间

   public Integer getId() {

   return id;

   public void setId(Integer id) {

   this.id = id;

   public String getProCode() {

   return proCode;

   public void setProCode(String proCode) {

   this.proCode = proCode;

   public String getProName() {

   return proName;

   public void setProName(String proName) {

   this.proName = proName;

   public String getProDesc() {

   return proDesc;

   public void setProDesc(String proDesc) {

   this.proDesc = proDesc;

   public String getProContact() {

   return proContact;

   public void setProContact(String proContact) {

   this.proContact = proContact;

   public String getProPhone() {

   return proPhone;

   public void setProPhone(String proPhone) {

   this.proPhone = proPhone;

   public String getProAddress() {

   return proAddress;

   public void setProAddress(String proAddress) {

   this.proAddress = proAddress;

   public String getProFax() {

   return proFax;

   public void setProFax(String proFax) {

   this.proFax = proFax;

   public Integer getCreatedBy() {

   return createdBy;

   public void setCreatedBy(Integer createdBy) {

   this.createdBy = createdBy;

   public Date getCreationDate() {

   return creationDate;

   public void setCreationDate(Date creationDate) {

   this.creationDate = creationDate;

   public Integer getModifyBy() {

   return modifyBy;

   public void setModifyBy(Integer modifyBy) {

   this.modifyBy = modifyBy;

   public Date getModifyDate() {

   return modifyDate;

   public void setModifyDate(Date modifyDate) {

   this.modifyDate = modifyDate;

  
public void setProductCount(BigDecimal productCount) {

   this.productCount = productCount;

   public BigDecimal getTotalPrice() {

   return totalPrice;

   public void setTotalPrice(BigDecimal totalPrice) {

   this.totalPrice = totalPrice;

   public Integer getIsPayment() {

   return isPayment;

   public void setIsPayment(Integer isPayment) {

   this.isPayment = isPayment;

   public Integer getProviderId() {

   return providerId;

   public void setProviderId(Integer providerId) {

   this.providerId = providerId;

   public Integer getCreatedBy() {

   return createdBy;

   public void setCreatedBy(Integer createdBy) {

   this.createdBy = createdBy;

   public Date getCreationDate() {

   return creationDate;

   public void setCreationDate(Date creationDate) {

   this.creationDate = creationDate;

   public Integer getModifyBy() {

   return modifyBy;

   public void setModifyBy(Integer modifyBy) {

   this.modifyBy = modifyBy;

   public Date getModifyDate() {

   return modifyDate;

   public void setModifyDate(Date modifyDate) {

   this.modifyDate = modifyDate;

  
resource下db.properties代码

  

url=jdbc:mysql://localhost:3306/smbms?useUnicode=true characterEncoding=utf8 useSSL=true";

 

  username=root

  password=root123456

  

 

  2.编写数据库的公共类

  Dao包下BaseDao代码如下

  

package com.tang.dao;

 

  import com.mysql.cj.protocol.Resultset;

  import java.io.IOException;

  import java.io.InputStream;

  import java.sql.*;

  import java.util.Properties;

  //操作数据库的公共类

  public class BaseDao {

   private static String url;

   private static String username;

   private static String password;

   //静态代码块,类加载的时候就初始化了

   static{

   Properties properties = new Properties();

   //通过类加载器读取对应的资源,并将资源变为流

   InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");

   try {

   properties.load(is);

   } catch (IOException e) {

   e.printStackTrace();

   url = properties.getProperty("url");

   username = properties.getProperty("username");

   password = properties.getProperty("password");

   //获取数据库的连接

   public static Connection getConnection(){

   Connection connection = null;//提升作用域

   try {

   connection = DriverManager.getConnection(url, username, password);

   } catch (SQLException throwables) {

   throwables.printStackTrace();

   return connection;

   //编写查询公共类

   public static ResultSet execute(Connection connection,String sql,Object[] params,ResultSet resultSet,PreparedStatement preparedStatement) throws SQLException {

   //预编译的sql,在后面直接执行就可以了

   preparedStatement = connection.prepareStatement(sql);

   //问号(参数可能不止一个,且类型未知,因此用Object的数据接收参数)

   for (int i = 0; i params.length; i++) {

   //setObject占位符从1开始,但是我们的数组是从0开始

   preparedStatement.setObject(i+1,params[i]);

   resultSet = preparedStatement.executeQuery();

   return resultSet;

   //编写增删改的公共方法

   public static int execute(Connection connection,String sql,Object[] params,PreparedStatement preparedStatement) throws SQLException {

   preparedStatement = connection.prepareStatement(sql);

   //问号(参数可能不止一个,且类型未知,因此用Object的数据接收参数)

   for (int i = 0; i params.length; i++) {

   //setObject占位符从1开始,但是我们的数组是从0开始

   preparedStatement.setObject(i+1,params[i]);

   int updateRows = preparedStatement.executeUpdate();

   return updateRows;

   //释放资源

   public static boolean coloseResource(Connection connection,PreparedStatement preparedStatement,ResultSet resultSet){

   boolean flag = true;

   if(resultSet != null) {

   try {

   resultSet.close();

   //GC回收

   resultSet = null;

   } catch (SQLException throwables) {

   throwables.printStackTrace();

   flag = false;//关闭失败

   if(connection != null) {

   try {

   connection.close();

   //GC回收

   connection = null;

   } catch (SQLException throwables) {

   throwables.printStackTrace();

   flag = false;//

   if(preparedStatement != null) {

   try {

   preparedStatement.close();

   //GC回收

   preparedStatement = null;

   } catch (SQLException throwables) {

   throwables.printStackTrace();

   flag = false;

   return flag;

  

 

  3.编写字符编码过滤器

  

package com.tang.filter;

 

  import javax.servlet.*;

  import java.io.IOException;

  public class CharacterEncodingFilter implements Filter {

   public void init(FilterConfig filterConfig) throws ServletException {

   public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

   servletRequest.setCharacterEncoding("utf-8");

   servletResponse.setCharacterEncoding("utf-8");

   servletResponse.setContentType("text/html");

   filterChain.doFilter(servletRequest,servletResponse);

   public void destroy() {

  

 

  并在web.xml中注册Filter

  

 filter 

 

   filter-name CharacterEncodingFilter /filter-name

   filter-class com.tang.filter.CharacterEncodingFilter /filter-class

   /filter

   filter-mapping

   filter-name CharacterEncodingFilter /filter-name

   url-pattern /* /url-pattern

   /filter-mapping

  

 

  八、导入静态资源

  在webapp下导入以下四个文件

  https://files.cnblogs.com/files/blogs/755902/js.zip?t=1659085614

  https://files.cnblogs.com/files/blogs/755902/images.zip?t=1659085600

  https://files.cnblogs.com/files/blogs/755902/css.zip?t=1659085576

  https://files.cnblogs.com/files/blogs/755902/calendar.zip?t=1659085557

  九、登录界面的实现

  1.设置首页

  

 !-- 设置欢迎界面-- 

 

   welcome-file-list

   welcome-file login.jsp /welcome-file

   /welcome-file-list

  

 

  首页样子

  2.编写dao层得到登录用户的接口

  UserDao接口代码

  

package com.tang.dao.user;

 

  import com.tang.pojo.User;

  import java.sql.Connection;

  import java.sql.SQLException;

  public interface UserDao {

   //得到要登录的用户

   public User getLoginUser(Connection connection,String userCode,String userPassword) throws SQLException;

  

 

  3.编写dao层得到用户接口的实现类

  UserDaoImpl代码

  

package com.tang.dao.user;

 

  import com.tang.dao.BaseDao;

  import com.tang.pojo.User;

  import java.sql.Connection;

  import java.sql.PreparedStatement;

  import java.sql.ResultSet;

  import java.sql.SQLException;

  public class UserDaoImpl implements UserDao{

   public User getLoginUser(Connection connection, String userCode,String userPassword) throws SQLException {

   //准备三个对象

   PreparedStatement pstm = null;

   ResultSet rs = null;

   User user = null;

   //判断数据库连接是否成功

   if(connection != null){

   String sql = "select * from smbms_user where userConde=? and userPassword=?";//连接成功就给它一个SQL语句

   Object[] params = {userCode, userPassword};

   rs = BaseDao.execute(connection, pstm, rs, sql, params);//执行SQL

   if(rs.next()){//若结果集中有数据

   //得到该登录用户的信息

   user = new User();

   user.setId(rs.getInt("id"));

   user.setUserCode(rs.getString("userCode"));

   user.setUserName(rs.getString("userName"));

   user.setUserPassword(rs.getString("userPassword"));

   user.setGender(rs.getInt("gender"));

   user.setBirthday(rs.getDate("birthday"));

   user.setPhone(rs.getString("phone"));

   user.setAddress(rs.getString("address"));

   user.setUserRole(rs.getInt("userRole"));

   user.setCreatedBy(rs.getInt("createdBy"));

   user.setCreationDate(rs.getTimestamp("creationDate"));

   user.setModifyBy(rs.getInt("modifyBy"));

   user.setModifyDate(rs.getTimestamp("modifyDate"));

   BaseDao.closeResource(null,pstm,rs);//连接可能涉及到业务,在这里先不关

   return user;

  

 

  4.业务层接口

  

package com.tang.service;

 

  import com.tang.pojo.User;

  public interface UserService {

   //用户登录

   public User login(String userCode,String password);

  

 

  5.业务层实现类

  

package com.tang.service;

 

  import com.tang.dao.BaseDao;

  import com.tang.dao.user.UserDao;

  import com.tang.dao.user.UserDaoImpl;

  import com.tang.pojo.User;

  import org.junit.Test;

  import java.sql.Connection;

  import java.sql.SQLException;

  public class UserServiceImpl implements UserService{

   //业务层都会调用dao层,所以我们要引入Dao层;

   private UserDao userDao;//dao下的得到登录用户的接口

   public UserServiceImpl(){

   userDao = new UserDaoImpl();

   public User login(String userCode, String password) {

   Connection connection = null;

   User user = null ;

   try {

   connection = BaseDao.getConnection();//得到连接

   //通过业务层调用对应的具体的数据库操作

   user = userDao.getLoginUser(connection, userCode, password);

   } catch (SQLException throwables) {

   throwables.printStackTrace();

   }finally {

   BaseDao.closeResource(connection,null,null);

   return user;

  

 

  6.编写servlet

  

package com.tang.servlet;

 

  import com.tang.pojo.User;

  import com.tang.service.UserServiceImpl;

  import com.tang.util.Constant;

  import javax.servlet.ServletException;

  import javax.servlet.http.HttpServlet;

  import javax.servlet.http.HttpServletRequest;

  import javax.servlet.http.HttpServletResponse;

  import java.io.IOException;

  public class LoginServlet extends HttpServlet {

   //Servlet:控制层,调用业务层代码

  
@Override

   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

   System.out.println("LoginServlet-- start.....");

   //获取用户名和密码,注意和前端login.jsp中的参数名相同

   String userCode = req.getParameter("userCode");

   String userPassword = req.getParameter("userPassword");

   //和数据库中的密码进行对比,调用业务层

   UserServiceImpl userService = new UserServiceImpl();

   User user = userService.login(userCode, userPassword);//这里已经把登录的人给查出来了

   if(user != null){//查有此人,可以登录

   //将用户的信息存放到Session中

   req.getSession().setAttribute(Constant.USER_SESSION,user);

   //跳转到主页

   resp.sendRedirect("/smbms_war/jsp/frame.jsp");

   else {//查无此人,无法登录

   //转发会登录页面,顺带提示它,用户名或者密码错误

   req.setAttribute("error","用户名或则密码不正确");//给login.jsp中的error负值,然后就会显示出来

   req.getRequestDispatcher("login.jsp").forward(req,resp);

   @Override

   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

   doGet(req, resp);

  

 

  7.注册servlet

  

 servlet 

 

   servlet-name LoginServlet /servlet-name

   servlet-class com.tang.servlet.LoginServlet /servlet-class

   /servlet

   servlet-mapping

   servlet-name LoginServlet /servlet-name

   url-pattern /login.do /url-pattern

   /servlet-mapping

  

 

  到这完成用户登录的判断,如下图

  解决NoClassDefFoundError: Could not initialize class

  输入账号和密码之后可能出现下面的500错误,找了一天,发现在target目录下没有db.properties文件,一气之下,直接将db.properties文件直接放到BaseDao同级目录下,因为下面报错的原因就是因为这个问题,所以在清理了一下maven之后再次构建会发现target目录下有db.properties这个文件

  
 

  最后问题解决

  十、登录功能优化

  思路:移除Session,返回登录界面

  

package com.tang.servlet.user;

 

  import com.tang.util.Constant;

  import javax.servlet.ServletException;

  import javax.servlet.http.HttpServlet;

  import javax.servlet.http.HttpServletRequest;

  import javax.servlet.http.HttpServletResponse;

  import java.io.IOException;

  public class LogoutServlet extends HttpServlet {

   @Override

   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

   //移除用户的Constant.USER_SESSION

   req.getSession().removeAttribute(Constant.USER_SESSION);

   resp.sendRedirect("/smbms_war/login.jsp");//返回登录界面

   @Override

   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

   doGet(req, resp);

  

 

  web.xml中注册

  

 servlet 

 

   servlet-name LogoutServlet /servlet-name

   servlet-class com.tang.servlet.user.LogoutServlet /servlet-class

   /servlet

   servlet-mapping

   servlet-name LogoutServlet /servlet-name

   url-pattern /jsp/logout.do /url-pattern

   /servlet-mapping

  

 

  运行结果图

  2.登录拦截

  用户没有登录的情况下不能进入主页

  

package com.tang.filter;

 

  
import javax.servlet.http.HttpServletRequest;

  import javax.servlet.http.HttpServletResponse;

  import java.io.IOException;

  public class SysFilter implements Filter {

   public void init(FilterConfig filterConfig) throws ServletException {

   public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

   HttpServletRequest request = (HttpServletRequest) servletRequest;

   HttpServletResponse response = (HttpServletResponse) servletResponse;

   //过滤器,从Session中获取用户

   User user = (User) request.getSession().getAttribute(Constant.USER_SESSION);

   if(user == null){//已经被移除或者注销了,或者未登录

   response.sendRedirect("/smbms_war/error.jsp");

   }else{

   filterChain.doFilter(servletRequest,servletResponse);

  
filter-name SysFilter /filter-name

   filter-class com.tang.filter.SysFilter /filter-class

   /filter

   filter-mapping

   filter-name SysFilter /filter-name

   url-pattern /jsp/* /url-pattern

   /filter-mapping

  

 

  登录完善之后运行结果图

  十一、密码修改

  1.导入前端素材

  

 li a href="${pageContext.request.contextPath }/jsp/pwdmodify.jsp" 密码修改 /a /li 

 

  

 

  导入之后记得用maven的插件把target给clean一下,然后重新部署项目

  2.UserDao接口

  

 //修改当前用户密码

 

   public int updatePwd(Connection connection,int id,int password) throws SQLException;

  

 

  3.UserDao接口实现类

  

//修改当前用户密码,需要连接数据库,和当前用户的id,以及旧密码

 

   public int updatePwd(Connection connection, int id, int password) throws SQLException {

   PreparedStatement pstm = null;//防止SQL注入

   int execute = 0;

   if(connection != null){//成功连接数据库

   String sql = "update smbms_user set userPassword = ? where id = ?";

   Object prams[] = {password,id};//传入两个参数

   execute = BaseDao.execute(connection, sql, prams, pstm);

   BaseDao.closeResource(null,pstm,null);

   return execute;

  

 

  4.UserService接口

  

//根据用户id修改密码

 

   public boolean updatePwd( int id, int password);

  

 

  5.UserService实现类

  

public boolean updatePwd(int id, int password) {

 

   Connection connection = null;

   boolean flag= false;

   //修改密码

   try {

   connection = BaseDao.getConnection();

   if(userDao.updatePwd(connection,id,password) 0){

   flag = true;//密码修改成功

   } catch (Exception throwables) {

   throwables.printStackTrace();

   }finally{//关闭资源

   BaseDao.closeResource(connection,null,null);

   return flag;

  

 

  6.Servlet 记得实现复用,需要提取方法

  

@Override

 

   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

   String method = req.getParameter("method");

   if(method.equals("savepwd") method != null){

   this.updatePwd(req,resp);

  public void updatePwd(HttpServletRequest req, HttpServletResponse resp){

   //从Session里拿ID

   Object o = req.getSession().getAttribute(Constant.USER_SESSION);

   String newpassword = req.getParameter("newpassword");

   boolean flag = false;

   if(o != null !StringUtils.isNullOrEmpty(newpassword)){

   UserServiceImpl userService = new UserServiceImpl();

   flag = userService.updatePwd(((User) o).getId(), newpassword);

   if(flag){

   req.setAttribute("message","修改密码成功,请退出使用新密码登录");

   //密码修改成功移除当前session

   req.getSession().removeAttribute(Constant.USER_SESSION);

   else{

   req.setAttribute("message","密码修改失败");

   }else{

   req.setAttribute("message","新密码有问题");

   try {

   req.getRequestDispatcher("pwdmodify.jsp").forward(req,resp);

   //resp.sendRedirect("/smbms_war/jsp/pwdmodify.jsp");

   } catch (Exception e) {

   e.printStackTrace();

  

 

  7.密码验证优化Ajax

  

//验证旧密码,session中有用户的密码

 

   public void pwdModify(HttpServletRequest req, HttpServletResponse resp){

   //从Session里拿ID

   Object o = req.getSession().getAttribute(Constant.USER_SESSION);

   String oldpassword = req.getParameter("oldpassword");

   //万能的map,结果集

   HashMap String, String resultMap = new HashMap String, String

   if(o == null){//session失效了

   resultMap.put("result","sessionerror");

   }else if(StringUtils.isNullOrEmpty(oldpassword)){//输入的密码为空

   resultMap.put("result","error");

   }else{

   String userPassword = ((User) o).getUserPassword();//Session中用户的密码

   if(oldpassword.equals(userPassword)){//输入的密码与原密码相同,前端显示✅

   resultMap.put("result","true");

   }else{//前台输入的密码与原密码不符则显示❌

   resultMap.put("result","false");

   try {

   resp.setContentType("application/json");//让该方法返回一个json值

   PrintWriter writer = resp.getWriter();

   //JSONArray 阿里巴巴的JSON工具。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: