SpingBoot的项目实战--模拟电商【1.首页搭建】

🥳🥳Welcome Huihui's Code World ! !🥳🥳

接下来看看由辉辉所写的关于SpringBoot电商项目的相关操作吧 

目录

🥳🥳Welcome Huihui's Code World ! !🥳🥳

一.项目背景及技术点运用

1.项目背景

2.技术点运用

二.数据库表及依赖

1.数据库

2.依赖

pom

yml

三.需求

1.页面分析

2.数据更换(静态➡动态)

(1)分类数据

(2)具体类别商品展示

①装饰摆件

②墙式壁挂

四.代码编写

0.需求

1.代码生成(model,mapper,service)

五.分类数据

1.mapper

2.service

3.controller

4.前端代码

六.类型具体数据

 1.mapper

2.service

3.controller

4.局部修改

摆件花艺

墙式壁挂

5.html页面


一.项目背景及技术点运用

1.项目背景

写此项目的初衷:最近后台接到了蛮多私信,很多的都在问springboot搭建一个项目会使用到哪些技术,以及怎么写这样一个项目。为了将技术更好的运用以及讲解,于是小编利用工作的空闲时间,写了一个可以训练自己技术点的小项目,大家有兴趣的可以订阅这个合集。

提要:因为这个项目只是练手,数据量很少,也就不存在什么请求卡顿之类的问题了,我就没有在sql优化中花费太多心思了

2.技术点运用

FreeMarker,SpringBoot,Mybatis-plus,Auto2,Spring Security,Mysql,Redis

二.数据库表及依赖

1.数据库

数据库脚本也已经上传上去了,在这篇博文可以看见

2.依赖

pom

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.6</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.wh</groupId><artifactId>easyshop</artifactId><version>0.0.1-SNAPSHOT</version><name>easyshop</name><description>Demo project for Spring Boot</description><properties><!-- <java.version>17</java.version>--></properties><dependencies><!--mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency><!--mybatis-plus的生成插件--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.2</version></dependency><!--spring freemarker--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency><!--oauth2--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-client</artifactId></dependency><!--security--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!--spring mvc--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--热加载工具--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><!--mysql--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--security-test--><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><!--lombok--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

yml

