B2C电商项目

首页多类别热门商品接口

外界发起请求先到的位置是商品服务,商品服务调用类别服务,类别服务查询到数据后返回商品服务,商品服务再进行数据库的查询,封装结果后返回给前端。前端传过来的是categoryName:[数组]数组里边装的是类别名称。类别名称到商品服务后要调用对应的类别服务。类别服务:/category/hots,数组就没办法路径传参了,用请求体传类别的集合,这个集合装的是类别的名称,通过类别集合到类别服务要进行数据库的查询,之后返回封装。之前的是返回封装的类别对象,但是封装的类别对象也会转成LinkedHashMap。我们希望返回R,但R的data中装类别的id,也就是类别名称对应的类别集合。到商品服务就:1、判断类别查询效果,2、根据类别的id进行商品的查询(只查询热门商品,并且7条),最后结果封装返回就可以。
开发步骤:
1、编写param(编写一个接集合的,上次的是单个值)
2、先完成类别的一套业务(根据类别的集合,怎么查到对应的值)
3、定义feign客户端(在原来的里边加方法就可以了),商品服务通过客户端调用类别服务
4、编写商品的一套业务
在这里插入图片描述
1、

package com.qqhru.param;

import lombok.Data;
import javax.validation.constraints.NotEmpty;
import java.util.List;
/**
 * 热门商品参数接收对象
 */
@Data
public class ProductHotParam {
    @NotEmpty//集合不能为空,集合是NotEmpty
    private List<String> categoryName;
}

2、

/**
     * 热门类别id查询
     * @return
     */
    @PostMapping("/hots")
    public R hots(@RequestBody @Validated ProductHotParam productHotParam, BindingResult result){
        if (result.hasErrors()){
            return R.fail("类别集合查询失败!");
        }
        return categoryService.hotsCategory(productHotParam);
    }


/**
     * 根据传入的热门类别名称集合,返回类别对应的id集合
     * @param productHotParam
     * @return
     */
    R hotsCategory(ProductHotParam productHotParam);

3、

/**
     * 根据传入的热门类别名称集合,返回类别对应的id集合
     * @param productHotParam
     * @return
     */
    @Override
    public R hotsCategory(ProductHotParam productHotParam) {
        //1、封装查询类别名称
        QueryWrapper<Category> categoryQueryWrapper = new QueryWrapper<>();
        //eq是单个值,in是集合
        categoryQueryWrapper.in("category_name",productHotParam.getCategoryName());//哪一列:category_name 值:productHotParam.getCategoryName()
        //如果不指定列,默认查询表中的和类别名称有关的所有列
        categoryQueryWrapper.select("category_id");//查询指定类别(查询指定列)

        //查询数据库
        List<Object> ids = categoryMapper.selectObjs(categoryQueryWrapper);//类别id的集合
        /*将类别集合封装返回*/
        R ok = R.ok("类别集合查询成功", ids);
        log.info("CategoryServiceImpl.hotsCategory业务结束,结果:{}",ok);
        return ok;
    }
/**
 * 类别的调用接口
 */
