基于 JAVASSM(Java + Spring + Spring MVC + MyBatis)框架开发一个九宫格日志系统

基于 JAVASSM(Java + Spring + Spring MVC + MyBatis)框架开发一个九宫格日志系统
在这里插入图片描述

步骤一:需求分析

明确系统需要实现的功能,比如:

  • 用户注册和登录
  • 添加日志(包含标题、内容、图片)
  • 查看日志列表
  • 查看单个日志的详细信息
  • 九宫格展示日志图片

步骤二:设计数据库

使用 MySQL 数据库存储系统数据。设计数据库表结构如下:

用户表(users)
  • id (INT, 主键, 自增)
  • username (VARCHAR)
  • password (VARCHAR)
  • email (VARCHAR)
  • phone (VARCHAR)
日志表(logs)
  • id (INT, 主键, 自增)
  • user_id (INT, 外键)
  • title (VARCHAR)
  • content (TEXT)
  • created_at (DATETIME)
日志图片表(log_images)
  • id (INT, 主键, 自增)
  • log_id (INT, 外键)
  • image_url (VARCHAR)

步骤三:选择开发工具

使用 IntelliJ IDEA 或 Eclipse 作为开发环境。

步骤四:搭建项目结构

  1. 创建 Maven 项目。
  2. 添加必要的依赖项(Spring、Spring MVC、MyBatis、MySQL 驱动等)。

步骤五:配置文件

