{"id":14983111,"url":"https://github.com/pgcai/gymms","last_synced_at":"2025-10-29T21:30:35.969Z","repository":{"id":41009063,"uuid":"262808795","full_name":"pgcai/GymMS","owner":"pgcai","description":"Gym management system based on SSM.","archived":false,"fork":false,"pushed_at":"2022-12-16T00:41:08.000Z","size":5714,"stargazers_count":36,"open_issues_count":5,"forks_count":10,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-02T04:41:19.807Z","etag":null,"topics":["java","mybatis","springmvc"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pgcai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-05-10T14:47:10.000Z","updated_at":"2025-01-29T11:50:23.000Z","dependencies_parsed_at":"2023-01-29T06:45:16.772Z","dependency_job_id":null,"html_url":"https://github.com/pgcai/GymMS","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pgcai%2FGymMS","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pgcai%2FGymMS/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pgcai%2FGymMS/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pgcai%2FGymMS/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pgcai","download_url":"https://codeload.github.com/pgcai/GymMS/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238892208,"owners_count":19548150,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","mybatis","springmvc"],"created_at":"2024-09-24T14:06:45.361Z","updated_at":"2025-10-29T21:30:32.769Z","avatar_url":"https://github.com/pgcai.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Gym management system based on SSM\n\n\u003e The project was made in 2020-05-05~2020-05-10\n\u003e\n\u003e 谨以此片博文记录下我的第一个Java小Demo\n\n\n\n## 项目展示\n\n![](https://img2020.cnblogs.com/blog/1593734/202005/1593734-20200510223056729-1025028746.png)\n\n\n\u003e **用户登录页**\n\n\n![](https://img2020.cnblogs.com/blog/1593734/202005/1593734-20200510223105878-2066053629.png)\n\n\n\u003e **用户注册页**\n\n\n\n![](https://img2020.cnblogs.com/blog/1593734/202005/1593734-20200510223115078-1710400359.png)\n\n\n\u003e **用户主页**\n\n\n\n![](https://img2020.cnblogs.com/blog/1593734/202005/1593734-20200510223123422-8795051.png)\n\n\n\u003e **用户购买健身卡**(商城)**页**\n\n\n\n![](https://img2020.cnblogs.com/blog/1593734/202005/1593734-20200510223132037-664136393.png)\n\n\n\u003e **管理员登录页**\n\n\n\n![](https://img2020.cnblogs.com/blog/1593734/202005/1593734-20200510223138826-2034480811.png)\n\n\n\u003e **管理员主页**\n\n\n\n![](https://img2020.cnblogs.com/blog/1593734/202005/1593734-20200510223149527-465864464.png)\n\n\n\u003e**管理员添加用户页**\n\n\n![](https://img2020.cnblogs.com/blog/1593734/202005/1593734-20200510223242033-123391326.png)\n\n\n\u003e**管理员编辑用户页**\n\n\n![](https://img2020.cnblogs.com/blog/1593734/202005/1593734-20200510223251566-250540578.png)\n\n\n\u003e**细节1：常驻工具栏（内含搜索栏）**\n\n\n\n![](https://img2020.cnblogs.com/blog/1593734/202005/1593734-20200510223259006-331494198.png)\n\n\n\u003e**细节2：登录账号密码实时反馈（AJAX）**\n\n\n![](https://img2020.cnblogs.com/blog/1593734/202005/1593734-20200510223308617-203187542.png)\n\n\n\u003e**细节3：翻页功能\u0026可选每页显示条数 **\n\n\n\n![](https://img2020.cnblogs.com/blog/1593734/202005/1593734-20200510223313817-1851190412.png)\n\n\n\u003e**细节4：人性化的交互设计**\n\n\n\n## 项目环境\n\n- JDK: 1.8\n\n- IDE: IDEA 201903\n\n- DataBase: MySQL 8.0\n\n- Mybatis: 3.5.2\n\n- POM: Maven\n\n- Tomcat 9\n- Bootstrap 3\n- JQuery 2\n- lombok 插件\n\n- 分页插件: PageHelper 5.1.11\n- 涉及技术 MySQL数据库，Spring，JavaWeb及MyBatis，简单的前端知识\n\n## 项目详情\n\n### 设计数据库\n\n\u003e 大二没有好好学系统设计与分析，画的图一塌糊涂。\n\n![](https://img2020.cnblogs.com/blog/1593734/202005/1593734-20200510223327088-1597991601.png)\n\n\n\u003e 包含两个实体类，用户\u0026管理员\n\u003e\n\u003e 生成该数据库的sql文件 在该链接跳转GitHub /sql 目录下\n\n\n![](https://img2020.cnblogs.com/blog/1593734/202005/1593734-20200510223339885-123568355.png)\n\n\n\u003e 生成表如图示\n\n### 设计要实现的功能\n\n\u003e 应该叫做用例图吧，但我的好多符号都是错的，再次后悔没有好好学习！\n\n![](https://img2020.cnblogs.com/blog/1593734/202005/1593734-20200510223346220-866693620.png)\n\n\n### 制作前端页面Demo\n\n![](https://img2020.cnblogs.com/blog/1593734/202005/1593734-20200510223352024-1606258504.png)\n\n\n\u003e 设计该图的[网址](www.processon.com)\n\n其实这一步放在后面也合适，我为了让自己吃大饼，就先设计了一下。\n\n### 环境配置\n\n![](https://img2020.cnblogs.com/blog/1593734/202005/1593734-20200510223407489-1370411315.png)\n\n\n\u003e 项目文件结构如图所示\n\n#### 基本步骤\n\n1. 新建Maven项目，添加web支持\n\n2. 导入pom依赖\n\n   ```xml\n   \u003cdependencies\u003e\n      \u003c!--Junit--\u003e\n      \u003cdependency\u003e\n          \u003cgroupId\u003ejunit\u003c/groupId\u003e\n          \u003cartifactId\u003ejunit\u003c/artifactId\u003e\n          \u003cversion\u003e4.12\u003c/version\u003e\n      \u003c/dependency\u003e\n      \u003c!--数据库驱动--\u003e\n      \u003cdependency\u003e\n          \u003cgroupId\u003emysql\u003c/groupId\u003e\n          \u003cartifactId\u003emysql-connector-java\u003c/artifactId\u003e\n          \u003cversion\u003e5.1.47\u003c/version\u003e\n      \u003c/dependency\u003e\n      \u003c!-- 数据库连接池 --\u003e\n      \u003cdependency\u003e\n          \u003cgroupId\u003ecom.mchange\u003c/groupId\u003e\n          \u003cartifactId\u003ec3p0\u003c/artifactId\u003e\n          \u003cversion\u003e0.9.5.2\u003c/version\u003e\n      \u003c/dependency\u003e\n   \n      \u003c!--Servlet - JSP --\u003e\n      \u003cdependency\u003e\n          \u003cgroupId\u003ejavax.servlet\u003c/groupId\u003e\n          \u003cartifactId\u003eservlet-api\u003c/artifactId\u003e\n          \u003cversion\u003e2.5\u003c/version\u003e\n      \u003c/dependency\u003e\n      \u003cdependency\u003e\n          \u003cgroupId\u003ejavax.servlet.jsp\u003c/groupId\u003e\n          \u003cartifactId\u003ejsp-api\u003c/artifactId\u003e\n          \u003cversion\u003e2.2\u003c/version\u003e\n      \u003c/dependency\u003e\n      \u003cdependency\u003e\n          \u003cgroupId\u003ejavax.servlet\u003c/groupId\u003e\n          \u003cartifactId\u003ejstl\u003c/artifactId\u003e\n          \u003cversion\u003e1.2\u003c/version\u003e\n      \u003c/dependency\u003e\n   \n      \u003c!--Mybatis--\u003e\n      \u003cdependency\u003e\n          \u003cgroupId\u003eorg.mybatis\u003c/groupId\u003e\n          \u003cartifactId\u003emybatis\u003c/artifactId\u003e\n          \u003cversion\u003e3.5.2\u003c/version\u003e\n      \u003c/dependency\u003e\n      \u003cdependency\u003e\n          \u003cgroupId\u003eorg.mybatis\u003c/groupId\u003e\n          \u003cartifactId\u003emybatis-spring\u003c/artifactId\u003e\n          \u003cversion\u003e2.0.2\u003c/version\u003e\n      \u003c/dependency\u003e\n   \n      \u003c!--Spring--\u003e\n      \u003cdependency\u003e\n          \u003cgroupId\u003eorg.springframework\u003c/groupId\u003e\n          \u003cartifactId\u003espring-webmvc\u003c/artifactId\u003e\n          \u003cversion\u003e5.1.9.RELEASE\u003c/version\u003e\n      \u003c/dependency\u003e\n      \u003cdependency\u003e\n          \u003cgroupId\u003eorg.springframework\u003c/groupId\u003e\n          \u003cartifactId\u003espring-jdbc\u003c/artifactId\u003e\n          \u003cversion\u003e5.1.9.RELEASE\u003c/version\u003e\n      \u003c/dependency\u003e\n   \u003c/dependencies\u003e\n   ```\n\n3. Maven资源过滤\n\n   ```xml\n   \u003cbuild\u003e\n      \u003cresources\u003e\n          \u003cresource\u003e\n              \u003cdirectory\u003esrc/main/java\u003c/directory\u003e\n              \u003cincludes\u003e\n                  \u003cinclude\u003e**/*.properties\u003c/include\u003e\n                  \u003cinclude\u003e**/*.xml\u003c/include\u003e\n              \u003c/includes\u003e\n              \u003cfiltering\u003efalse\u003c/filtering\u003e\n          \u003c/resource\u003e\n          \u003cresource\u003e\n              \u003cdirectory\u003esrc/main/resources\u003c/directory\u003e\n              \u003cincludes\u003e\n                  \u003cinclude\u003e**/*.properties\u003c/include\u003e\n                  \u003cinclude\u003e**/*.xml\u003c/include\u003e\n              \u003c/includes\u003e\n              \u003cfiltering\u003efalse\u003c/filtering\u003e\n          \u003c/resource\u003e\n      \u003c/resources\u003e\n   \u003c/build\u003e\n   ```\n\n4. 建立基本结构框架 （如上所示[点此跳转](# 环境配置)\n\n5. 建立基本配置\n\n   - mybatis-config.xml\n\n     ```xml\n     \u003c?xml version=\"1.0\" encoding=\"UTF-8\" ?\u003e\n     \u003c!DOCTYPE configuration\n            PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\n            \"http://mybatis.org/dtd/mybatis-3-config.dtd\"\u003e\n     \u003cconfiguration\u003e\n     \n     \u003c/configuration\u003e\n     ```\n\n   - applicationContext.xml\n\n     ```xml\n     \u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n     \u003cbeans xmlns=\"http://www.springframework.org/schema/beans\"\n           xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n          xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n            http://www.springframework.org/schema/beans/spring-beans.xsd\"\u003e\n     \n     \u003c/beans\u003e\n     ```\n\n6. Mybatis层编写\n\n   - 数据库配置文件 **database.properties**\n\n     ```properties\n     jdbc.driver=com.mysql.jdbc.Driver\n     jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=true\u0026useUnicode=true\u0026characterEncoding=utf8\n     jdbc.username=root\n     jdbc.password=123456IDEA关联数据库\n     ```\n\n   - IDEA关联数据库\n\n   - 编写MyBatis的核心配置文件\n\n     ```xml\n     \u003c?xml version=\"1.0\" encoding=\"UTF-8\" ?\u003e\n     \u003c!DOCTYPE configuration\n            PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\n            \"http://mybatis.org/dtd/mybatis-3-config.dtd\"\u003e\n     \u003cconfiguration\u003e\n        \n        \u003ctypeAliases\u003e\n            \u003cpackage name=\"com.kuang.pojo\"/\u003e\n        \u003c/typeAliases\u003e\n        \u003cmappers\u003e\n            \u003cmapper resource=\"com/kuang/dao/BookMapper.xml\"/\u003e\n        \u003c/mappers\u003e\n     \n     \u003c/configuration\u003e\n     ```\n\n### POJO Mapper Services的编写\n\n#### POJO\n\n1. User\n\n   ```java\n   @Data  //使用lombok插件即可省写get set\n   @AllArgsConstructor\n   @NoArgsConstructor\n   public class User {\n       private int id;\n       private String username;\n       private String password;\n       private String name;\n       private String sex;\n       private String telephone;\n       private int age;\n       private String begintime;\n       private String endtime;\n       private int remainday;\n       private int addday;\n   \n       public static void main(String[] args) {\n           User u = new User();\n           u.getTelephone();\n       }\n   }\n   ```\n\n2. Admin\n\n   ```java\n   @Data\n   @NoArgsConstructor\n   @AllArgsConstructor\n   public class Admin {\n       private int id;\n       private String username;\n       private String password;\n       private String name;\n       private String telephone;\n   }\n   ```\n\n#### Mapper\n\n1. 编写DAO层的Mapper接口\n\n   1. 1 userMapper\n\n   ```java\n   public interface UserMapper {\n       //通过id查询\n       User queryUserById(int id);\n   //    查询到期时间\n       Date queryDateById(int id);\n       //修改账号密码\n       int updateNP(User user);\n       //login\n       User userLogin(User user);\n       //会员注册\n       int userRegister(User user);\n   }\n   ```\n\n   1. 2 adminMapper \n\n      ```java\n      @Mapper\n      @Component\n      public interface AdminMapper{\n          //查询会员\n          List\u003cUser\u003e queryUser();\n          //新增会员\n          int addUser(User user);\n          //删除会员\n          int deleteUserById(int id);\n          //更新会员\n          int updateUser(User user);\n          //根据id查询一个会员\n          User queryUserById(int id);\n          //根据姓名查询一个会员\n          User queryUserByName(String name);\n          //login\n          Admin adminLogin(Admin admin);\n          //查询用户总数\n          int selectTotal();\n          //    分页\n          @Select(\"select * from gymms.user\")\n          @Results({\n                  // 用户信息，只要指定id列与属性的映射关系，其他列会自动封装（属性与列一致）\n                  @Result(property = \"id\", column = \"id\"),\n                  // 信息\n                  @Result(property = \"id\", column = \"id\"),\n                  @Result(property = \"username\", column = \"username\"),\n                  @Result(property = \"password\", column = \"password\"),\n                  @Result(property = \"name\", column = \"name\"),\n                  @Result(property = \"sex\", column = \"sex\"),\n                  @Result(property = \"telephone\", column = \"telephone\"),\n                  @Result(property = \"age\", column = \"age\"),\n                  @Result(property = \"begintime\", column = \"begintime\"),\n                  @Result(property = \"endtime\", column = \"endtime\"),\n                  @Result(property = \"remainday\", column = \"remainday\")\n          })\n          List\u003cUser\u003e findAll();\n      }\n      ```\n\n2. 编写接口对应的 Mapper.xml 文件\n\n   2. 1 userMapper.xml\n\n   ```xml\n   \u003c?xml version=\"1.0\" encoding=\"UTF-8\" ?\u003e\n   \u003c!DOCTYPE mapper\n           PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n           \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\"\u003e\n   \n   \u003cmapper namespace=\"com.cc.dao.UserMapper\"\u003e\n       \u003cselect id=\"queryDate\" resultType=\"User\"\u003e\n           select remainday from gymms.user\n         where id = #{id}\n       \u003c/select\u003e\n   \u003c!--    查询用户--\u003e\n       \u003cselect id=\"queryUserById\" resultType=\"User\"\u003e\n           select * from gymms.user\n         where id = #{id}\n       \u003c/select\u003e\n       \u003c!--更新User--\u003e\n       \u003cupdate id=\"updateUser\" parameterType=\"User\"\u003e\n         update gymms.user\n         set username = #{username},password = #{password}\n         where id = #{id}\n      \u003c/update\u003e\n       \u003c!--根据账号密码查询,返回一个User--\u003e\n       \u003cselect id=\"userLogin\" resultType=\"User\"\u003e\n           select * from gymms.user\n         where username = #{username} and password = #{password}\n       \u003c/select\u003e\n   \u003c!--    会员注册--\u003e\n       \u003c!--增加一个会员--\u003e\n       \u003cinsert id=\"userRegister\" parameterType=\"User\"\u003e\n         insert into gymms.user(username,password,name,sex,telephone,age,begintime,endtime,remainday)\n         values (#{username},#{password},#{name},#{sex},#{telephone},#{age},#{begintime},#{endtime},#{remainday})\n      \u003c/insert\u003e\n   \u003c/mapper\u003e\n   ```\n\n   \n\n   2. 2 adminMapper.xml\n\n   ```xml\n   \u003c?xml version=\"1.0\" encoding=\"UTF-8\" ?\u003e\n   \u003c!DOCTYPE mapper\n           PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n           \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\"\u003e\n   \u003cmapper namespace=\"com.cc.dao.AdminMapper\"\u003e\n       \u003c!--增加一个会员--\u003e\n       \u003cinsert id=\"addUser\" parameterType=\"User\"\u003e\n         insert into gymms.user(username,password,name,sex,telephone,age,begintime,endtime,remainday)\n         values (#{username},#{password},#{name},#{sex},#{telephone},#{age},#{begintime},#{endtime},#{remainday})\n      \u003c/insert\u003e\n       \u003c!--根据id删除一个User--\u003e\n       \u003cdelete id=\"deleteUserById\" parameterType=\"int\"\u003e\n         delete from gymms.user where id=#{id}\n      \u003c/delete\u003e\n       \u003c!--更新User--\u003e\n       \u003cupdate id=\"updateUser\" parameterType=\"User\"\u003e\n         update gymms.user\n         set username = #{username},password = #{password},name = #{name},sex = #{sex},telephone = #{telephone},\n         age = #{age},endtime = #{endtime},remainday = #{remainday}\n         where id = #{id}\n      \u003c/update\u003e\n       \u003c!--根据id查询,返回一个User--\u003e\n       \u003cselect id=\"queryUserById\" resultType=\"User\"\u003e\n         select * from gymms.user\n         where id = #{id}\n      \u003c/select\u003e\n       \u003c!--根据姓名查询,返回一个User--\u003e\n       \u003cselect id=\"queryUserByName\" resultType=\"User\"\u003e\n         select * from gymms.user\n         where name = #{name}\n      \u003c/select\u003e\n       \u003c!--查询全部Book--\u003e\n       \u003cselect id=\"queryUser\" resultType=\"User\"\u003e\n         SELECT * from gymms.user\n      \u003c/select\u003e\n       \u003c!--根据账号密码查询,返回一个Admin--\u003e\n       \u003cselect id=\"adminLogin\" resultType=\"Admin\"\u003e\n           select * from gymms.admin\n         where username = #{username} and password = #{password}\n       \u003c/select\u003e\n       \u003cselect id=\"selectTotal\" resultType=\"int\"\u003e\n           select count(*) from gymms.user\n       \u003c/select\u003e\n   \u003c/mapper\u003e\n   ```\n\n   \n\n3. 编写Service层的接口和实现类\n\n   3. 1 userService\n\n   ```java\n   public interface UserService {\n       //    查询到期时间\n       Date queryDateById(int id);\n       //修改账号密码\n       int updateNP(User user);\n       //login\n       User userLogin(User user);\n       //通过id查询\n       User queryUserById(int id);\n       //会员注册\n       int userRegister(User user);\n   }\n   ```\n\n   3. 2 adminService\n\n   ```java\n   public interface AdminService {\n       //查询会员\n       List\u003cUser\u003e queryUser();\n       //新增会员\n       int addUser(User user);\n       //删除会员\n       int deleteUserById(int id);\n       //更新会员\n       int updateUser(User user);\n       //根据id查询一个会员\n       User queryUserById(int id);\n       //根据姓名查询一个会员\n       User queryUserByName(String name);\n       //login\n       Admin adminLogin(Admin admin);\n       //查询用户总数\n       int selectTotal();\n       //    分页\n       List\u003cUser\u003e findAll();\n   \n       /**\n        * 分页查询\n        * @param pageNum  当然页\n        * @param pageSize 页大小\n        * @return 返回PageHelper提供的封装分页参数的PageInfo对象\n        */\n       PageInfo\u003cUser\u003e findByPage(int pageNum, int pageSize);\n   }\n   ```\n\n   3. 3 userServiceImpl\n\n   ```java\n   public class UserServiceImpl implements UserService {\n       private UserMapper userMapper;\n       public void setUserMapper(UserMapper userMapper) {\n           this.userMapper = userMapper;\n       }\n       public Date queryDateById(int id) {\n           return userMapper.queryDateById(id);\n       }\n       public int updateNP(User user) {\n           return userMapper.updateNP(user);\n       }\n       public User userLogin(User user) {\n           return userMapper.userLogin(user);\n       }\n       public User queryUserById(int id) {\n           return userMapper.queryUserById(id);\n       }\n       public int userRegister(User user) {\n           return userMapper.userRegister(user);\n       }\n   }\n   ```\n\n   3. 4 adminServiceImpl\n\n   ```java\n   public class AdminServiceImpl implements AdminService {\n       private AdminMapper adminMapper;\n       public void setAdminMapper(AdminMapper adminMapper) {\n           this.adminMapper = adminMapper;\n       }\n       public List\u003cUser\u003e queryUser() {\n           return adminMapper.queryUser();\n       }\n       public int addUser(User user) {\n           return adminMapper.addUser(user);\n       }\n       public int deleteUserById(int id) {\n           return adminMapper.deleteUserById(id);\n       }\n       public int updateUser(User user) {\n           return adminMapper.updateUser(user);\n       }\n       public User queryUserById(int id) { \n           return adminMapper.queryUserById(id); \n       }\n       public User queryUserByName(String name) { \n           return adminMapper.queryUserByName(name); \n       }\n       public Admin adminLogin(Admin admin) {\n           return adminMapper.adminLogin(admin);\n       }\n       public int selectTotal() {\n           return adminMapper.selectTotal();\n       }\n       public List\u003cUser\u003e findAll() {\n           return adminMapper.findAll();\n       }\n       public PageInfo\u003cUser\u003e findByPage(int pageNum, int pageSize) {\n           PageHelper.startPage(pageNum, pageSize);\n           List\u003cUser\u003e list = adminMapper.findAll();\n           PageInfo\u003cUser\u003e pageInfo = new PageInfo\u003c\u003e(list);\n           return pageInfo;\n       }\n   }\n   ```\n\n\n\n#### Spring层\n\n- 配置**Spring整合MyBatis**，我们这里数据源使用c3p0连接池；\n\n- 编写Spring整合Mybatis的相关的配置文件；\n\n  spring-dao.xml\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cbeans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns:context=\"http://www.springframework.org/schema/context\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n       http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://www.springframework.org/schema/context\n       https://www.springframework.org/schema/context/spring-context.xsd\"\u003e\n\n    \u003c!-- 配置整合mybatis --\u003e\n    \u003c!-- 1.关联数据库文件 --\u003e\n    \u003ccontext:property-placeholder location=\"classpath:database.properties\"/\u003e\n\n    \u003c!-- 2.数据库连接池 --\u003e\n    \u003c!--数据库连接池\n        dbcp 半自动化操作 不能自动连接\n        c3p0 自动化操作（自动的加载配置文件 并且设置到对象里面）\n    --\u003e\n    \u003cbean id=\"dataSource\" class=\"com.mchange.v2.c3p0.ComboPooledDataSource\"\u003e\n        \u003c!-- 配置连接池属性 --\u003e\n        \u003cproperty name=\"driverClass\" value=\"${jdbc.driver}\"/\u003e\n        \u003cproperty name=\"jdbcUrl\" value=\"${jdbc.url}\"/\u003e\n        \u003cproperty name=\"user\" value=\"${jdbc.username}\"/\u003e\n        \u003cproperty name=\"password\" value=\"${jdbc.password}\"/\u003e\n\n        \u003c!-- c3p0连接池的私有属性 --\u003e\n        \u003cproperty name=\"maxPoolSize\" value=\"30\"/\u003e\n        \u003cproperty name=\"minPoolSize\" value=\"10\"/\u003e\n        \u003c!-- 关闭连接后不自动commit --\u003e\n        \u003cproperty name=\"autoCommitOnClose\" value=\"false\"/\u003e\n        \u003c!-- 获取连接超时时间 --\u003e\n        \u003cproperty name=\"checkoutTimeout\" value=\"10000\"/\u003e\n        \u003c!-- 当获取连接失败重试次数 --\u003e\n        \u003cproperty name=\"acquireRetryAttempts\" value=\"2\"/\u003e\n    \u003c/bean\u003e\n\n    \u003c!-- 3.配置SqlSessionFactory对象 --\u003e\n    \u003cbean id=\"sqlSessionFactory\" class=\"org.mybatis.spring.SqlSessionFactoryBean\"\u003e\n        \u003c!-- 注入数据库连接池 --\u003e\n        \u003cproperty name=\"dataSource\" ref=\"dataSource\"/\u003e\n        \u003c!-- 配置MyBaties全局配置文件:mybatis-config.xml --\u003e\n        \u003cproperty name=\"configLocation\" value=\"classpath:mybatis-config.xml\"/\u003e\n    \u003c/bean\u003e\n\n    \u003c!-- 4.配置扫描Dao接口包，动态实现Dao接口注入到spring容器中 --\u003e\n    \u003c!--解释 ：https://www.cnblogs.com/jpfss/p/7799806.html--\u003e\n    \u003cbean class=\"org.mybatis.spring.mapper.MapperScannerConfigurer\"\u003e\n        \u003c!-- 注入sqlSessionFactory --\u003e\n        \u003cproperty name=\"sqlSessionFactoryBeanName\" value=\"sqlSessionFactory\"/\u003e\n        \u003c!-- 给出需要扫描Dao接口包 --\u003e\n        \u003cproperty name=\"basePackage\" value=\"com.cc.dao\"/\u003e\n    \u003c/bean\u003e\n\u003c/beans\u003e\n```\n\n- **Spring整合service层**\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cbeans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns:context=\"http://www.springframework.org/schema/context\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n   http://www.springframework.org/schema/beans/spring-beans.xsd\n   http://www.springframework.org/schema/context\n   http://www.springframework.org/schema/context/spring-context.xsd\"\u003e\n    \u003c!-- 扫描service相关的bean --\u003e\n    \u003ccontext:component-scan base-package=\"com.cc.service\" /\u003e\n    \u003c!--AdminServiceImpl注入到IOC容器中--\u003e\n    \u003cbean id=\"AdminServiceImpl\" class=\"com.cc.service.AdminServiceImpl\"\u003e\n        \u003cproperty name=\"adminMapper\" ref=\"adminMapper\"/\u003e\n    \u003c/bean\u003e\n    \u003c!--UserServiceImpl注入到IOC容器中--\u003e\n    \u003cbean id=\"UserServiceImpl\" class=\"com.cc.service.UserServiceImpl\"\u003e\n        \u003cproperty name=\"userMapper\" ref=\"userMapper\"/\u003e\n    \u003c/bean\u003e\n    \u003c!-- 配置事务管理器 --\u003e\n    \u003cbean id=\"transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\"\u003e\n        \u003c!-- 注入数据库连接池 --\u003e\n        \u003cproperty name=\"dataSource\" ref=\"dataSource\" /\u003e\n    \u003c/bean\u003e\n\u003c/beans\u003e\n```\n\n\n\n#### SpringMVC层\n\n- **web.xml**\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cweb-app xmlns=\"http://xmlns.jcp.org/xml/ns/javaee\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd\"\n         version=\"4.0\"\u003e\n    \u003c!--DispatcherServlet--\u003e\n    \u003cservlet\u003e\n        \u003cservlet-name\u003eDispatcherServlet\u003c/servlet-name\u003e\n        \u003cservlet-class\u003eorg.springframework.web.servlet.DispatcherServlet\u003c/servlet-class\u003e\n        \u003cinit-param\u003e\n            \u003cparam-name\u003econtextConfigLocation\u003c/param-name\u003e\n            \u003c!--一定要注意:我们这里加载的是总的配置文件，之前被这里坑了！--\u003e\n            \u003cparam-value\u003eclasspath:applicationContext.xml\u003c/param-value\u003e\n        \u003c/init-param\u003e\n        \u003cload-on-startup\u003e1\u003c/load-on-startup\u003e\n    \u003c/servlet\u003e\n    \u003cservlet-mapping\u003e\n        \u003cservlet-name\u003eDispatcherServlet\u003c/servlet-name\u003e\n        \u003curl-pattern\u003e/\u003c/url-pattern\u003e\n    \u003c/servlet-mapping\u003e\n\n    \u003c!--encodingFilter--\u003e\n    \u003cfilter\u003e\n        \u003cfilter-name\u003eencodingFilter\u003c/filter-name\u003e\n        \u003cfilter-class\u003e\n            org.springframework.web.filter.CharacterEncodingFilter\n        \u003c/filter-class\u003e\n        \u003cinit-param\u003e\n            \u003cparam-name\u003eencoding\u003c/param-name\u003e\n            \u003cparam-value\u003eutf-8\u003c/param-value\u003e\n        \u003c/init-param\u003e\n    \u003c/filter\u003e\n    \u003cfilter-mapping\u003e\n        \u003cfilter-name\u003eencodingFilter\u003c/filter-name\u003e\n        \u003curl-pattern\u003e/*\u003c/url-pattern\u003e\n    \u003c/filter-mapping\u003e\n\n    \u003c!--Session过期时间--\u003e\n    \u003csession-config\u003e\n        \u003csession-timeout\u003e15\u003c/session-timeout\u003e\n    \u003c/session-config\u003e\n\u003c/web-app\u003e\n```\n\n\n\n- **spring-mvc.xml**\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cbeans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns:context=\"http://www.springframework.org/schema/context\"\n       xmlns:mvc=\"http://www.springframework.org/schema/mvc\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n   http://www.springframework.org/schema/beans/spring-beans.xsd\n   http://www.springframework.org/schema/context\n   http://www.springframework.org/schema/context/spring-context.xsd\n   http://www.springframework.org/schema/mvc\n   https://www.springframework.org/schema/mvc/spring-mvc.xsd\"\u003e\n    \u003c!-- 配置SpringMVC --\u003e\n    \u003c!-- 1.开启SpringMVC注解驱动 --\u003e\n    \u003cmvc:annotation-driven\u003e\n    \u003c/mvc:annotation-driven\u003e\n    \u003c!-- 2.静态资源默认servlet配置--\u003e\n    \u003cmvc:default-servlet-handler/\u003e\n    \u003c!-- 3.配置jsp 显示ViewResolver视图解析器 --\u003e\n    \u003cbean class=\"org.springframework.web.servlet.view.InternalResourceViewResolver\"\u003e\n        \u003cproperty name=\"viewClass\" value=\"org.springframework.web.servlet.view.JstlView\" /\u003e\n        \u003cproperty name=\"prefix\" value=\"/WEB-INF/jsp/\" /\u003e\n        \u003cproperty name=\"suffix\" value=\".jsp\" /\u003e\n    \u003c/bean\u003e\n    \u003c!-- 日期转换 --\u003e\n    \u003cbean class=\"org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter\"\u003e\n        \u003cproperty name=\"webBindingInitializer\"\u003e\n            \u003cbean class=\"com.cc.utils.convertDate\"/\u003e\n        \u003c/property\u003e\n    \u003c/bean\u003e\n    \u003c!-- 4.扫描web相关的bean --\u003e\n    \u003ccontext:component-scan base-package=\"com.cc.controller\" /\u003e\n\n\u003c/beans\u003e\n```\n\n\n\n- **Spring配置整合文件，applicationContext.xml**\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cbeans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n       http://www.springframework.org/schema/beans/spring-beans.xsd\"\u003e\n    \u003c!--3. 创建SqlSessionFactoryBean，注入连接池--\u003e\n    \u003cbean class=\"org.mybatis.spring.SqlSessionFactoryBean\"\u003e\n        \u003cproperty name=\"dataSource\" ref=\"dataSource\"\u003e\u003c/property\u003e\n    \u003c/bean\u003e\n\n    \u003cimport resource=\"classpath:spring/spring-dao.xml\"/\u003e\n    \u003cimport resource=\"classpath:spring/spring-service.xml\"/\u003e\n    \u003cimport resource=\"classpath:spring/spring-mvc.xml\"/\u003e\n\n\u003c/beans\u003e\n```\n\n#### Controller\u0026视图层\n\n- UserController\n\n```java\npackage com.cc.controller;\n\nimport com.cc.pojo.User;\nimport com.cc.service.UserService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.ResponseBody;\nimport org.springframework.web.bind.annotation.RestController;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.text.ParseException;\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\n\n@Controller\n@RequestMapping(\"/user\")\npublic class UserController {\n\n    @Autowired\n    @Qualifier(\"UserServiceImpl\")\n    private UserService userService;\n\n    @RequestMapping(\"/toLogin\")\n    public String toLoginUser(Model model,\n                              HttpServletRequest request\n                              ) {\n        try {\n            String username = request.getParameter(\"username\");\n            String password = request.getParameter(\"password\");\n\n            System.out.println(username+\"  \"+password);\n            User user =new User();\n            user.setUsername(username);\n            user.setPassword(password);\n            User users = userService.userLogin(user);\n            if (users.getId() \u003e 0) {\n//            model.addAttribute(\"user\", users);\n                model.addAttribute(\"user\", users);\n                return \"userMain\";\n            }\n        } catch (Exception e) {\n            model.addAttribute(\"error\",\"Wrong username or password!\");\n            return \"redirect:/\";\n        }\n        return \"redirect:/\";\n    }\n\n    @ResponseBody\n    @RequestMapping(\"/toLogintest\")\n    public String userLogin(String name,String pwd) {\n        String msg = \"Wrong username or password!\";\n        //模拟数据库中存在数据\n        if ((name != null) \u0026\u0026 (pwd != null)) {\n            //        从数据库检索是否存在该用户\n            User user = new User();\n            user.setUsername(name);\n            user.setPassword(pwd);\n            try {\n                User users = userService.userLogin(user);\n                if (users.getUsername().equals(name) \u0026\u0026 users.getPassword().equals(pwd)) {\n                    msg = \"Login Success\";\n                }\n                return msg;\n            }catch (Exception e){}\n            return msg; //g\n        }\n        return msg;\n    }\n\n    @RequestMapping(\"/userBuy\")\n    public String userBuyCard(Model model,int id) throws ParseException {\n        User user = userService.queryUserById(id);\n        System.out.println(user);\n        model.addAttribute(\"user\",user );\n        return \"userMall\";\n    }\n    @RequestMapping(\"/userMianPage\")\n    public String userMianPage(Model model,int id) throws ParseException {\n        User user = userService.queryUserById(id);\n        System.out.println(user);\n        model.addAttribute(\"user\",user );\n        return \"userMain\";\n    }\n//    跳转注册页面\n    @RequestMapping(\"/toUserRegister\")\n    public String toAddPaper() {\n        return \"register\";\n    }\n    //注册\n    @RequestMapping(\"/userRegister\")\n    public String registerUser(User user) throws ParseException {\n        SimpleDateFormat sp = new SimpleDateFormat(\"yyyy-MM-dd hh:mm:ss\");\n        String date = sp.format(new Date());\n        user.setBegintime(date);\n        user.setEndtime(date);\n        user.setRemainday(0);\n        userService.userRegister(user);\n        return \"redirect:/user/toLogin\";\n    }\n}\n\n```\n\n\n\n- AdminController\n\n```java\npackage com.cc.controller;\n\nimport com.cc.pojo.Admin;\nimport com.cc.pojo.User;\nimport com.cc.service.AdminService;\nimport com.github.pagehelper.PageInfo;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport java.text.ParseException;\nimport java.text.SimpleDateFormat;\nimport java.util.Calendar;\nimport java.util.Date;\nimport java.util.List;\n\n@Controller\n@RequestMapping(\"/admin\")\npublic class AdminController {\n    @Autowired\n    @Qualifier(\"AdminServiceImpl\")\n    private AdminService adminService;\n    \n    @RequestMapping(\"/toAddUser\")\n    public String toAddPaper() {\n        return \"register\";\n    }\n\n    @RequestMapping(\"/addUser\")\n    public String addPaper(User user) throws ParseException {\n        System.out.println(user);\n        SimpleDateFormat dateFormat = new SimpleDateFormat(\"yyyy-MM-dd\"); // 日期格式\n        Date date = dateFormat.parse(user.getBegintime()); // 指定日期\n        Calendar cl = Calendar.getInstance();\n        cl.setTime(date);\n        cl.add(Calendar.DATE, user.getRemainday());\n        String temp = \"\";\n        temp = dateFormat.format(cl.getTime());\n        user.setEndtime(temp);\n        adminService.addUser(user);\n        return \"redirect:/admin/findByPage\";\n    }\n    @RequestMapping(\"/toUpdateUser\")\n    public String toUpdateUser(Model model, int id) {\n        User user = adminService.queryUserById(id);\n        System.out.println(user);\n        model.addAttribute(\"user\",user );\n        return \"updateUser\";\n    }\n\n    @RequestMapping(\"/updateUser\")\n    public String updateUser(Model model, User user) throws ParseException {\n        SimpleDateFormat dateFormat = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\"); // 日期格式\n        Date date = dateFormat.parse(user.getBegintime()); // 指定日期\n        Calendar cl = Calendar.getInstance();\n        cl.setTime(date);\n        int allday = user.getRemainday()+user.getAddday();\n        cl.add(Calendar.DATE, allday);\n        String temp = \"\";\n        temp = dateFormat.format(cl.getTime());\n        user.setEndtime(temp);\n        user.setRemainday(allday);\n        adminService.updateUser(user);\n        User users = adminService.queryUserById(user.getId());\n        model.addAttribute(\"user\", users);\n        return \"redirect:/admin/findByPage\";\n    }\n    @RequestMapping(\"/del/{userId}\")\n    public String deleteBook(@PathVariable(\"userId\") int id) {\n        adminService.deleteUserById(id);\n        return \"redirect:/admin/findByPage\";\n    }\n    @RequestMapping(\"/toaLogin\")\n    public String toaLogin() {\n        return \"/aLogin\";\n    }\n    @RequestMapping(\"/aLogin\")\n    public String toLoginUser(Admin admin) {\n        System.out.println(admin.getUsername()+admin.getPassword());\n        try {\n            Admin admins = adminService.adminLogin(admin);\n            if (admins.getId() \u003e 0) {\n//            model.addAttribute(\"user\", users);\n                return \"redirect:/admin/findByPage\";\n            }\n        }catch (Exception e){\n            return \"/aLogin\";\n        }\n        return \"/aLogin\";\n    }\n@RequestMapping(\"/findAll\")\npublic ModelAndView findAll() {\n    //1.1 调用service\n    List\u003cUser\u003e list = adminService.findAll();\n    //1.2 返回结果\n    ModelAndView mv = new ModelAndView();\n    mv.setViewName(\"order-list\");\n    mv.addObject(\"list\", list);\n    return mv;\n}\n\n    @RequestMapping(\"/findByPage\")\n    public String findByPage(Model model,\n            @RequestParam(defaultValue = \"1\") int pageNum,\n            @RequestParam(defaultValue = \"11\") int pageSize) {\n        PageInfo\u003cUser\u003e pageInfo = adminService.findByPage(pageNum, pageSize);\n//        PageInfo pageInfo = adminService.findByPage(pageNum, pageSize);\n        //1.1 调用service\n        //1.2 返回结果\n        model.addAttribute(\"list\", pageInfo.getList());\n        model.addAttribute(\"pageInfo\", pageInfo);\n        return \"allUserPage\";\n    }\n    @RequestMapping(\"/searchUser\")\n    public String searchUser(Model model, String name) {\n        try {\n            User user = adminService.queryUserByName(name);\n            System.out.println(user);\n            model.addAttribute(\"user\", user);\n            if (user.getName() == null) {\n                return \"redirect:/admin/findByPage\";\n            }\n            return \"updateUser\";\n        }catch (Exception e){\n            return \"redirect:/admin/findByPage\";\n        }\n    }\n//    商城\n@RequestMapping(\"/buy\")\npublic String buyCard() throws ParseException {\n    return \"mall\";\n}\n\n}\n\n```\n\n##### 视图层\n\n![image-20200510221105529](E:\\MyMD\\健身房管理系统\\image\\vw.png)\n\n\u003e 详情见GitHub\n\n### 拓展与展望\n\n以下功能在以后可拓展开发\n![](https://img2020.cnblogs.com/blog/1593734/202005/1593734-20200510223506173-1926830963.png)\n\n![](https://img2020.cnblogs.com/blog/1593734/202005/1593734-20200510223514318-559773983.png)\n\n\n## 结束与总结\n\n这个小Demo做了五六天,分页那里卡了接近两天，无数的坑等着踩。\n\n期间也体会到了编程的乐趣，每天晚上都肝的快快乐乐。\n\n所有代码放在GitHub供大家交流学习。\n\n今天母亲节呀，祝我妈妈母亲节快乐！ 晚安！\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpgcai%2Fgymms","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpgcai%2Fgymms","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpgcai%2Fgymms/lists"}