经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring Boot » 查看文章
Spring Boot整合Thymeleaf详解
来源:jb51  时间:2022/8/23 15:36:26  对本文有异议

 Thymeleaf

基本介绍

Spring Boot 官方推荐使用 Thymeleaf 作为其模板引擎。SpringBoot 为 Thymeleaf 提供了一系列默认配置,并且为Thymeleaf提供了视图解析器。项目中一但导入了 Thymeleaf 的依赖,相对应的自动配置 (ThymeleafAutoConfiguration) 就会自动生效,因此 Thymeleaf 可以与 Spring Boot 完美整合 。Thymeleaf模板引擎可以和html标签完美结合,便于后端渲染数据。Thymeleaf支持静态效果和动态效果,在没有动态数据的时候,会展示静态效果模板引擎是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档就是将模板文件和数据通过模板引擎生成一个HTML代码**常见的模板引擎有:jsp、freemarker、velocity、thymeleafThymeleaf默认写的位置是在templates这个目录下面Thymeleaf官网:https://www.thymeleaf.org/

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  4. </dependency>
Thymeleaf默认的视图路径是:/ resources/templates,在这个目录下面创建html并引入thymeleaf
  1. <html lang="en" xmlns:th="http://www.thymleaf.org">

xmlns:th=“http://www.thymleaf.org”>

基本语法

${域属性名}:获得request域中的域属性值并显示
${session.域属性名}: 获得session域中的域属性值并显示

  1. < p th:text="${name}">aaa</p>

如果取得到数据的话,就会渲染成动态画面,否则就渲染成静态画面(只显示学生管理系统只显示学生管理系统这几个字)

th:text文本替换

  1. <span th:text="${user.name}">Tom</span>

th:if和th:unless文本替换

使用th:if和th:unless属性进行条件判断,th:unlessth:unless刚好相反,只有表达式条件不成立才会显示内容

  1. <h2 th:if="${age>=18}">成年</h2>
  2. <h2 th:unless="${age>=18}">未成年</h2>

th:each foreach循环

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. .tb-stus{
  8. width: 900px;
  9. margin: 0 auto;
  10. border: black 1px solid;
  11. border-collapse: collapse;
  12. }
  13. .tb-stus th,td{
  14. padding: 10px;
  15. text-align: center;
  16. border:1px solid black;
  17. }
  18. </style>
  19. </head>
  20. <body>
  21. <h2 align="center">学生管理系统</h2>
  22. <table class="tb-stus">
  23. <thead>
  24. <tr>
  25. <th>序号</th>
  26. <th>姓名</th>
  27. <th>年龄</th>
  28. <th>性别</th>
  29. <th>班级</th>
  30. <th>生日</th>
  31. <th>操作</th>
  32. </tr>
  33. </thead>
  34. <tbody>
  35. <tr th:each="stu:${stuList}">
  36. <td>1</td>
  37. <td th:text="${stu.name}">aa</td>
  38. <td>22</td>
  39. <td></td>
  40. <td>计科1班</td>
  41. <td>2022-2-3</td>
  42. <td>
  43. <a href="#" rel="external nofollow" >删除</a>
  44. </td>
  45. </tr>
  46. </tbody>
  47. </table>
  48. </body>
  49. </html>

th:href和@{}链接表达式

  1. <!--http://localhost:8080/stu/10 -->
  2. <a th:href="${'/stus/'+ stu.id}" rel="external nofollow" >编辑学生1</a>
  3.  
  4. <!--http://localhost:8080/stu?id=10 -->
  5. <a th:href="@{/stus(id=${stu.id})}" rel="external nofollow" >编辑学生2</a>
  6.  
  7. <!--http://localhost:8080/stu?id=10&name=abc -->
  8. <a th:href="@{/stus(id=${stu.id},name=${stu.name})}" rel="external nofollow" >编辑学生3</a>

th:switch和th:case

  1. <div th:switch="${stu.role}">
  2. <h2 th:case="banzhang">班长</h2>
  3. <h2 th:case="tuanzhishu">团支书</h2>
  4. <h2 th:case="${data}">学委</h2>
  5. <h2 th:case="*">其他</h2>
  6. </div>

thymeleaf默认给变量名+Stat的状态

如果没有显示设置状态变量,thymeleaf会默认给一个变量名+Stat的状态

  1. <tr th:each="stu: ${stus}">
  2. <td th:text="${stuStat.index}"></td>
  3. <td th:text="${ stu.name}"></td>
  4. <td th:text="${ stu.age}"></td>
  5. </tr>

th:id、th:value、th:checked等(和form表单相关)