@FeignClient("category-service")//客户端调用的服务名称
public interface CategoryClient {
    //根据类别集合查询类别id的方法
    /*调用类别里边根据类别集合查询类别id的方法*/
     /*注意:写全路径,根据路径配上服务去注册中心找服务的对应地址,最终向服务发起请求*/
    @PostMapping("/category/hots")
    R hots(@RequestBody ProductPromoParam productPromoParam);
}
 @PostMapping("/hots")
    public R hots(@RequestBody @Validated ProductPromoParam productPromoParam,BindingResult result){
        if (result.hasErrors()){
            return R.fail("数据查询失败!");
        }
        return productService.hots(productPromoParam);
    }

 /**
     * 多类别热门商品查询,根据类别名称集合!最多查询7条
     * 1、调用类别服务
     * 2、类别集合id查询商品
     * 3、结果集封装即可
     * @param productPromoParam 类别名称集合
     * @return
     */
    R hots(ProductPromoParam productPromoParam);
  /**
     * 多类别热门商品查询,根据类别名称集合!最多查询7条
     * 1、调用类别服务
     * 2、类别集合id查询商品
     * 3、结果集封装即可
     * @param productPromoParam 类别名称集合
     * @return
     */
    @Override
    public R hots(ProductPromoParam productPromoParam) {
        R r = categoryClient.hots(productPromoParam);
        if (r.getCode().equals(R.FAIL_CODE)){
            log.info("ProductServiceImpl.hots业务结束,结果:{}",r.getMsg());
            return r;
        }
        //
        List<Object> ids = (List<Object>) r.getData();
        //进行商品数据查询
        QueryWrapper<Product> productQueryWrapper = new QueryWrapper<>();
        productQueryWrapper.in("category_id",ids);//商品表中的category_id等于ids
        productQueryWrapper.orderByDesc("product_sales");//热门商品要倒叙,根据商品价格倒叙
        //封装分页参数
        IPage<Product> page = new Page<>();

        page = productMapper.selectPage(page,productQueryWrapper);
        List<Product> records = page.getRecords();
        R ok = R.ok("多类别热门商品查询成功");
        return ok;
    }
商品类别信息接口
 @GetMapping("/list")
    public R list(){
        return categoryService.list();
    }

/**
     * 查询类别数据,进行返回
     * @return
     */
    R list();
  @GetMapping("/category/list")
    R list();

 @PostMapping("/category/list")
    public R clist(){
        return productService.clist();
    }

 /**
     * 查询类别商品集合
     * @return
     */
    R clist();


 /**
     * 查询类别商品集合
     * @return
     */
    @Override
    public R clist() {
        R r = categoryClient.list();//  R ok = R.ok("类别集合全部数据查询成功!", categoryList);
        log.info("ProductServiceImpl.clist业务结束,结果:{}",r);
        return r;
    }
/**
 * 类别实体类
 * 如果有天改了category,需要在ProductService修改获取category_id的key
 */
@Data
@TableName("category")
public class Category {
    @JsonProperty("category_id")//json格式化,显示在前端
    @TableId(type = IdType.AUTO)
    private Integer categoryId;
    @JsonProperty("category_name")
    private String categoryName;
}
指定类别商品和全部商品接口

1、定义接收参数的param
2、controller、service、mapper

1/*单类别(指定类别)商品展示*/
@Data
public class ProductIdsParam extends PageParam{
    //可以为空的集合,但是不能传空的值
    @NotNull
    private List<Integer> categoryID;

    private int currentPage = 1;
    private int pageSize = 15;//默认值
}
2@PostMapping("/bycategory")
    public R byCategory(@RequestBody @Validated ProductIdsParam productIdsParam,BindingResult result){
        if (result.hasErrors()){
            return R.fail("类别商品查询失败!");
        }
        return productService.byCategory(productIdsParam);
    }
3/**
     * 通用性的业务
     *  如果传入了类别型的id,根据id查询并且分页
     *  如果没有传入类别的id,查询全部!
     * @param productIdsParam
     * @return
     */
    R byCategory(ProductIdsParam productIdsParam);
4@Override
    public R byCategory(ProductIdsParam productIdsParam) {
        List<Integer> categoryID = productIdsParam.getCategoryID();
        /*封装参数*/
        QueryWrapper<Product> queryWrapper = new QueryWrapper<>();

        if (!categoryID.isEmpty()) {
            queryWrapper.in("category_id",categoryID);
        }
        /*分页*/
        IPage<Product> page =  new Page<>(productIdsParam.getCurrentPage(),productIdsParam.getPageSize());

        /*查询:在当页显示的商品。如果queryWrapper为空,就查询全部*/
        page = productMapper.selectPage(page,queryWrapper);

        /*结果集封装时候封装一个对应的total*/
        R ok = R.ok("查询成功", page.getRecords(), page.getTotal());
        log.info("ProductServiceImpl.byCategory业务结束,结果:{}",ok);
        return ok;
    }