server:port: 8080
spring:freemarker:cache: falsesuffix: .htmltemplate-loader-path: classpath:/templates/mvc:static-path-pattern: /static/**datasource:url: jdbc:mysql://localhost:3306/easyshopdriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: 123456hikari:# 最小空闲连接数量minimum-idle: 5# 空闲连接存活最大时间,默认600000(10分钟)idle-timeout: 180000# 连接池最大连接数,默认是10maximum-pool-size: 10# 此属性控制从池返回的连接的默认自动提交行为,默认值:trueauto-commit: true# 连接池名称pool-name: MyHikariCP# 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟max-lifetime: 1800000# 数据库连接超时时间,默认30秒,即30000connection-timeout: 30000
mybatis-plus:type-aliases-package: com.wh.easyshop.model
#日志配置
logging:level:com.star.easyshop.mapper: debug

三.需求

1.页面分析

这个已经转成pdf文件上传在这篇博文中了

2.数据更换(静态➡动态)

(1)分类数据

(2)具体类别商品展示

①装饰摆件

②墙式壁挂

四.代码编写

0.需求

需要将数据库中对应的商品信息展示在首页

1.代码生成(model,mapper,service)

代码生成类

package com.wh.easyshop.config;import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import lombok.extern.slf4j.Slf4j;import java.util.Arrays;
import java.util.Collections;
import java.util.List;@Slf4j
public class MySQLGenerator {private final static String URL = "jdbc:mysql://localhost:3306/easyshop";private final static String USERNAME = "root";private final static String PASSWORD = "123456";private final static DataSourceConfig.Builder DATA_SOURCE_CONFIG =new DataSourceConfig.Builder(URL, USERNAME, PASSWORD);public static void main(String[] args) {FastAutoGenerator.create(DATA_SOURCE_CONFIG).globalConfig((scanner, builder) ->builder.author(scanner.apply("请输入作者名称?")).outputDir(System.getProperty("user.dir") + "\\src\\main\\java").commentDate("yyyy-MM-dd").dateType(DateType.TIME_PACK)).packageConfig((builder) ->builder.parent("com.wh.easyshop").entity("model").service("service").serviceImpl("service.impl").mapper("mapper").xml("mapper.xml").pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "\\src\\main\\resources\\mapper"))).injectionConfig((builder) ->builder.beforeOutputFile((a, b) -> log.warn("tableInfo: " + a.getEntityName()))).strategyConfig((scanner, builder) ->builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?所有输入 all"))).addTablePrefix("tb_", "t_", "lay_", "meeting_", "sys_").entityBuilder().enableChainModel().enableLombok().enableTableFieldAnnotation().controllerBuilder().enableRestStyle().enableHyphenStyle().build()).templateEngine(new FreemarkerTemplateEngine()).execute();}protected static List<String> getTables(String tables) {return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));}}

五.分类数据

这个地方因为自己在设计表的时候没有考虑完善,所以这个地方的遍历会有点复杂,我把哪些有二级目录的分类菜单的数据加到了数据库中

但是在其中有一些分类的类别是没有二级菜单的,所以这里需要查询三次

一次是查询有二级菜单的分类菜单

一次是查询没有二级菜单的分类菜单

一次是查询二级菜单的具体数据

1.mapper

package com.wh.easyshop.mapper;import com.wh.easyshop.model.Goods;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;import java.util.List;
import java.util.Map;/*** <p>* 商品信息表 Mapper 接口* </p>** @author wh* @since 2023-12-27*/
@Repository
public interface GoodsMapper extends BaseMapper<Goods> {/*** 首页分类* @param type* @return*/List<Map<String,Object>> typelist (String type);}
<?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.wh.easyshop.mapper.GoodsMapper"><select id="typelist" resultType="java.util.Map">SELECT*FROMt_dict_type dt,t_dict_data ddWHEREdt.dict_type = dd.dict_typeANDdt.dict_type = #{type}</select>
</mapper>

2.service

package com.wh.easyshop.service;import com.wh.easyshop.model.Goods;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;import java.util.List;
import java.util.Map;/*** <p>* 商品信息表 服务类* </p>** @author wh* @since 2023-12-27*/
public interface IGoodsService extends IService<Goods> {/*** 首页分类* @param type* @return*/List<Map<String,Object>> typelist (String type);
}
package com.wh.easyshop.service.impl;import com.wh.easyshop.model.Goods;
import com.wh.easyshop.mapper.GoodsMapper;
import com.wh.easyshop.service.IGoodsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;
import java.util.Map;/*** <p>* 商品信息表 服务实现类* </p>** @author wh* @since 2023-12-27*/
@Service
public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements IGoodsService {
@Autowired
private  GoodsMapper goodsMapper;/*** 分类商品* @param type* @return*/@Overridepublic List<Map<String, Object>> typelist(String type) {return goodsMapper.typelist(type);}}

3.controller