th:object可以定义对象属性
*{}可以和th:object配合使用,可以取出对象中的属性

#dates.format()可以用来格式化日期格式
  1. <form th:object="${stu}">
  2. 编号:<input type="text" name="id" th:value="*{id}"><br>
  3. 姓名:<input type="text" name="name" th:value="*{name}"><br>
  4. 年龄:<input type="text" name="age" th:value="*{age}"><br>
  5. 性别:<input type="radio" name="gender" value="true" th:checked="*{gender}"><br>
  6. 性别:<input type="radio" name="gender" value="true" th:checked="*{not gender}"><br>
  7. 生日:<input type="text" name="birth" th:value="*{#dates.format(birth,'yyyy-MM-dd')}"><br>
  8. <input type="submit" value="编辑">
  9. </form>

整合Thymeleaf

基本配置

 创建项目的时候,记得在模板引擎中勾选Thymeleaf

在pom.xml中把MySQL驱动的作用域删除
然后我们这里使用druid连接池,所以需要在pom文件导入相关依赖

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>druid-spring-boot-starter</artifactId>
  4. <version>1.2.11</version>
  5. </dependency>

然后我们需要在全局配置文件application.properties中进行相关配置

  1. # 指定Mybatis的Mapper接口的xml映射文件的路径
  2. mybatis.mapper-locations=classpath:mapper/*xml
  3. # MySQL数据库驱动
  4. #这个驱动也可以省略,可以根据使用的MySQL自动加载相应的驱动
  5. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  6. # 数据源名称
  7. spring.datasource.name=com.alibaba.druid.pool.DruidDataSource
  8. # 数据库连接地址
  9. spring.datasource.url=jdbc:mysql://localhost:3306/school?serverTimezone=UTC&zeroDateTimeBehavior=convertToNull
  10. # 数据库用户名和密码
  11. spring.datasource.username=root
  12. spring.datasource.password=a87684009.
  13. # 设置日志级别
  14. logging.level.com.zyh.springboot=debug
  15. # 开启mybatis驼峰命名规则自动转换功能
  16. mybatis.configuration.map-underscore-to-camel-case=true

数据库准备 准备好数据库中表所对应的实体类,以及三层结构

image.png

  1. @Data
  2. public class Stu {
  3. private Integer id;
  4. private String name;
  5. private Integer age;
  6. private Boolean gender;
  7. private Integer cid;
  8. @DateTimeFormat(pattern = "yyyy-MM-dd")
  9. private Date birth;
  10. }

三层架构

Mapper

  1. @Mapper
  2. public interface StuMapper {
  3. /**
  4. * 查询所有学生信息
  5. * @return
  6. * @throws Exception
  7. */
  8. @Select("select * from stu")
  9. List<Stu> queryAllStu() throws Exception;
  10. }

Service

  1. public interface StuService {
  2. /**
  3. * 查询所有学生信息
  4. * @return
  5. */
  6. List<Stu> queryAllStu() throws Exception;
  7. }

Service的实现类

  1. @Service
  2. public class StuServiceImpl implements StuService {
  3. @Autowired
  4. private StuMapper stuMapper;
  5. @Override
  6. public List<Stu> queryAllStu() throws Exception {
  7. return stuMapper.queryAllStu();
  8. }
  9. }

thymeleaf

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <h2>学生管理系统</h2>
  9. <h2 th:text="${name}">aaaa</h2>
  10. </body>
  11. </html>

Controller

  1. @Controller
  2. @RequestMapping("/stu")
  3. public class StuController {
  4. @Autowired
  5. private StuService stuService;
  6. /**
  7. * 显示学生管理系统的画面
  8. * @return
  9. */
  10. @RequestMapping("/stusUi")
  11. public String stusUi(){
  12. return "stus";
  13. }
  14. }