5@PostMapping("/all")
    public R all(@RequestBody @Validated ProductIdsParam productIdsParam,BindingResult result){
        if (result.hasErrors()){
            return R.fail("类别商品查询失败!");
        }
        return productService.byCategory(productIdsParam);
    }
商品详情(单个商品)
/*商品id参数接收*/
import lombok.Data;
import javax.validation.constraints.NotNull;

@Data
public class ProductIdParam {
    @NotNull
    private Integer productID;
}


 @PostMapping("/detail")
    public R detail(@RequestBody @Validated ProductIdParam productIdParam, BindingResult result){
        if (result.hasErrors()){
            return R.fail("商品详情查询失败!");
        }
        return productService.detail(productIdParam.getProductID());
    }


/**
     * 根据商品id查询商品详情信息
     * @param productID
     * @return
     */
    R detail(Integer productID);

  @Override
    public R detail(Integer productID) {
        Product product = productMapper.selectById(productID);

        /*查到数据封装*/
        R ok = R.ok(product);
        log.info("ProductServiceImpl.detail业务结束,结果:{}",ok);
        return ok;
    }
图片详情接口

商品图片返回的是一个新的表,还要声明一个对应的实体类,实体类在声明的时候需不需要json格式化
在这里插入图片描述

/**
 * 商品图片实体类
 */
@TableName("product_picture")
public class Picture {
    @TableId(type = IdType.AUTO)
    private Integer id;

    @TableField("product_id")//数据库表中字段,不声明也没事,会自动改成驼峰式,显示声明效率会更高
    @JsonProperty("product_id")//前台测试结果中显示成的JSON格式
    private Integer productId;

    @TableField("product_picture")
    @JsonProperty("product_picture")
    private String productPicture;
    
    private String intro;
}

 @PostMapping("/pictures")
    public R pictures(@RequestBody @Validated ProductIdParam productIdParam, BindingResult result){
        if (result.hasErrors()){
            return R.fail("商品图片详情查询失败!");
        }
        return productService.pictures(productIdParam.getProductID());
    }


 /**
     * 查询商品对应的图片详情集合
     * @param productID
     * @return
     */
    R pictures(Integer productID);

//现在不能用productMapper了,因为返回结果已经指定是product_pictures表了
public interface PictureMapper extends BaseMapper<Picture> {
}


/**
     * 查询商品对应的图片详情集合
     * @param productID
     * @return
     */
    @Override
    public R pictures(Integer productID) {
        QueryWrapper<Picture> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("product_id",productID);
        List<Picture> pictureList = pictureMapper.selectList(queryWrapper);
        R ok = R.ok(pictureList);
        log.info("ProductServiceImpl.pictures业务结束,结果:{}",ok);
        return ok;
    }

缓存设计之缓存介绍和缓存配置引入

每一次点击(商品)都要进行mysql的数据库的查询,每一次查询都会消耗一定的性能,而缓存是把它存储到运行内存中,用更高效的数据库给缓存起来,最后在查询的时候就不用走mysql了,提升查询的性能和提高用户体验度。
在这里插入图片描述
缓存本身利用的是redis缓存,所以要连接配置redis的地址和激活缓存配置
如何把配置类应用到每个服务中?把配置类放到通用模块,哪个模块想要使用配置类,只需要声明配置类去继承它。配置文件也放到通用模块,只要下边任何服务需要,只需要激活它就可以了。

缓存配置类
/*缓存配置类,被其他子类继承*/
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;

import java.time.Duration;
/**
 * description: 缓存配置类 放置配置的方法,子模板继承和复用
 */
public class CacheConfiguration {
    
