栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

基于SpringMVC的图书管理系统

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于SpringMVC的图书管理系统

       这是本人经过Spring框架的学习,根据其他人项目的参考与改进,由此实现了一个较为基本的图书管理系统,也算是自己的一个学习经历吧,好了废话不多说,下面进入正题。


文章目录
  • 一、项目概述
    • 功能性需求描述
    • 设计概述
    • 实现功能
    • 功能展示
      • 登录
      • 管理员身份操作
      • 用户(读者)身份操作
      • 用户管理员密码修改
  • 二、系统详细设计
    • 1、大框架的构建
    • 2、项目前期的准备工作
  • 三、各个功能的详细实现
    • 1、创建spring配置文件
    • 2、配置mybatis
    • 3、实现登录业务
    • 4、管理员业务实现
      • (1)相关业务的实现
      • (2)相关业务的数据操作
      • (3)mybatis数据库操作
      • (4)相关业务的交互操作
    • 5、用户(读者)业务实现
      • (1)相关业务的实现
      • (2)相关业务的数据操作
      • (3)mybatis数据库操作
      • (4)相关业务的交互操作


一、项目概述 功能性需求描述

图书(馆)管理系统是典型的信息管理系统,其开发主要包括以下部分:后台数据库的建立、维护,前端应用程序的开发。
对于前者,要建立起数据一致性和完整性强、数据安全性较好的数据库。而对于后者来说,需要的是应用程序功能完备,易使用等特点。

设计概述

1、界面设计简洁,友好(易于人机交互)
2、信息分类清晰,准确(全部图书,图书借阅情况,用户信息情况)
3、提高较好的查询能力(支持模糊查询)
4、支持图书馆工作人员对图书借阅、归还等基本的功能

实现功能

1、管理员对图书进行管理
2、管理员对借阅者(读者)信息的管理
3、管理员对借阅者借阅书本的归还管理
4、管理员登入管理
5、用户借阅查询,个人信息查询,借阅信息查询等
6、管理员/用户的密码更改

功能展示 登录

登陆界面

管理员身份操作

以管理员身份登录后的首页,在这里可以进行图书的相关操作

管理员对读者进行管理

管理员查看所有用户书目借还记录

用户(读者)身份操作

以用户(读者)身份登陆后的首页,在这里可以进行图书的相关操作

用户(读者)修改个人账号信息

用户(读者)查看个人的借还记录

用户管理员密码修改


二、系统详细设计 1、大框架的构建

要写好一个项目,首先最重要的就是构建项目的框架。有了框架,写一个项目就不会手忙脚乱,就会变得有计划,有规律,效率才能提高。
根据SpringMVC的三层架构,我们可以将项目分为这三大部分:

  • Model(模型)是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。
  • View(视图)是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。
  • Controller(控制器)是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

在此三大模型之上,可以再细分:

  • dao层:这一层是数据持久层,正所谓数据持久化,就要和数据库打交道,所以这一层,需要做的便是有关于数据库的操作,例如图书的增删改查之类的。
  • controller层:这一层是控制层,控制前端界面-后台的数据交互与逻辑操作,例如从页面读取数据,发送数据之类的操作。(具体的业务)
  • entity层:这一层便是实体层,放置一个个实体,及其相应的set、get方法。如果想要对数据库进行一些操作(比如说读取)的话,就要先写entity层。
  • service层:这一层是服务层,负责模块间的数据交互与逻辑操作(模块间的业务)

做好大框架的构造后,下面就可以进行项目的准备工作了!


2、项目前期的准备工作

项目的前期准备工作有:

相关技术名称
前端jsp、css、html、JQuery、BootStrap
后端SpringMVC、Mybatis
数据库Mysql
开发环境IDEA

预期实现的功能有:

角色功能
普通用户(借阅者)图书查询(查看全部图书),个人信息(查看或修改个人信息),借还情况,密码修改
管理员图书管理(查看全部图书,增加图书),读者管理(查看全部读者,增加读者),借还管理,修改密码
未登录人员登录系统,进入管理员或者普通用户界面

