This commit is contained in:
landaiqing 2023-10-08 00:01:31 +08:00
commit 97b8fe951f
59 changed files with 4361 additions and 0 deletions

38
.gitignore vendored Normal file
View File

@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

10
.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,10 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# Zeppelin 忽略的文件
/ZeppelinRemoteNotebooks/

7
.idea/encodings.xml Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>

14
.idea/misc.xml Normal file
View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_18" default="true" project-jdk-name="18" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

124
.idea/uiDesigner.xml Normal file
View File

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

BIN
libs/fastjson-1.2.79.jar Normal file

Binary file not shown.

54
pom.xml Normal file
View File

@ -0,0 +1,54 @@
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.landaiqing</groupId>
<artifactId>MessageBook2</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>MessageBook2 Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<!--EL标签-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
</dependencies>
<build>
<finalName>MessageBook2</finalName>
</build>
</project>

View File

@ -0,0 +1,77 @@
package com.landaiqing.entity;
public class AdminUserEntity {
/**
*CREATE TABLE `admin-user` (
* `adminId` int NOT NULL AUTO_INCREMENT COMMENT 'ID',
* `adminUserName` varchar(25) NOT NULL COMMENT '管理员账号',
* `adminPassword` varchar(255) DEFAULT NULL COMMENT '管理员密码',
* PRIMARY KEY (`adminId`) USING BTREE
* ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
*/
private Integer adminId;
private String adminUserName;
private String adminPassword;
private Integer isValid;
public AdminUserEntity(String adminUserName, String adminPassword) {
this.adminUserName = adminUserName;
this.adminPassword = adminPassword;
}
public AdminUserEntity(){
}
public Integer getAdminId() {
return adminId;
}
public void setAdminId(Integer adminId) {
this.adminId = adminId;
}
public String getAdminUserName() {
return adminUserName;
}
public void setAdminUserName(String adminUserName) {
this.adminUserName = adminUserName;
}
public String getAdminPassword() {
return adminPassword;
}
public void setAdminPassword(String adminPassword) {
this.adminPassword = adminPassword;
}
public Integer getIsValid() {
return isValid;
}
public void setIsValid(Integer isValid) {
this.isValid = isValid;
}
public AdminUserEntity(Integer adminId, String adminUserName, String adminPassword, Integer isValid) {
this.adminId = adminId;
this.adminUserName = adminUserName;
this.adminPassword = adminPassword;
this.isValid = isValid;
}
// @Override
// public String toString() {
// return "AdminUserEntity{" +
// "adminId=" + adminId +
// ", adminUserName='" + adminUserName + '\'' +
// ", adminPassword='" + adminPassword + '\'' +
// ", isValid=" + isValid +
// '}';
// }
}

View File