application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/log_system?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Drivermybatis.mapper-locations=classpath:mapper/*.xml
spring-mvc.xml
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><context:component-scan base-package="com.logsystem"/><mvc:annotation-driven/><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".jsp"/></bean></beans>
mybatis-config.xml
<configuration><mappers><mapper resource="mapper/UserMapper.xml"/><mapper resource="mapper/LogMapper.xml"/><!-- 其他 Mapper 文件 --></mappers>
</configuration>

步骤六:编写实体类

User.java
package com.logsystem.entity;public class User {private int id;private String username;private String password;private String email;private String phone;// Getters and Setters
}
Log.java
package com.logsystem.entity;import java.util.Date;
import java.util.List;public class Log {private int id;private int userId;private String title;private String content;private Date createdAt;private List<String> images;// Getters and Setters
}

步骤七:编写 DAO 层

UserMapper.java
package com.logsystem.mapper;import com.logsystem.entity.User;
import org.apache.ibatis.annotations.*;@Mapper
public interface UserMapper {@Select("SELECT * FROM users WHERE username = #{username} AND password = #{password}")User login(@Param("username") String username, @Param("password") String password);@Insert("INSERT INTO users(username, password, email, phone) VALUES(#{username}, #{password}, #{email}, #{phone})")@Options(useGeneratedKeys = true, keyProperty = "id")void register(User user);
}
LogMapper.java
package com.logsystem.mapper;import com.logsystem.entity.Log;
import org.apache.ibatis.annotations.*;import java.util.List;@Mapper
public interface LogMapper {@Select("SELECT * FROM logs WHERE user_id = #{userId} ORDER BY created_at DESC")List<Log> getLogsByUserId(int userId);@Select("SELECT * FROM logs WHERE id = #{id}")Log getLogById(int id);@Insert("INSERT INTO logs(user_id, title, content, created_at) VALUES(#{userId}, #{title}, #{content}, NOW())")@Options(useGeneratedKeys = true, keyProperty = "id")void addLog(Log log);@Update("UPDATE logs SET title=#{title}, content=#{content} WHERE id=#{id}")void updateLog(Log log);@Delete("DELETE FROM logs WHERE id=#{id}")void deleteLog(int id);@Select("SELECT image_url FROM log_images WHERE log_id = #{logId}")List<String> getImagesByLogId(int logId);@Insert("INSERT INTO log_images(log_id, image_url) VALUES(#{logId}, #{imageUrl})")void addImageToLog(@Param("logId") int logId, @Param("imageUrl") String imageUrl);
}

步骤八:编写 Service 层

UserService.java
package com.logsystem.service;import com.logsystem.entity.User;
import com.logsystem.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public User login(String username, String password) {return userMapper.login(username, password);}public void register(User user) {userMapper.register(user);}
}
LogService.java
package com.logsystem.service;import com.logsystem.entity.Log;
import com.logsystem.mapper.LogMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class LogService {@Autowiredprivate LogMapper logMapper;public List<Log> getLogsByUserId(int userId) {List<Log> logs = logMapper.getLogsByUserId(userId);for (Log log : logs) {log.setImages(logMapper.getImagesByLogId(log.getId()));}return logs;}public Log getLogById(int id) {Log log = logMapper.getLogById(id);log.setImages(logMapper.getImagesByLogId(id));return log;}public void addLog(Log log) {logMapper.addLog(log);for (String imageUrl : log.getImages()) {logMapper.addImageToLog(log.getId(), imageUrl);}}public void updateLog(Log log) {logMapper.updateLog(log);logMapper.deleteImagesByLogId(log.getId());for (String imageUrl : log.getImages()) {logMapper.addImageToLog(log.getId(), imageUrl);}}public void deleteLog(int id) {logMapper.deleteImagesByLogId(id);logMapper.deleteLog(id);}
}

步骤九:编写 Controller 层

UserController.java
package com.logsystem.controller;import com.logsystem.entity.User;
import com.logsystem.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;@Controller
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/login")public String showLoginForm() {return "login";}@PostMapping("/login")public String handleLogin(@RequestParam("username") String username, @RequestParam("password") String password, Model model) {User user = userService.login(username, password);if (user != null) {model.addAttribute("user", user);return "redirect:/logs";} else {model.addAttribute("error", "Invalid username or password");return "login";}}@GetMapping("/register")public String showRegisterForm() {return "register";}@PostMapping("/register")public String handleRegister(User user) {userService.register(user);return "redirect:/login";}
}
LogController.java
package com.logsystem.controller;import com.logsystem.entity.Log;
import com.logsystem.service.LogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;@Controller
public class LogController {@Autowiredprivate LogService logService;@GetMapping("/logs")public String showLogs(@RequestParam("userId") int userId, Model model) {List<Log> logs = logService.getLogsByUserId(userId);model.addAttribute("logs", logs);return "logs";}@GetMapping("/log/{id}")public String showLogDetails(@RequestParam("id") int id, Model model) {Log log = logService.getLogById(id);model.addAttribute("log", log);return "logDetails";}@GetMapping("/addLog")public String showAddLogForm() {return "addLog";}@PostMapping("/addLog")public String handleAddLog(@RequestParam("title") String title, @RequestParam("content") String content,@RequestParam("images") MultipartFile[] images, HttpServletRequest request) throws IOException {Log log = new Log();log.setTitle(title);log.setContent(content);log.setUserId(Integer.parseInt(request.getParameter("userId")));List<String> imageUrls = new ArrayList<>();for (MultipartFile file : images) {if (!file.isEmpty()) {String originalFilename = file.getOriginalFilename();String uploadDir = request.getServletContext().getRealPath("/uploads");File uploadFile = new File(uploadDir, originalFilename);file.transferTo(uploadFile);imageUrls.add("/uploads/" + originalFilename);}}log.setImages(imageUrls);logService.addLog(log);return "redirect:/logs?userId=" + log.getUserId();}@GetMapping("/editLog/{id}")public String showEditLogForm(@RequestParam("id") int id, Model model) {Log log = logService.getLogById(id);model.addAttribute("log", log);return "editLog";}@PostMapping("/editLog")public String handleEditLog(@RequestParam("id") int id, @RequestParam("title") String title, @RequestParam("content") String content,@RequestParam("images") MultipartFile[] images, HttpServletRequest request) throws IOException {Log log = logService.getLogById(id);log.setTitle(title);log.setContent(content);List<String> imageUrls = new ArrayList<>();for (MultipartFile file : images) {if (!file.isEmpty()) {String originalFilename = file.getOriginalFilename();String uploadDir = request.getServletContext().getRealPath("/uploads");File uploadFile = new File(uploadDir, originalFilename);file.transferTo(uploadFile);imageUrls.add("/uploads/" + originalFilename);}}log.setImages(imageUrls);logService.updateLog(log);return "redirect:/logs?userId=" + log.getUserId();}@GetMapping("/deleteLog/{id}")public String handleDeleteLog(@RequestParam("id") int id) {logService.deleteLog(id);return "redirect:/logs?userId=" + request.getParameter("userId");}
}

步骤十:前端页面

使用 JSP 创建前端页面。以下是简单的 JSP 示例:

login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Login</title>
</head>
<body>
<h2>Login</h2>
<form action="${pageContext.request.contextPath}/login" method="post">Username: <input type="text" name="username"><br>Password: <input type="password" name="password"><br><input type="submit" value="Login">
</form>
<c:if test="${not empty error}"><p style="color: red">${error}</p>
</c:if>
</body>
</html>
logs.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head><title>Logs</title><style>.grid-container {display: grid;grid-template-columns: repeat(3, 1fr);gap: 10px;}.grid-item {border: 1px solid #ccc;padding: 10px;text-align: center;}</style>
</head>
<body>
<h2>Logs</h2>
<a href="${pageContext.request.contextPath}/addLog">Add New Log</a>
<div class="grid-container"><c:forEach items="${logs}" var="log"><div class="grid-item"><h3>${log.title}</h3><p>${log.content}</p><c:forEach items="${log.images}" var="image"><img src="${image}" alt="${log.title}" width="100"></c:forEach><a href="${pageContext.request.contextPath}/log/${log.id}?userId=${log.userId}">View Details</a><a href="${pageContext.request.contextPath}/editLog/${log.id}?userId=${log.userId}">Edit</a><a href="${pageContext.request.contextPath}/deleteLog/${log.id}?userId=${log.userId}">Delete</a></div></c:forEach>
</div>
</body>
</html>

步骤十一:测试与调试

对每个功能进行详细测试,确保所有功能都能正常工作。

步骤十二:部署与发布

编译最终版本的应用程序,并准备好 WAR 文件供 Tomcat 或其他应用服务器部署。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/5820.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

003-Kotlin界面开发之声明式编程范式

概念本源 在界面程序开发中&#xff0c;有两个非常典型的编程范式&#xff1a;命令式编程和声明式编程。命令式编程是指通过编写一系列命令来描述程序的运行逻辑&#xff0c;而声明式编程则是通过编写一系列声明来描述程序的状态。在命令式编程中&#xff0c;程序员需要关心程…

华为海思招聘-芯片与器件设计工程师-模拟芯片方向- 机试题-真题套题题目——共8套(每套四十题)

华为海思招聘-芯片与器件设计工程师-模拟芯片方向- 机试题-真题套题题目分享——共九套&#xff08;每套四十题&#xff09; 岗位——芯片与器件设计工程师 岗位意向——模拟芯片 真题题目分享&#xff0c;完整题目&#xff0c;无答案&#xff08;共8套&#xff09; 实习岗位…

解决程序因缺少xinput1_3.dll无法运行的有效方法,有效修复丢失xinput1_3.dll

如果你的电脑在运行某些应用程序或游戏时提示“xinput1_3.dll丢失”或“找不到xinput1_3.dll”的错误消息&#xff0c;那么很可能是因为你的系统中缺少这个重要的DLL文件而导致的问题。那么电脑出现xinput1_3.dll丢失的问题时有哪些方法进行修复呢&#xff1f; 如何确定电脑是否…

入门网络安全工程师要学习哪些内容

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 大家都知道网络安全行业很火&#xff0c;这个行业因为国家政策趋势正在大力发展&#xff0c;大有可为!但很多人对网络安全工程师还是不了解&#xff0c;不知道网…

命令行参数、环境变量、地址空间

命令行参数&#xff1a; int main(int argc, char *argv[ ])&#xff0c;main的参数可带可不带。argc参数通常代表后面的char *argv的元素个数有多少。 在linux中会把输入的字符串存到char *argv[ ]中&#xff0c;在数组的结尾为NULL。 命令行参数可以让同一个程序可以通过不同…

Docker学习—Docker核心概念总结

核心概念总结 容器&#xff1a;容器就是将应用运行所需的所有内容比如代码、运行时环境&#xff0c;进行打包和隔离。 容器和虚拟机的对比 虚拟机是在同一个硬件上虚拟化出多个操作系统&#xff08;OS&#xff09;实例。 容器是在操作系统上进行虚拟化&#xff0c;用于隔离…

Java实战项目-基于SpringBoot的新能源汽车个性化推荐系统

博主介绍&#xff1a;✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不…

统信UOS设备驱动开发-常见问题

包含linux设备驱动开发的基础知识及统信UOS设备驱动的总体架构,常用的设备驱动开发调试优化手段及在环境搭建和代码编写过程中常见问题处理等。 文章目录 环境搭建如何编译驱动代码编写如何实现同源异构环境搭建 如何编译内核 下载并解压内核源码包,进入源码根目录,内核的编…

基于python主观题自动阅卷系统毕业设计项目

基于python主观题自动阅卷系统毕业设计项目 大家好&#xff0c;我是陈辰学长&#xff0c;一名在 Java 圈辛勤劳作的码农。今日&#xff0c;要和大家分享的是一款基于python主观题自动阅卷系统毕业设计。项目源码以及部署相关事宜&#xff0c;请联系陈辰学长&#xff0c;文末会…

详细分析WebStorageCache 基本知识

目录 1. 基本知识2. Demo 1. 基本知识 相关的源码如下&#xff1a;web-storage-cache WebStorageCache 是一个用于扩展 HTML5 的 localStorage 和 sessionStorage 的库&#xff0c;增加了超时时间管理和序列化功能。它可以存储 JSON 对象&#xff0c;并且在存储数据时可以方便…

如何用手机将驾驶证信息转为结构化Excel表格

在日常生活和工作中&#xff0c;我们经常需要将纸质文档或图片中的信息转化为结构化的电子数据&#xff0c;以便更好地进行管理和分析。驾驶证作为重要的个人证件&#xff0c;其信息的电子化也显得尤为重要。本文将详细介绍如何使用手机将驾驶证信息转化为结构化的Excel表格。 …

Idea自动生成mysql表DML语句

背景 在开发上线的时候&#xff0c;某个表会被多次修改&#xff0c;更改了多个字段。上线的时候需要变更线上数据表&#xff0c;会很麻烦。需要自己写很多个DML语句。 IDEA解决方案 使用IDEA的数据库插件可以很快的得到变更表的DML语句。 步骤&#xff1a; 勾选不同环境的两…

自动化细胞核分割与特征分析

自动化细胞核分割与特征分析 引言效果展示HoverNet概述HoverNet原理分析整体网络框架实例分割原理 HoverNet评估结果复现过程细胞核特征应用说明参考文献总结备注资源获取 本文所涉及所有资源均在传知代码平台可获取 引言 细胞核分割和分类在医学研究和临床诊断中具有重要意义…

[ZJCTF 2019]NiZhuanSiWei

[ZJCTF 2019]NiZhuanSiWei 审题 看到可以传入file&#xff0c;text&#xff0c;和password三个参数。 知识点 php伪协议&#xff0c;反序列化 解题 传入text&#xff0c;看到有file_get_content函数&#xff0c;这个函数表示读取$text文件里的值&#xff0c;返回字符串。 所…

Transformer究竟是什么?预训练又指什么?BERT

目录 Transformer究竟是什么? 预训练又指什么? BERT的影响力 Transformer究竟是什么? Transformer是一种基于自注意力机制(Self-Attention Mechanism)的神经网络架构,它最初是为解决机器翻译等序列到序列(Seq2Seq)任务而设计的。与传统的循环神经网络(RNN)或卷…

阿里云对象存储OSS

Alibaba Cloud OSS Alibaba Cloud OSS: 阿里云对象存储服务&#xff08;Object Storage Service&#xff0c;简称 OSS&#xff09;&#xff0c;是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。 1.引…

element plus中修改el-table的样式

文章目录 前情提要相关环境package.jsonvue代码结果 方式一直接看代码 方式二直接看代码 前情提要 因为项目中用到el-table的时候&#xff0c;需要将el-table表格的样式进行修改&#xff0c;将整个表格的背景颜色从白色变成透明&#xff0c;使得表格变得透明之后&#xff0c;展…

HTML前端页面设计静态网站

浅浅分享一下前端作业&#xff0c;大佬轻喷~ <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>一个网…

tauri开发中如果取消了默认的菜单项,复制黏贴撤销等功能也就没有了,解决办法

取消默认的菜单项&#xff1a;清除tauri默认的菜单项&#xff0c;让顶部的菜单menu不显示-CSDN博客 就是通过配置空菜单&#xff0c;让菜单不显示&#xff0c;但是这个引发的问题就是复制黏贴撤销等功能也就没有了&#xff0c;解决办法&#xff1a; 新增加编辑下的子菜单&…

02 高效调优:Oracle内存体系的精细化管理实践

文章目录 高效调优&#xff1a;Oracle内存体系的精细化管理实践一、Oracle内存体系的核心组件1.1 系统全局区&#xff08;SGA&#xff09;1.2 程序全局区&#xff08;PGA&#xff09; 二、各组件的交互关系2.1 Buffer Cache与磁盘I/O2.2 Shared Pool与SQL执行2.3 PGA与会话管理…