项目文件框架如下:

  1. book:里面有controller,dao,entity,service
  2. resources:里面放xml等配置文件
  3. webapp:里面放网页有关的东西,static(里面放静态加载的文件,css,images,js),WEB-INF(jsp,web.xml文件等)
  4. pom.xml文件:通过maven远程仓库,引入相关依赖包
  5. mybatis映射文件:通过mybatis映射找到相应的sql语句

项目结构如图所示:

项目前期的准备工作基本上就做完了,下面进行项目中各逻辑方法的实现


三、各个功能的详细实现

此篇章较多,各位客官可以慢慢看,也可以选择最喜欢的部分看,话不多说,开始项目!

1、创建spring配置文件

由于项目基于Spring框架,需要用到spring配置文件来进行bean类的注入

        
        

    
    
    
    
2、配置mybatis

db.properties:

#mysql jdbc
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/library?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456

pom.xml

 
        
            org.mybatis
            mybatis-spring
            1.3.0
        
        
        
            org.mybatis
            mybatis
            3.4.1
        
        
        
            com.alibaba
            druid
            1.1.18
        
        
        
            com.github.pagehelper
            pagehelper
            5.2.0
        
3、实现登录业务

先创建管理员实体类Admin和普通借阅用户实体类ReadCard
实现getter和setter方法

private long admin_id;
    private String password;
    private String username;

    public long getAdminId() {
        return admin_id;
    }

    public void setAdminId(long admin_id) {
        this.admin_id = admin_id;
    }

    public String getPassword() {
        return password;
    }

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

    public String getUsername() {
        return username;
    }

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

ReadCard的setter与getter此处省略,之后的也一样,只写对应的实体属性

	private long reader_id;
    private String username;
    private String password;

开始写Dao数据访问层接口和实现类:
接口:

public interface AdminDao {
    int getMatchCount(final long admin_id, final String password);
    int resetPassword(final long admin_id, final String password);
    String getPassword(final long admin_id);
    String getUsername(final long admin_id);
}
public interface ReaderCardDao {
    int getIdMatchCount(final long reader_id, final String password);
    ReaderCard findReaderByReaderId(final long reader_id);
    int resetPassword(final long reader_id, final String newPassword);
    int addReaderCard(final ReaderInfo readerInfo, final String password);
    String getPassword(final long reader_id);
    int deleteReaderCard(final long reader_id);
}

实现类:以AdminDao接口AdminDaoImpl为例

@Repository
public class AdminDaoImpl implements AdminDao {

    private final static String NAMESPACE = "com.book.dao.impl.AdminDaoImpl.";
    @Resource
    private SqlSessionTemplate sqlSessionTemplate;

    @Override
    public int getMatchCount(final long admin_id, final String password) {
        Map paramMap = new HashMap<>();
        paramMap.put("admin_id", admin_id);
        paramMap.put("password", password);
        return sqlSessionTemplate.selectOne(NAMESPACE + "getMatchCount", paramMap);
    }

    @Override
    public int resetPassword(final long admin_id, final String password) {
        Map paramMap = new HashMap<>();
        paramMap.put("admin_id", admin_id);
        paramMap.put("password", password);
        return sqlSessionTemplate.update(NAMESPACE + "resetPassword", paramMap);
    }

    @Override
    public String getPassword(final long admin_id) {
        return sqlSessionTemplate.selectOne(NAMESPACE + "getPassword", admin_id);
    }

    @Override
    public String getUsername(final long admin_id) {
        return sqlSessionTemplate.selectOne(NAMESPACE + "getUsername", admin_id);
    }

}

开始写Service服务层接口和实现类:
LoginService定义方法:

	boolean hasMatchReader(long readerId,String password);

    String getAdminUsername(long adminId);

    ReaderCard findReaderCardByReaderId(long readerId);

    boolean hasMatchAdmin(long adminId,String password);

    boolean adminRePassword(long adminId, String newPassword);

    String getAdminPassword(long adminId);

    boolean readerRePassword(long readerId, String newPassword);

    String getReaderPassword(long readerId);

对应的实现类写逻辑方法
注入数据交互,使得通过数据交互层对数据库进行访问,实现登录功能

