使用 Servlet、Hibernate、MySQL 和 Thymeleaf 开发CRUD WEB应用程序
在本教程中,您将学习使用 Servlet、Hibernate、MySQL 和 Thymeleaf 开发CRUD WEB应用程序。
pom.xml
-
-
<project xmlns="http://maven.apache.org/POM/4.0.0"
-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-
<modelVersion>4.0.0</modelVersion>
-
<groupId>tigratius</groupId>
-
<artifactId>Servlet-Thymeleaf-Hibernate-Crud</artifactId>
-
<version>1.0</version>
-
<packaging>war</packaging>
-
-
<properties>
-
<project.build.sourceEncoding>US-ASCII</project.build.sourceEncoding>
-
<maven.compiler.source>1.8</maven.compiler.source>
-
<maven.compiler.target>1.8</maven.compiler.target>
-
</properties>
-
-
<build>
-
<resources>
-
<resource>
-
<directory>src/main/resources</directory>
-
</resource>
-
<resource>
-
<directory>src/main/java</directory>
-
<includes>
-
<include>**/*.properties</include>
-
<include>**/*.xml</include>
-
<include>**/*.html</include>
-
</includes>
-
</resource>
-
</resources>
-
-
<plugins>
-
<plugin>
-
<groupId>org.apache.maven.plugins</groupId>
-
<artifactId>maven-dependency-plugin</artifactId>
-
<version>3.0.1</version>
-
<executions>
-
<execution>
-
<phase>package</phase>
-
<goals>
-
<goal>copy</goal>
-
</goals>
-
<configuration>
-
<artifactItems>
-
<artifactItem>
-
<groupId>com.github.jsimone</groupId>
-
<artifactId>webapp-runner</artifactId>
-
<version>9.0.24.0</version>
-
<destFileName>webapp-runner.jar</destFileName>
-
</artifactItem>
-
</artifactItems>
-
</configuration>
-
</execution>
-
</executions>
-
</plugin>
-
<plugin>
-
<groupId>org.apache.maven.plugins</groupId>
-
<artifactId>maven-compiler-plugin</artifactId>
-
<version>3.8.0</version>
-
<configuration>
-
<source>${maven.compiler.source}</source>
-
<target>${maven.compiler.target}</target>
-
<encoding>${project.build.sourceEncoding}</encoding>
-
</configuration>
-
</plugin>
-
<plugin>
-
<groupId>org.apache.maven.plugins</groupId>
-
<artifactId>maven-resources-plugin</artifactId>
-
<version>3.1.0</version>
-
<configuration>
-
<encoding>${project.build.sourceEncoding}</encoding>
-
</configuration>
-
</plugin>
-
<plugin>
-
<groupId>org.apache.maven.plugins</groupId>
-
<artifactId>maven-war-plugin</artifactId>
-
<version>3.2.2</version>
-
<configuration>
-
<failOnMissingWebXml>false</failOnMissingWebXml>
-
</configuration>
-
</plugin>
-
<plugin>
-
<groupId>org.apache.tomcat.maven</groupId>
-
<artifactId>tomcat7-maven-plugin</artifactId>
-
<version>2.2</version>
-
</plugin>
-
-
</plugins>
-
-
</build>
-
-
<dependencies>
-
<dependency>
-
<groupId>org.thymeleaf</groupId>
-
<artifactId>thymeleaf</artifactId>
-
<version>3.0.15.RELEASE</version>
-
</dependency>
-
<dependency>
-
<groupId>javax.servlet</groupId>
-
<artifactId>javax.servlet-api</artifactId>
-
<version>4.0.1</version>
-
</dependency>
-
<dependency>
-
<groupId>org.slf4j</groupId>
-
<artifactId>slf4j-api</artifactId>
-
<version>2.0.3</version>
-
<scope>compile</scope>
-
</dependency>
-
-
<dependency>
-
<groupId>org.slf4j</groupId>
-
<artifactId>slf4j-log4j12</artifactId>
-
<version>2.0.3</version>
-
<scope>compile</scope>
-
</dependency>
-
-
<dependency>
-
<groupId>log4j</groupId>
-
<artifactId>log4j</artifactId>
-
<version>1.2.17</version>
-
<scope>compile</scope>
-
<exclusions>
-
<exclusion>
-
<groupId>com.sun.jdmk</groupId>
-
<artifactId>jmxtools</artifactId>
-
</exclusion>
-
<exclusion>
-
<groupId>com.sun.jmx</groupId>
-
<artifactId>jmxri</artifactId>
-
</exclusion>
-
<exclusion>
-
<groupId>javax.jms</groupId>
-
<artifactId>jms</artifactId>
-
</exclusion>
-
</exclusions>
-
</dependency>
-
<!--https://mvnrepository.com/artifact/mysql/mysql-connector-java-->
-
<dependency>
-
<groupId>mysql</groupId>
-
<artifactId>mysql-connector-java</artifactId>
-
<!--<version>5.1.6</version>-->
-
<version>8.0.22</version>
-
</dependency>
-
<!--https://mvnrepository.com/artifact/org.hibernate/hibernate-core-->
-
<dependency>
-
<groupId>org.hibernate</groupId>
-
<artifactId>hibernate-core</artifactId>
-
<version>5.6.12.Final</version>
-
</dependency>
-
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-c3p0 добавил сломалось-->
-
<dependency>
-
<groupId>org.hibernate</groupId>
-
<artifactId>hibernate-c3p0</artifactId>
-
<version>5.6.12.Final</version>
-
</dependency>
-
<!-- https://mvnrepository.com/artifact/javax.persistence/javax.persistence-api -->
-
<dependency>
-
<groupId>javax.persistence</groupId>
-
<artifactId>javax.persistence-api</artifactId>
-
<version>2.2</version>
-
</dependency>
-
-
</dependencies>
-
-
-
</project>
MySQL建表脚本
-
CREATE TABLE `users` (
-
`id` INT(10) NOT NULL AUTO_INCREMENT,
-
`first_name` VARCHAR(100) NOT NULL COLLATE 'utf8mb4_unicode_ci',
-
`last_name` VARCHAR(100) NOT NULL COLLATE 'utf8mb4_unicode_ci',
-
`specialty` VARCHAR(100) NOT NULL COLLATE 'utf8mb4_unicode_ci',
-
PRIMARY KEY (`id`) USING BTREE
-
)
User.java
-
package com.example.crudweb.entity;
-
-
import javax.persistence.*;
-
import java.util.Set;
-
-
-
-
public class User {
-
-
-
-
private Long id;
-
-
private String firstName;
-
-
private String lastName;
-
private String specialty;
-
-
public User() {
-
}
-
-
public User(Long id, String firstName, String lastName, String specialty) {
-
this.id = id;
-
this.firstName = firstName;
-
this.lastName = lastName;
-
this.specialty = specialty;
-
}
-
-
public Long getId() {
-
return id;
-
}
-
-
public void setId(Long id) {
-
this.id = id;
-
}
-
-
public String getFirstName() {
-
return firstName;
-
}
-
-
public void setFirstName(String firstName) {
-
this.firstName = firstName;
-
}
-
-
public String getLastName() {
-
return lastName;
-
}
-
-
public void setLastName(String lastName) {
-
this.lastName = lastName;
-
}
-
-
public String getSpecialty() {
-
return specialty;
-
}
-
-
public void setSpecialty(String specialty) {
-
this.specialty = specialty;
-
}
-
-
}
UserRepository.java
-
package com.example.crudweb.repository;
-
-
import com.sun.xml.bind.v2.model.core.ID;
-
import com.example.crudweb.entity.User;
-
import java.util.List;
-
-
public interface UserRepository {
-
-
void delete(Long id);
-
-
void update(User item);
-
-
void add(User item);
-
-
User getById(Long id);
-
-
List<User> getAll();
-
}
UserRepositoryImpl.java
-
package com.example.crudweb.repository.impl;
-
-
import com.example.crudweb.entity.User;
-
import com.example.crudweb.repository.UserRepository;
-
import org.hibernate.Session;
-
import org.hibernate.SessionFactory;
-
import org.hibernate.Transaction;
-
-
import java.util.ArrayList;
-
import java.util.List;
-
-
public class UserRepositoryImpl implements UserRepository {
-
-
SessionFactory sessionFactory;
-
-
public UserRepositoryImpl(SessionFactory sessionFactory) {
-
-
this.sessionFactory = sessionFactory;
-
}
-
-
public void update(User item) {
-
Session session = null;
-
Transaction tx = null;
-
try {
-
session = sessionFactory.openSession();
-
tx = session.beginTransaction();
-
session.update(item);
-
tx.commit();
-
} catch (Exception e) {
-
if (tx != null) {
-
tx.rollback();
-
}
-
e.printStackTrace();
-
} finally {
-
if (session != null && session.isOpen()) {
-
session.close();
-
}
-
}
-
}
-
-
public void add(User item) {
-
Session session = null;
-
Transaction tx = null;
-
try {
-
session = sessionFactory.openSession();
-
tx = session.beginTransaction();
-
session.save(item);
-
tx.commit();
-
} catch (Exception e) {
-
if (tx != null) {
-
tx.rollback();
-
}
-
e.printStackTrace();
-
} finally {
-
if (session != null && session.isOpen()) {
-
session.close();
-
}
-
}
-
}
-
-
public void delete(Long id) {
-
Session session = null;
-
Transaction tx = null;
-
try {
-
session = sessionFactory.openSession();
-
tx = session.beginTransaction();
-
User user = session.get(User.class, id);
-
session.delete(user);
-
tx.commit();
-
} catch (Exception e) {
-
if (tx != null) {
-
tx.rollback();
-
}
-
e.printStackTrace();
-
} finally {
-
if (session != null && session.isOpen()) {
-
session.close();
-
}
-
}
-
}
-
-
public User getById(Long id) {
-
Session session = null;
-
User skill = null;
-
try {
-
session = sessionFactory.openSession();
-
skill = session.get(User.class, id);
-
} catch (Exception e) {
-
e.printStackTrace();
-
} finally {
-
if (session != null && session.isOpen()) {
-
session.close();
-
}
-
}
-
return skill;
-
}
-
-
public List<User> getAll() {
-
Session session = null;
-
List<User> users = new ArrayList<>();
-
try {
-
session = sessionFactory.openSession();
-
users = session.createQuery("from User", User.class).list();
-
} catch (Exception e) {
-
e.printStackTrace();
-
} finally {
-
if (session != null && session.isOpen()) {
-
session.close();
-
}
-
}
-
return users;
-
}
-
-
}
UserService.java
-
package com.example.crudweb.service;
-
-
import com.example.crudweb.entity.User;
-
-
import com.example.crudweb.repository.UserRepository;
-
-
import java.util.HashSet;
-
import java.util.List;
-
import java.util.Set;
-
-
public class UserService {
-
-
private UserRepository userRepository;
-
-
public UserService(UserRepository userRepository) {
-
-
this.userRepository = userRepository;
-
-
}
-
-
public User getById(Long id) {
-
try {
-
return userRepository.getById(id);
-
} catch (Exception ex) {
-
ex.printStackTrace();
-
}
-
-
return null;
-
}
-
-
public List<User> getAll() {
-
return userRepository.getAll();
-
}
-
-
public void delete(Long id) {
-
userRepository.delete(id);
-
}
-
-
public void create(String firstName, String lastName, String specialty) {
-
User user = getNewUser(firstName, lastName, specialty);
-
userRepository.add(user);
-
}
-
-
public void update(Long id, String firstName, String lastName, String specialty) {
-
User user = getNewUser(firstName, lastName, specialty);
-
user.setId(id);
-
userRepository.update(user);
-
}
-
-
private User getNewUser(String firstName, String lastName, String specialty) {
-
User user = new User();
-
user.setFirstName(firstName);
-
user.setLastName(lastName);
-
user.setSpecialty(specialty);
-
return user;
-
}
-
}
UserController.java
-
package com.example.crudweb.controller;
-
-
import com.example.crudweb.config.ThymeleafConfig;
-
import com.example.crudweb.entity.User;
-
import com.example.crudweb.repository.impl.UserRepositoryImpl;
-
import com.example.crudweb.service.UserService;
-
import com.example.crudweb.util.HibernateUtil;
-
import org.hibernate.SessionFactory;
-
import org.thymeleaf.TemplateEngine;
-
import org.thymeleaf.context.WebContext;
-
-
import javax.servlet.ServletConfig;
-
import javax.servlet.ServletContext;
-
import javax.servlet.annotation.WebServlet;
-
import javax.servlet.http.HttpServlet;
-
import javax.servlet.http.HttpServletRequest;
-
import javax.servlet.http.HttpServletResponse;
-
import java.io.IOException;
-
import java.util.Arrays;
-
import java.util.List;
-
import java.util.stream.Collectors;
-
-
-
public class UserController extends HttpServlet {
-
-
private ThymeleafConfig thymeleafConfig;
-
private ServletContext servletContext;
-
private UserService userService;
-
-
-
public void init(ServletConfig config) {
-
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
-
System.out.println(" HibernateUtil.getSessionFactory() was called!");
-
servletContext = config.getServletContext();
-
thymeleafConfig = new ThymeleafConfig(servletContext);
-
userService = new UserService(new UserRepositoryImpl(sessionFactory));
-
}
-
-
-
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
-
doGet(req, resp);
-
}
-
-
-
protected void doGet(HttpServletRequest request, HttpServletResponse response)
-
throws IOException {
-
-
String action = request.getServletPath();
-
-
switch (action) {
-
case "/user/new":
-
showNewForm(request, response);
-
break;
-
case "/user/insert":
-
insert(request, response);
-
break;
-
case "/user/delete":
-
delete(request, response);
-
break;
-
case "/user/edit":
-
showEditForm(request, response);
-
break;
-
case "/user/update":
-
update(request, response);
-
break;
-
default:
-
list(request, response);
-
break;
-
}
-
}
-
-
private void update(HttpServletRequest request, HttpServletResponse response) throws IOException {
-
Long id = Long.parseLong(request.getParameter("id"));
-
String firstName = request.getParameter("firstName");
-
String lastName = request.getParameter("lastName");
-
String specialty = request.getParameter("specialty");
-
-
userService.update(id, firstName, lastName, specialty);
-
response.sendRedirect("/user");
-
}
-
-
private void showEditForm(HttpServletRequest request, HttpServletResponse response) throws IOException {
-
Long id = Long.parseLong(request.getParameter("id"));
-
User user = userService.getById(id);
-
-
WebContext ctx = new WebContext(request, response, servletContext, request.getLocale());
-
ctx.setVariable("user", user);
-
-
TemplateEngine engine = thymeleafConfig.getTemplateEngine();
-
engine.process("user/edit", ctx, response.getWriter());
-
}
-
-
private void delete(HttpServletRequest request, HttpServletResponse response) throws IOException {
-
Long id = Long.parseLong(request.getParameter("id"));
-
userService.delete(id);
-
response.sendRedirect("/user");
-
}
-
-
private void insert(HttpServletRequest request, HttpServletResponse response) throws IOException {
-
String firstName = request.getParameter("firstName");
-
String lastName = request.getParameter("lastName");
-
String specialty = request.getParameter("specialty");
-
-
userService.create(firstName, lastName, specialty);
-
response.sendRedirect("/user");
-
}
-
-
private void showNewForm(HttpServletRequest request, HttpServletResponse response) throws IOException {
-
-
WebContext ctx = new WebContext(request, response, servletContext, request.getLocale());
-
-
TemplateEngine engine = thymeleafConfig.getTemplateEngine();
-
engine.process("user/new", ctx, response.getWriter());
-
}
-
-
private void list(HttpServletRequest request, HttpServletResponse response) throws IOException {
-
List<User> users = userService.getAll();
-
-
WebContext ctx = new WebContext(request, response, servletContext, request.getLocale());
-
ctx.setVariable("users", users);
-
-
TemplateEngine engine = thymeleafConfig.getTemplateEngine();
-
engine.process("user/list", ctx, response.getWriter());
-
}
-
}
ThymeleafConfig.java
-
-
package com.example.crudweb.config;
-
-
import org.thymeleaf.TemplateEngine;
-
import org.thymeleaf.templatemode.TemplateMode;
-
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;
-
-
import javax.servlet.ServletContext;
-
-
-
/**
-
* Thymeleaf configuration.
-
*/
-
-
-
public class ThymeleafConfig {
-
-
private final String prefix = "/WEB-INF/templates/";
-
private final String suffix = ".html";
-
private final Long cacheTTLMs = 3600000L;
-
private final TemplateEngine templateEngine;
-
-
public ThymeleafConfig(final ServletContext ctx) {
-
-
ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(ctx);
-
templateResolver.setTemplateMode(TemplateMode.HTML);
-
templateResolver.setPrefix(prefix);
-
templateResolver.setSuffix(suffix);
-
templateResolver.setCacheTTLMs(cacheTTLMs);
-
templateResolver.setCacheable(true);
-
-
templateEngine = new TemplateEngine();
-
templateEngine.setTemplateResolver(templateResolver);
-
}
-
-
public TemplateEngine getTemplateEngine() {
-
return templateEngine;
-
}
-
}
-
-
-
HibernateUtil.java
-
package com.example.crudweb.util;
-
-
import com.example.crudweb.entity.User;
-
import org.hibernate.SessionFactory;
-
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
-
import org.hibernate.cfg.Configuration;
-
import org.hibernate.service.ServiceRegistry;
-
-
public class HibernateUtil {
-
-
private static SessionFactory sessionFactory = null;
-
-
public static SessionFactory getSessionFactory() {
-
-
if (sessionFactory != null) {
-
return sessionFactory;
-
} else {
-
try {
-
Configuration configuration = new Configuration().configure();
-
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
-
.applySettings(configuration.getProperties()).build();
-
configuration.addAnnotatedClass(User.class);
-
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
-
} catch (Throwable ex) {
-
System.err.println("Initial SessionFactory creation failed." ex);
-
throw new ExceptionInInitializerError(ex);
-
}
-
return sessionFactory;
-
}
-
}
-
}
hibernate.cfg.xml
-
-
-
"-//Hibernate/Hibernate Configuration DTD//EN"
-
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
-
<hibernate-configuration>
-
<session-factory>
-
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
-
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/demodb?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai</property>
-
<property name="hibernate.connection.username">root</property>
-
<property name="hibernate.connection.password">root</property>
-
-
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
-
<property name="show_sql">false</property>
-
-
<!-- hibernate c3p0 connection pooling configuration -->
-
<property name="hibernate.c3p0.acquire_increment">1</property>
-
<property name="hibernate.c3p0.idle_test_period">60</property> <!-- seconds -->
-
<property name="hibernate.c3p0.min_size">5</property>
-
<property name="hibernate.c3p0.max_size">10</property>
-
<property name="hibernate.c3p0.max_statements">50</property>
-
<property name="hibernate.c3p0.timeout">0</property> <!-- seconds -->
-
<property name="hibernate.c3p0.acquireRetryAttempts">1</property>
-
<property name="hibernate.c3p0.acquireRetryDelay">250</property>
-
-
<mapping class="com.tigratius.crudweb.entity.User"/>
-
-
</session-factory>
-
</hibernate-configuration>
list.html
-
-
-
<html xmlns:th="http://www.thymeleaf.org">
-
-
<head>
-
<title>User List</title>
-
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-
<link rel="stylesheet" type="text/css" media="all" href="../../../css/style.css" th:href="@{/css/style.css}" />
-
</head>
-
-
<body>
-
-
<h1>User List</h1>
-
-
<div style="margin-bottom: 20px">
-
<a class="add" th:href="@{/user/new}">Add New User</a>
-
</div>
-
-
<table>
-
<thead>
-
<tr>
-
<th>FIRST_NAME</th>
-
<th>LAST_NAME</th>
-
<th>SPECIALTY</th>
-
<th></th>
-
<th></th>
-
</tr>
-
</thead>
-
<tbody th:remove="all-but-first">
-
<tr th:each="user : ${users}" th:class="${userStat.odd}? 'odd'">
-
<td th:text="${user.firstName}"></td>
-
<td th:text="${user.lastName}"></td>
-
<td th:text="${user.specialty}"></td>
-
-
<td><a th:href="@{/user/edit(id=${user.id})}">edit</a></td>
-
<td><a th:href="@{/user/delete(id=${user.id})}">delete</a></td>
-
</tr>
-
</tbody>
-
</table>
-
-
<p>
-
<a href="../home.html" th:href="@{/}">Return to home</a>
-
</p>
-
-
</body>
-
-
</html>
-
new.html
-
-
-
<html xmlns:th="http://www.thymeleaf.org">
-
-
<head>
-
<title>User New Form</title>
-
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-
<link rel="stylesheet" type="text/css" media="all" href="../../../css/style.css" th:href="@{/css/style.css}"/>
-
</head>
-
-
<body>
-
-
<h1>Add New User</h1>
-
-
<form action="insert" method="post">
-
-
<table>
-
<tr>
-
<th>First_Name:</th>
-
<td>
-
<input type="text" name="firstName"
-
value=""
-
/>
-
</td>
-
</tr>
-
<tr>
-
<th>Last_Name:</th>
-
<td>
-
<input type="text" name="lastName"
-
value=""
-
/>
-
</td>
-
</tr>
-
<tr>
-
<th>Specialty:</th>
-
<td>
-
<input type="text" name="specialty"
-
value=""
-
/>
-
</td>
-
</tr>
-
-
-
</table>
-
-
<input type="submit" value="Save"/>
-
</form>
-
-
</body>
-
-
</html>
edit.html
-
-
-
<html xmlns:th="http://www.thymeleaf.org">
-
-
<head>
-
<title>User Edit Form</title>
-
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-
<link rel="stylesheet" type="text/css" media="all" href="../../../css/style.css" th:href="@{/css/style.css}"/>
-
</head>
-
-
<body>
-
-
<h1>Edit User</h1>
-
-
<form action="update" method="post">
-
-
<input type="hidden" name="id" th:value="${user.id}"/>
-
-
<table>
-
<tr>
-
<th>First_Name:</th>
-
<td>
-
<input type="text" name="firstName"
-
th:value="${user.firstName}"
-
/>
-
</td>
-
</tr>
-
<tr>
-
<th>Last_Name:</th>
-
<td>
-
<input type="text" name="lastName"
-
th:value="${user.lastName}"
-
/>
-
</td>
-
</tr>
-
<tr>
-
<th>Specialty:</th>
-
<td>
-
<input type="text" name="specialty"
-
th:value="${user.specialty}"
-
/>
-
</td>
-
</tr>
-
-
-
</table>
-
<input type="submit" value="Save"/>
-
</form>
-
-
</body>
-
-
</html>
下载:https://github.com/allwaysoft/Servlet-Thymeleaf-Hibernate-Crud
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgkigah
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13