springboot+ssm+thymeleaf+bootstrap 创建简易微博系统

项目源码
本项目源码已上传到github
前言
此项目从0开始,1天入门java,制作一个简易的微博系统。参考网上的资料基于springtool工具搭建springboot项目,仅供自己学习参考,同时希望能给您带来帮助,都是最基础的功能,不喜勿喷哦。
功能说明
前台
1、用户登录登出
2、增删改查心情文章
3、关注其他用户
4、查看关注用户的心情微博
后台
1、用户管理
2、心情微博管理
项目部分截图
环境搭建
首先下载一个专为Spring设计的eclipse版本——Spring Tool Suite
创建项目
下载完安装就行了,然后点击左上角,File —> new —> Spring Starter Project
下一步填入项目名称,自定义名称就行
在输入框中依次输入以下五个选项,并选中,会在右侧出现你选中的选项,这些都会在后面的开发过程中用到,如果忘记添加也没关系,后续可以在项目的pom.xml中添加即可,项目的pom.xml是个依赖管理的配置文件
点击finish即可,到目前为止创建项目成功,静静等待编译结束就可以开始开发啦,这个过程可能比较漫长,这个时候可以选择吃吃零食,看看剧,玩玩游戏...☺
项目目录
入口文件
首先来看一下项目的入口文件,
右击这个类,run as——Spring Boot App,就会启动该项目,看一眼就ok了,不用管它。
配置文件
项目最关键两个配置文件,一个是上面提到的依赖管理pom.xml文件,就在项目的根目录下,需要什么包在这里引入就好了;其次就是resources目录下的application.properties文件,可以用来设置连接mysql的配置信息。
# mysql
spring.datasource.url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username: root
spring.datasource.password: root
以上代码是在application.properties文件中定义连接了本地springboot数据库,mysql连接用户名以及密码,在我的github项目的resouces目录下有个sql.java文件,在mysql中打开此文件运行就能在本地数据库中生成该数据库。
开发项目
好啦,数据库也建好了,对于web开发来说,我的理解是最基本的就是后台与数据库的交互获取数据,传给前端,前端通过thymeleaf模板引擎展示数据。首先就是需要建立模型,这样才能通过控制器获取到数据库中的数据。
建立模型
在model下新建bean目录,定义一个模型类,以user表为例,在bean目录下新建User.java文件
package com.example.demo.model.bean;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = -5611386225028407298L;
private Integer id;
private String account;
private String name;
private String password;
private Integer agent;
private String image;
private String phone;
private String address;
private Integer permission;
private Followuser followuser;
// 省略get和set方法,大家自己设置即可
public Followuser getFollowuser() {
return followuser;
}
public void setFollowuser(Followuser followuser) {
this.followuser = followuser;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAgent() {
return agent;
}
public void setAgent(Integer agent) {
this.agent = agent;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getPermission() {
return permission;
}
public void setPermission(Integer permission) {
this.permission = permission;
}
}
有了这个就可以和数据库表有个映射关系,现在还需要一个接口,定义项目中所有关于user表的查询方法,在model目录下新建dao目录,在dao目录下新建UserDAO.java,
package com.example.demo.model.dao;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.example.demo.model.bean.User;
import java.util.List;
@Mapper
public interface UserDAO {
public User find(@Param("account")String account, @Param("password")String password);
public User findByAccount(@Param("account")String account);
public User findByID(@Param("userID")String userID);
public Integer create(@Param("account")String account, @Param("password")String password, @Param("name")String name, @Param("agent")Integer agent, @Param("phone")String phone, @Param("address")String address, @Param("image")String image);
public List<User> findMyFollow(@Param("userID")String userID);
public List<User> findAll();
public Integer remove(@Param("userID")Integer userID);
public Integer updatePassword(@Param("password")String password, @Param("userID")String userID);
public List<User> findSearch(@Param("keyword")String keyword);
// 注: CRTL+Shift+O,快捷导入所有import
}
以上需要注意的是,如果需要查询user表中一条数据多个字段,用上面定义的User类接收,如果查询一条数据的单个字段,可以根据数据表中定义的字段类型去接收,比如create方法返回的是创建此条记录的id值是Integer类型的,如果返回多条数据就用list接收。
有了上面的方法接口后,还需要mybatis映射接口到SQL语句的文件,根据application.properties中的配置mybatis.mapper-locations: classpath:mapper/*.xml,在resources文件夹下新建mapper文件夹,下面放入UserDAO.xml文件,都是sql语句就不多说了。
<?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.example.demo.model.dao.UserDAO">
<select id="find" resultType="com.example.demo.model.bean.User">
SELECT id, account, name, password, address, image, phone, agent, permission from user where account = #{account} and password = #{password}
</select>
<select id="findAll" resultType="com.example.demo.model.bean.User">
SELECT id, account, name, password, address, image, phone, agent, permission from user where permission = 0
</select>
<select id="findByAccount" resultType="com.example.demo.model.bean.User">
SELECT id, account, name, password, address, image, phone, agent, permission from user where account = #{account}
</select>
<select id="findByID" resultType="com.example.demo.model.bean.User">
SELECT id, account, name, password, address, image, phone, agent, permission from user where id = #{userID}
</select>
<select id="findMyFollow" resultMap="userFollowMap">
SELECT u.name, u.id from user u left join followuser fu on u.id = fu.followTo where fu.followFrom = #{userID}
</select>
<select id="findSearch" resultType="com.example.demo.model.bean.User">
SELECT id, account, name, password, address, image, phone, agent, permission from user where account like '%${keyword}%' or name like '%${keyword}%'
</select>
<resultMap id="userFollowMap" type="com.example.demo.model.bean.User">
<id property="id" column="id"></id>
<result property="account" column="account"></result>
<result property="name" column="name"></result>
<result property="password" column="password"></result>
<result property="image" column="image"></result>
<result property="agent" column="agent"></result>
<result property="phone" column="phone"></result>
<result property="address" column="address"></result>
<association property="followuser" column="id" javaType="com.example.demo.model.bean.Followuser">
<id property="id" column="id"></id>
<result property="followFrom" column="followFrom"></result>
<result property="followTo" column="followTo"></result>
</association>
</resultMap>
<insert id="create" parameterType="com.example.demo.model.bean.User">
INSERT into user(account, password, name, agent, phone, address, image) VALUES(#{account}, #{password}, #{name}, #{agent}, #{phone}, #{address}, #{image})
</insert>
<delete id="remove" parameterType="com.example.demo.model.bean.User">
DELETE FROM user where id = #{userID}
</delete>
<update id="updatePassword" parameterType="com.example.demo.model.bean.User">
UPDATE user set password = #{password} where id = #{userID}
</update>
</mapper>
控制器
有了数据之后就可以通过控制器去接收数据了,比较常用的请求方式是get请求和post请求,我就以两个请求方式为例
get请求
以后台用户管理为例
@GetMapping(value = "admin/userManager") //vaule代表路由
public Object userManager(Map<String, Object> map, HttpSession session) {
if(!StringUtils.isEmpty(session.getAttribute("userID"))) {
User user = userDAO.findByID(session.getAttribute("userID").toString());
if(user.getPermission()==1) {
map.put("userID", session.getAttribute("userID"));
map.put("username", session.getAttribute("username"));
List<User> allUser = userDAO.findAll(); //这里就是调用dao里面的方法
if(allUser != null) {
map.put("allUser", allUser); //map.put就是向前端传输数据
}
}else {
return new ModelAndView("redirect:/"); //如果验证成功那就
}
}else {
return new ModelAndView("redirect:/");
}
return new ModelAndView("admin/userManager");
}
前端通过thymeleaf展示数据
<table class="table">
<thead class="thead-dark">
<tr>
<th scope="col">用户账号</th>
<th scope="col">用户密码</th>
<th scope="col">用户名称</th>
<th scope="col">性别</th>
<th scope="col">用户手机</th>
<th scope="col">用户地址</th>
<th scope="col">操作</th>
</tr>
</thead>
<tbody>
<tr th:each="item,stat:${allUser}" >
<form method="post">
<th th:text="${item.account}"></th>
<th th:text="${item.password}" th:id="'password_'+${item.id}"></th>
<th th:id="'passwordInput_'+${item.id}" style="display:none">
<input type="password" name="password" class="form-control">
<input type="text" name="userID" class="form-control" th:value="${item.id}" style="display:none">
</th>
<th th:text="${item.name}"></th>
<th th:text="${item.agent==1?'女':'男'}"></th>
<th th:text="${item.phone}"></th>
<th th:text="${item.address}"></th>
<th>
<a class="btn btn-primary editPassoword" th:id="'editPassword_'+${item.id}" th:onclick="'editPassword('+${item.id}+')'">编辑</a>
<input class="btn btn-primary savePassword" th:id="'savePassword_'+${item.id}" type="submit" value="保存" style="display:none">
<a class="btn btn-danger" th:href="@{'removeUser?userID=' + ${item.id}}">删除</a>
</th>
</form>
</tr>
</tbody>
</table>
post请求
@RequestMapping(value = "admin/login", method = RequestMethod.POST)
public Object login1(Map<String, Object> map,@RequestParam(value = "account", required = false) String account,
@RequestParam(value = "password", required = false) String password, HttpSession session) {
session.removeAttribute("userID");
session.removeAttribute("username");
if(StringUtils.isEmpty(account)) {
map.put("errors", "账号不能为空!");
}else if(StringUtils.isEmpty(password)){
map.put("errors", "密码不能为空!");
}else {
User user = userDAO.find(account, password);
System.out.println(user);
if (user != null && user.getPermission()==1) {
session.setAttribute("userID", user.getId());
session.setAttribute("username", user.getName());
return new ModelAndView("redirect:/admin/userManager");
} else {
map.put("errors", "账户或者密码错误!");
}
}
return new ModelAndView("admin/login");
}
//通过@RequestParam接收前端post过来的数据
同样根据github上的项目进行修改开发另一套选课系统。后台管理系统使用vue前端框架搭建页面,应用ElementUI组件,vuex数据管理;微信小程序使用uni跨平台技术,可以打包运行在微信开发平台进行调试;后端用的springboot框架搭建的服务端,包含各种接口。springboot项目目录介绍:关键目录是在system目录,controller目录是控制器,控制页面请求的接口地址映射,entity目录实现和数据库表字段之间的映射,vo目录实现的是在entity基础上表关联关系的数据库表字段之间的映射,控制器中访问的服务接口在service中统一管理,对应service.impl目录下的相关文件,具体实现在service.impl中体现,数据库表查询对应dao文件的接口,对应resource目录下mapper目录,实现sql表查询操作。
放上部分截图