@Service
public class LoginServiceImpl implements LoginService{

    @Autowired
    private ReaderCardDaoImpl readerCardDaoImpl;
    @Autowired
    private AdminDaoImpl adminDaoImpl;

    @Override
    public boolean hasMatchReader(long readerId, String password){
        return  readerCardDaoImpl.getIdMatchCount(readerId, password)>0;
    }

    @Override
    public String getAdminUsername(long adminId) {
        return adminDaoImpl.getUsername(adminId);
    }

    @Override
    public ReaderCard findReaderCardByReaderId(long readerId){
        return readerCardDaoImpl.findReaderByReaderId(readerId);
    }

    @Override
    public boolean hasMatchAdmin(long adminId, String password){
        return adminDaoImpl.getMatchCount(adminId, password) == 1;
    }

    @Override
    public boolean adminRePassword(long adminId, String newPassword){
        return adminDaoImpl.resetPassword(adminId,newPassword)>0;
    }
    @Override
    public String getAdminPassword(long adminId){
        return adminDaoImpl.getPassword(adminId);
    }

    @Override
    public boolean readerRePassword(long readerId, String newPassword) {
        return readerCardDaoImpl.resetPassword(readerId, newPassword) > 0;
    }

    @Override
    public String getReaderPassword(long readerId) {
        return readerCardDaoImpl.getPassword(readerId);
    }


}
4、管理员业务实现 (1)相关业务的实现

与登陆有关的业务

@Autowired
    private ReaderCardDaoImpl readerCardDaoImpl;
    @Autowired
    private AdminDaoImpl adminDaoImpl;

    @Override
    public boolean hasMatchReader(long readerId, String password){
        return  readerCardDaoImpl.getIdMatchCount(readerId, password)>0;
    }

    @Override
    public String getAdminUsername(long adminId) {
        return adminDaoImpl.getUsername(adminId);
    }

    @Override
    public ReaderCard findReaderCardByReaderId(long readerId){
        return readerCardDaoImpl.findReaderByReaderId(readerId);
    }

    @Override
    public boolean hasMatchAdmin(long adminId, String password){
        return adminDaoImpl.getMatchCount(adminId, password) == 1;
    }

    @Override
    public boolean adminRePassword(long adminId, String newPassword){
        return adminDaoImpl.resetPassword(adminId,newPassword)>0;
    }
    @Override
    public String getAdminPassword(long adminId){
        return adminDaoImpl.getPassword(adminId);
    }

    @Override
    public boolean readerRePassword(long readerId, String newPassword) {
        return readerCardDaoImpl.resetPassword(readerId, newPassword) > 0;
    }

    @Override
    public String getReaderPassword(long readerId) {
        return readerCardDaoImpl.getPassword(readerId);
    }

与图书相关的业务

@Autowired
    private BookDaoImpl bookDaoImpl;

    @Override
    public PageInfo queryBook(String searchWord,int pageNum,int pageSize) {
        //分页
        PageHelper.startPage(pageNum,pageSize);
        ArrayList list = bookDaoImpl.queryBook(searchWord);
        PageInfo pageInfo = new PageInfo(list);
        return pageInfo;

    }

    @Override
    public PageInfo getAllBooks(int pageNum,int pageSize) {
        //分页
        PageHelper.startPage(pageNum,pageSize);
        ArrayList list = bookDaoImpl.getAllBooks();
        PageInfo pageInfo = new PageInfo(list);
        return pageInfo;
    }

    @Override
    public boolean matchBook(String searchWord) {
        return bookDaoImpl.matchBook(searchWord) > 0;
    }

    @Override
    public boolean addBook(Book book) {
        return bookDaoImpl.addBook(book) > 0;
    }

    @Override
    public Book getBook(Long bookId) {
        return bookDaoImpl.getBook(bookId);
    }

    @Override
    public boolean editBook(Book book) {
        return bookDaoImpl.editBook(book) > 0;
    }

    @Override
    public boolean deleteBook(Long bookId) {
        return bookDaoImpl.deleteBook(bookId) > 0;
    }

    @Override
    public ArrayList getAllTypes() {
        return bookDaoImpl.getAllTypes();
    }

    //通过book_id找对应类型  进而找出book_id 对应的 类号和分类名
    @Override
    public Type getTypesById(Long bookId) {
        return bookDaoImpl.getTypesById(bookId);
    }