    //配置缓存manager
    @Bean
    @Primary  //同类型,多个bean,默认生效! 默认缓存时间1小时!  可以选择!
    public RedisCacheManager cacheManagerHour(RedisConnectionFactory redisConnectionFactory){

        RedisCacheConfiguration instanceConfig = instanceConfig(1 * 3600L);//缓存时间1小时

        //构建缓存对象
        return RedisCacheManager.builder(redisConnectionFactory)
                .cacheDefaults(instanceConfig)
                .transactionAware()
                .build();
    }

    //缓存一天配置
    @Bean
    public RedisCacheManager cacheManagerDay(RedisConnectionFactory redisConnectionFactory){

        RedisCacheConfiguration instanceConfig = instanceConfig(24 * 3600L);//缓存时间1小时

        //构建缓存对象
        return RedisCacheManager.builder(redisConnectionFactory)
                .cacheDefaults(instanceConfig)
                .transactionAware()
                .build();
    }


    /**
     * 实例化具体的缓存配置!
     *    设置缓存方式JSON
     *    设置缓存时间 单位秒
     * @param ttl
     * @return
     */
    private RedisCacheConfiguration instanceConfig(Long ttl){

        //设置jackson序列化工具
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer
                = new Jackson2JsonRedisSerializer<Object>(Object.class);

        //常见jackson的对象映射器,并设置一些基本属性
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        objectMapper.registerModule(new JavaTimeModule());
        objectMapper.configure(MapperFeature.USE_ANNOTATIONS,false);
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
        ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);

        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

        return RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(ttl)) //设置缓存时间
                .disableCachingNullValues()
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer));
    }
}
spring:
  cache:
    type: redis
  redis:
    host: 192.168.23.140
    port: 6379
    jedis: # 设置Redis连接池
      pool:
        max-wait: 2000ms
        min-idle: 2
        max-idle: 8
        max-active: 10
/*商品模块配置类:哪个想要哪个继承CacheConfiguration就可以了*/
@Configuration
public class ProductConfiguration extends CacheConfiguration {

}

激活缓存:
profiles:
active: cache
让缓存生效需要在启动类上加@EnableCaching//开启缓存,让缓存生效

缓存设计之商品服务缓存设计考量

怎么看一个接口适不适合缓存?要看接口的使用率以及接口的更新率。
商品搜索是不宜添加缓存的,因为每次搜索的关键字(key)是不一样的,很少两次搜索相同的数据。缓存时候有key和事件
单类别热门商品缓存时间不宜过长,因为它会受销售的影响,所以设置为1小时
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

缓存一般在业务层

收藏服务值收藏添加接口

什么时候创建param?只有param和实体类完全不符或者局部属性的时候就要声明param,但这次不要求数据库store_collect的collect表中时间和id不是前端传的,前端就穿两个东西,刚好和实体类的属性相等,所以不用创建param,所以直接使用实体类接值就可以了。第二收藏数据用mybatisplus进行插入,用BaseMapperinsert方法,insert方法里边要的是数据库对应的实体类,所以不创建param。

/*收藏实体类*/
@Data
@TableName("collect")
public class Collect implements Serializable {

    public static final Long serialVersionUID = 1L;

    @TableId(type = IdType.AUTO)
    private Integer id;

    @JsonProperty("user_id")
    @TableField("user_id")//对应数据库的属性名
    private Integer userId;

    @TableId("product_id")
    @JsonProperty("product_id")
    private Integer productId;

    @JsonProperty("collect_time")
    @TableField("collect_time")
    private Long collectTime;
}


@RestController
@RequestMapping("/collect")
public class CollectionController {

    @Autowired
    private CollectService collectService;

    @PostMapping("/save")
    public R save(@RequestBody Collect collect){

        return collectService.save(collect);
    }
}


public interface CollectService {
    /**
     * 收藏添加的方法
     * @param collect
     * @return 001 004
     */
    R save(Collect collect);
}
/*收藏实现类*/
@Service
@Slf4j
public class CollectServiceImpl implements CollectService {

    @Autowired
    private CollectMapper collectMapper;