@ -0,0 +1,124 @@
package com.landaiqing.entity;
import java.sql.Date;
public class UserEntity {
/**
* CREATE TABLE `user` (
* `userId` int NOT NULL AUTO_INCREMENT COMMENT 'ID',
* `nickname` varchar(50) DEFAULT NULL COMMENT '昵称',
* `qq` int DEFAULT NULL COMMENT 'QQ',
* `email` varchar(255) DEFAULT NULL COMMENT '邮箱',
* `content` longtext COMMENT '留言内容',
* `datetime` datetime DEFAULT NULL COMMENT '留言日期',
* `replyContent` longtext COMMENT '回复内容',
* `replyDateTime` datetime DEFAULT NULL COMMENT '回复时间',
* PRIMARY KEY (`userId`) USING BTREE
* ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
* */
private Integer userId;
private String nickName;
private String QQ;
private String email;
private String content;
private Date dateTime;
private String replyContent;
private Date replyDateTime;
public UserEntity(){
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getQQ() {
return QQ;
}
public void setQQ(String QQ) {
this.QQ = QQ;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getDateTime() {
return dateTime;
}
public void setDateTime(Date dateTime) {
this.dateTime = dateTime;
}
public String getReplyContent() {
return replyContent;
}
public void setReplyContent(String replyContent) {
this.replyContent = replyContent;
}
public Date getReplyDateTime() {
return replyDateTime;
}
public void setReplyDateTime(Date replyDateTime) {
this.replyDateTime = replyDateTime;
}
public UserEntity(Integer userId, String nickName, String QQ, String email, String content, Date dateTime, String replyContent, Date replyDateTime) {
this.userId = userId;
this.nickName = nickName;
this.QQ = QQ;
this.email = email;
this.content = content;
this.dateTime = dateTime;
this.replyContent = replyContent;
this.replyDateTime = replyDateTime;
}
// @Override
// public String toString() {
// return "UserEntity{" +
// "userId=" + userId +
// ", nickName='" + nickName + '\'' +
// ", QQ='" + QQ + '\'' +
// ", email='" + email + '\'' +
// ", content='" + content + '\'' +
// ", dateTime=" + dateTime +
// ", replyContent='" + replyContent + '\'' +
// ", replyDateTime=" + replyDateTime +
// '}';
// }
}

View File

@ -0,0 +1,21 @@
package com.landaiqing.mapper;
import com.landaiqing.entity.AdminUserEntity;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface adminMapper {
List<AdminUserEntity> login(@Param("adminUserName") String adminUserName,@Param("adminPassword") String adminPassword);
List<AdminUserEntity> selectAllAdmin();
int OpenAdmin(@Param("adminId") Integer adminId);
int CloseAdmin(@Param("adminId") Integer adminId);
AdminUserEntity getAdminByID(@Param("adminId")Integer adminId);
int updateAdmin(AdminUserEntity adminUserEntity);
int insertAdmin(AdminUserEntity adminUserEntity);
int deleteAdmin(Integer adminId);
}

View File

@ -0,0 +1,17 @@
package com.landaiqing.mapper;
import com.landaiqing.entity.UserEntity;
import java.util.ArrayList;
public interface userMapper {
ArrayList<UserEntity> list();
int insert(UserEntity userEntity);
int reply(UserEntity userEntity);
int deleteUser(Integer userId);
int update(UserEntity userEntity);
}

View File

@ -0,0 +1,69 @@
package com.landaiqing.service;
import com.landaiqing.entity.AdminUserEntity;
import com.landaiqing.mapper.adminMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class AdminUserService {
private adminMapper adminMapper;
private SqlSession sqlSession;
public AdminUserService()throws IOException {
// 通过无参构造方法 初始化mybatis 得到flightMapper
// mybatis-config.xml 目录位置
String resource = "mybatis-config.xml";
// 1.解析mybatis-config.xml 得到数据库相关的配置信息
InputStream inputStream = Resources.getResourceAsStream(resource);
//2.创建得到一个sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//3.获取到sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(true);
adminMapper = sqlSession.getMapper(adminMapper.class);
// sqlSession.close();
}
public List<AdminUserEntity> login(String adminUserName,String adminPassword){
return adminMapper.login(adminUserName,adminPassword);
}
public List<AdminUserEntity> selectAllAdmin(){
return adminMapper.selectAllAdmin();
}
public int OpenAdmin(Integer adminId){
int openAdmin = adminMapper.OpenAdmin(adminId);
// sqlSession.commit();
return openAdmin;
}
public int CloseAdmin( Integer adminId){
int closeAdmin = adminMapper.CloseAdmin(adminId);
// sqlSession.commit();
return closeAdmin;
}
public AdminUserEntity getAdminByID(@Param("adminId")Integer adminId){
return adminMapper.getAdminByID(adminId);
}
public int updateAdmin(AdminUserEntity adminUserEntity){
int updateAdmin = adminMapper.updateAdmin(adminUserEntity);
// sqlSession.commit();
return updateAdmin;
}
public int insertAdmin(AdminUserEntity adminUserEntity){
int insertAdmin = adminMapper.insertAdmin(adminUserEntity);
// sqlSession.commit();
return insertAdmin;
}
public int deleteAdmin(Integer adminId){
int deleteAdmin = adminMapper.deleteAdmin(adminId);
// sqlSession.commit();
return deleteAdmin;
}
}

View File

@ -0,0 +1,59 @@
package com.landaiqing.service;
import com.landaiqing.entity.UserEntity;
import com.landaiqing.mapper.userMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
public class UserService {
private SqlSession sqlSession;
private userMapper userMapper;
public UserService() throws IOException{
// 通过无参构造方法 初始化mybatis 得到flightMapper
// mybatis-config.xml 目录位置
String resource = "mybatis-config.xml";
// 1.解析mybatis-config.xml 得到数据库相关的配置信息
InputStream inputStream = Resources.getResourceAsStream(resource);
//2.创建得到一个sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//3.获取到sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(true);
userMapper = sqlSession.getMapper(userMapper.class);
// sqlSession.close();
}
public ArrayList<UserEntity> list(){
return userMapper.list();
}
public int insert(UserEntity userEntity){
int insert = userMapper.insert(userEntity);
// sqlSession.commit();
return insert;
}
public int reply(UserEntity userEntity){
int reply = userMapper.reply(userEntity);
// sqlSession.commit();
return reply;
}
public int deleteUser(Integer userId){
int deleteUser = userMapper.deleteUser(userId);
// sqlSession.commit();
return deleteUser;
}
public int update(UserEntity userEntity){
int update = userMapper.update(userEntity);
// sqlSession.commit();
return update;
}
}

View File

@ -0,0 +1,89 @@
package com.landaiqing.servlet;
import com.landaiqing.entity.AdminUserEntity;
import com.landaiqing.service.AdminUserService;
import com.landaiqing.utils.RandomValidateCode;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.*;
import org.apache.commons.lang3.StringUtils;
import java.io.IOException;
import java.util.List;
/**
* 管理员登录
*/
@WebServlet("/login")
public class AdminLoginServlet extends HttpServlet {
private AdminUserService adminUserService;
{
try {
adminUserService = new AdminUserService();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 转发login页面
req.getRequestDispatcher("login.jsp").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 点击登录的时候 获取到用户的参数
String userName = req.getParameter("username");
if (StringUtils.isEmpty(userName)) {
//转发到错误页面
req.setAttribute("errorMsg", "用户名称不能够是为空!");
req.getRequestDispatcher("error.jsp").forward(req, resp);
return;
}
String userPwd = req.getParameter("password");
// 参数验证
if (StringUtils.isEmpty(userPwd)) {
//转发到错误页面
req.setAttribute("errorMsg", "userPwd不能够是为空!");
req.getRequestDispatcher("error.jsp").forward(req, resp);
return;
}
String userCode = req.getParameter("code"); // 用户输入的图形验证码
// 从session中获取图形验证码
HttpSession session = req.getSession();
String sessionCode = (String) session.getAttribute(RandomValidateCode.RANDOMVALIDATECODE);
if (!sessionCode.equalsIgnoreCase(userCode)) {
req.setAttribute("errorMsg", "图形验证码不正确,请重新输入!");
req.getRequestDispatcher("error.jsp").forward(req, resp);
return;
}
// 在调用业务逻辑层
List<AdminUserEntity> adminUserEntity = adminUserService.login(userName, userPwd);
if (adminUserEntity == null) {
// 用户名称或者密码错误!
req.setAttribute("errorMsg", "用户名称或者是密码错误!");
req.getRequestDispatcher("error.jsp").forward(req, resp);
return;
}
// 判断用户是否记住密码
String rememberPassword = req.getParameter("remember");
if ("on".equals(rememberPassword)) {
// 如果有记住密码则 将密码保存在cookie中
Cookie userNameCookie = new Cookie("userName", userName);
Cookie userPwdCookie = new Cookie("userPwd", userPwd);
resp.addCookie(userNameCookie);
resp.addCookie(userPwdCookie);
}
// 能够db中查询到对象 登录成功了 将用户数据存放在session中
session = req.getSession();
session.setAttribute("user", adminUserEntity);
// 在转发到首页重定向到首页
// req.getRequestDispatcher("index.jsp").forward(req, resp);
resp.sendRedirect("./System/index.jsp");
}
}

View File

@ -0,0 +1,37 @@
package com.landaiqing.servlet;
import com.landaiqing.entity.UserEntity;
import com.landaiqing.service.UserService;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet("")
public class ListServlet extends HttpServlet {
private UserService userService;
{
try {
userService = new UserService();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<UserEntity> userEntities=userService.list();
req.setAttribute("list",userEntities);
req.getRequestDispatcher("index.jsp").forward(req,resp);
}
}

View File

@ -0,0 +1,83 @@
package com.landaiqing.servlet;
import com.landaiqing.entity.UserEntity;
import com.landaiqing.service.UserService;
import com.mysql.cj.util.StringUtils;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
@WebServlet("/publish")
public class PublishServlet extends HttpServlet {
private UserService userService;
{
try {
userService = new UserService();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
String name = req.getParameter("name");
if (StringUtils.isNullOrEmpty(name)){
req.setAttribute("errorMsg","name 的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
String qq = req.getParameter("qq");
if (StringUtils.isNullOrEmpty(qq)){
req.setAttribute("errorMsg","qq 的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
String email = req.getParameter("email");
if (StringUtils.isNullOrEmpty(email)){
req.setAttribute("errorMsg","arriveAirport 的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
String content = req.getParameter("content");
if (StringUtils.isNullOrEmpty(content)){
req.setAttribute("errorMsg","content 的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
Date time = new java.sql.Date(new Date().getTime());
UserEntity userEntity=new UserEntity();
userEntity.setNickName(name);
userEntity.setQQ(qq);
userEntity.setEmail(email);
userEntity.setContent(content);
userEntity.setDateTime((java.sql.Date) time);
int result = userService.insert(userEntity);
if (result<=0){
req.setAttribute("errorMsg","插入失败!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
userService.list();
resp.sendRedirect("index.jsp");
} catch (Exception e) {
req.setAttribute("errorMsg","系统异常!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
throw new RuntimeException(e);
}
}
}

View File

@ -0,0 +1,63 @@
package com.landaiqing.servlet;
import com.landaiqing.entity.UserEntity;
import com.landaiqing.service.UserService;
import com.mysql.cj.util.StringUtils;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
@WebServlet("/reply")
public class ReplyServlet extends HttpServlet {
private UserService userService;
{
try {
userService = new UserService();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
String userId = req.getParameter("userId");
if (StringUtils.isNullOrEmpty(userId)){
req.setAttribute("errorMsg","userId 的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
String replyContent = req.getParameter("replyContent");
if (StringUtils.isNullOrEmpty(replyContent)){
req.setAttribute("errorMsg","content 的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
Date time = new java.sql.Date(new Date().getTime());
UserEntity userEntity=new UserEntity();
userEntity.setUserId(Integer.valueOf(userId));
userEntity.setReplyContent(replyContent);
userEntity.setReplyDateTime((java.sql.Date) time);
int result = userService.reply(userEntity);
if (result<=0){
req.setAttribute("errorMsg","插入失败!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
resp.sendRedirect("index.jsp");
} catch (Exception e) {
req.setAttribute("errorMsg","系统异常!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
throw new RuntimeException(e);
}
}
}

View File

@ -0,0 +1,39 @@
package com.landaiqing.servlet;
import com.landaiqing.utils.RandomValidateCode;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 前台验证码处点击刷新,发送到该servlet的请求,
* 该servlet调用生成验证码的工具类返回一个图像验证码
*/
@WebServlet(name = "VerifycodeServlet", urlPatterns = "/VerifycodeServlet")
public class VerifycodeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpeg");//设置相应类型,告诉浏览器输出的内容为图片
response.setHeader("Pragma", "No-cache");//设置响应头信息告诉浏览器不要缓存此内容
//做浏览器兼容
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expire", 0);
RandomValidateCode randomValidateCode = new RandomValidateCode();
try {
randomValidateCode.getRandcode(request, response);//输出图片方法
} catch (Exception e) {
e.printStackTrace();
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

View File

@ -0,0 +1,68 @@
package com.landaiqing.servlet.system;
import com.landaiqing.entity.AdminUserEntity;
import com.landaiqing.service.AdminUserService;
import com.mysql.cj.util.StringUtils;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/addAdmin")
public class AddAdmin extends HttpServlet {
private AdminUserService adminUserService;
{
try {
adminUserService = new AdminUserService();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
String adminUseName = req.getParameter("adminUserName");
if (StringUtils.isNullOrEmpty(adminUseName)){
req.setAttribute("errorMsg","adminUseName 的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
String adminPassword = req.getParameter("adminPassword");
if (StringUtils.isNullOrEmpty(adminPassword)){
req.setAttribute("errorMsg","adminPassword 的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
String isValid = req.getParameter("isValid");
if (StringUtils.isNullOrEmpty(isValid)){
req.setAttribute("errorMsg","isValid 的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
AdminUserEntity adminUserEntity=new AdminUserEntity();
adminUserEntity.setAdminUserName(adminUseName);
adminUserEntity.setAdminPassword(adminPassword);
adminUserEntity.setIsValid(Integer.valueOf(isValid));
int result = adminUserService.insertAdmin(adminUserEntity);
if (result<=0){
req.setAttribute("errorMsg","插入失败!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
resp.sendRedirect("./System/index.jsp");
} catch (Exception e) {
req.setAttribute("errorMsg","系统异常!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
throw new RuntimeException(e);
}
}
}

View File

@ -0,0 +1,45 @@
package com.landaiqing.servlet.system;
import com.alibaba.fastjson.JSONObject;
import com.landaiqing.entity.AdminUserEntity;
import com.landaiqing.service.AdminUserService;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
@WebServlet("/adminList")
public class AllAdmin extends HttpServlet {
private AdminUserService adminUserService;
{
try {
adminUserService = new AdminUserService();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<AdminUserEntity> adminUserEntityList=adminUserService.selectAllAdmin();
PrintWriter writer=resp.getWriter();
String jsonString = JSONObject.toJSONString(adminUserEntityList);
System.out.println(jsonString);
writer.println(jsonString);
writer.close();
// req.setAttribute("allAdmin",adminUserEntityList);
// req.getRequestDispatcher("./System/index.jsp").forward(req,resp);
}
}

View File

@ -0,0 +1,51 @@
package com.landaiqing.servlet.system;
import com.landaiqing.service.AdminUserService;
import com.mysql.cj.util.StringUtils;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/closeAdmin")
public class CloseAdmin extends HttpServlet {
private AdminUserService adminUserService;
{
try {
adminUserService = new AdminUserService();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
String idStr = req.getParameter("id");
if (StringUtils.isNullOrEmpty(idStr)){
req.setAttribute("errorMsg","id的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
int result = adminUserService.CloseAdmin(Integer.valueOf(idStr));
if (result<=0){
req.setAttribute("errorMsg","修改失败!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
PrintWriter writer=resp.getWriter();
writer.println("修改成功!");
writer.close();
resp.sendRedirect("");
} catch (Exception e) {
req.setAttribute("errorMsg","系统异常!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
throw new RuntimeException(e);
}
}
}

View File

@ -0,0 +1,53 @@
package com.landaiqing.servlet.system;
import com.landaiqing.service.AdminUserService;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/deleteAdmin")
public class DeleteAdmin extends HttpServlet {
private AdminUserService adminUserService;
{
try {
adminUserService = new AdminUserService();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String idStr = req.getParameter("id");
if (idStr==null || idStr==""){
req.setAttribute("errorMsg","ID的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
try {
Integer id = Integer.parseInt(idStr);
int result = adminUserService.deleteAdmin(id);
if (result > 0) {
// req.getRequestDispatcher("showFlight.jsp").forward(req,resp);
resp.sendRedirect("./System/index.jsp");
}else {
req.setAttribute("errorMsg","删除失败!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
}
} catch (NumberFormatException e) {
req.setAttribute("errorMsg","类型转换异常,id 不能转换成Int类型!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
e.printStackTrace();
}catch (Exception e){
req.setAttribute("errorMsg","系统异常!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
}
}
}

View File

@ -0,0 +1,53 @@
package com.landaiqing.servlet.system;
import com.landaiqing.service.UserService;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/deleteUser")
public class DeleteUser extends HttpServlet {
private UserService userService;
{
try {
userService = new UserService();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String idStr = req.getParameter("id");
if (idStr==null || idStr==""){
req.setAttribute("errorMsg","ID的值不能为空!!!");
req.getRequestDispatcher("./error.jsp").forward(req,resp);
return;
}
try {
Integer id = Integer.parseInt(idStr);
int result = userService.deleteUser(id);
if (result > 0) {
// req.getRequestDispatcher("showFlight.jsp").forward(req,resp);
resp.sendRedirect("./System/index.jsp");
}else {
req.setAttribute("errorMsg","删除失败!!!");
req.getRequestDispatcher("./error.jsp").forward(req,resp);
}
} catch (NumberFormatException e) {
req.setAttribute("errorMsg","类型转换异常,id 不能转换成Int类型!!!");
req.getRequestDispatcher("./error.jsp").forward(req,resp);
e.printStackTrace();
}catch (Exception e){
req.setAttribute("errorMsg","系统异常!!!");
req.getRequestDispatcher("./error.jsp").forward(req,resp);
}
}
}

View File

@ -0,0 +1,100 @@
package com.landaiqing.servlet.system;
import com.landaiqing.entity.AdminUserEntity;
import com.landaiqing.service.AdminUserService;
import com.mysql.cj.util.StringUtils;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/updateAdmin")
public class GetAdminByID extends HttpServlet {
private AdminUserService adminUserService;
{
try {
adminUserService = new AdminUserService();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String idStr = req.getParameter("id");
if (idStr==null || idStr==""){
req.setAttribute("errorMsg","ID的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
try {
Integer id = Integer.parseInt(idStr);
AdminUserEntity adminUserEntity = adminUserService.getAdminByID(id);
if (adminUserEntity==null){
req.setAttribute("errorMsg","id不存在!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
req.setAttribute("adminByID",adminUserEntity);
req.getRequestDispatcher("./System/adminManage.jsp").forward(req,resp);
}catch (Exception e){
req.setAttribute("errorMsg","系统异常!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
String idStr = req.getParameter("id");
if (StringUtils.isNullOrEmpty(idStr)){
req.setAttribute("errorMsg","id的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
Integer id = Integer.parseInt(idStr);
String adminUserName = req.getParameter("adminUserName");
if (StringUtils.isNullOrEmpty(adminUserName)){
req.setAttribute("errorMsg","adminUserName 的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
String adminPassword = req.getParameter("adminPassword");
if (StringUtils.isNullOrEmpty(adminPassword)){
req.setAttribute("errorMsg","adminPassword 的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
String isValid = req.getParameter("isValid");
if (StringUtils.isNullOrEmpty(idStr)){
req.setAttribute("errorMsg","isValid 的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
AdminUserEntity adminUserEntity=new AdminUserEntity();
adminUserEntity.setAdminId(id);
adminUserEntity.setAdminUserName(adminUserName);
adminUserEntity.setAdminPassword(adminPassword);
adminUserEntity.setIsValid(Integer.valueOf(isValid));
int result = adminUserService.updateAdmin(adminUserEntity);
if (result<=0){
req.setAttribute("errorMsg","修改失败!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
resp.sendRedirect("./System/adminManage.jsp");
} catch (Exception e) {
req.setAttribute("errorMsg","系统异常!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
throw new RuntimeException(e);
}
}
}

View File

@ -0,0 +1,45 @@
package com.landaiqing.servlet.system;
import com.alibaba.fastjson.JSONObject;
import com.landaiqing.entity.UserEntity;
import com.landaiqing.service.UserService;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
@WebServlet("/listManage")
public class ListManage extends HttpServlet {
private UserService userService;
{
try {
userService = new UserService();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
List<UserEntity> userEntities=userService.list();
String jsonString = JSONObject.toJSONString(userEntities);
writer.println(jsonString);
writer.close();
// req.setAttribute("listManage",jsonString);
// req.getRequestDispatcher("./System/index.jsp").forward(req,resp);
}
}

View File

@ -0,0 +1,51 @@
package com.landaiqing.servlet.system;
import com.landaiqing.service.AdminUserService;
import com.mysql.cj.util.StringUtils;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/openAdmin")
public class OpenAdmin extends HttpServlet {
private AdminUserService adminUserService;
{
try {
adminUserService = new AdminUserService();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
String idStr = req.getParameter("id");
if (StringUtils.isNullOrEmpty(idStr)){
req.setAttribute("errorMsg","id的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
int result = adminUserService.OpenAdmin(Integer.valueOf(idStr));
if (result<=0){
req.setAttribute("errorMsg","修改失败!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
PrintWriter writer=resp.getWriter();
writer.println("修改成功!");
writer.close();
resp.sendRedirect("");
} catch (Exception e) {
req.setAttribute("errorMsg","系统异常!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
throw new RuntimeException(e);
}
}
}

View File

@ -0,0 +1,107 @@
package com.landaiqing.servlet.system;
import com.landaiqing.entity.UserEntity;
import com.landaiqing.service.UserService;
import com.mysql.cj.util.StringUtils;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Date;
@WebServlet("/update")
public class UpdateServlet extends HttpServlet {
private UserService userService;
{
try {
userService = new UserService();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
String idStr = req.getParameter("id");
if (StringUtils.isNullOrEmpty(idStr)){
req.setAttribute("errorMsg","id的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
Integer id = Integer.parseInt(idStr);
String nickName = req.getParameter("nickName");
if (StringUtils.isNullOrEmpty(nickName)){
req.setAttribute("errorMsg","nickName 的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
String qq = req.getParameter("qq");
if (StringUtils.isNullOrEmpty(qq)){
req.setAttribute("errorMsg","qq 的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
String email = req.getParameter("email");
if (StringUtils.isNullOrEmpty(idStr)){
req.setAttribute("errorMsg","email 的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
String content = req.getParameter("content");
if (StringUtils.isNullOrEmpty(idStr)){
req.setAttribute("errorMsg","content 的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
String DateTime = req.getParameter("dateTime");
if (StringUtils.isNullOrEmpty(idStr)){
req.setAttribute("errorMsg","DateTime 的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
String replyContent = req.getParameter("replyContent");
if (StringUtils.isNullOrEmpty(idStr)){
req.setAttribute("errorMsg","replyContent 的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
String replyDateTime = req.getParameter("replyDateTime");
if (StringUtils.isNullOrEmpty(idStr)){
req.setAttribute("errorMsg","replyDateTime 的值不能为空!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
UserEntity userEntity=new UserEntity();
userEntity.setUserId(id);
userEntity.setNickName(nickName);
userEntity.setQQ(qq);
userEntity.setEmail(email);
userEntity.setContent(content);
userEntity.setDateTime(Date.valueOf(DateTime));
userEntity.setReplyContent(replyContent);
userEntity.setReplyDateTime(Date.valueOf(replyDateTime));
int result = userService.update(userEntity);
if (result<=0){
req.setAttribute("errorMsg","修改失败!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
return;
}
resp.sendRedirect("./System/messageManage.jsp");
} catch (Exception e) {
req.setAttribute("errorMsg","系统异常!!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
throw new RuntimeException(e);
}
}
}

View File

@ -0,0 +1,34 @@
package com.landaiqing.test;
import com.landaiqing.entity.AdminUserEntity;
import com.landaiqing.mapper.adminMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class Test01 {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2.获取到获取到
SqlSession sqlSession = sqlSessionFactory.openSession();
// 3.根据 mapper id=getByUsers 执行该s ql 语句 通过 sql语句得到我们的对象 orm
// List<UserEntity> userEntitys = sqlSession.selectList("getByUsers", UserEntity.class);
adminMapper mapper = sqlSession.getMapper(adminMapper.class);
// System.out.println(mapper.login("666","666"));
// AdminUserEntity adminUserEntity = new AdminUserEntity();
// adminUserEntity.setAdminId(1);
// adminUserEntity.setAdminUserName("777");
// adminUserEntity.setAdminPassword("777");
// adminUserEntity.setIsValid(1);
System.out.println(mapper.deleteAdmin(4));
sqlSession.commit();
// System.out.println(userEntitys);
sqlSession.close();
}
}

View File

@ -0,0 +1,41 @@
package com.landaiqing.test;
import com.landaiqing.entity.UserEntity;
import com.landaiqing.mapper.adminMapper;
import com.landaiqing.mapper.userMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Date;
public class Test02 {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2.获取到获取到
SqlSession sqlSession = sqlSessionFactory.openSession();
// 3.根据 mapper id=getByUsers 执行该s ql 语句 通过 sql语句得到我们的对象 orm
// List<UserEntity> userEntitys = sqlSession.selectList("getByUsers", UserEntity.class);
userMapper mapper = sqlSession.getMapper(userMapper.class);
// System.out.println(mapper.login("666","666"));
UserEntity userEntity = new UserEntity();
userEntity.setQQ("888888");
userEntity.setNickName("888");
userEntity.setContent("8888");
userEntity.setEmail("88888");
userEntity.setUserId(10);
userEntity.setReplyContent("000000000");
Date time= new java.sql.Date(new java.util.Date().getTime());
userEntity.setReplyDateTime(time);
userEntity.setDateTime(time);
System.out.println(mapper.update(userEntity));
sqlSession.commit();
// System.out.println(userEntitys);
sqlSession.close();
}
}

View File

@ -0,0 +1,132 @@
package com.landaiqing.utils;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class JdbcUtils {
private JdbcUtils() {
}
/**
* 2.定义工具类 需要 声明 变量
*/
private static String driverClass;
private static String url;
private static String user;
private static String password;
/**
*3.使用静态代码快 来给我们声明好 jdbc变量赋值读取config.properties
*/
static {
try {
// 1.读取config.properties IO 路径 相对路径
InputStream resourceAsStream = JdbcUtils.class.getClassLoader().
getResourceAsStream("config.properties");
// 2.赋值给我们声明好的变量
Properties properties = new Properties();
properties.load(resourceAsStream);
driverClass = properties.getProperty("driverClass");
url = properties.getProperty("url");
user = properties.getProperty("user");
password = properties.getProperty("password");
// 3.注册驱动类
Class.forName(driverClass);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 4.封装连接方法
*/
public static Connection getConnection() throws SQLException {
Connection connection = DriverManager.getConnection(url, user, password);
return connection;
}
/**
* 5.封装释放连接方法 (重载)
*/
public static void closeConnection(ResultSet resultSet, Statement statement, Connection connection) {
// 1.查询 释放连接 resultSet statement connection
try {
if (resultSet != null)
resultSet.close();
if (statement != null)
statement.close();
if (connection != null)
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 增删改---释放jdbc资源
*
* @param statement
* @param connection
*/
public static void closeConnection(Statement statement, Connection connection) {
// 1.查询 释放连接 resultSet statement connection
closeConnection(null, statement, connection);
}
/**
* 开启事务
*
* @param connection
* @throws SQLException
*/
public static void beginTransaction(Connection connection) throws SQLException {
connection.setAutoCommit(false);
}
/**
* 提交事务
*
* @param connection
* @throws SQLException
*/
public static void commitTransaction(Connection connection) throws SQLException {
connection.commit();
}
/**
* 回滚事务
*
* @param connection
*/
public static void rollBackTransaction(Connection connection) {
if (connection != null) {
try {
connection.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 关闭事务
*
* @param connection
*/
public static void endTransaction(Connection connection) {
if (connection != null) {
try {
connection.setAutoCommit(true);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

View File

@ -0,0 +1,105 @@
package com.landaiqing.utils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;
/**
* 工具类,生成随机验证码
*/
public class RandomValidateCode {
public static final String RANDOMVALIDATECODE = "RandomValidateCode";// 放到session中的key
private Random random = new Random();
private String randString = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生的字符串
private int width = 100;// 图片宽度
private int height = 26;// 图片高度
private int lineSize = 40;// 干扰线数量
private int stringNum = 4;// 随机产生的字符数量
/**
* 获得字体
*/
private Font getFont() {
return new Font("Fixedsys", Font.CENTER_BASELINE, 18);
}
/**
* 获得颜色
*/
private Color getRandColor(int fc, int bc) {
if (fc > 255)
fc = 255;
if (bc > 255)
bc = 255;
int r = fc + random.nextInt(bc - fc - 16);
int g = fc + random.nextInt(bc - fc - 14);
int b = fc + random.nextInt(bc - fc - 18);
return new Color(r, g, b);
}
/**
* 生成随机图片
*/
public void getRandcode(HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession();
// BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,该对象可以在图像上进行各种绘制操作
g.fillRect(0, 0, width, height);
g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));
g.setColor(getRandColor(110, 133));
// 绘制干扰线
for (int i = 0; i <= lineSize; i++) {
drowLine(g);
}
// 绘制随机字符
String randomString = "";
for (int i = 1; i <= stringNum; i++) {
randomString = drowString(g, randomString, i);
}
session.removeAttribute(RANDOMVALIDATECODE);
session.setAttribute(RANDOMVALIDATECODE, randomString);
g.dispose();
try {
ImageIO.write(image, "JPEG", response.getOutputStream());// 将内存中的图片通过流动形式输出到客户端
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 绘制字符串
*/
private String drowString(Graphics g, String randomString, int i) {
g.setFont(getFont());
g.setColor(new Color(random.nextInt(101), random.nextInt(111), random.nextInt(121)));
String rand = getRandomString(random.nextInt(randString.length()));
randomString += rand;
g.translate(random.nextInt(3), random.nextInt(3));
g.drawString(rand, 13 * i, 16);
return randomString;
}
/**
* 绘制干扰线
*/
private void drowLine(Graphics g) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(13);
int yl = random.nextInt(15);
g.drawLine(x, y, x + xl, y + yl);
}
/**
* 获取随机的字符
*/
public String getRandomString(int num) {
return String.valueOf(randString.charAt(num));
}
}

View File

@ -0,0 +1,4 @@
driverClass=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/webguestbook?serverTimezone=GMT%2B8&useAffectedRows=true
user=root
password=1611

View File

@ -0,0 +1,37 @@
<?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">
<mapper namespace="com.landaiqing.mapper.adminMapper">
<resultMap id="adminMap" type="com.landaiqing.entity.AdminUserEntity">
<!-- 数据库中字段名称 column="" property="id" 类中成员属性名称-->
<id column="adminId" property="adminId"></id>
<result column="adminUserName" property="adminUserName"></result>
<result column="adminPassword" property="adminPassword"></result>
<result column="is_valid" property="isValid"></result>
</resultMap>
<insert id="insertAdmin" parameterType="com.landaiqing.entity.AdminUserEntity">
INSERT INTO `admin` (`adminId`, `adminUserName`, `adminPassword`, `is_valid`) VALUES (null, #{adminUserName}, #{adminPassword}, #{isValid});
</insert>
<update id="OpenAdmin" parameterType="int">
UPDATE `admin` SET `is_valid` = 1 WHERE `adminId` = #{adminId};
</update>
<update id="CloseAdmin" parameterType="int">
UPDATE `admin` SET `is_valid` = 0 WHERE `adminId` = #{adminId};
</update>
<update id="updateAdmin" parameterType="com.landaiqing.entity.AdminUserEntity">
UPDATE `admin` SET `adminUserName` = #{adminUserName}, `adminPassword` = #{adminPassword},`is_valid`=#{isValid} WHERE `adminId` = #{adminId};
</update>
<delete id="deleteAdmin" parameterType="int">
DELETE from `admin` WHERE `adminId` = #{adminId};
</delete>
<select id="login" parameterType="com.landaiqing.entity.AdminUserEntity" resultMap="adminMap">
select * from admin where adminUserName=#{adminUserName} and adminPassword=#{adminPassword} and is_valid='1';
</select>
<select id="selectAllAdmin" resultMap="adminMap">
select * from admin;
</select>
<select id="getAdminByID" resultType="com.landaiqing.entity.AdminUserEntity">
select * from admin where adminId=#{adminId};
</select>
</mapper>

View File

@ -0,0 +1,33 @@
<?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">
<mapper namespace="com.landaiqing.mapper.userMapper">
<resultMap id="userMap" type="com.landaiqing.entity.UserEntity">
<!-- 数据库中字段名称 column="" property="id" 类中成员属性名称-->
<id column="userId" property="userId"></id>
<result column="nickname" property="nickName"></result>
<result column="QQ" property="QQ"></result>
<result column="email" property="email"></result>
<result column="content" property="content"></result>
<result column="datetime" property="dateTime"></result>
<result column="replyContent" property="replyContent"></result>
<result column="replyDateTime" property="replyDateTime"></result>
</resultMap>
<insert id="insert" parameterType="com.landaiqing.entity.UserEntity">
INSERT INTO `webguestbook`.`user` (`userId`, `nickname`, `qq`, `email`, `content`, `datetime`, `replyContent`, `replyDateTime`) VALUES (null, #{nickName}, #{QQ}, #{email}, #{content} ,#{dateTime},null, null);
</insert>
<update id="reply" parameterType="com.landaiqing.entity.UserEntity">
UPDATE `webguestbook`.`user` SET `replyContent` = #{replyContent}, `replyDateTime` = #{replyDateTime} WHERE `userId` = #{userId};
</update>
<update id="update" parameterType="com.landaiqing.entity.UserEntity">
UPDATE `webguestbook`.`user` SET `nickname` = #{nickName}, `qq` = #{QQ}, `email` = #{email}, `content` = #{content}, `datetime` = #{dateTime}, `replyContent` = #{replyContent}, `replyDateTime` = #{replyDateTime} WHERE `userId` = #{userId};
</update>
<delete id="deleteUser" parameterType="int">
DELETE from `user` WHERE `userId` = #{userId};
</delete>
<select id="list" resultType="com.landaiqing.entity.UserEntity" resultMap="userMap">
select * from user ORDER BY datetime DESC ;
</select>
</mapper>

View File

@ -0,0 +1,26 @@
<?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>
<properties resource="config.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- <property name="driver" value="com.mysql.cj.jdbc.Driver"/>-->
<!-- <property name="url" value="jdbc:mysql://127.0.0.1:3306/notebook?serverTimezone=GMT%2B8"/>-->
<!-- <property name="username" value="root"/>-->
<!-- <property name="password" value="1611"/>-->
<property name="driver" value="${driverClass}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/adminMapper.xml"/>
<mapper resource="mapper/userMapper.xml"/>
</mappers>
</configuration>

View File

@ -0,0 +1,347 @@
<%--
Created by IntelliJ IDEA.
User: LDQ
Date: 2023/6/9
Time: 16:57
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<!-- 引入 layui.css -->
<link href="//unpkg.com/layui@2.8.0/dist/css/layui.css" rel="stylesheet">
<!-- 引入 layui.js -->
<script src="//unpkg.com/layui@2.8.0/dist/layui.js"></script>
</head>
<body>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-sm" lay-event="addAdmin">添加管理员</button>
</div>
</script>
<table class="layui-hide" id="ID-table-demo-data"></table>
<script type="text/html" id="ID-table-demo-templet-switch">
<!-- 这里的 checked 的状态值判断仅作为演示 -->
<input type="checkbox" id="checkbox" name="status" value="{{= d.adminId }}" title="开启|关闭" lay-skin="switch" lay-filter="status" {{= d.isValid == '1' ? "checked" : "" }}>
</script>
<script type="text/html" id="barDemo">
<div class="layui-clear-space">
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-xs" lay-event="more">
更多
<i class="layui-icon layui-icon-down"></i>
</a>
</div>
</script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
function getDate(){
axios({
// 请求方式
method: 'get',
// 请求的地址
url: 'http://localhost:8080${pageContext.request.contextPath}/adminList',
// URL 中的查询参数
params: {
}
}).then(function (result) {
layui.use('table', function(){
var table = layui.table;
var form = layui.form;
var dropdown = layui.dropdown;
// 已知数据渲染
var inst = table.render({
elem: '#ID-table-demo-data'
,toolbar: '#toolbarDemo'
,cols: [[ //标题栏
{field: 'adminId', title: 'ID', width: 80, sort: true}
,{field: 'adminUserName', title: '管理员', width: 180}
,{field: 'adminPassword', title: '密码', width: 200}
,{field: 'isValid', title: '是否有效', width: 150,templet: function(d){
if(d.isValid === 1){
return '<span style="color: green" title="有效">●</span>';
} else {
return '<span style="color: red" title="无效">●</span>';
}
}},
{title: '状态', width:100, templet: '#ID-table-demo-templet-switch'},
{fixed: 'right', title:'操作', width: 134, minWidth: 125, toolbar: '#barDemo'}
]],done:function (){
form.on('switch(status)', function (obj) {
var id = obj.value;
if(this.checked){
OpenAdmin(id);
}else{
CloseAdmin(id);
}
});
table.on('toolbar(ID-table-demo-data)', function(obj){
var id = obj.config.id;
var checkStatus = table.checkStatus(id);
var othis = lay(this);
switch(obj.event){
case 'addAdmin':
layer.open({
title: '添加管理员',
type: 1,
area: ['50%','80%'],
content: `<div id="warp">
<div style="display: flex;flex-direction: column;align-content: center;align-items: center;justify-content: center">
<div class="layui-form-item">
<label class="layui-form-label">管理员</label>
<div class="layui-input-block">
<input type="text" name="admin" id="adminUserName" autocomplete="off" class="layui-input" >
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">密码</label>
<div class="layui-input-block">
<input type="password" id="adminPassword" lay-verify="required" class="layui-input" >
</div>
</div>
<div class="layui-form-item" pane>
<label class="layui-form-label">是否有效</label>
<div class="layui-input-block">
<input type="text" id="isValid" placeholder="1 为有效/0为无效" name="open" lay-filter="required" class="layui-input" >
</div>
</div>
<div class="layui-form-item">
<button class="layui-btn" onclick="addAdmin()">确认</button>
<!-- <button type="close" class="layui-btn layui-btn-primary" onclick="close()">关闭</button>-->
</div>
</div>
</div>`,
});
break;
// case 'getData':
// var getData = table.getData(id);
// console.log(getData);
// layer.alert(layui.util.escape(JSON.stringify(getData)));
// break;
// case 'LAYTABLE_TIPS':
// layer.alert('自定义工具栏图标按钮');
// break;
};
});
// 触发单元格工具事件
table.on('tool(ID-table-demo-data)', function(obj){ // 双击 toolDouble
var data = obj.data; // 获得当前行数据
// console.log(obj)
if(obj.event === 'edit'){
layer.open({
title: '编辑 - id:'+ data.adminId,
type: 1,
area: ['50%','80%'],
content: `<div id="warp">
<div style="display: flex;flex-direction: column;align-content: center;align-items: center;justify-content: center">
<div class="layui-form-item">
<label class="layui-form-label">ID</label>
<div class="layui-input-block">
<input type="text" name="id" id="ID" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">管理员</label>
<div class="layui-input-block">
<input type="text" name="admin" id="adminUserName" autocomplete="off" class="layui-input" >
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">密码</label>
<div class="layui-input-block">
<input type="password" id="adminPassword" lay-verify="required" class="layui-input" >
</div>
</div>
<div class="layui-form-item" pane>
<label class="layui-form-label">是否有效</label>
<div class="layui-input-block">
<input type="text" id="isValid" placeholder="1 为有效/0为无效" name="open" lay-filter="required" class="layui-input" >
</div>
</div>
<div class="layui-form-item">
<button class="layui-btn" onclick="upAdateAdmin()">确认</button>
<!-- <button type="close" class="layui-btn layui-btn-primary" onclick="close()">关闭</button>-->
</div>
</div>
</div>`,
});
} else if(obj.event === 'more'){
// 更多 - 下拉菜单
dropdown.render({
elem: this, // 触发事件的 DOM 对象
show: true, // 外部事件触发即显示
data: [{
title: '查看',
id: 'detail'
},{
title: '删除',
id: 'del'
}],
click: function(menudata){
if(menudata.id === 'detail'){
layer.msg('ID:'+ data.adminId
+'\n管理员:'+data.adminUserName
+"\n密 码:"+data.adminPassword
+"\n是否有效:"+data.isValid);
} else if(menudata.id === 'del'){
layer.confirm('真的删除行 [id: '+ data.adminId +'] 么', function(){
obj.del(); // 删除对应行tr的DOM结构
// layer.close(index);
deleteAdmin(data.adminId);
// 向服务端发送删除指令
});
}
},
align: 'right', // 右对齐弹出
style: 'box-shadow: 1px 1px 10px rgb(0 0 0 / 12%);' // 设置额外样式
})
}
});
}
,data: result.data
//,skin: 'line' // 表格风格
//,even: true
,page: true // 是否显示分页
,limits: [5, 10, 15]
,limit: 5 // 每页默认显示的数量
});
});
})
}
getDate();
function OpenAdmin(id){
axios({
// 请求方式
method: 'get',
// 请求的地址
url: 'http://localhost:8080${pageContext.request.contextPath}/openAdmin',
// URL 中的查询参数
params: {
id:id
}
}).then(function (result) {
layer.msg('开启成功'), {
offset: '6px'
}
window.location.reload();
})
}
function CloseAdmin(id){
axios({
// 请求方式
method: 'get',
// 请求的地址
url: 'http://localhost:8080${pageContext.request.contextPath}/closeAdmin',
// URL 中的查询参数
params: {
id:id
}
}).then(function (result) {
layer.msg('关闭成功'), {
offset: '6px'
}
window.location.reload();
})
}
function upAdateAdmin(){
var id=document.getElementById('ID').value;
var adminUserName=document.getElementById('adminUserName').value;
var adminPassword=document.getElementById('adminPassword').value;
var isValid=document.getElementById('isValid').value;
axios({
// 请求方式
method: 'post',
// 请求的地址
url: 'http://localhost:8080${pageContext.request.contextPath}/updateAdmin',
// URL 中的查询参数
params: {
id:id,
adminUserName:adminUserName,
adminPassword:adminPassword,
isValid:isValid
}
}).then(function (result) {
layer.msg('修改成功!'), {
offset: '6px'
}
window.location.reload();
})
}
function deleteAdmin(id){
axios({
// 请求方式
method: 'get',
// 请求的地址
url: 'http://localhost:8080${pageContext.request.contextPath}/deleteAdmin',
// URL 中的查询参数
params: {
id:id,
}
}).then(function (result) {
layer.msg('删除成功!'), {
offset: '6px'
}
window.location.reload();
})
}
function addAdmin()
{
var adminUserName=document.getElementById('adminUserName').value;
var adminPassword=document.getElementById('adminPassword').value;
var isValid=document.getElementById('isValid').value;
axios({
// 请求方式
method: 'post',
// 请求的地址
url: 'http://localhost:8080${pageContext.request.contextPath}/addAdmin',
// URL 中的查询参数
params: {
adminUserName:adminUserName,
adminPassword:adminPassword,
isValid:isValid
}
}).then(function (result) {
layer.msg('添加成功!'), {
offset: '6px'
}
window.location.reload();
})
}
</script>
</body>
</html>

View File

@ -0,0 +1,325 @@
<%--
Created by IntelliJ IDEA.
User: LDQ
Date: 2023/6/8
Time: 19:48
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>留言本管理</title>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<!-- 引入 layui.css -->
<link href="//unpkg.com/layui@2.8.0/dist/css/layui.css" rel="stylesheet">
<!-- 引入 layui.js -->
<script src="//unpkg.com/layui@2.8.0/dist/layui.js"></script>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1">
<%-- <script type="text/javascript" src="./static/layui/layui.js"></script>--%>
<%-- <link rel="stylesheet" type="text/css" href="./static/layui/css/layui.css">--%>
</head>
<body>
<div class="layui-layout layui-layout-admin">
<div class="layui-header">
<div class="layui-logo">后台管理系统</div>
<ul class="layui-nav layui-layout-right">
<li class="layui-nav-item">
<a href="javascript:;">
<img src="../static/img/头像修改.png" class="layui-nav-img">
Admin
</a>
<%-- <dl class="layui-nav-child">--%>
<%-- <dd>--%>
<%-- <!--TODO -->--%>
<%-- <!--需要修改为自己项目的部分:-->--%>
<%-- <!--1、属性data-url需要在右边选项卡中打开的页面的路径 -->--%>
<%-- <!--2、属性data-title选项卡标题-->--%>
<%-- <!--3、属性data-id必须唯一tab选项卡根据这个值进行切换-->--%>
<%-- <a href="#" data-url="profile" data-title="个人资料" data-id="44" class="site-demo-active"--%>
<%-- data-type="tabAdd">--%>
<%-- 个人资料--%>
<%-- </a>--%>
<%-- </dd>--%>
<%-- <dd>--%>
<%-- <!--TODO -->--%>
<%-- <!--需要修改为自己项目的部分:-->--%>
<%-- <!--1、属性data-url需要在右边选项卡中打开的页面的路径 -->--%>
<%-- <!--2、属性data-title选项卡标题-->--%>
<%-- <!--3、属性data-id必须唯一tab选项卡根据这个值进行切换-->--%>
<%-- <a href="#" data-url="password" data-title="修改密码" data-id="55" class="site-demo-active" data-type="tabAdd">--%>
<%-- 修改密码--%>
<%-- </a>--%>
<%-- </dd>--%>
<%-- </dl>--%>
</li>
<li class="layui-nav-item">
<!--TODO -->
<!--可能需要修改路径-->
<a href="${pageContext.request.contextPath}/">返回首页</a>
</li>
</ul>
</div>
<!-- 左侧导航栏 -->
<div class="layui-tab layui-side layui-tab-card site-demo-button">
<ul class="layui-nav layui-side layui-nav-tree layui-nav-side">
<li class="layui-nav-item layui-nav-itemed">
<a href="javascript:;">系统管理</a>
<dl class="layui-nav-child">
<dd>
<!--TODO -->
<!--需要修改为自己项目的部分:-->
<!--1、属性data-url需要在右边选项卡中打开的页面的路径 -->
<!--2、属性data-title选项卡标题-->
<!--3、属性data-id必须唯一tab选项卡根据这个值进行切换-->
<!--4、id也必须唯一这里id设置为default-tab设置该选项卡为默认显示的-->
<a href="#" data-url="${pageContext.request.contextPath}/System/adminManage" data-title="管理员管理" data-id="11" id="default-tab" class="site-demo-active"
data-type="tabAdd">
管理员管理
</a>
</dd>
<dd>
<!--TODO -->
<!--需要修改为自己项目的部分:-->
<!--1、属性data-url需要在右边选项卡中打开的页面的路径 -->
<!--2、属性data-title选项卡标题-->
<!--3、属性data-id必须唯一tab选项卡根据这个值进行切换-->
<a href="#" data-url="${pageContext.request.contextPath}/System/messageManage" data-title="留言管理" data-id="22" class="site-demo-active"
data-type="tabAdd">
留言管理
</a>
</dd>
<%-- <dd>--%>
<%-- <!--TODO -->--%>
<%-- <!--需要修改为自己项目的部分:-->--%>
<%-- <!--1、属性data-url需要在右边选项卡中打开的页面的路径 -->--%>
<%-- <!--2、属性data-title选项卡标题-->--%>
<%-- <!--3、属性data-id必须唯一tab选项卡根据这个值进行切换-->--%>
<%-- <a href="#" data-url="profile" data-title="考核管理" data-id="33" class="site-demo-active"--%>
<%-- data-type="tabAdd">--%>
<%-- 考核管理--%>
<%-- </a>--%>
<%-- </dd>--%>
</dl>
</li>
<%-- <li class="layui-nav-item layui-nav-itemed">--%>
<%-- <a href="javascript:;">个人管理</a>--%>
<%-- <dl class="layui-nav-child">--%>
<%-- <dd>--%>
<%-- <!--TODO -->--%>
<%-- <!--需要修改为自己项目的部分:-->--%>
<%-- <!--1、属性data-url需要在右边选项卡中打开的页面的路径 -->--%>
<%-- <!--2、属性data-title选项卡标题-->--%>
<%-- <!--3、属性data-id必须唯一tab选项卡根据这个值进行切换-->--%>
<%-- <a href="#" data-url="profile" data-title="个人资料" data-id="44" class="site-demo-active"--%>
<%-- data-type="tabAdd">--%>
<%-- 个人资料--%>
<%-- </a>--%>
<%-- </dd>--%>
<%-- <dd>--%>
<%-- <!--TODO -->--%>
<%-- <!--需要修改为自己项目的部分:-->--%>
<%-- <!--1、属性data-url需要在右边选项卡中打开的页面的路径 -->--%>
<%-- <!--2、属性data-title选项卡标题-->--%>
<%-- <!--3、属性data-id必须唯一tab选项卡根据这个值进行切换-->--%>
<%-- <a href="#" data-url="password" data-title="修改密码" data-id="55" class="site-demo-active"--%>
<%-- data-type="tabAdd">--%>
<%-- 修改密码--%>
<%-- </a>--%>
<%-- </dd>--%>
<%-- </dl>--%>
<%-- </li>--%>
</ul>
</div>
<div class="layui-body">
<!-- 内容主体区域 -->
<div class="layui-tab" lay-filter="demo" lay-allowClose="true">
<!--tab页标题-->
<ul class="layui-tab-title">
</ul>
<!--tab页标题上右键出现下面的 关闭当前和关闭所有的选项-->
<ul class="rightMenu" style="display: none;position: absolute;">
<li data-type="closeThis" class="layui-bg-cyan">关闭当前</li>
<li data-type="closeAll" class="layui-bg-cyan">关闭所有</li>
</ul>
<!--tab页主体内容区域-->
<div class="layui-tab-content">
</div>
</div>
</div>
<div class="layui-footer">
<!-- 底部固定区域 -->
© landaiqing.space - 后台管理系统
</div>
</div>
<script>
layui.use(['element','layer'], function () {
var $ = layui.jquery;
var element = layui.element; //Tab的切换功能切换事件监听等需要依赖element模块
//触发事件
var active = {
// 在这里给active绑定几项事件后面可通过active调用这些事件
tabAdd: function (url, id, name) {
// 新增一个Tab项 传入三个参数分别对应其标题tab页面的地址还有一个规定的id是标签中data-id的属性值
// 关于tabAdd的方法所传入的参数可看layui的开发文档中基础方法部分
element.tabAdd('demo', {
title: name,
// TODO
// 这里的选项卡页面路径: src="' + url + '.html" ,可能需要根据自己项目实际的后缀名修改
content: '<iframe data-frameid="' + id + '" scrolling="auto" frameborder="0" src="' + url + '.jsp" style="width:100%;height:99%;"></iframe>',
id: id // 规定好的id
})
CustomRightClick(id); // 自定义函数给tab绑定右击事件
FrameWH(); // 自定义函数计算iframe层的大小
},
tabChange: function (id) {
// 切换到指定Tab项
element.tabChange('demo', id); // 根据传入的id传入到指定的tab项
},
tabDelete: function (id) {
element.tabDelete("demo", id);// 删除
}
, tabDeleteAll: function (ids) {// 删除所有
$.each(ids, function (i, item) {
element.tabDelete("demo", item); //ids是一个数组里面存放了多个id调用tabDelete方法分别删除
})
}
};
// 当点击有site-demo-active属性的标签时即左侧菜单栏中内容 ,触发点击事件
$('.site-demo-active').on('click', function () {
var dataid = $(this);
// 这时会判断右侧.layui-tab-title属性下的有lay-id属性的li的数目即已经打开的tab项数目
if ($(".layui-tab-title li[lay-id]").length <= 0) {
// 如果比零小则直接打开新的tab项
active.tabAdd(dataid.attr("data-url"), dataid.attr("data-id"), dataid.attr("data-title"));
} else {
// 否则判断该tab项是否已经存在
var isData = false; //初始化一个标志为false说明未打开该tab项 为true则说明已有
$.each($(".layui-tab-title li[lay-id]"), function () {
//如果点击左侧菜单栏所传入的id 在右侧tab项中的lay-id属性可以找到则说明该tab项已经打开
if ($(this).attr("lay-id") == dataid.attr("data-id")) {
isData = true;
}
})
if (isData == false) {
//标志为false 新增一个tab项
active.tabAdd(dataid.attr("data-url"), dataid.attr("data-id"), dataid.attr("data-title"));
}
}
// 最后不管是否新增tab最后都转到要打开的选项页面上
active.tabChange(dataid.attr("data-id"));
});
function CustomRightClick(id) {
//取消右键 rightMenu属性开始是隐藏的 ,当右击的时候显示,左击的时候隐藏
$('.layui-tab-title li').on('contextmenu', function () {
return false;
})
$('.layui-tab-title,.layui-tab-title li').click(function () {
$('.rightMenu').hide();
});
//桌面点击右击
$('.layui-tab-title li').on('contextmenu', function (e) {
var popupmenu = $(".rightMenu");
popupmenu.find("li").attr("data-id", id); //在右键菜单中的标签绑定id属性
//判断右侧菜单的位置
l = ($(document).width() - e.clientX) < popupmenu.width() ? (e.clientX - popupmenu.width()) : e.clientX;
t = ($(document).height() - e.clientY) < popupmenu.height() ? (e.clientY - popupmenu.height()) : e.clientY;
popupmenu.css({left: l, top: t}).show(); //进行绝对定位
//alert("右键菜单")
return false;
});
}
$(".rightMenu li").click(function () {
//右键菜单中的选项被点击之后判断type的类型决定关闭所有还是关闭当前。
if ($(this).attr("data-type") == "closeThis") {
//如果关闭当前即根据显示右键菜单时所绑定的id执行tabDelete
active.tabDelete($(this).attr("data-id"))
} else if ($(this).attr("data-type") == "closeAll") {
var tabtitle = $(".layui-tab-title li");
var ids = new Array();
$.each(tabtitle, function (i) {
ids[i] = $(this).attr("lay-id");
})
//如果关闭所有 即将所有的lay-id放进数组执行tabDeleteAll
active.tabDeleteAll(ids);
}
$('.rightMenu').hide(); //最后再隐藏右键菜单
})
// 计算frame高度
function FrameWH() {
var h = $(window).height() - 41 - 10 - 60 - 10 - 44 - 10;
$("iframe").css("height", h + "px");
}
$(window).resize(function () {
FrameWH();
})
var layer = layui.layer;
layer.ready(function(){
// layer.msg('您已进入页面了!');
// 触发点击事件,这样就可以设置默认显示的选项卡页面
// TODO
// 可能需要修改的地方标签id值
$("#default-tab").trigger( "click" );
});
});
</script>
</body>
</html>

View File

@ -0,0 +1,315 @@
<%--
Created by IntelliJ IDEA.
User: LDQ
Date: 2023/6/9
Time: 16:57
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<!-- 引入 layui.css -->
<link href="//unpkg.com/layui@2.8.0/dist/css/layui.css" rel="stylesheet">
<!-- 引入 layui.js -->
<script src="//unpkg.com/layui@2.8.0/dist/layui.js"></script>
</head>
<body>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-sm" lay-event="upadte">修 改</button>
</div>
</script>
<script type="text/html" id="barDemo">
<div class="layui-clear-space">
<%-- <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>--%>
<a class="layui-btn layui-btn-xs" lay-event="more">
更多
<i class="layui-icon layui-icon-down"></i>
</a>
</div>
</script>
<table class="layui-hide" id="ID-table-demo-data"></table>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
function getDate(){
axios({
// 请求方式
method: 'get',
// 请求的地址
url: 'http://localhost:8080${pageContext.request.contextPath}/listManage',
// URL 中的查询参数
params: {
}
}).then(function (result) {
console.log(result);
layui.use('table', function(){
var table = layui.table;
var form = layui.form;
var dropdown = layui.dropdown;
var laydate = layui.laydate;
var util = layui.util;
// 已知数据渲染
var inst = table.render({
elem: '#ID-table-demo-data'
,toolbar: '#toolbarDemo'
,cols: [[ //标题栏
{field: 'userId', title: 'ID', width: 80, sort: true}
,{field: 'nickName', title: '昵称', width: 130}
,{field: 'qQ', title: 'QQ', width: 130}
,{field: 'email', title: '邮箱', width: 180},
{field:'content', title: '评论内容', width:250, },
{field:'dateTime', title: '评论时间', width:130, },
{field:'replyContent', title: '回复内容', width:200, },
{field:'replyDateTime', title: '回复时间', width:130, },
{fixed: 'right', title:'操作', width: 134, minWidth: 125, toolbar: '#barDemo'}
// {fixed: 'right', title:'操作', width: 134, minWidth: 125, toolbar: '#barDemo'}
]],done:function (){
// 触发单元格工具事件
table.on('tool(ID-table-demo-data)', function(obj){ // 双击 toolDouble
var data = obj.data; // 获得当前行数据
// console.log(obj)
if(obj.event === 'more'){
// 更多 - 下拉菜单
dropdown.render({
elem: this, // 触发事件的 DOM 对象
show: true, // 外部事件触发即显示
data: [{
title: '查看',
id: 'detail'
},{
title: '删除',
id: 'del'
}],
click: function(menudata){
if(menudata.id === 'detail'){
layer.msg('ID:'+ data.userId
+'\n昵称:'+data.nickName
+"\nQ Q:"+data.qQ
+"\nEmail:"+data.email
+"\n评论内容:"+data.content
+"\n评论时间:"+data.dateTime
+"\n回复内容:"+data.replyContent
+"\n回复时间:"+data.replyDateTime
);
} else if(menudata.id === 'del'){
layer.confirm('真的删除行 [id: '+ data.userId +'] 么', function(){
obj.del(); // 删除对应行tr的DOM结构
// layer.close(index);
// deleteAdmin(data.adminId);
deleteUser(data.userId);
// 向服务端发送删除指令
});
}
},
align: 'right', // 右对齐弹出
style: 'box-shadow: 1px 1px 10px rgb(0 0 0 / 12%);' // 设置额外样式
})
}
});
table.on('toolbar(ID-table-demo-data)', function(obj){
var id = obj.config.id;
var checkStatus = table.checkStatus(id);
var othis = lay(this);
switch(obj.event){
case 'upadte':
layer.open({
title: '修改',
type: 1,
area: ['80%','80%'],
content: `<div id="warp">
<div style="display: flex;flex-direction: column;align-content: center;align-items: center;justify-content: center">
<form class="layui-form" lay-filter="scoreRuleForm">
<div class="layui-form-item">
<label class="layui-form-label">ID</label>
<div class="layui-input-block">
<input type="text" name="id" id="id" autocomplete="off" class="layui-input" placeholder="被修改数据ID">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">昵 称</label>
<div class="layui-input-block">
<input type="text" id="nickName" name="nickName" class="layui-input" >
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">QQ</label>
<div class="layui-input-block">
<input type="text" id="qq" name="qq" class="layui-input" >
</div>
</div>
<div class="layui-form-item" pane>
<label class="layui-form-label">Email</label>
<div class="layui-input-block">
<input type="text" id="email" name="email" lay-filter="required" class="layui-input" >
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">评论内容</label>
<div class="layui-input-block">
<textarea placeholder="请输入评论内容" id="content" name="content" class="layui-textarea"></textarea>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">评论日期</label>
<div class="layui-input-inline layui-input-wrap">
<div class="layui-input-prefix">
<i class="layui-icon layui-icon-date"></i>
</div>
<input type="text" name="dateTime" id="dateTime" lay-verify="date" placeholder="yyyy-MM-dd" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">回复内容</label>
<div class="layui-input-block">
<textarea placeholder="请输入回复内容" id="replyContent" name="replyContent" class="layui-textarea"></textarea>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">回复日期</label>
<div class="layui-input-inline layui-input-wrap">
<div class="layui-input-prefix">
<i class="layui-icon layui-icon-date"></i>
</div>
<input type="text" name="replyDateTime" id="replyDateTime" lay-verify="date" placeholder="yyyy-MM-dd" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<button type="submit" class="layui-btn" lay-submit lay-filter="demo1">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
</div>
</div>`,
});
break;
// case 'getData':
// var getData = table.getData(id);
// console.log(getData);
// layer.alert(layui.util.escape(JSON.stringify(getData)));
// break;
// case 'LAYTABLE_TIPS':
// layer.alert('自定义工具栏图标按钮');
// break;
};
});
// 日期
form.on('submit(demo1)', function(data){
var field = data.field; // 获取表单字段值
// 显示填写结果,仅作演示用
layer.alert(JSON.stringify(field), {
title: '当前填写的字段值'
});
$.ajax({
url:"http://localhost:8080${pageContext.request.contextPath}/update",
async:false,
type:"POST",
dataType:"text",
data:field,
success:function(){
window.location.reload();
}
})
layer.alert(JSON.stringify(data.field), {
})
return false; // 阻止默认 form 跳转
});
}
,data: result.data
//,skin: 'line' // 表格风格
//,even: true
,page: true // 是否显示分页
,limits: [5, 10, 15]
,limit: 5 // 每页默认显示的数量
});
});
})
}
getDate();
function deleteUser(id){
axios({
// 请求方式
method: 'get',
// 请求的地址
url: 'http://localhost:8080${pageContext.request.contextPath}/deleteUser',
// URL 中的查询参数
params: {
id:id,
}
}).then(function (result) {
layer.msg('删除成功!'), {
offset: '6px'
}
})
}
layui.use('laydate', function(){
var laydate = layui.laydate;
laydate.render({
elem: '#dateTime',
});
laydate.render({
elem: '#replyDateTime',
});
});
<%--function update(){--%>
<%-- var id=document.getElementById('id').value;--%>
<%-- var nickName=document.getElementById('nickName').value;--%>
<%-- var qq=document.getElementById('qq').value;--%>
<%-- var email=document.getElementById('email').value;--%>
<%-- var content=document.getElementById('content').value;--%>
<%-- var replyContent=document.getElementById('replyContent').value;--%>
<%-- var dateTime=document.getElementById('dateTime').value;--%>
<%-- var ReplyDateTime=document.getElementById('ReplyDateTime').value;--%>
<%-- axios({--%>
<%-- // 请求方式--%>
<%-- method: 'post',--%>
<%-- // 请求的地址--%>
<%-- url: 'http://localhost:8080${pageContext.request.contextPath}/update',--%>
<%-- // URL 中的查询参数--%>
<%-- params: {--%>
<%-- id:id,--%>
<%-- nickName:nickName,--%>
<%-- qq:qq,--%>
<%-- email:email,--%>
<%-- content:content,--%>
<%-- replyContent:replyContent,--%>
<%-- dateTime:dateTime,--%>
<%-- ReplyDateTime:ReplyDateTime--%>
<%-- }--%>
<%-- }).then(function (result) {--%>
<%-- layer.msg('修改成功!'), {--%>
<%-- offset: '6px'--%>
<%-- }--%>
<%-- window.location.reload();--%>
<%-- })--%>
<%--}--%>
</script>
</body>
</html>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
</web-app>
<!--<!DOCTYPE web-app PUBLIC-->
<!-- "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"-->
<!-- "http://java.sun.com/dtd/web-app_2_3.dtd" >-->
<!--<web-app>-->
<!-- <display-name>Archetype Created Web Application</display-name>-->
<!--</web-app>-->

16
src/main/webapp/error.jsp Normal file
View File

@ -0,0 +1,16 @@
<%--
Created by IntelliJ IDEA.
User: LDQ
Date: 2023/6/9
Time: 1:32
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${errorMsg}
</body>
</html>

525
src/main/webapp/index.jsp Normal file
View File

@ -0,0 +1,525 @@
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
Created by IntelliJ IDEA.
User: landaiqing
Date: 2023/6/8
Time: 19:20
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>--%>
<%--<%@ taglib uri= "http://java.sun.com/jsp/jstl/core" prefix="c" %>--%>
<html>
<head>
<title>留言本</title>
<%-- Lay-ui组件库--%>
<%-- <script type="text/javascript" src="./static/layui/layui.js"></script>--%>
<%-- &lt;%&ndash; Lay-ui样式&ndash;%&gt;--%>
<%-- <link rel="stylesheet" type="text/css" href="./static/layui/css/layui.css">--%>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<!-- 引入 layui.css -->
<link href="//unpkg.com/layui@2.8.0/dist/css/layui.css" rel="stylesheet">
<!-- 引入 layui.js -->
<script src="//unpkg.com/layui@2.8.0/dist/layui.js">
// <link rel="stylesheet" href="./static/css/index.css" type="text/css">
// <script language=JavaScript type="text/javascript" src="static/js/index.js"></script>
<style type="text/css">
@IMPORT url("./static/css/index.css");
.submit {
width: 100px;
height: 40px;
border-radius: 20px;
background-color: #1dc48c;
}
.layui-icon-down {
color: black;
}
.layui-nav .layui-nav-more {
position: absolute;
top: -13px;
right: 3px;
left: auto !important;
margin-top: 0;
font-size: 12px;
cursor: pointer;
transition: all .2s;
-webkit-transition: all .2s;
}
</style>
</head>
<body>
<div class="main">
<div class="header">
<div style="display: flex;position: fixed;flex-direction: row;flex-wrap: nowrap;align-items: center;z-index: 99999;background-color: white">
<div style="width: 570px;height: 45px;">
<span style="font-size: 2rem;font-weight: 700;font-family: FZShuTi;color:coral;">留 &nbsp;&nbsp;言&nbsp;&nbsp; 本</span>
</div>
<button type="button" class="layui-btn layui-btn-warm layui-btn-radius" lay-on="wrap">
<i class="layui-icon layui-icon-edit"></i>
发布留言
</button>
<!-- <button type="button" class="layui-btn layui-btn-radius" lay-on="admin">
<i class="layui-icon layui-icon-set-fill"></i>
管理
</button> -->
<div>
<ul class="layui-nav" style="background: transparent;">
<li class="layui-nav-item" lay-unselect>
<a href="javascript:;">
<img src="./static/img/touxiang.png" class="layui-nav-img">
</a>
<dl class="layui-nav-child">
<button type="button" class="layui-btn layui-btn-radius" lay-on="admin">
<i class="layui-icon layui-icon-set-fill"></i>
管理
</button>
</dl>
</li>
</ul>
</div>
</div>
</div>
<blockquote style="margin-top: 6%" class="layui-elem-quote layui-text">
留言列表
</blockquote>
<!-- 管理员登陆 -->
<div class="layui-form" id="adminform" lay-filter="filter-test-layer" style="margin: 16px;display: none;">
<form action="/MessageBook2_war_exploded/login" method="post">
<div class="demo-login-container">
<div class="layui-form-item">
<div class="layui-input-wrap">
<div class="layui-input-prefix">
<i class="layui-icon layui-icon-username"></i>
</div>
<input type="text" name="username" value="" lay-verify="required" placeholder="用户名"
lay-reqtext="请填写用户名" autocomplete="off" class="layui-input" lay-affix="clear">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-wrap">
<div class="layui-input-prefix">
<i class="layui-icon layui-icon-password"></i>
</div>
<input type="password" name="password" value="" lay-verify="required" placeholder="密 码"
lay-reqtext="请填写密码" autocomplete="off" class="layui-input" lay-affix="eye">
</div>
</div>
<div class="layui-form-item">
<div class="layui-row">
<div class="layui-col-xs7">
<div class="layui-input-wrap">
<div class="layui-input-prefix">
<i class="layui-icon layui-icon-vercode"></i>
</div>
<input type="text" name="code" value="" lay-verify="required" placeholder="验证码"
lay-reqtext="请填写验证码" autocomplete="off" class="layui-input"
lay-affix="clear">
</div>
</div>
<div class="layui-col-xs5">
<div style="margin-left: 10px;">
<img src=VerifycodeServlet
onclick="this.src='VerifycodeServlet?'+ new Date().getTime();">
</div>
</div>
</div>
</div>
<div class="layui-form-item">
<input type="checkbox" name="remember" lay-skin="primary" title="记住密码">
</div>
<div class="layui-form-item">
<input class="submit" type="submit" value="登录"/>
</div>
</div>
</form>
</div>
<!-- 发布留言的主体 -->
<div class="wrap" id="warp" style="display: none;">
<div class="userIfo">
<div class="layui-panel">
<div style="padding: 32px;" class="panel">
<div class="layui-input-wrap">
<div class="layui-input-prefix">
<i class="layui-icon layui-icon-username"></i>
</div>
<input type="text" id="name" name="name" placeholder="昵称" class="layui-input">
</div>
<div class="layui-input-wrap">
<div class="layui-input-prefix">
<i class="layui-icon layui-icon-login-qq"></i>
</div>
<input type="text" id="qq" name="qq" placeholder="QQ" class="layui-input">
</div>
<div class="layui-input-wrap">
<div class="layui-input-prefix">
<i class="layui-icon layui-icon-email"></i>
</div>
<input type="text" id="email" name="email" placeholder="Email" class="layui-input">
</div>
</div>
</div>
</div>
<div class="layui-panel">
<div class="wrap-head">
<div class="head-logo">
<img src="./static/img/留言.png" style="height: 20px;width: 20px;"/>
</div>
<div class="head-txt">
<a class="title-txt"
href="javascript:void(0)">言无有善恶也,苟有得乎吾心而言也,则其辞不索而获。</a>
</div>
</div>
<div class="main-txt">
<textarea name="content" id="content" rows="" cols="" class="main-area"></textarea>
</div>
<div class="warp-footer">
<div class="warp-icon-cont">
<ul>
<li><img src="./static/img/发表情.png" alt=""/>
<a href="javascript:void(0)">表情</a>
</li>
<li><img src="./static/img/图片_填充.png" alt=""/>
<a href="javascript:void(0)">图片</a>
</li>
<li><img src="./static/img/视频_填充.png" alt=""/>
<a href="javascript:void(0)">视频</a>
</li>
<li><img src="./static/img/话题选中.png" alt=""/>
<a href="javascript:void(0)">话题</a>
</li>
<li><img src="./static/img/文章.png" alt=""/>
<a href="javascript:void(0)">文章</a>
</li>
</ul>
</div>
<div class="warp-footer-btns">
<div class="release-btn">
<a href="javascript:publish()">发布</a>
</div>
</div>
</div>
</div>
</div>
<!-- 显示留言的主体 -->
<c:forEach items="${list}" var="list" varStatus="i">
<div class="show">
<div class="show-content">
<div class="show-name">
<div class="avtors"><img src="./static/img/头像修改.png" alt=""
style="width: 40px;height: 40px;border-radius: 50%;"></div>
<span style="margin-left: 10px;font-size: 1rem;">${list.nickName}</span>
</div>
<div class="show-txt">
<p class="">${list.content}</p>
</div>
<div class="show-time">${list.dateTime}</div>
<!-- <button type="button" class="layui-btn layui-btn-xs" lay-on="wrap">
<i class="layui-icon layui-icon-release"></i> 回复
</button> -->
<div class="layui-panel">
<c:choose>
<c:when test="${not empty list.replyContent && !(list.replyContent eq null)}">
<div class="comment-wrap">
<div class="photo">
<div class="avatar" style="background-image: url('./static/img/头像修改.png')"></div>
</div>
<div class="comment-block">
<p class="comment-text">${list.replyContent}</p>
<div class="bottom-comment">
<div class="comment-date">${list.replyDateTime}</div>
</div>
</div>
</div>
<%-- <div class="comments">--%>
<%-- <div class="comment-wrap">--%>
<%-- <div class="photo">--%>
<%-- <div class="avatar" style="background-image: url('./static/img/头像修改.png')"></div>--%>
<%-- </div>--%>
<%-- <div class="comment-block">--%>
<%-- <form action="">--%>
<%-- <textarea name="content" id="replyContent" cols="30" rows="3" placeholder="Say somthing..."--%>
<%-- style="resize:none"></textarea>--%>
<%-- <button type="button" class="layui-btn layui-btn-xs" onclick="reply(${list.userId})">--%>
<%-- <i class="layui-icon layui-icon-release"></i> 回复--%>
<%-- </button>--%>
<%-- </form>--%>
<%-- </div>--%>
<%-- </div>--%>
</c:when>
<c:otherwise>
<div class="comments">
<div class="comment-wrap">
<div class="photo">
<div class="avatar" style="background-image: url('./static/img/头像修改.png')"></div>
</div>
<div class="comment-block">
<form action="">
<textarea name="" id="replyContent" cols="30" rows="3" placeholder="Say somthing..."
style="resize:none"></textarea>
<button type="button" class="layui-btn layui-btn-xs" onclick="reply(${list.userId})">
<i class="layui-icon layui-icon-release"></i> 回复
</button>
</form>
</div>
</div>
</c:otherwise>
</c:choose>
<div class="show-close">x</div>
</div>
</div>
</div>
</c:forEach>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
layui.use(function () {
var $ = layui.$;
var layer = layui.layer;
var util = layui.util;
var form = layui.form;
util.on('lay-on', {
'wrap': function () {
layer.open({
type: 1,
resize: true,
title: '发表留言',
shade: false, // 不显示遮罩
content: $('#warp'), // 捕获的元素
end: function () {
// layer.msg('关闭后的回调', {icon:6});
}
});
},
'admin': function () {
layer.open({
type: 1,
area: '350px',
resize: false,
shadeClose: true,
title: '管理员登录',
content: $('#adminform'),
},)
}
})
})
// 发布评论
function publish() {
var name = document.getElementById('name').value;
var qq = document.getElementById('qq').value;
var email = document.getElementById('email').value;
var content = document.getElementById('content').value;
console.log(name + qq + email + content);
axios({
// 请求方式
method: 'post',
// 请求的地址
url: 'http://localhost:8080${pageContext.request.contextPath}/publish',
// URL 中的查询参数
params: {
name: name,
qq: qq,
email: email,
content: content
}
}).then(function (result) {
//定位 span id 名称 error 修改
// console.log(result);
window.location.reload();
})
}
// 回复
function reply(userId){
var content = document.getElementById('replyContent').value;
axios({
// 请求方式
method: 'post',
// 请求的地址
url: 'http://localhost:8080${pageContext.request.contextPath}/reply',
// URL 中的查询参数
params: {
userId: userId,
replyContent:content
}
}).then(function (result) {
//定位 span id 名称 error 修改
// console.log(result);
window.location.reload();
})
}
$(function () {
// 还能输入的字得个数
var able_count = 140;
// 是否可以发布留言
var release_able = false;
// 右上角文字
var $title_txt = $('.title-txt');
// 留言框
var $main_area = $('.main-area');
// 发布按钮
var $release_btn = $('.release-btn');
// 输入框获取焦点
$main_area.focus(function () {
console.log("获取焦点");
$(this).parent().addClass('outline');
$title_txt.addClass('title');
if (able_count >= 0) {
$title_txt.html("还可以输入" + able_count + "个字");
} else {
$title_txt.html("你以超出" + (-able_count) + "个字");
}
})
// 输入框失去焦点
$main_area.blur(function () {
console.log("失去焦点");
$(this).parent().removeClass('outline');
$title_txt.removeClass('title');
$title_txt.html("言无有善恶也,苟有得乎吾心而言也,则其辞不索而获。");
})
// 输入框文本修改
$main_area.on('input', function () {
console.log("文本修改");
// 剩余可输入的字个数
able_count = 140 - $main_area.val().length;
// console.log(able_count);
// 根据可输入字的个数决定右上角文本的提示 与 是否能发布的状态
if (able_count >= 0 && able_count <= 140) {
$title_txt.html("还可以输入" + able_count + "个字");
if (able_count != 140) {
release_able = true;
} else {
release_able = false;
}
} else {
$title_txt.html("你以超出" + (-able_count) + "个字");
release_able = false;
}
// 根据发布状态决定发布按钮的样式
if (release_able) {
$release_btn.css({
backgroundColor: "orange",
borderColor: "orange"
})
} else {
$release_btn.css({
backgroundColor: "#ffc09f",
borderColor: "#ffc09f"
})
}
})
// 发布事件
// $release_btn.click(function () {
// console.log("发布");
// if (release_able) {
// console.log('可以发布');
// // 创建show对象的各个部位
// var $showContent = $('<div class="show-content"></div>'),
// $showName = $('<div class="show-name"></div>'),
// $showTxt = $('<div class="show-txt"></div>'),
// $showTime = $('<div class="show-time"></div>'),
// $showClose = $('<div class="show-close"></div>'),
// $showP = $('<p class=""></p>');
//
// var date = new Date();
// // 设置,对象结构内内容
// $showName.text("XxXx");
// $showP.text($main_area.val());
// $showTime.text(date);
// $showClose.text("x");
// // 添加进入主结构
// $showTxt.append($showP);
// $showContent.append($showName);
// $showContent.append($showTxt);
// $showContent.append($showTime);
// $showContent.append($showClose);
//
// // 向所有匹配元素内部的开始处插入内容
// $('.show').prepend($showContent);
//
// // 添加动画
// // 位置从输入框处下移
// $showContent.css({
// top: '-150px'
// })
// $showContent.animate({
// top: 0
// }, 200)
//
// // 删除事件
// $showClose.click(function () {
// // 显示插入的索引位置
// // console.log($(this).parent().index());
// // console.log($showContent.index());
//
//
// // 删除操作为顺便
// // $showContent.remove();
//
// // 使用删除动画,创建效果
// $showContent.animate({
// height: 0
// }, 200, function () {
// // 动画结束后将自身从dom中移除
// $showContent.remove();
// })
//
//
// })
//
// // 发布成功后收尾工作
// $main_area.val(""); //输入框清空
// able_count = 140; //输入框可输入内容数重置
// release_able = false;
// $release_btn.css({
// backgroundColor: '#ffc09f',
// borderColor: '#ffc09f'
// }) //按钮点击事件重置
//
// }
// })
})
</script>
</body>
</html>

View File

@ -0,0 +1,355 @@
body, ul {
margin: 0;
padding: 0;
}
body{
display: flex;
align-items: center;
justify-content: center;
flex-direction: row;
}
ul {
list-style: none;
}
/* main */
.main {
width: 800px;
height: 100%;
/* background-color: #eb7350; */
display: flex;
flex-direction: column;
}
/* header */
.header{
width: 100%;
height: 50px;
/* background-color: #ddd; */
display: flex;
flex-direction: row-reverse;
flex-wrap: nowrap;
/* align-items: center; */
/* justify-content: flex-end; */
}
.userIfo {
display: flex;
margin-top: 20px;
}
.panel{
display: flex;
flex-direction: row;
justify-content: space-between;
}
.layui-panel {
background:transparent;
}
.admin {
width: 350px;
height: 500px;
}
/* 管理员登陆 */
.demo-login-container{width: 320px; margin: 21px auto 0;}
.demo-login-other .layui-icon{position: relative; display: inline-block; margin: 0 2px; top: 2px; font-size: 26px;}
/*最外层*/
.wrap {
width: 700px;
height: 325px;
margin: 20px auto;
border-radius: 4px;
/* border: 1px solid #ddd; */
padding: 0 10px;
}
.wrap-head {
width: 100%;
height: 24px;
padding-top: 4px;
overflow: hidden;
}
.head-logo {
width: 20%;
float: left;
}
.head-logo img {
width: 30px;
height: 30px;
}
.head-txt {
padding: 4px 0;
width: 60%;
float: right;
text-align: center;
}
.head-txt a {
font-size: 12px;
color: #eb7350;
text-decoration: none;
}
.title-txt.title {
text-align: right;
color: black;
display: block;
width: 100%;
}
/*内层设计,输入框*/
.main-txt {
border: 1px solid #ccc;
width: 98%;
height: 68px;
margin: 4px 0 0;
padding: 5px;
box-shadow: 0px 0px 3px 0px rgba(0, 0, 0, 0.15) inset;
}
.main-txt textarea {
border: none;
width: 100%;
height: 66px;
outline: none;
resize: none;
color: #333;
}
.main-txt.outline {
outline: 2px orange solid;
}
/*下层设计*/
.warp-footer {
width: 100%;
height: 40px;
margin: 6px 0;
overflow: hidden;
}
.warp-icon-cont {
width: 65%;
float: left;
margin-top: 10px;
}
.warp-icon-cont ul li {
display: inline-block;
margin-right: 15px;
cursor: pointer;
}
.warp-icon-cont a {
font-size: 12px;
color: #333;
text-decoration: none;
height: 20px;
margin-left: 5px;
display: block;
width: 25px;
float: right;
line-height: 20px;
}
.warp-icon-cont a:hover {
color: #eb7350;
}
.warp-icon-cont img {
width: 20px;
height: 20px;
}
.warp-footer-btns {
width: 35%;
float: right;
overflow: hidden;
margin-top: 3px;
}
.release-btn {
width: 80px;
height: 28px;
float: right;
background-color: #ffc09f;
border: 4px solid #fbbd9e;
cursor: pointer;
border-radius: 2px;
}
.release-btn a {
display: block;
color: #fff;
width: 80px;
height: 28px;
line-height: 28px;
text-align: center;
text-decoration: none;
font-size: 15px;
}
/*后期添加的留言框*/
.show {
width: 800px;
/* margin: 20px auto; */
}
.show-content {
width: 775px;
border: 1px solid #ccc;
border-radius: 4px;
margin-bottom: 10px;
padding: 10px;
position: relative;
overflow: hidden;
}
.show-name {
width: 100%;
text-align: left;
font-size: 14px;
color: #333;
font-weight: bold;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-items: center;
}
.show-txt {
width: 100%;
color: #444;
font-size: 14px;
margin-top: 10px;
}
.show-txt p {
width: 100%;
word-wrap: break-word;
}
.show-time {
font-size: 12px;
color: #808080;
margin-top: 10px;
}
.show-close {
position: absolute;
top: 10px;
right: 10px;
font-size: 12px;
color: #ccc;
cursor: pointer;
transition: .5s;
}
.show-close:hover {
color: red;
}
/* html,
body {
background-color: #f0f2fa;
font-family: "PT Sans", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif;
color: #555f77;
-webkit-font-smoothing: antialiased;
} */
input,
textarea {
outline: none;
border: none;
display: block;
margin: 0;
padding: 0;
-webkit-font-smoothing: antialiased;
font-family: "PT Sans", "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif;
font-size: 1rem;
color: #555f77;
}
input::-webkit-input-placeholder,
textarea::-webkit-input-placeholder {
color: #ced2db;
}
input::-moz-placeholder,
textarea::-moz-placeholder {
color: #ced2db;
}
input:-moz-placeholder,
textarea:-moz-placeholder {
color: #ced2db;
}
input:-ms-input-placeholder,
textarea:-ms-input-placeholder {
color: #ced2db;
}
p {
line-height: 1.3125rem;
}
.comments {
margin: 2.5rem auto 0;
max-width: 60.75rem;
padding: 0 1.25rem;
}
.comment-wrap {
margin-bottom: 1.25rem;
display: table;
width: 100%;
min-height: 5.3125rem;
}
.photo {
padding-top: 0.625rem;
display: table-cell;
vertical-align: middle;
text-align: center;
width: 3.5rem;
}
.photo .avatar {
height: 2.25rem;
width: 2.25rem;
border-radius: 50%;
background-size: contain;
}
.comment-block {
padding: 1rem;
background-color: #fff;
display: table-cell;
vertical-align: top;
border-radius: 0.1875rem;
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.08);
}
.comment-block textarea {
width: 100%;
max-width: 100%;
}
.comment-text {
margin-bottom: 1.25rem;
}
.bottom-comment {
color: #acb4c2;
font-size: 0.875rem;
}
.comment-date {
float: left;
}
.comment-actions {
float: right;
}
.comment-actions li {
display: inline;
}
.comment-actions li.complain {
padding-right: 0.625rem;
border-right: 1px solid #e1e5eb;
}
.comment-actions li.reply {
padding-left: 0.625rem;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

@ -0,0 +1,142 @@
// 匿名函数包裹,防止外界操作的修改
$(function () {
// 还能输入的字得个数
var able_count = 140;
// 是否可以发布留言
var release_able = false;
// 右上角文字
var $title_txt = $('.title-txt');
// 留言框
var $main_area = $('.main-area');
// 发布按钮
var $release_btn = $('.release-btn');
// 输入框获取焦点
$main_area.focus(function () {
console.log("获取焦点");
$(this).parent().addClass('outline');
$title_txt.addClass('title');
if (able_count >= 0) {
$title_txt.html("还可以输入" + able_count + "个字");
} else {
$title_txt.html("你以超出" + (-able_count) + "个字");
}
})
// 输入框失去焦点
$main_area.blur(function () {
console.log("失去焦点");
$(this).parent().removeClass('outline');
$title_txt.removeClass('title');
$title_txt.html("111");
})
// 输入框文本修改
$main_area.on('input', function () {
console.log("文本修改");
// 剩余可输入的字个数
able_count = 140 - $main_area.val().length;
// console.log(able_count);
// 根据可输入字的个数决定右上角文本的提示 与 是否能发布的状态
if (able_count >= 0 && able_count <= 140) {
$title_txt.html("还可以输入" + able_count + "个字");
if (able_count != 140) {
release_able = true;
} else {
release_able = false;
}
} else {
$title_txt.html("你以超出" + (-able_count) + "个字");
release_able = false;
}
// 根据发布状态决定发布按钮的样式
if (release_able) {
$release_btn.css({
backgroundColor: "orange",
borderColor: "orange"
})
} else {
$release_btn.css({
backgroundColor: "#ffc09f",
borderColor: "#ffc09f"
})
}
})
// 发布事件
$release_btn.click(function () {
console.log("发布");
if (release_able) {
console.log('可以发布');
// 创建show对象的各个部位
var $showContent = $('<div class="show-content"></div>'),
$showName = $('<div class="show-name"></div>'),
$showTxt = $('<div class="show-txt"></div>'),
$showTime = $('<div class="show-time"></div>'),
$showClose = $('<div class="show-close"></div>'),
$showP = $('<p class=""></p>');
var date = new Date();
// 设置,对象结构内内容
$showName.text("XxXx");
$showP.text($main_area.val());
$showTime.text(date);
$showClose.text("x");
// 添加进入主结构
$showTxt.append($showP);
$showContent.append($showName);
$showContent.append($showTxt);
$showContent.append($showTime);
$showContent.append($showClose);
// 向所有匹配元素内部的开始处插入内容
$('.show').prepend($showContent);
// 添加动画
// 位置从输入框处下移
$showContent.css({
top: '-150px'
})
$showContent.animate({
top: 0
}, 200)
// 删除事件
$showClose.click(function () {
// 显示插入的索引位置
// console.log($(this).parent().index());
// console.log($showContent.index());
// 删除操作为顺便
// $showContent.remove();
// 使用删除动画,创建效果
$showContent.animate({
height: 0
}, 200, function () {
// 动画结束后将自身从dom中移除
$showContent.remove();
})
})
// 发布成功后收尾工作
$main_area.val(""); //输入框清空
able_count = 140; //输入框可输入内容数重置
release_able = false;
$release_btn.css({
backgroundColor: '#ffc09f',
borderColor: '#ffc09f'
}) //按钮点击事件重置
}
})
})

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 322 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long