(2)相关业务的数据操作

管理员登陆

private final static String NAMESPACE = "com.book.dao.impl.AdminDaoImpl.";
    @Resource
    private SqlSessionTemplate sqlSessionTemplate;

    @Override
    public int getMatchCount(final long admin_id, final String password) {
        Map paramMap = new HashMap<>();
        paramMap.put("admin_id", admin_id);
        paramMap.put("password", password);
        return sqlSessionTemplate.selectOne(NAMESPACE + "getMatchCount", paramMap);
    }

    @Override
    public int resetPassword(final long admin_id, final String password) {
        Map paramMap = new HashMap<>();
        paramMap.put("admin_id", admin_id);
        paramMap.put("password", password);
        return sqlSessionTemplate.update(NAMESPACE + "resetPassword", paramMap);
    }

    @Override
    public String getPassword(final long admin_id) {
        return sqlSessionTemplate.selectOne(NAMESPACE + "getPassword", admin_id);
    }

    @Override
    public String getUsername(final long admin_id) {
        return sqlSessionTemplate.selectOne(NAMESPACE + "getUsername", admin_id);
    }

图书管理

private final static String NAMESPACE = "com.book.dao.impl.BookDaoImpl.";
    @Resource
    private SqlSessionTemplate sqlSessionTemplate;

    @Override
    public int matchBook(final String searchWord) {
        String search = "%" + searchWord + "%";
        return sqlSessionTemplate.selectOne(NAMESPACE + "matchBook", search);
    }

    @Override
    public ArrayList queryBook(final String searchWord) {
        String search = "%" + searchWord + "%";
        List result = sqlSessionTemplate.selectList(NAMESPACE + "queryBook", search);
        return (ArrayList) result;
    }

    @Override
    public ArrayList getAllBooks() {
        List result = sqlSessionTemplate.selectList(NAMESPACE + "getAllBooks");
        return (ArrayList) result;
    }

    @Override
    public int addBook(final Book book) {
        return sqlSessionTemplate.insert(NAMESPACE + "addBook", book);
    }

    @Override
    public Book getBook(final long bookId) {
        return sqlSessionTemplate.selectOne(NAMESPACE + "getBook", bookId);
    }

    @Override
    public int editBook(final Book book) {
        return sqlSessionTemplate.update(NAMESPACE + "editBook", book);
    }

    @Override
    public int deleteBook(final long bookId) {
        return sqlSessionTemplate.delete(NAMESPACE + "deleteBook", bookId);
    }

    @Override
    public ArrayList getAllTypes() {
        List result = sqlSessionTemplate.selectList(NAMESPACE + "getAllTypes");
        return (ArrayList) result;
    }

    @Override
    public Type getTypesById(final long TypeId){
        return sqlSessionTemplate.selectOne(NAMESPACE + "getTypesById", TypeId);
    }
(3)mybatis数据库操作

admin.xml


        select password from admin where admin_id = #{admin_id}
    
    
        select * from class_info
    
    
        select * from book_info
    
    
        select count(*) from book_info where name like #{search}
        or author like #{search} or introduction like #{search}
    
    
        select * from lend_list
    
    
        select * from reader_info
    
    
        select reader_id from reader_info where
        name = #{name} and sex = #{sex} and
        birth = #{birth} and address = #{address}
        and phone = #{phone}
    
(4)相关业务的交互操作

借阅业务的交互操作