    /**
     * 收藏添加的方法
     * @param collect
     * @return 001 004
     */
    @Override
    public R save(Collect collect) {
        //1.先判断(查询)数据是否存在,
        QueryWrapper<Collect> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_id",collect.getUserId());
        queryWrapper.eq("product_id",collect.getProductId());
        //查询有几条
        Long count = collectMapper.selectCount(queryWrapper);

        if (count > 0){//有
            //说明已经添加了,不能再添加
            return R.fail("该商品已经添加收藏,请到我的收藏查看");
        }

        //2.如果不存在,则添加,在添加之前补充时间值,因为前端不传时间
        collect.setCollectTime(System.currentTimeMillis());
        int rows = collectMapper.insert(collect);//影响行数

        log.info("CollectServiceImpl.save业务结束,结果:{}",rows);
        return R.ok("添加收藏成功");
    }
}

/*数据库接口*/
public interface CollectMapper extends BaseMapper<Collect> {
}
收藏展示接口

根据user_id去收藏表中去查出用户对应有哪些商品,结果返回的是商品的详情,还需要把当前用户对应的商品集合,最终完成信息的查询和返回。
1、在收藏服务中根据user_id去查询对应的product_id集合
2、调用商品服务,传入id集合,完成数据查询
3、结果返回即可
收藏服务要调用商品服务,要传入商品id集合。商品服务中根据传入的商品id集合进行数据库的查询,返回数据库信息封装的R

在这里插入图片描述

购物车添加接口

在这里插入图片描述
创建vo就是用来返回结果的,实体类需要实现Serializable接口。

购物车展示接口

ProductCollectParam可以复用,里边装的是product的id集合
在这里插入图片描述

  /**
     * mq序列化方式,选择json!
     * @return
     */
    @Bean
    public MessageConverter messageConverter(){

        return new Jackson2JsonMessageConverter();
    }

在这里插入图片描述

商品模块值之商品删除在这里插入图片描述
使用阿里云OSS

导入依赖

 <!-- 阿里云OSS文件上传开始 -->
<!-- 阿里云 OSS -->
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.14.1</version>
</dependency>
<!--日期时间工具-->
<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.10.14</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>
</dependencies>

声明配置

#OSS配置
aliyun:
  oss:
    file:
      # 控制台 - oss - 点击对应桶 - 概览 - 地域节点
      endpoint: 你的地域节点
      keyid: 你的accesskey
      keysecret: 你的accesssecret
      bucketname: 你的桶名

导入工具类

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.ObjectMetadata;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.util.Date;

/**
 * projectName: b2c-cloud-store
 *
 * @author: hwf
 * description:
 */
@Component
@Data
@ConfigurationProperties(prefix = "aliyun.oss.file")
public class AliyunOSSUtils {

    //基本属性 读取配置文件
    private  String endPoint;
    private  String keyId;
    private  String keySecret;
    private  String bucketName;



    /**
     * byte数组格式上传文件并返回上传后的URL地址
     * @param objectName        完整文件名, 例如abc/efg/123.jpg
     * @param content           文件内容, byte数组格式
     * @param contentType       文件类型   image/png  image/jpeg
     * @param hours             过期时间   单位小时
     * @Author hwf
     */
    public  String uploadImage(String objectName,
                                     byte[] content,String contentType,int hours)  throws Exception {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endPoint, keyId, keySecret);
        // 创建上传文件的元信息,可以通过文件元信息设置HTTP header(设置了才能通过返回的链接直接访问)。
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentType(contentType);
        // 文件上传
        ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content), objectMetadata);
        // 设置URL过期时间为hours小时。
        Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000 * 300 * hours);
        //返回url地址
        String url = ossClient.generatePresignedUrl(bucketName, objectName, expiration).toString();
        //关闭OSSClient。
        ossClient.shutdown();
        return url;
    }

    /**
     * 下载文件到本地
     * @param objectName        完整文件名, 例如abc/efg/123.jpg
     * @param localFile         下载到本地文件目录
     * @Author hwf
     */
    public  void downFile(String objectName,
                                String localFile) throws Exception {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endPoint, keyId, keySecret);

        // 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
        ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(localFile));

        // 关闭OSSClient。
        ossClient.shutdown();
    }

    /**
     * 删除文件
     * @param objectName        完整文件名, 例如abc/efg/123.jpg
     * @Author hwf
     */
    public  void deleteFile(String objectName) {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endPoint, keyId, keySecret);

        // 删除文件。如需删除文件夹,请将ObjectName设置为对应的文件夹名称。如果文件夹非空,则需要将文件夹下的所有object删除后才能删除该文件夹。
        ossClient.deleteObject(bucketName, objectName);

        // 关闭OSSClient。
        ossClient.shutdown();
    }
}