然后我们先准备好页面

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. .tb-stus{
  8. width: 900px;
  9. margin: 0 auto;
  10. border: black 1px solid;
  11. border-collapse: collapse;
  12. }
  13. .tb-stus th,td{
  14. padding: 10px;
  15. text-align: center;
  16. border:1px solid black;
  17. }
  18. </style>
  19. </head>
  20. <body>
  21. <h2 align="center">学生管理系统</h2>
  22. <table class="tb-stus">
  23. <thead>
  24. <tr>
  25. <th>序号</th>
  26. <th>姓名</th>
  27. <th>年龄</th>
  28. <th>性别</th>
  29. <th>班级</th>
  30. <th>生日</th>
  31. <th>操作</th>
  32. </tr>
  33. </thead>
  34. <tbody>
  35. <tr th:each="stu,status: ${stuList}">
  36. <td th:text="${status.index+1}">1</td>
  37. <td th:text="${stu.name}">aa</td>
  38. <td th:text="${stu.age}">22</td>
  39. <!-- gender的属性值为1表示性别为男-->
  40. <td th:if="${stu.gender}"></td>
  41. <td th:unless="${stu.gender}"></td>
  42. <td th:text="${stu.cid}">计科1班</td>
  43. <td th:text="${#dates.format(stu.birth,'yyyy-MM-dd')}">2022-2-3</td>
  44. <td>
  45. <!--http://localhost:8080/stu/delete?id=10-->
  46. <a th:href="@{/stu/delete(id=${stu.id})}" rel="external nofollow" rel="external nofollow" rel="external nofollow" >删除</a>
  47. </td>
  48. </tr>
  49. </tbody>
  50. </table>
  51. </body>
  52. </html>

当我们点击删除的时候,后端要根据前端传过来的id来从数据库中删除对应的数据。这里我们先按照我们之前学的时候,熟悉的方法来完成,到后面的时候,会详细讲前后端分离开发

删除操作

Controller(之前的方法这里没有粘贴出来,不然代码太多了)

  1. @Controller
  2. @RequestMapping("/stu")
  3. public class StuController {
  4. @Autowired
  5. private StuService stuService;
  6. /**根据id删除数据
  7. * http://localhost:8080/stu/delete?id=10
  8. * @return
  9. */
  10. @RequestMapping("/delete")
  11. public String deleteById(@RequestParam("id") Integer id){
  12. try {
  13. stuService.deleteByid(id);
  14. } catch (Exception e) {
  15. e.printStackTrace();
  16. }
  17. System.out.println(id);
  18. return "redirect:/stu/stusUi";
  19. }
  20.  
  21.  
  22. }

Service

  1. public interface StuService {
  2. /**
  3. * 查询所有学生信息
  4. * @return
  5. */
  6. List<Stu> queryAllStu() throws Exception;
  7.  
  8. void deleteByid(Integer id);
  9. }

Service实现类

  1. @Service
  2. public class StuServiceImpl implements StuService {
  3. @Autowired
  4. private StuMapper stuMapper;
  5. @Override
  6. public List<Stu> queryAllStu() throws Exception {
  7. return stuMapper.queryAllStu();
  8. }
  9.  
  10. /**
  11. * 根据id删除数据
  12. * @param id
  13. */
  14. @Override
  15. public void deleteByid(Integer id) throws Exception {
  16. stuMapper.deleteById(id);
  17. }
  18. }

Mapper

  1. @Mapper
  2. public interface StuMapper {
  3. /**
  4. * 查询所有学生信息
  5. * @return
  6. * @throws Exception
  7. */
  8. @Select("select * from stu")
  9. List<Stu> queryAllStu() throws Exception;
  10. @Delete("delete from stu where id=#{id}")
  11. void deleteById( Integer id);
  12. }

把编号为8的数据删除

编辑操作

页面stus.html

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. .tb-stus{
  8. width: 900px;
  9. margin: 0 auto;
  10. border: black 1px solid;
  11. border-collapse: collapse;
  12. }
  13. .tb-stus th,td{
  14. padding: 10px;
  15. text-align: center;
  16. border:1px solid black;
  17. }
  18. </style>
  19. </head>
  20. <body>
  21. <h2 align="center">学生管理系统</h2>
  22. <table class="tb-stus">
  23. <thead>
  24. <tr>
  25. <th>序号</th>
  26. <th>姓名</th>
  27. <th>年龄</th>
  28. <th>性别</th>
  29. <th>班级</th>
  30. <th>生日</th>
  31. <th>操作</th>
  32. </tr>
  33. </thead>
  34. <tbody>
  35. <tr th:each="stu,status: ${stuList}">
  36. <td th:text="${stu.id}">1</td>
  37. <td th:text="${stu.name}">aa</td>
  38. <td th:text="${stu.age}">22</td>
  39. <!-- gender的属性值为1表示性别为男-->
  40. <td th:if="${stu.gender}"></td>
  41. <td th:unless="${stu.gender}"></td>
  42. <td th:text="${stu.cid}">计科1班</td>
  43. <td th:text="${#dates.format(stu.birth,'yyyy-MM-dd')}">2022-2-3</td>
  44. <td>
  45. <!-- localhost:8080/stu/delete/8-->
  46. <!-- <a th:href="${'/stu/delete/'+stu.id}" rel="external nofollow" rel="external nofollow" >删除</a>-->
  47. <!--http://localhost:8080/stu/delete?id=10-->
  48. <a th:href="@{/stu/delete(id=${stu.id})}" rel="external nofollow" rel="external nofollow" rel="external nofollow" >删除</a>
  49. <a th:href="@{/stu/edit(id=${stu.id})}" rel="external nofollow" rel="external nofollow" >编辑</a>
  50. </td>
  51. </tr>
  52. </tbody>
  53. </table>
  54.  
  55. </body>
  56. </html>