@Autowired
    private BookServiceImpl bookServiceImpl;

    @RequestMapping("/deletebook.html")
    public String deleteBook(HttpServletRequest request, RedirectAttributes redirectAttributes) {
        long bookId = Long.parseLong(request.getParameter("bookId"));
        if (bookServiceImpl.deleteBook(bookId)) {
            redirectAttributes.addFlashAttribute("succ", "图书删除成功!");
        } else {
            redirectAttributes.addFlashAttribute("error", "图书删除失败!");
        }
        return "redirect:/admin_books.html";
    }

    @RequestMapping("/lendlist.html")
    public ModelAndView lendList(HttpServletRequest request,@RequestParam(required = false,defaultValue = "1")int pageNum, @RequestParam(required = false,defaultValue = "10")int pageSize) {
        ModelAndView modelAndView = new ModelAndView("admin_lend_list");
        modelAndView.addObject("pageInfo", lendServiceImpl.lendList(pageNum,pageSize));
        return modelAndView;
    }

    @RequestMapping("/mylend.html")
    public ModelAndView myLend(HttpServletRequest request, @RequestParam(required = false,defaultValue = "1")int pageNum, @RequestParam(required = false,defaultValue = "10")int pageSize) {
        ReaderCard readerCard = (ReaderCard) request.getSession().getAttribute("readercard");
        ModelAndView modelAndView = new ModelAndView("reader_lend_list");
        modelAndView.addObject("pageInfo", lendServiceImpl.myLendList(readerCard.getReaderId(),pageNum,pageSize));
        return modelAndView;
    }

    @RequestMapping("/deletelend.html")
    public String deleteLend(HttpServletRequest request, RedirectAttributes redirectAttributes) {
        long serNum = Long.parseLong(request.getParameter("serNum"));
        if (lendServiceImpl.deleteLend(serNum) > 0) {
            redirectAttributes.addFlashAttribute("succ", "记录删除成功!");
        } else {
            redirectAttributes.addFlashAttribute("error", "记录删除失败!");
        }
        return "redirect:/lendlist.html";
    }

    @RequestMapping("/lendbook.html")
    public String bookLend(HttpServletRequest request, RedirectAttributes redirectAttributes) {
        long bookId = Long.parseLong(request.getParameter("bookId"));
        long readerId = ((ReaderCard) request.getSession().getAttribute("readercard")).getReaderId();
        String name = request.getParameter("name");
        if (lendServiceImpl.lendBook(bookId, readerId, name)) {
            redirectAttributes.addFlashAttribute("succ", "图书借阅成功!");
        } else {
            redirectAttributes.addFlashAttribute("succ", "图书借阅成功!");
        }
        return "redirect:/reader_books.html";
    }

读者业务的交互操作