实战代码:

@PostMapping("upload")
public Object upload(MultipartFile img) throws Exception {

    String filename = img.getOriginalFilename();
    String contentType = img.getContentType();
    long millis = System.currentTimeMillis();

    filename = millis + filename; //防止重复

    String url = aliyunOSSUtils.uploadImage(filename, img.getBytes(), contentType, 1000);
    System.out.println("url = " + url);
    return R.ok("上传成功",url);

}
钢铁小宝宝
关注 关注
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大型B2c互联网分布式电商项目javashop完整)内附数据库+详细技术讲解视频+每一步需求分析等等等
10-16
本资源是基于开源项目javashop的升级版b2c大型分布式电商项目,内容包括项目需求的分析、项目流程图绘制、电商分布式项目架构搭建、功能实现(涉及到的技术有:SSO单点登录,第三方支付平台对接,如支付宝等,solr搜索引擎集成,第三方短信平台对接,Redis 集成开发,以及一些分布式解决方案,如:分布式事务LCN实现,分布式锁Redis实现等)每一个关键技术都内附有视频讲解,学习先后顺序均有详细说明文档,每一个知识点都能自我模拟考核(考验学习主动性),本项目适合于熟练掌握了SSM、Maven、SVN、了解前端知识(能看懂)以及对分布式有基础了解的人学习。是本人学习开源电商项目javashop的总结,内附详细数据库分析,商品表,订单表等详细设置,以及为什么这么设计等。项目过大,上传文件为下载地址文件!
B2C电商例子
12-23
是一个小型的电子商务平台的例子。功能齐全
B2C电商项目总结--php
03-07
B2C电商项目总结与开发过程
综合介绍_B2C项目
wiaini_kong_1998的博客
12-24 1915
linux 安装MQ 需要安装 java JDK 先把Open jdk卸载掉 安装java 的jdk 在可以java -version 查看 是否是java jdk www.cnblogs.com/CuteNet/p/3947139.html 访问网址卸载Open JDK rpm -qa | grep java :查看虚拟机的jdk 索引库的同步, 商品维护,和添加商品是索引...
电商项目-基于SSM+VUE的B2C电商项目
11-11
基于SSM+VUE的B2C电商项目 ● 操作系统:Windows 10 Enterprise ● 开发工具:Intellij IDEA ● 数据库:MySQL 8.0.13 ● Java SDK:Oracle JDK 1.8.152 内附电商商城项目展示截图,软件框架进行了前后端分离 ...
SSM框架VUE实现B2C电商项目
12-23
项目管理工具 项目构建:Maven 代码管理:Git 后台主要技术栈 核心框架:Spring + Spring MVC + MyBatis 数据库连接池:Alibaba Druid 数据库缓存:Redis 接口文档引擎:Swagger2 RESTful 风格 API 文档生成 全文...
基于 SSM + VUE 的 B2C 电商项目.zip
12-29
SSM框架学习宝典:入门、进阶、精通,全方位代码项目资 一、探索SSM的无限可能 SSM(Spring + Spring MVC + MyBatis)框架作为Java开发中的黄金组合,为开发者提供了强大的技术支持和丰富的功能。本系列资料将带您...
基于 SSM + VUE 开发的目前最火爆的B2C 电商项目+源码+开发文档(高分优秀项目
最新发布
05-08
基于 SSM + VUE 开发的目前最火爆的B2C 电商项目+源码+开发文档,适合毕业设计、课程设计、项目开发项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 开发环境 操作系统:Windows 10 Enterprise 开发...
B2C商城综合系统项目
11-28
B2C商城综合系统项目
B2C商城综合系统项目源码
05-23
项目名称: B2C网络商城(ShoppingCity) 开发平台: VS2005+SQLserver2000+C# 开发周期: 1/月 项目描述: 此项目是一个完整的B2C电子商务网站,实现了在网上直接浏览商品、购买商品、创建订单、评论商品、留言、用户管理等一系列的网上购物服务。
B2C商城项目源码,基于Java开发的高可用分布式B2C商城系统,Java+Spring MVC+Dubbo+Zookeeper+MySQL+Redis+FastDFS+Nginx+Solr
Spring Boot-Common On With You
10-25 2122
前言 哎呦商城-aiyou 一、项目环境搭建 二、项目数据库创建>从aiyou_common项目中拿sql进行导入到已创建的b2c_aiyou数据库中 三、拉取项目顺序 通过Tomcat插件启动项目,输入命令: 1、aiyou-parent 2、aiyou-common 3、aiyou-manager 4、aiyou-content 5、aiyou-manager-web 6、aiyou-portal-web 7、aiyou-search 8、aiy...
尚硅谷10小时搞定B2C电商毕设项目p11部分坑解决记录
Downsiren的博客
03-02 652
product文件夹下的resources不要改mysql的地址,还是用localhost,因为表是导在本机的mysql中,不是服务器的。中的地址,导致install的时候,还是老师视频里的服务器地址。这两个改完以后,不要忘记改store-search文件夹下的config文件夹,这个里面也有一个网址需要更改。错误,可能是因为,在maven运行的时候,common-feign文件夹下的resources,没有改。以及listener文件夹中,这两个文件里,client的注解都改为@Resource。
【转载】模仿国内知名B2C网站,实现的一个分布式B2C商城 使用Spring Cloud
zhouxiaoxiao的专栏
11-11 7729
模仿国内知名B2C网站,实现的一个分布式B2C商城 使用Spring Cloud 涉及技术Spring Cloud Hystrix Spring Cloud Turbine Spring Cloud Eureka Spring Cloud Sleuth Spring Cloud Config(Apollo) 使用携程的开源阿波罗作为配置中心 Spring Cloud Feign Sp
B2C购物商城---MMALL商城概览
Kaybee - 练级之路
05-22 5677
项目为慕课网线上商城实战项目,经本人实际上手Coding,经过自己修改调优, 项目源码在:https://github.com/LiuKay/mmall-kay-Java 目前分支情况如下: master 发布版本 v1.0 功能实现,单服务器版本(已完成) v2.0 分布式版本(正在迭代) 具体请查看对应分支详细源码,commit 提交记录可查看迭代过程及核心技术。 附本人画的一...
B2C商城项目的一些总结
bluefish_flying的博客
05-12 2511
这里主要负责的是后台商品数据等的上传,更新和删除效果。从这个项目中让我更加懂得了如何使用数据库,如果通过自己的思维一步一步的实现想要的功能,怎么用debug等调试工具调试自己的错误;          主要是怕以后忘了自己的一些犯错点,所以做一些笔记。           1、首先确定自己要做的是什么,需要哪些东西,需要哪些字段,如何建表。           2、建立数据库,规则,有些表后
技术抄录_Java高级架构师教程
weixin_30357231的博客
04-03 56
1.B2C商城项目实战 2.高性能架构专题 3.架构筑基与开源框架解析专题 4.团队协作开发专题 5.微服务架构专题 6.设计模式 附上【架构资料】 转载于:...
Java程序员年薪40W,他1年走了别人5年的路(技术提炼) ...
测试0901-1
12-16 447
一、Java架构体系 1.高性能架构 2.开源框架解析 3.架构师筑基 4.微服务架构 5.团队协作开发 6.B2C商城项目实战 二、设计模式 三、数据结构与算法 四、BATJ企业面试总结 Java架构体系 1.高性能架构 2.开源框架解析 3.架构师筑基 4.微服务架构 5.团队协作开发 6.B2C商城项目实战 设...
电商项目介绍
热门推荐
一诺
10-22 8万+
电商项目介绍 2.电商行业技术特点 ①技术新:(NoSql推广首在社区网站和电商项目),发展快,需求推动技术的革新。 ②技术范围广:除了java,像淘宝前端还使用了PHP,数据库MySQL或者oracle,nosql,服务器端使用Linux,服务器安全、系统安全 ③分布式:以前是在一台机器上做运算,现在是分散到很多机器上,最后汇总起来。(集中式向分布式进行考虑)由需求来推动 ④高并发、集...
s2b2c电商微服务项目包含哪些微服务
07-12
在一个s2b2c电商微服务项目中,可以考虑以下一些常见的微服务: 1. 用户服务微服务: - 处理用户注册和登录 - 管理用户个人信息 - 处理用户权限和身份验证 2. 商品服务微服务: - 管理商品信息和库存 - 处理...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 解决stack FetchError: request to https://registry.npm.taobao.org/@vue%2fcli-plugin-vuex failed, reason 3003
  • Vue错误跳坑:npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! newbee@0.1.0 serve: `vue-cli-service serv 2527
  • 电脑删除文件找不到该项目怎么解决 2298
  • Docker启动Nacos,但是windows页面无法访问 2173
  • 线程安全、线程同步 537

最新评论

  • Vue错误跳坑:npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! newbee@0.1.0 serve: `vue-cli-service serv

    CSDN-Ada助手: 亲爱的博主,非常感谢您分享了这篇有关Vue踩坑的博客,我们相信这篇文章可以帮助更多的开发者。作为一名优秀的博主,您一定还有更多的技术心得分享给大家,我们期待您的下一篇博客。 针对当前的问题,我们建议您可以写一篇有关Vue项目中常见错误及解决方案的博客,帮助更多的开发者避免常见的坑点。此外,您也可以分享一些Vue开发中的实用技巧和经验,例如Vue组件的封装、Vue路由的应用等等,帮助更多的开发者提升开发效率和项目质量。 祝您写作愉快,期待您的下一篇优秀博客! 2023年博客之星「城市赛道」年中评选已开启(https://activity.csdn.net/creatActivity?id=10470&utm_source=blog_comment_city ), 博主的原力值在所在城市已经名列前茅,持续创作就有机会成为所在城市的 TOP1 博主(https://bbs.csdn.net/forums/blogstar2023?typeId=3152981&utm_source=blog_comment_city),更有丰厚奖品等你来拿~。

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • Vue错误跳坑:npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! newbee@0.1.0 serve: `vue-cli-service serv
  • 解决stack FetchError: request to https://registry.npm.taobao.org/@vue%2fcli-plugin-vuex failed, reason
  • Gateway服务网关
2023年3篇
2022年26篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司山南高端网站设计黔南优秀网站设计哪家好福州网站建设设计报价威海外贸网站制作双龙至尊标王哪家好固原模板制作哪家好永湖百姓网标王赤峰品牌网站设计多少钱红河网站设计模板公司和田至尊标王宿迁网站开发价格南充企业网站制作推荐雅安网站制作报价邢台百姓网标王推荐茂名网站关键词优化推荐保山网站定制报价咸阳阿里店铺运营价格张家口百度标王公司黔南网站改版推荐肇庆seo网站优化丽江外贸网站设计价格六安营销网站公司西宁百度竞价包年推广百色网站搜索优化报价湘潭网站搭建推荐淮安外贸网站建设公司哈尔滨企业网站建设公司乌海百度关键词包年推广价格承德企业网站改版价格昭通品牌网站设计推荐歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化