当前位置:   article > 正文

Spring Boot快速搭建一个简易商城项目【一展示商城首页篇】_springboot电脑商城项目

springboot电脑商城项目

   前言:今天我来使用Spring Boot快速搭建一个简易商城项目以下是相关的思路流程,如果有更好的思路,欢迎大佬评论留言!!!

一,实现思路:

  1. 创建 Spring Boot 项目: 使用 Spring Initializr(https://start.spring.io/)创建一个新的 Spring Boot 项目,添加 Web、JPA、freemack(或其他模板引擎Thymeleaf)、MySQL(或其他数据库)的依赖。

  2. 设计数据库结构: 设计商城所需的数据库表,比如商品表、订单表、用户表等。使用 JPA 或者 MyBatis 等持久层框架来实现对数据库的访问与操作。

  3. 创建实体类: 根据数据库设计创建对应的实体类,并使用注解来映射到数据库表,同时定义实体之间的关联关系。

  4. 编写业务逻辑: 创建服务类来处理商城的业务逻辑,比如商品的增删改查,用户的注册登录,订单的生成与支付等。

  5. 创建控制器: 编写控制器来响应前端页面的请求,接收参数并调用服务层完成相应的业务逻辑处理,然后返回结果给前端页面。

  6. 创建前端页面: 使用 Thymeleaf 或其他前端模板引擎创建商城的前端页面,包括商品展示页、购物车、订单页面等。

  7. 测试与调试: 对整个项目进行测试与调试,确保各项功能正常运行。

  8. 部署与发布: 将项目打包成可执行的 JAR 包,部署到服务器上并启动项目。

以上是一个简单的商城项目的搭建流程。在实际开发中,还需要考虑安全性、性能优化、异常处理等方面的内容。希望这些步骤能够对你有所帮助!如果还有其他问题,请随时提问。

二,使用到的相关技术点:

  1. Spring Boot:作为基础框架,用于快速构建应用程序的后端。

  2. MySQL(或其他数据库):作为数据存储后端,用于存储商品、订单、用户等信息。

  3. Spring Web:用于构建 Web 应用程序,处理 HTTP 请求和响应。

  4. Freemack:用于创建商城的前端页面,实现页面与后端数据的交互。

  5. Spring Security:用于处理用户认证、授权等安全相关的功能。

  6. RESTful API:如果你打算提供给其他应用程序使用的接口,可以考虑使用 RESTful 风格的 API。

  7. Swagger:用于生成 API 文档,方便前端开发人员了解后端接口的使用方法。

  8. Lombok:简化 Java 代码的开发,通过注解的方式来减少冗长的代码。

  9. Log4j/Logback:用于日志记录,方便排查问题和追踪应用程序运行状态。

三,具体步骤:

pom文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.lya</groupId>
  6. <artifactId>lyaspshop</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <name>lyaspshop</name>
  9. <description>lyaspshop</description>
  10. <properties>
  11. <java.version>1.8</java.version>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  14. <spring-boot.version>2.7.6</spring-boot.version>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-freemarker</artifactId>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-web</artifactId>
  24. </dependency>
  25. <!-- 热加载-->
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-devtools</artifactId>
  29. <scope>runtime</scope>
  30. <optional>true</optional>
  31. </dependency>
  32. <dependency>
  33. <groupId>com.mysql</groupId>
  34. <artifactId>mysql-connector-j</artifactId>
  35. <scope>runtime</scope>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.projectlombok</groupId>
  39. <artifactId>lombok</artifactId>
  40. <optional>true</optional>
  41. </dependency>
  42. <!-- test-->
  43. <dependency>
  44. <groupId>org.springframework.boot</groupId>
  45. <artifactId>spring-boot-starter-test</artifactId>
  46. <scope>test</scope>
  47. </dependency>
  48. <!-- mybatis-plus -->
  49. <dependency>
  50. <groupId>com.baomidou</groupId>
  51. <artifactId>mybatis-plus-boot-starter</artifactId>
  52. <version>3.5.2</version>
  53. </dependency>
  54. <dependency>
  55. <groupId>com.baomidou</groupId>
  56. <artifactId>mybatis-plus-generator</artifactId>
  57. <version>3.5.2</version>
  58. </dependency>
  59. <!-- 集合分割-->
  60. <dependency>
  61. <groupId>com.google.guava</groupId>
  62. <artifactId>guava</artifactId>
  63. <version>20.0</version>
  64. </dependency>
  65. <!-- Druid 数据库连接池 -->
  66. <dependency>
  67. <groupId>com.alibaba</groupId>
  68. <artifactId>druid-spring-boot-starter</artifactId>
  69. <version>1.1.10</version>
  70. </dependency>
  71. </dependencies>
  72. <dependencyManagement>
  73. <dependencies>
  74. <dependency>
  75. <groupId>org.springframework.boot</groupId>
  76. <artifactId>spring-boot-dependencies</artifactId>
  77. <version>${spring-boot.version}</version>
  78. <type>pom</type>
  79. <scope>import</scope>
  80. </dependency>
  81. </dependencies>
  82. </dependencyManagement>
  83. <build>
  84. <plugins>
  85. <plugin>
  86. <groupId>org.apache.maven.plugins</groupId>
  87. <artifactId>maven-compiler-plugin</artifactId>
  88. <version>3.8.1</version>
  89. <configuration>
  90. <source>1.8</source>
  91. <target>1.8</target>
  92. <encoding>UTF-8</encoding>
  93. </configuration>
  94. </plugin>
  95. <plugin>
  96. <groupId>org.springframework.boot</groupId>
  97. <artifactId>spring-boot-maven-plugin</artifactId>
  98. <version>${spring-boot.version}</version>
  99. <configuration>
  100. <mainClass>com.lya.lyaspshop.LyaspshopApplication</mainClass>
  101. <skip>true</skip>
  102. </configuration>
  103. <executions>
  104. <execution>
  105. <id>repackage</id>
  106. <goals>
  107. <goal>repackage</goal>
  108. </goals>
  109. </execution>
  110. </executions>
  111. </plugin>
  112. </plugins>
  113. </build>
  114. </project>

配置:application.yml文件:都有注释放心引用:

  1. server:
  2. port: 8080
  3. spring:
  4. freemarker:
  5. # 设置模板后缀名
  6. suffix: .html
  7. # 设置文档类型
  8. content-type: text/html
  9. # 设置页面编码格式
  10. charset: UTF-8
  11. # 设置页面缓存
  12. cache: false
  13. # 设置ftl文件路径
  14. template-loader-path: classpath:/templates
  15. # 设置静态文件路径,js,css等
  16. mvc:
  17. static-path-pattern: /static/**
  18. datasource:
  19. driver-class-name: com.mysql.cj.jdbc.Driver
  20. username: root
  21. password: 123456
  22. url: jdbc:mysql://localhost:3306/lyaspshop
  23. druid:
  24. filter:
  25. stat:
  26. merge-sql: true # 合并 SQL 语句
  27. slow-sql-millis: 5000 # 慢查询阈值,单位为毫秒
  28. initial-size: 5 # 初始连接数
  29. max-active: 20 # 最大活跃连接数
  30. max-pool-prepared-statement-per-connection-size: 20 # 每个连接上缓存的 PreparedStatement 数量
  31. max-wait: 60000 # 获取连接的最大等待时间,单位为毫秒
  32. min-evictable-idle-time-millis: 30000 # 连接在池中最小空闲时间,超过该时间会被销毁,单位为毫秒
  33. min-idle: 5 # 最小空闲连接数
  34. pool-prepared-statements: true # 启用预编译语句缓存
  35. stat-view-servlet: # Druid 的监控页面配置
  36. allow: 127.0.0.1 # 允许访问的 IP 地址
  37. enabled: true # 是否启用监控页面
  38. login-password: admin # 登录密码
  39. login-username: admin # 登录用户名
  40. reset-enable: true # 是否允许重置统计信息
  41. url-pattern: /druid/* # 监控页面的访问路径
  42. test-on-borrow: true # 在连接池中获取连接时,是否进行有效性检测
  43. test-on-return: false # 在连接池中归还连接时,是否进行有效性检测
  44. test-while-idle: true # 在连接池中空闲连接的扫描间隔时间内,是否进行有效性检测
  45. time-between-eviction-runs-millis: 60000 # 空闲连接的扫描间隔时间,单位为毫秒
  46. validation-query: SELECT 1 FROM DUAL # 用于校验连接是否有效的 SQL 查询语句
  47. web-stat-filter: # Druid 的 Web 统计过滤器配置
  48. enabled: true # 是否启用 Web 统计过滤器
  49. exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*' # 排除的资源路径
  50. session-stat-enable: true # 是否记录 Session 的统计信息
  51. session-stat-max-count: 100 # 最多同时记录的 Session 数量
  52. url-pattern: /* # 统计过滤器的 URL 匹配模式
  53. mybatis-plus:
  54. #类型别名
  55. type-aliases-package: com.lya.lyaspshop.pojo
  56. configuration:
  57. #驼峰命名法
  58. map-underscore-to-camel-case: true
  59. logging:
  60. level:
  61. com.lya.lyaspshop.mapper: debug

PageController 

  1. package com.lya.lyaspshop.controller;
  2. import com.google.common.collect.Lists;
  3. import com.lya.lyaspshop.pojo.Goods;
  4. import com.lya.lyaspshop.service.impl.GoodsServiceImpl;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.ui.Model;
  8. import org.springframework.web.bind.annotation.PathVariable;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. import java.util.List;
  11. @Controller
  12. public class PageController {
  13. @Autowired
  14. private GoodsServiceImpl goodsService;
  15. @RequestMapping("/")
  16. public String index(Model model) {
  17. List<Goods> gs1 = goodsService.queryshopbytypeguava("01", 6);
  18. List<List<Goods>> ps1 = Lists.partition(gs1, 3);
  19. List<Goods> gs2 = goodsService.queryshopbytypeguava("07", 12);
  20. List<List<Goods>> ps2 = Lists.partition(gs2, 4);
  21. model.addAttribute("ps1", ps1);
  22. model.addAttribute("ps2", ps2);
  23. return "index";
  24. }
  25. @RequestMapping("/page/{page}")
  26. public String to(@PathVariable("page") String page) {
  27. return page.replace(".html", "");
  28. }
  29. }

商城首页:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <#include "common/head.html">
  5. <link rel="stylesheet" type="text/css" href="css/public.css"/>
  6. <link rel="stylesheet" type="text/css" href="css/index.css" />
  7. </head>
  8. <body>
  9. <!------------------------------head------------------------------>
  10. <#include "common/top.html">
  11. <!-------------------------banner--------------------------->
  12. <div class="block_home_slider">
  13. <div id="home_slider" class="flexslider">
  14. <ul class="slides">
  15. <li>
  16. <div class="slide">
  17. <img src="img/banner2.jpg"/>
  18. </div>
  19. </li>
  20. <li>
  21. <div class="slide">
  22. <img src="img/banner1.jpg"/>
  23. </div>
  24. </li>
  25. </ul>
  26. </div>
  27. </div>
  28. <!------------------------------thImg------------------------------>
  29. <div class="thImg">
  30. <div class="clearfix">
  31. <a href="${ctx}/page/vase_proList.html"><img src="img/i1.jpg"/></a>
  32. <a href="${ctx}/page/proList.html"><img src="img/i2.jpg"/></a>
  33. <a href="#2"><img src="img/i3.jpg"/></a>
  34. </div>
  35. </div>
  36. <!------------------------------news------------------------------>
  37. <div class="news">
  38. <div class="wrapper">
  39. <h2><img src="img/ih1.jpg"/></h2>
  40. <div class="top clearfix">
  41. <a href="${ctx}/page/proDetail.html"><img src="img/n1.jpg"/><p></p></a>
  42. <a href="${ctx}/page/proDetail.html"><img src="img/n2.jpg"/><p></p></a>
  43. <a href="${ctx}/page/proDetail.html"><img src="img/n3.jpg"/><p></p></a>
  44. </div>
  45. <div class="bott clearfix">
  46. <a href="${ctx}/page/proDetail.html"><img src="img/n4.jpg"/><p></p></a>
  47. <a href="${ctx}/page/proDetail.html"><img src="img/n5.jpg"/><p></p></a>
  48. <a href="${ctx}/page/proDetail.html"><img src="img/n6.jpg"/><p></p></a>
  49. </div>
  50. <h2><img src="img/ih2.jpg"/></h2>
  51. <#list ps1 as ps >
  52. <div class="flower clearfix tran">
  53. <#list ps as p >
  54. <a href="proDetail.html" class="clearfix">
  55. <dl>
  56. <dt>
  57. <span class="abl"></span>
  58. <img src="${p.goodsImg}"/>
  59. <span class="abr"></span>
  60. </dt>
  61. <dd>${p.goodsName}</dd>
  62. <dd><span>¥ ${p.goodsPrice}</span></dd>
  63. </dl>
  64. </a>
  65. </#list>
  66. </div>
  67. </#list>
  68. </div>
  69. </div>
  70. <!------------------------------ad------------------------------>
  71. <a href="#" class="ad"><img src="img/ib1.jpg"/></a>
  72. <!------------------------------people------------------------------>
  73. <div class="people">
  74. <div class="wrapper">
  75. <h2><img src="img/ih3.jpg"/></h2>
  76. <div class="pList clearfix tran">
  77. <a href="proDetail.html">
  78. <dl>
  79. <dt>
  80. <span class="abl"></span>
  81. <img src="img/s7.jpg"/>
  82. <span class="abr"></span>
  83. </dt>
  84. <dd>【最家】不锈钢壁饰墙饰软装</dd>
  85. <dd><span>688.00</span></dd>
  86. </dl>
  87. </a>
  88. <a href="proDetail.html">
  89. <dl>
  90. <dt>
  91. <span class="abl"></span>
  92. <img src="img/s10.jpg"/>
  93. <span class="abr"></span>
  94. </dt>
  95. <dd>【最家】小城动物木板画壁挂北欧</dd>
  96. <dd><span>188.00</span></dd>
  97. </dl>
  98. </a>
  99. <a href="proDetail.html">
  100. <dl>
  101. <dt>
  102. <span class="abl"></span>
  103. <img src="img/s4.jpg"/>
  104. <span class="abr"></span>
  105. </dt>
  106. <dd>【最家】玄关假山水壁饰背景墙饰挂件创意</dd>
  107. <dd><span>599.00</span></dd>
  108. </dl>
  109. </a>
  110. <a href="proDetail.html">
  111. <dl>
  112. <dt>
  113. <span class="abl"></span>
  114. <img src="img/s9.jpg"/>
  115. <span class="abr"></span>
  116. </dt>
  117. <dd>【最家】金属树枝壁饰铜鸟装饰品</dd>
  118. <dd><span>928.00</span></dd>
  119. </dl>
  120. </a>
  121. </div>
  122. <div class="pList clearfix tran">
  123. <a href="proDetail.html">
  124. <dl>
  125. <dt>
  126. <span class="abl"></span>
  127. <img src="img/s6.jpg"/>
  128. <span class="abr"></span>
  129. </dt>
  130. <dd>【最家】金属壁饰创意背景墙面挂件创意</dd>
  131. <dd><span>228.00</span></dd>
  132. </dl>
  133. </a>
  134. <a href="proDetail.html">
  135. <dl>
  136. <dt>
  137. <span class="abl"></span>
  138. <img src="img/s8.jpg"/>
  139. <span class="abr"></span>
  140. </dt>
  141. <dd>【最家】小城动物木板画壁挂北欧</dd>
  142. <dd><span>199.00</span></dd>
  143. </dl>
  144. </a>
  145. <a href="proDetail.html">
  146. <dl>
  147. <dt>
  148. <span class="abl"></span>
  149. <img src="img/s12.jpg"/>
  150. <span class="abr"></span>
  151. </dt>
  152. <dd>【最家】欧式复古挂钟创意餐厅钟表家居挂件</dd>
  153. <dd><span>666.00</span></dd>
  154. </dl>
  155. </a>
  156. <a href="proDetail.html">
  157. <dl>
  158. <dt>
  159. <span class="abl"></span>
  160. <img src="img/s1.jpg"/>
  161. <span class="abr"></span>
  162. </dt>
  163. <dd>【最家】客厅地中海欧式现代相片墙创意</dd>
  164. <dd><span>59.80</span></dd>
  165. </dl>
  166. </a>
  167. </div>
  168. <div class="pList clearfix tran">
  169. <a href="proDetail.html">
  170. <dl>
  171. <dt>
  172. <span class="abl"></span>
  173. <img src="img/s5.jpg"/>
  174. <span class="abr"></span>
  175. </dt>
  176. <dd>【最家】铁艺荷叶壁挂软装背景墙上装饰品</dd>
  177. <dd><span>800.00</span></dd>
  178. </dl>
  179. </a>
  180. <a href="proDetail.html">
  181. <dl>
  182. <dt>
  183. <span class="abl"></span>
  184. <img src="img/s3.jpg"/>
  185. <span class="abr"></span>
  186. </dt>
  187. <dd>【最家】欧式照片墙 创意组合结婚礼物</dd>
  188. <dd><span>189.00</span></dd>
  189. </dl>
  190. </a>
  191. <a href="proDetail.html">
  192. <dl>
  193. <dt>
  194. <span class="abl"></span>
  195. <img src="img/s2.jpg"/>
  196. <span class="abr"></span>
  197. </dt>
  198. <dd>【最家】欧式钟表相框墙挂墙创意组合</dd>
  199. <dd><span>148.00</span></dd>
  200. </dl>
  201. </a>
  202. <a href="proDetail.html">
  203. <dl>
  204. <dt>
  205. <span class="abl"></span>
  206. <img src="img/s11.jpg"/>
  207. <span class="abr"></span>
  208. </dt>
  209. <dd>【最家】小城动物木板画壁挂北欧</dd>
  210. <dd><span>188.00</span></dd>
  211. </dl>
  212. </a>
  213. </div>
  214. </div>
  215. </div>
  216. <#include "common/footer.html"/>
  217. <script src="js/public.js" type="text/javascript" charset="utf-8"></script>
  218. <script src="js/nav.js" type="text/javascript" charset="utf-8"></script>
  219. <script src="js/jquery.flexslider-min.js" type="text/javascript" charset="utf-8"></script>
  220. <script type="text/javascript">
  221. $(function() {
  222. $('#home_slider').flexslider({
  223. animation: 'slide',
  224. controlNav: true,
  225. directionNav: true,
  226. animationLoop: true,
  227. slideshow: true,
  228. slideshowSpeed:2000,
  229. useCSS: false
  230. });
  231. });
  232. </script>
  233. </body>
  234. </html>

查询首页类型语句:

  1. <select id="queryshopbytypeguava" resultType="goods">
  2. SELECT
  3. *
  4. FROM
  5. t_goods g,
  6. t_dict_data t
  7. WHERE
  8. g.goods_type = t.dict_value
  9. AND t.dict_value = #{type} LIMIT #{size}
  10. </select>

访问试用

遇到的报错:

注:

在 MyBatis 中,@Param 注解用于给 SQL 语句中的参数起一个自定义的名称,以便在 XML 映射文件中引用这些参数。在 Java 中使用 @Param 注解可以帮助提高 SQL 语句的可读性和灵活性。以下是 @Param 注解的基本用法:

  1. 在接口方法中使用 @Param 注解:

    public interface UserMapper { User selectUserById(@Param("userId") int userId); }

    在这个例子中,@Param 注解用于给参数 userId 起了一个别名 "userId"。

  2. 在 XML 映射文件中引用 @Param 注解定义的参数:

    <select id="selectUserById" resultType="User"> SELECT * FROM user WHERE id = #{userId} </select>

    在这个例子中,我们可以通过 #{userId} 引用接口方法中使用 @Param 注解定义的参数。

通过使用 @Param 注解,我们可以更清晰地表达出每个参数的含义,避免在 XML 文件中直接引用方法参数名带来的歧义。此外,@Param 注解还可以用于解决传递多个参数时的问题,比如在 SQL 语句中引用多个参数。

需要注意的是,在 MyBatis 的 3.4.1 版本之前,如果你使用了 Java 8 及以上版本,MyBatis 会自动支持参数的注解,不需要显式地使用 @Param 注解。但是,为了代码的清晰性和规范性,建议在接口方法中明确地使用 @Param 注解。

总而言之,@Param 注解可以让你在 MyBatis 中更清晰地定义参数,并在 XML 映射文件中引用这些参数,从而提高代码的可读性和维护性。

在 Spring 框架中,@PathVariable 注解用于从 URL 路径中提取参数值,以便在处理请求的方法中使用。它通常与 @RequestMapping 注解一起使用,用于将路径变量与请求的 URL 匹配。

下面是 @PathVariable 注解的基本用法:

  1. 在控制器方法中使用 @PathVariable 注解:
@Controller @RequestMapping("/users") public class UserController { @GetMapping("/{id}") public String getUserById(@PathVariable("id") int userId) { // 处理逻辑 return "user"; } }

在这个例子中,@PathVariable 注解将 URL 路径中的 {id} 部分提取为 userId 参数,并将其传递给 getUserById 方法。

  1. 在请求的 URL 中使用路径变量:

GET /users/123

在这个例子中,请求的 URL 包含路径变量 123,它会被 @PathVariable("id") 提取并传递给 getUserById 方法的 userId 参数。

通过使用 @PathVariable 注解,我们可以方便地从 URL 中提取路径变量,并在处理请求的方法中使用。这样可以使代码更具可读性和灵活性,并且可以实现根据不同的路径变量执行不同的逻辑。

需要注意的是,@PathVariable 注解默认是必需的,即请求的 URL 中必须包含对应的路径变量。如果路径变量是可选的,可以使用 @PathVariable(required = false) 或者给参数设置默认值来指定它是可选的。

希望对你有所帮助!如果还有其他问题,请随时提问。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号