@Autowired
    private ReaderInfoServiceImpl readerInfoServiceImpl;

    @Autowired
    private LoginServiceImpl loginServiceImpl;

    @Autowired
    private ReaderCardServiceImpl readerCardServiceImpl;

    private ReaderInfo getReaderInfo(long readerId, String name, String sex, String birth, String address, String phone) {
        ReaderInfo readerInfo = new ReaderInfo();
        Date date = new Date();
        try {
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            date = df.parse(birth);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        readerInfo.setAddress(address);
        readerInfo.setName(name);
        readerInfo.setReaderId(readerId);
        readerInfo.setPhone(phone);
        readerInfo.setSex(sex);
        readerInfo.setBirth(date);
        return readerInfo;
    }

    @RequestMapping("allreaders.html")
    public ModelAndView allBooks(@RequestParam(required = false,defaultValue = "1")int pageNum,@RequestParam(required = false,defaultValue = "10")int pageSize) {
        PageInfo pageInfo = readerInfoServiceImpl.readerInfos(pageNum,pageSize);
        ModelAndView modelAndView = new ModelAndView("admin_readers");
        modelAndView.addObject("pageInfo", pageInfo);
        return modelAndView;
    }

    @RequestMapping("reader_delete.html")
    public String readerDelete(HttpServletRequest request, RedirectAttributes redirectAttributes) {
        long readerId = Long.parseLong(request.getParameter("readerId"));
        if (readerInfoServiceImpl.deleteReaderInfo(readerId) && readerCardServiceImpl.deleteReaderCard(readerId)) {
            redirectAttributes.addFlashAttribute("succ", "删除成功!");
        } else {
            redirectAttributes.addFlashAttribute("error", "删除失败!");
        }
        return "redirect:/allreaders.html";
    }

    @RequestMapping("/reader_info.html")
    public ModelAndView toReaderInfo(HttpServletRequest request) {
        ReaderCard readerCard = (ReaderCard) request.getSession().getAttribute("readercard");
        ReaderInfo readerInfo = readerInfoServiceImpl.getReaderInfo(readerCard.getReaderId());
        ModelAndView modelAndView = new ModelAndView("reader_info");
        modelAndView.addObject("readerinfo", readerInfo);
        return modelAndView;
    }

    @RequestMapping("reader_edit.html")
    public ModelAndView readerInfoEdit(HttpServletRequest request) {
        long readerId = Long.parseLong(request.getParameter("readerId"));
        ReaderInfo readerInfo = readerInfoServiceImpl.getReaderInfo(readerId);
        ModelAndView modelAndView = new ModelAndView("admin_reader_edit");
        modelAndView.addObject("readerInfo", readerInfo);
        return modelAndView;
    }

    @RequestMapping("reader_edit_do.html")
    public String readerInfoEditDo(HttpServletRequest request, String name, String sex, String birth, String address, String phone, RedirectAttributes redirectAttributes) {
        long readerId = Long.parseLong(request.getParameter("readerId"));
        ReaderInfo readerInfo = getReaderInfo(readerId, name, sex, birth, address, phone);
        if (readerInfoServiceImpl.editReaderInfo(readerInfo) && readerInfoServiceImpl.editReaderCard(readerInfo)) {
            redirectAttributes.addFlashAttribute("succ", "读者信息修改成功!");
        } else {
            redirectAttributes.addFlashAttribute("error", "读者信息修改失败!");
        }
        return "redirect:/allreaders.html";
    }

    @RequestMapping("reader_add.html")
    public ModelAndView readerInfoAdd() {
        return new ModelAndView("admin_reader_add");
    }

    @RequestMapping("reader_add_do.html")
    public String readerInfoAddDo(String name, String sex, String birth, String address, String phone, String password, RedirectAttributes redirectAttributes) {
        ReaderInfo readerInfo = getReaderInfo(0, name, sex, birth, address, phone);
        long readerId = readerInfoServiceImpl.addReaderInfo(readerInfo);
        readerInfo.setReaderId(readerId);
        if (readerId > 0 && readerCardServiceImpl.addReaderCard(readerInfo, password)) {
            redirectAttributes.addFlashAttribute("succ", "添加读者信息成功!");
        } else {
            redirectAttributes.addFlashAttribute("succ", "添加读者信息失败!");
        }
        return "redirect:/allreaders.html";
    }

    @RequestMapping("reader_info_edit.html")
    public ModelAndView readerInfoEditReader(HttpServletRequest request) {
        ReaderCard readerCard = (ReaderCard) request.getSession().getAttribute("readercard");
        ReaderInfo readerInfo = readerInfoServiceImpl.getReaderInfo(readerCard.getReaderId());
        ModelAndView modelAndView = new ModelAndView("reader_info_edit");
        modelAndView.addObject("readerinfo", readerInfo);
        return modelAndView;
    }

    @RequestMapping("reader_edit_do_r.html")
    public String readerInfoEditDoReader(HttpServletRequest request, String name, String sex, String birth, String address, String phone, RedirectAttributes redirectAttributes) {
        ReaderCard readerCard = (ReaderCard) request.getSession().getAttribute("readercard");
        ReaderInfo readerInfo = getReaderInfo(readerCard.getReaderId(), name, sex, birth, address, phone);
        if (readerInfoServiceImpl.editReaderInfo(readerInfo) && readerInfoServiceImpl.editReaderCard(readerInfo)) {
            ReaderCard readerCardNew = loginServiceImpl.findReaderCardByReaderId(readerCard.getReaderId());
            request.getSession().setAttribute("readercard", readerCardNew);
            redirectAttributes.addFlashAttribute("succ", "信息修改成功!");
        } else {
            redirectAttributes.addFlashAttribute("error", "信息修改失败!");
        }
        return "redirect:/reader_info.html";
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/434947.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号