package com.wh.easyshop.controller;import com.google.common.collect.Lists;
import com.wh.easyshop.model.DictData;
import com.wh.easyshop.model.DictType;
import com.wh.easyshop.model.Goods;
import com.wh.easyshop.service.IDictDataService;
import com.wh.easyshop.service.IDictTypeService;
import com.wh.easyshop.service.IGoodsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;
import java.util.Map;/*** <p>* 商品信息表 前端控制器* </p>** @author wh* @since 2023-12-27*/
@Controllerpublic class GoodsController {@Autowiredprivate IGoodsService goodsService;@Autowiredprivate IDictTypeService dictTypeService;@Autowiredprivate  IDictDataService dictDataService;/*** 首页商品展示+分类* @param model* @return*/@RequestMapping("/")public String index(Model model) {//1.首页商品展示//商品集合List<Goods> g1 = goodsService.showGoods("01", 6);//切片List<List<Goods>> p1 = Lists.partition(g1, 3);//商品集合List<Goods> g2 = goodsService.showGoods("07", 12);//切片List<List<Goods>> p2 = Lists.partition(g2, 4);model.addAttribute("p1", p1);model.addAttribute("p2", p2);//2.分类//次类名显示//所有商品List<Map<String, Object>> allGoods = goodsService.typelist("all_goods");//装饰摆件List<Map<String, Object>> flowerDer = goodsService.typelist("flowerDer");//布艺软饰List<Map<String, Object>> decoration = goodsService.typelist("decoration");model.addAttribute("allGoods", allGoods);model.addAttribute("flowerDer", flowerDer);model.addAttribute("decoration", decoration);//主类名显示List<DictData> other = dictDataService.list();model.addAttribute("other", other);List<DictType> main = dictTypeService.list();model.addAttribute("main", main);return "index";}}

4.前端代码

<script type="text/javascript" src="js/jquery-1.12.4.min.js"></script>
<script>$(function(){let nickname=getCookie("nickname");if(null!=nickname&&''!=nickname&&undefined!=nickname) {//设置昵称$('#nickname').text("您好,"+nickname);//隐藏登录注册按钮$('p.fl>span:eq(1)').css("display","none");//显示昵称和退出按钮$('p.fl>span:eq(0)').css("display","block");}else{//隐藏昵称$('#nickname').text("");//显示登录注册按钮$('p.fl>span:eq(1)').css("display","block");//隐藏昵称和退出按钮$('p.fl>span:eq(0)').css("display","none");}});function getCookie(cname) {var name = cname + "=";var decodedCookie = decodeURIComponent(document.cookie);var ca = decodedCookie.split(';');for(var i = 0; i <ca.length; i++) {var c = ca[i];while (c.charAt(0) == ' ') {c = c.substring(1);}if (c.indexOf(name) == 0) {return c.substring(name.length, c.length);}}return "";}
</script>
<div class="head"><div class="wrapper clearfix"><div class="clearfix" id="top"><h1 class="fl"><a href="${ctx}/"><img src="img/logo.png"/></a></h1><div class="fr clearfix" id="top1"><p class="fl"><span><span id="nickname"></span><a href="${ctx}/user/userLogout">退出</a></span><span style="display: none"><a href="${ctx}/page/login.html" id="login">登录</a><a href="${ctx}/page/reg.html" id="reg">注册</a></span></p><form action="#" method="get" class="fl"><input type="text" placeholder="热门搜索:干花花瓶" /><input type="button" /></form><div class="btn fl clearfix"><a href="${ctx}/page/mygxin.html"><img src="img/grzx.png"/></a><a href="#" class="er1"><img src="img/ewm.png"/></a><a href="${ctx}/shopCar/queryShopCar"><img src="img/gwc.png"/></a><p><a href="#"><img src="img/smewm.png"/></a></p></div></div></div><ul class="clearfix" id="bott"><li><a href="${ctx}/">首页</a></li><li><#list main as m><#if m.dict_id==2><a href="#">${m.dict_name}</a><!--  <a href="#">所有商品</a>--><div class="sList"><div class="wrapper  clearfix"><a href="${ctx}/page/paint.html"><dl><dd>${m.dict_label}</dd></dl></a></#if></#list></div></div></li><li><#list main as m><#if m.dictId==3><a href="#">${m.dictName}</a></#if></#list><div class="sList2"><div class="clearfix"><#list flowerDer as f><a href="${ctx}/page/proList.html">${f.dict_label}</a></#list></div></div></li><li><#list main as m><#if m.dictId==4><a href="#">${m.dictName}</a></#if></#list><div class="sList2"><div class="clearfix"><#list decoration as d><a href="${ctx}/page/proList.html">${d.dict_label}</a></#list></div></div></li><li><#list other as t><#if t.dictValue=='07'><a href="#">${t.dictLabel}</a></#if></#list></li><li><#list other as t><#if t.dictValue=='08'><a href="#">${t.dictLabel}</a></#if></#list></li><li><#list other as t><#if t.dictValue=='09'><a href="#">${t.dictLabel}</a></#if></#list></li></ul></div>
</div>

六.类型具体数据

 1.mapper

        因为我们展示的商品是按照类别来的,所以我们需要进行条件查询,所以这里我们自己编写一个接口就好了。

        在下面的代码中有一个@Param注解,我们也可以看一下这个注解的作用到底是什么👇👇

@Param注解可用于给Mapper接口中的方法参数起别名。如果一个方法有多个参数,而且这些参数在SQL语句中使用了,则必须给每个参数加上该注解,以便在SQL语句中可以使用参数别名来引用参数

package com.wh.easyshop.mapper;import com.wh.easyshop.model.Goods;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;import java.util.List;/*** <p>* 商品信息表 Mapper 接口* </p>** @author wh* @since 2023-12-27*/
@Repository
public interface GoodsMapper extends BaseMapper<Goods> {/*** 首页商品展示* @param type* @param size* @return*/List<Goods> showGoods (@Param("type") String type, @Param("size") int size);}

对了,我们这里因为是自己编写接口的,所以那个mapper.xml也是需要我们自己写的,目前我们在前端只需要展示装饰摆件以及墙式壁挂,但可能以后也会想要换成其他类型,所以我在mapper.xml中并没有把类型以及展示的条数写死,这样我们想要修改的时候,可以直接在controller层中进行修改

<?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.wh.easyshop.mapper.GoodsMapper"><select id="showGoods" resultType="com.wh.easyshop.model.Goods">SELECT*FROMt_goods g,t_dict_data ddWHEREdd.dict_value = #{type}ANDg.goods_type = dd.dict_valuelimit #{size}</select>
</mapper>

2.service

package com.wh.easyshop.service;import com.wh.easyshop.model.Goods;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;import java.util.List;/*** <p>* 商品信息表 服务类* </p>** @author wh* @since 2023-12-27*/
public interface IGoodsService extends IService<Goods> {/*** 首页商品展示* @param type* @param size* @return*/List<Goods> showGoods (@Param("type") String type, @Param("size") int size);}
package com.wh.easyshop.service.impl;import com.wh.easyshop.model.Goods;
import com.wh.easyshop.mapper.GoodsMapper;
import com.wh.easyshop.service.IGoodsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;/*** <p>* 商品信息表 服务实现类* </p>** @author wh* @since 2023-12-27*/
@Service
public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements IGoodsService {
@Autowired
private  GoodsMapper goodsMapper;/*** 首页商品展示* @param type* @param size* @return*/@Overridepublic List<Goods> showGoods(String type, int size) {return goodsMapper.showGoods(type,size);}
}

3.controller

package com.wh.easyshop.controller;import com.google.common.collect.Lists;
import com.wh.easyshop.model.Goods;
import com.wh.easyshop.service.IGoodsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** <p>* 商品信息表 前端控制器* </p>** @author wh* @since 2023-12-27*/
@Controllerpublic class GoodsController {@Autowiredprivate IGoodsService goodsService;/*** 首页商品展示* @param model* @return*/@RequestMapping("/")public String index(Model model) {//商品集合List<Goods> g1 = goodsService.showGoods("01", 6);//切片List<List<Goods>> p1 = Lists.partition(g1, 3);//商品集合List<Goods> g2 = goodsService.showGoods("07", 12);//切片List<List<Goods>> p2 = Lists.partition(g2, 4);model.addAttribute("p1", p1);model.addAttribute("p2", p2);return "index";}
}

4.局部修改

这时候我们在前端遍历一下,我们的集合,现在就是需要把这个里面的东西都换成数据库来的值

这段是遍历的摆件花艺的值,但是我发现这样子遍历之后,前端的样式不对了

<div class="flower clearfix tran"><#list g1 as g><a href="proDetail.html" class="clearfix"><dl><dt><span class="abl"></span><img src="${g.goodsImg}"/><span class="abr"></span></dt><dd>${g.goodsTitle}</dd><dd><span>¥ 79.00</span></dd></dl></a></#list></div>

现在这些都是一排展示了,而原本它应该是有两排,每排三个的

也是因为我在遍历的时候是遍历的我拿到的6个元素,所以他就一次遍历出来了,如果我们需要完成那种两排的效果,那么需要做一个处理,让它一次只有三个出来,这里其实我们很容易就能够想到,可以使用切片来完成,使用切片也有许多的方法,这里小编使用的是guava,使用这个之前,需要引入相应的依赖

  <!--guava 切片--><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.0.1-jre</version></dependency>

然后我们再修改一下controller层的方法以及前端页面

package com.wh.easyshop.controller;import com.google.common.collect.Lists;
import com.wh.easyshop.model.Goods;
import com.wh.easyshop.service.IGoodsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** <p>* 商品信息表 前端控制器* </p>** @author wh* @since 2023-12-27*/
@Controllerpublic class GoodsController {@Autowiredprivate IGoodsService goodsService;@RequestMapping("/")public String index(Model model) {//商品集合List<Goods> g1 = goodsService.showGoods("01", 6);//切片List<List<Goods>> p1 = Lists.partition(g1, 3);//商品集合List<Goods> g2 = goodsService.showGoods("07", 12);//切片List<List<Goods>> p2 = Lists.partition(g2, 4);model.addAttribute("p1", p1);model.addAttribute("p2", p2);return "index";}
}

摆件花艺

<#list p1 as p><div class="flower clearfix tran"><#list p as g><a href="proDetail.html" class="clearfix"><dl><dt><span class="abl"></span><img src="${g.goodsImg}"/><span class="abr"></span></dt><dd>${g.goodsTitle}</dd><dd><span>¥ 79.00</span></dd></dl></a></#list></div></#list>

现在我们再看一下前端的页面展示,就可以发现是两排的啦

墙式壁挂

<div class="people"><div class="wrapper"><h2><img src="img/ih3.jpg"/></h2><#list p2 as p><div class="pList clearfix tran"><#list p as g><a href="proDetail.html"><dl><dt><span class="abl"></span><img src="${g.goodsImg}"/><span class="abr"></span></dt><dd>${g.goodsTitle}</dd><dd><span>¥${g.goodsPrice}</span></dd></dl></a></#list></div></#list></div>

5.html页面

<!DOCTYPE html>
<html>
<head lang="en"><#include "common/head.html"><link rel="stylesheet" type="text/css" href="css/public.css"/><link rel="stylesheet" type="text/css" href="css/index.css" />
</head>
<body>
<!------------------------------head------------------------------>
<#include "common/top.html"><!-------------------------banner--------------------------->
<div class="block_home_slider"><div id="home_slider" class="flexslider"><ul class="slides"><li><div class="slide"><img src="img/banner2.jpg"/></div></li><li><div class="slide"><img src="img/banner1.jpg"/></div></li></ul></div>
</div><!------------------------------thImg------------------------------>
<div class="thImg"><div class="clearfix"><a href="${ctx}/page/vase_proList.html"><img src="img/i1.jpg"/></a><a href="${ctx}/page/proList.html"><img src="img/i2.jpg"/></a><a href="#2"><img src="img/i3.jpg"/></a></div>
</div><!------------------------------news------------------------------>
<div class="news"><div class="wrapper"><h2><img src="img/ih1.jpg"/></h2><div class="top clearfix"><a href="${ctx}/page/proDetail.html"><img src="img/n1.jpg"/><p></p></a><a href="${ctx}/page/proDetail.html"><img src="img/n2.jpg"/><p></p></a><a href="${ctx}/page/proDetail.html"><img src="img/n3.jpg"/><p></p></a></div><div class="bott clearfix"><a href="${ctx}/page/proDetail.html"><img src="img/n4.jpg"/><p></p></a><a href="${ctx}/page/proDetail.html"><img src="img/n5.jpg"/><p></p></a><a href="${ctx}/page/proDetail.html"><img src="img/n6.jpg"/><p></p></a></div><h2><img src="img/ih2.jpg"/></h2><#list p1 as p><div class="flower clearfix tran"><#list p as g><a href="proDetail.html" class="clearfix"><dl><dt><span class="abl"></span><img src="${g.goodsImg}"/><span class="abr"></span></dt><dd>${g.goodsTitle}</dd><dd><span>¥${g.goodsPrice}</span></dd></dl></a></#list></div></#list></div>
</div><!------------------------------ad------------------------------>
<a href="#" class="ad"><img src="img/ib1.jpg"/></a><!------------------------------people------------------------------>
<div class="people"><div class="wrapper"><h2><img src="img/ih3.jpg"/></h2><#list p2 as p><div class="pList clearfix tran"><#list p as g><a href="proDetail.html"><dl><dt><span class="abl"></span><img src="${g.goodsImg}"/><span class="abr"></span></dt><dd>${g.goodsTitle}</dd><dd><span>¥${g.goodsPrice}</span></dd></dl></a></#list></div></#list></div></div>
</div><#include "common/footer.html"/><script src="js/public.js" type="text/javascript" charset="utf-8"></script>
<script src="js/nav.js" type="text/javascript" charset="utf-8"></script>
<script src="js/jquery.flexslider-min.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">$(function() {$('#home_slider').flexslider({animation: 'slide',controlNav: true,directionNav: true,animationLoop: true,slideshow: true,slideshowSpeed:2000,useCSS: false});});
</script>
</body>
</html>

好啦,今天的分享就到这了,希望能够帮到你呢!😊😊 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 一个有bug的贪吃蛇。。。。。。。。

C 一个有bug的贪吃蛇。。。。。。。。 #include <graphics.h> #include<Windows.h> #include<Mmsystem.h> #include<conio.h> #include<time.h> #include<stdio.h> #include<easyx.h> using namespace std; #pragma warning(di…

Qt之自定义分页(翻页)控件

当数据量较大时,分页显示是个不错的选择。这里用百家姓来演示分页效果,包括首页、上一页、下一页、尾页和跳转。 一.效果 每页15个姓氏。 二.实现 QHPageWidget.h #ifndef QHPAGEWIDGET_H #define QHPAGEWIDGET_H#include <QWidget> #include <QStandardItemMod…

DBeaver连接hive

1.新建hive连接 其中主机填写hive所在节点地址&#xff0c;端口10000为默认&#xff0c;数据库名不填则是默认default数据库&#xff0c;用户名密码填写hadoop集群中能操作hdfs的用户和密码。 2.编辑驱动&#xff0c;驱动的jar包从安装的hive下的jdbc路径下获取&#xff0c;例…

第8章 社会工程学攻击

社会工程学是利用人性弱点体察、获取有价值信息的实践方法&#xff0c;它是一种欺骗的艺术。在缺少目标系统的必要信息时&#xff0c;社会工程学技术是渗透测试人员获取信息的至关重要的手段。对所有类型的组织&#xff08;单位&#xff09;而言&#xff0c;人都是安全防范措施…

STM32 基础知识(探索者开发板)--93讲 PWM

预分频器相当于一个计数器&#xff0c;2分频就是接收2个脉冲传递一个脉冲&#xff0c;3分频就是接收3个脉冲传递一个脉冲&#xff0c;最高65535分频&#xff0c;那么总计时间能达到65535*65535*1/72MHZ 约59秒&#xff0c;没有分频器只能计数最高0.09秒 PWM配置步骤 1.配置定时…

《长江丛刊》期刊投稿发表

《长江丛刊》杂志是由国家新闻出版总署批准的正规期刊&#xff0c;是一本文学类综合性刊物&#xff0c;包括文学评论以及文学作品的发表。是广大专家、学者、教师、学子发表论文、交流信息的重要平台&#xff0c;符合评职称要求&#xff08;单位有特殊要求除外&#xff09;。 …

docker小白第八天

docker小白第八天 redis常规安装 前期已经配好了阿里云容器镜像加速库 docker search redis docker pull redis:6.0.8 docker images redis:6.0.8启动容器,并进入容器的命令行界面 docker run -d -p 6379:6379 redis:6.0.8 docker ps docker exec -it 容器id /bin/bash验证…

Java生态系统的进化:从JDK 1.0到今天

目录 前言 JDK 1.0&#xff1a;开启Java时代 JDK 1.1&#xff1a;Swing和内部类 JDK 1.2&#xff1a;Collections框架和JIT编译器 JDK 1.5&#xff1a;引入泛型和枚举 JDK 1.8&#xff1a;Lambda表达式和流 JDK 11以后&#xff1a;模块化和新特性 未来展望 总结 作者简…

UI自动化Selenium 元素定位之Xpath

一、元素定位方式 selenium中定位元素&#xff0c;通常有几种方式&#xff1a; 1、通过id定位&#xff1a;By.ID 2、通过Name定位&#xff1a;By.Name 3、通过元素其他属性定位&#xff0c;如class、type、text文本。。。。。。等等&#xff0c;如果要用属性定位那就需要使…

虚析构和纯虚析构

多态使用时&#xff0c;如果子类中有属性开辟到堆区&#xff0c;那么父类的指针在释放时无法调用到子类的析构代码 解决方式&#xff1a;将父类中的析构代码函数改为虚析构或者纯虚析构 虚析构和纯虚析构共性&#xff1a; 可以解决父类指针释放子类对象 都需要有具体的函数…

[SWPUCTF 2021 新生赛]finalrce

[SWPUCTF 2021 新生赛]finalrce wp 注&#xff1a;本文参考了 NSSCTF Leaderchen 师傅的题解&#xff0c;并修补了其中些许不足。 此外&#xff0c;参考了 命令执行(RCE)面对各种过滤&#xff0c;骚姿势绕过总结 题目代码&#xff1a; <?php highlight_file(__FILE__); …

【算法练习】leetcode链表算法题合集

链表总结 增加表头元素倒数节点&#xff0c;使用快慢指针环形链表&#xff08;快慢指针&#xff09;合并有序链表&#xff0c;归并排序LRU缓存 算法题 删除链表元素 删除链表中的节点 LeetCode237. 删除链表中的节点 复制后一个节点的值&#xff0c;删除后面的节点&#x…

java球队信息管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web球队信息管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5…

深度学习之RNN

1.循环神经网络 在时间t的时候&#xff0c;对于单个神经元来讲它的输出y(t)如下 wx是对于输入x的权重&#xff0c;wy是对于上一时刻输出的权重 所以循环神经网络有两个权重。 如果有很多这样的神经元并排在一起 则在t时刻的输出y为 这时输入输出都是向量 2.记忆单元 由于循…

车队试验的远程实时显示方案

风丘科技推出的数据远程实时显示方案更好地满足了客户对于试验车队远程实时监控的需求&#xff0c;并真正实现了试验车队的远程管理。随着新的数据记录仪软件IPEmotion RT和相应的跨平台显示解决方案的引入&#xff0c;让我们的客户端不仅可在线访问记录器系统状态&#xff0c;…

git unable to create temporary file: No space left on device(git报错)

1.问题 1.1 vscode中npm run serve跑项目的时候&#xff0c;进度达到95%的时候一直卡着无进度&#xff1b; 1.2 git命令提交代码报错&#xff1b; 2.具体解决 这个错误通常表示你的磁盘空间已经满了&#xff0c;导致 Git 无法在临时目录中创建文件。2.1 清理磁盘空间&#xf…

低代码平台在金融银行中的应用场景

随着数字化转型的推进&#xff0c;商业银行越来越重视技术在业务发展中的作用。在这个背景下&#xff0c;白码低代码平台作为一种新型的开发方式&#xff0c;正逐渐受到广大商业银行的关注和应用。白码低代码平台能够快速构建各类应用程序&#xff0c;提高开发效率&#xff0c;…

跨境电商引流真的很难吗?了解一下这些技巧!

随着全球电商市场的不断扩大&#xff0c;越来越多的企业开始涉足跨境电商领域&#xff0c;然而&#xff0c;与国内电商相比&#xff0c;跨境电商面临着诸多挑战&#xff0c;其中最大的难题之一就是如何有效地吸引潜在客户。 很多卖家觉得跨境电商引流非常困难&#xff0c;但实…

springBoot整合redis做缓存

一、Redis介绍 Redis是当前比较热门的NOSQL系统之一&#xff0c;它是一个开源的使用ANSI c语言编写的key-value存储系统&#xff08;区别于MySQL的二维表格的形式存储。&#xff09;。和Memcache类似&#xff0c;但很大程度补偿了Memcache的不足。和Memcache一样&#xff0c;R…

BAT log-yyyy-mm-dd.log

日志文件 文件名 日期格式化 https://download.csdn.net/download/spencer_tseng/88673832 https://download.csdn.net/download/spencer_tseng/88673716