页面 stu-edit.html

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>编辑画面</title>
  6. </head>
  7. <body>
  8. <h2 >编辑学生信息</h2>
  9. <form action="" method="post" th:object="${stu}">
  10. 学号:<input type="text" name="id" th:value="*{id}" ><br><br>
  11. 姓名:<input type="text" name="name" th:value="*{name}"><br><br>
  12. 年龄:<input type="text" name="age" th:value="*{age}"><br><br>
  13. 性别:<input type="radio" name="gender" th:checked="*{gender}" >
  14. <input type="radio" name="gender" th:checked="*{!gender}" ><br><br>
  15. 班级:<input type="text" name="cid" th:value="*{cid}"><br><br>
  16. 生日:<input type="text" name="birth" th:value="*{#dates.format(birth,'yyyy-MM-dd')}"><br><br>
  17. <input type="submit" value="编辑">
  18. </form>
  19. </body>
  20. </html>

Controller

  1. /**
  2. * 根据id来修改数据
  3. * 我们首先得先根据id把数据查询出来,然后把数据展示出来
  4. * 用户再进行编辑,用户编辑完并且提交以后,跳转到学生管理系统画面,展示所有数据
  5. * @return
  6. */
  7. @RequestMapping("/edit")
  8. public String edit(@RequestParam("id") Integer id,Model model){
  9. System.out.println("id"+id);
  10. try {
  11. Stu stu=stuService.queryById(id);
  12. model.addAttribute("stu",stu);
  13. } catch (Exception e) {
  14. e.printStackTrace();
  15. }
  16.  
  17. return "stu-edit";
  18. }

Service

  1. public interface StuService {
  2. /**
  3. * 查询所有学生信息
  4. * @return
  5. */
  6. List<Stu> queryAllStu() throws Exception;
  7.  
  8. /**
  9. * 根据id来删除学生信息
  10. * @param id
  11. * @throws Exception
  12. */
  13. void deleteByid(Integer id) throws Exception;
  14.  
  15. /**
  16. * 根据id来查询对应学生信息
  17. * @param id
  18. * @return
  19. * @throws Exception
  20. */
  21. Stu queryById(Integer id) throws Exception;
  22. }

Service实现类

  1. @Service
  2. public class StuServiceImpl implements StuService {
  3. @Autowired
  4. private StuMapper stuMapper;
  5. @Override
  6. public List<Stu> queryAllStu() throws Exception {
  7. return stuMapper.queryAllStu();
  8. }
  9.  
  10. /**
  11. * 根据id删除数据
  12. * @param id
  13. */
  14. @Override
  15. public void deleteByid(Integer id) throws Exception {
  16. stuMapper.deleteById(id);
  17. }
  18.  
  19. @Override
  20. public Stu queryById(Integer id) throws Exception {
  21. return stuMapper.queryById(id);
  22. }
  23. }

Mapper

  1. @Mapper
  2. public interface StuMapper {
  3. /**
  4. * 查询所有学生信息
  5. * @return
  6. * @throws Exception
  7. */
  8. @Select("select * from stu")
  9. List<Stu> queryAllStu() throws Exception;
  10. @Delete("delete from stu where id=#{id}")
  11. void deleteById( Integer id);
  12. @Select("select * from stu where id=#{id}")
  13. Stu queryById(Integer id) throws Exception;
  14. }

比如在序号为4中,点击编辑

用户登录

登录页面:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <h2>用户登录</h2>
  9. <form action="/login" method="post">
  10. 账号:<input type="text" name="username"><br><br>
  11. 密码:<input type="password" name="password"><br><br>
  12. <input type="submit" value="登录">
  13. </form>
  14.  
  15.  
  16. </body>
  17. </html>

因为需要判断用户是否存在,这是从数据库进行查询的,所以要准备对应的管理员表

  1. # 创建管理员表
  2. CREATE TABLE admin(
  3. id INT PRIMARY KEY AUTO_INCREMENT,
  4. username VARCHAR(20),
  5. `password` VARCHAR(20)
  6. );
  7.  
  8. INSERT INTO admin VALUES
  9. (DEFAULT,'aaa',111),
  10. (DEFAULT,'bbb',222),
  11. (DEFAULT,'ccc',333);
  12. # 查询测试
  13. SELECT * FROM admin;

准备对应的实体类

  1. @Data
  2. public class Admin {
  3. private String username;
  4. private String password;
  5. }

Controller

  1. @Controller
  2. @SessionAttributes(names = {"admin"})
  3. public class AdminController {
  4. @Autowired
  5. private AdminService adminService;
  6.  
  7. /**
  8. * 显示登录页面
  9. * @return
  10. */
  11. @RequestMapping(value = "/loginUi")
  12. public String loginUi(){
  13. return "login";
  14. }
  15. @RequestMapping(value = "/login",method = RequestMethod.POST)
  16. public String login(String username, String password, Model model){
  17. try {
  18. Admin admin = adminService.login(username, password);
  19. //用户名存在说明登录成功
  20. if (admin!=null){
  21. //存放到session域中
  22. model.addAttribute("admin",admin);
  23. return "redirect:/stu/stusUi";
  24. }
  25. } catch (Exception e) {
  26. e.printStackTrace();
  27. }
  28. return "redirect:/loginUi";
  29. }
  30.  
  31. }

Service

  1. public interface AdminService {
  2. Admin login(String username,String password) throws Exception;
  3. }

Service对应的实现类

  1. @Service
  2. public class AdminServiceImpl implements AdminService {
  3. @Autowired
  4. private AdminMapper adminMapper;
  5. @Override
  6. public Admin login(String username, String password) throws Exception {
  7. return adminMapper.queryByUsernameAndPassword(username,password);
  8. }
  9. }

Mapper

  1. @Mapper
  2. public interface AdminMapper {
  3. @Select("select * from admin where username=#{username} and password=#{password}")
  4. Admin queryByUsernameAndPassword(@Param("username") String username, @Param("password") String password);
  5. }

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. .tb-stus{
  8. width: 900px;
  9. margin: 0 auto;
  10. border: black 1px solid;
  11. border-collapse: collapse;
  12. }
  13. .tb-stus th,td{
  14. padding: 10px;
  15. text-align: center;
  16. border:1px solid black;
  17. }
  18. </style>
  19. </head>
  20. <body>
  21. <h2 align="center">学生管理系统</h2>
  22. <h2 th:if="${session.admin!=null}" th:text="${session.admin.username}">用户名</h2>
  23. <a th:unless="${session.admin!=null}" href="/loginUi" rel="external nofollow" >登录</a>
  24. <a th:if="${session.admin!=null}" href="/logout" rel="external nofollow" >注销用户</a>
  25. <table class="tb-stus">
  26. <thead>
  27. <tr>
  28. <th>序号</th>
  29. <th>姓名</th>
  30. <th>年龄</th>
  31. <th>性别</th>
  32. <th>班级</th>
  33. <th>生日</th>
  34. <th>操作</th>
  35. </tr>
  36. </thead>
  37. <tbody>
  38. <tr th:each="stu,status: ${stuList}">
  39. <td th:text="${stu.id}">1</td>
  40. <td th:text="${stu.name}">aa</td>
  41. <td th:text="${stu.age}">22</td>
  42. <!-- gender的属性值为1表示性别为男-->
  43. <td th:if="${stu.gender}"></td>
  44. <td th:unless="${stu.gender}"></td>
  45. <td th:text="${stu.cid}">计科1班</td>
  46. <td th:text="${#dates.format(stu.birth,'yyyy-MM-dd')}">2022-2-3</td>
  47. <td>
  48. <!-- localhost:8080/stu/delete/8-->
  49. <!-- <a th:href="${'/stu/delete/'+stu.id}" rel="external nofollow" rel="external nofollow" >删除</a>-->
  50. <!--http://localhost:8080/stu/delete?id=10-->
  51. <a th:href="@{/stu/delete(id=${stu.id})}" rel="external nofollow" rel="external nofollow" rel="external nofollow" >删除</a>
  52. <a th:href="@{/stu/edit(id=${stu.id})}" rel="external nofollow" rel="external nofollow" >编辑</a>
  53. </td>
  54. </tr>
  55. </tbody>
  56. </table>
  57.  
  58. </body>
  59. </html>

用户注销

注销的话,我们把session域中的用户对象取消,然后这个时候就得重新登录,应该要跳转到登录画面

  1. @RequestMapping("/logout")
  2. public String logout(HttpSession session){
  3. session.removeAttribute("admin");
  4. return "redirect:/loginUi";
  5. }

点击注销用户

到此这篇关于Spring Boot整合Thymeleaf详解的文章就介绍到这了,更多相关Spring Boot整合Thymeleaf内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号