c2c电子商务网站用到的技术,企业网站系统功能分析与设计,知乎推广和引流技巧,后端开发工作内容异步查询工具axios(儿所以时) vue官方推荐的ajax请求框架 新增品牌页面 如何找到上面这个页面 下面这个页面里面的新增商品弹窗 上面就是请求路径与请求方式
那么请求参数是什么#xff1f; brand对象#xff0c;外加商品分类的id数组cids #xff08;这里其实不止就是添加… 异步查询工具axios(儿所以时) vue官方推荐的ajax请求框架 新增品牌页面 如何找到上面这个页面 下面这个页面里面的新增商品弹窗 上面就是请求路径与请求方式
那么请求参数是什么 brand对象外加商品分类的id数组cids 这里其实不止就是添加一个分类
返回值没有就是一个响应这里201就成功表明创建了数据
下面我们去写Controller页面
这个Controller就是BrandController
这个Controller里面要增加如下一个方法 这个方法内部的参数是什么 一个对象和一个ids的数组
我们先去看一下实际传递的是什么鬼 这里很明显传递的是一个json对象
这个对象现在要拿到控制器的方法里面去 我用两个参数来接收一个json对象 下面是BrandController里面的保存品牌的方法 下面就去service里面完成saveBrand()这个方法 我先去数据库当中创建一张中间表因为品牌与分类是有一个多对多的关系 上面就创建了一个中间表
下面先来预先插入一些数据 上面数据是到位了对吧 再回到我们的Service里面 那我们现在去通用mapper里面添加一个方法并且用注解配置好sql语句
这里必须在注解上写sql和原理,可以去javaee里面mybatis4进行查看
下面我们去完成mapper里面的方法BrandMapper 下面去到我们BrandService里面有一个saveBrand方法这个方法我们必须加上spring的事务注解要么都成功要么都失败因为这里涉及到插入了品牌表之后我们还要去插入品牌表与分类表的中间表 下面我们去测一下我们这个方法从新启动商品这个微服务
我在测这个模块的时候给我报了一个错误就是500 这里就很明显是服务器的代码出了问题我去测试了一下,直接是连controller层都没有进来就直接报错了 我怀疑是参数接收的时候没有设置好从前端传过来的是一个JSON数据里面包含了一个多选框数据那么在用List集合进行接收的时候我们需要加RequestParam注解
改进如下 修改完了之后重新启动服务模块 还是会报错但是这个时候就是给我们响应的一个400的报错 400的报错
这里其实也就是参数中的数据格式出现了问题我们看一下请求的数据格式 很明显的是这里是一个json的数据格式
来说一下axios的处理请求原则 这里解决方案是你引入npm里面的工具包QS,这是一个第三方库安装方式npm install qs --save 我们的项目已经装好了如上 下面我们就要用这个QS对象去修改一下前端页面了不过这个页面该怎么去找如何去寻找到这个页面呢
首先找到商品的的vue组件也就是Brand.vue组件 在我们的目录里面也就是左边 然后我们再去提交一次查询发现数据已经不是之前的JSON格式了 但是服务器又报500错误 我们还是去后端进行测试一下
直接看一下给我们报的错误异常
.apache.ibatis.binding.BindingException: Parameter cid not found. Available parameters are [arg1, arg0, param1, param2] 那我把这里做一些修改用放到dao层的注解Param做一个参数名字的映射 重新启动service模块然后重新访问
插入成功这是我刚刚在tb_brand里面插入的一个品牌 现在去关联的表里面看一下有没有与分类连接起来 这里可以很明显的看到关联了两个分类 下面我们做图片上传功能 文件的上传它并不是只在品牌管理中有需求以后其他服务可能也需要因为把它变成一个独立微服务专门处理各种上传
把它变成一个微服务之后我们需要导入下面的依赖 下面说一下spring-boot-starter-test的用法
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.assertEquals;SpringBootTest
public class MySpringBootApplicationTests {Testpublic void testSampleMethod() {// 假设您有一个名为 SampleService 的 Spring Bean并且它有一个方法返回 Hello, World!SampleService sampleService new SampleService();String result sampleService.getGreeting();// 使用断言来验证结果是否符合预期assertEquals(Hello, World!, result);}
}解释一下上面的代码 下面我们去编写一下配置文件
server:port: 8082
spring:application:name: upload-serviceservlet:multipart:max-file-size: 5MB # 限制文件上传大小
eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eurekainstance:lease-renewal-interval-in-seconds: 5 #每隔五秒发送一次心跳保证这个方法还在lease-expiration-duration-in-seconds: 10 #10秒不发送心跳就过期会把服务剔除掉prefer-ip-address: trueip-address: 127.0.0.1instance-id: ${spring.application.name}:${server.port}下面我们编写spring boot启动类 在我们编写具体的业务代码之前我们必须弄清楚请求路径请求蚕丝请求方式返回值类型
我们直接在下面这个位置点击上传测试一下下面的路径 首先请求方式肯定是POST上传
路径/upload/image
请求参数
我们可以看到请求参数是一个 文件对象SpringMVC会把它封装成一个接口:Multiple
返回结果上传成功之后得到文件的一个url路径
下面我们开始去编写controllerl类
package com.leyou.controller;import com.leyou.service.UploadService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;RestController
RequestMapping(upload)
public class UploadController {//我们需要一个上传的Service对象Autowiredprivate UploadService uploadService;PostMapping(image)public ResponseEntityString uploadImage(RequestParam(file) MultipartFile file) {String url uploadService.upload(file);System.out.println(打印url: url);if(StringUtils.isBlank(url)) {System.out.println(这里为空串);//上面的url为空//为空上传有可能就是参数错误直接返回400的错误状态码return new ResponseEntity(HttpStatus.BAD_REQUEST);}//下面就是成功返回200状态码与url数据return ResponseEntity.ok(url);}}下面去service层完成相应的方法
在上传文件中我们需要对上传内容进行校验我们这里重点关注过程不关注代码代码可以copy
1.检验文件大小
2.检验文件的媒体类型也就是说互联网传输过程中是什么类型 可以直接去查这个对照表 3.校验文件内容 下面说一下SLF4JSimple Logging Facade for Java和Logback来记录日志的使用状况 下面说一下下面这部分内容的含义
// 2)校验图片内容
BufferedImage image ImageIO.read(
file.getInputStream());
if (image null) {
logger.info(上传失败文件内容不符合要求); return null;
} 下面我们上servcie的完整代码
package com.leyou.service;import com.leyou.controller.UploadController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Arrays;
import java.util.List;Service
public class UploadService {//做一个日志变量用来记录某个类会出现的错误信息private static final Logger logger (Logger) LoggerFactory.getLogger(UploadController.class);//列出支持的文件类型//利用Arrays类的asList()方法把支持的类型做成一个集合private static final ListString suffixes Arrays.asList(image/png, image/jpeg);//下面去完成主体代码//MultipartFile file这个是处理文件上传的对象//他可以获取文件类型信息还有就是文件的原始名字等等public String upload(MultipartFile file) {try {// 1、图片信息校验// 1)校验文件类型String type file.getContentType();if (!suffixes.contains(type)) {logger.info(上传失败文件类型不匹配{}, type);return null;}// 2)校验图片内容BufferedImage image ImageIO.read(file.getInputStream());if (image null) {logger.info(上传失败文件内容不符合要求);return null;}// 2、保存图片// 2.1、生成保存目录File dir new File(D:\\pxx\\upload);if (!dir.exists()) {dir.mkdirs();}// 2.2、保存图片file.transferTo(new File(dir, file.getOriginalFilename()));// 2.3、拼接图片地址String url http://image.leyou.com/upload/ file.getOriginalFilename();return url;} catch (Exception e) {return null;}}}下面我们用rest client 测试一下这个接口 上面很明显就是接口测试成功
我们看一下上面的路径
http://127.0.0.1:8082/upload/image
这个路径很明显就是绕过了网关的因为网关会给我们过来的所有连接加上/api前缀 图片上传是文件的传输如果也经过zuul网关代理文件就会经过多次网络传输造成不必要的网络负担在高并发的情况下可能会导致网络阻塞zuul网关不可用下面我们需要绕过网关处理
我们可以在网关做如下配置过滤某个微服务 但是如果这样配置首先路径还是不会变如下 也就是还是回去加上/api 这样一个前缀但是我们真正想要的链接是
http://127.0.0.1:8082/upload/image
这里多说一点在这个位置上面api.leyou.com一过来会路过linux上面的nginx服务器给我们定向到网关看一下下面的配置 她会给我们代理到192.168.1.100:10010也就是网关服务器的地址这里我们是在本机上面配的网关但很明显我们不想去这我们想去的还是下面这个地址
http://127.0.0.1:8082/upload/image
下面说一个nginx重写地址并马上进行转发的指令rewirte指令 下面我们贴一个路径规则然后来进行讲解一下 那么这里我们先去重写一下这个匹配规则
先贴一个原来的路径转发 上面还是保留一下原来的我们配置一下现在的访问目录就行了比如这个是/api/upload这样一个访问目录也就是主机过来之后遇到后面跟这样一个访问目录就会跳到这个location位置给我们进行转发但是需要注意的一个问题是这个配置必须写到location /这样一个位置前面因为location \这个是一个相当于通配并且它的配置级别比较大/api/upload这样路径一过来其实不止是这个路径是任意路径一过来一旦第一个匹配直接找到location /那么就会进去执行相应的转发代理
话不多说我们来配置一下nginx 服务器 难道就是说上面这样配置一下就好了吗
如果我们只是上面这样匹配了一下还是会出问题因为下面的路径一过来 上面是原本的请求路径
然后经过上面代理注意我们这里代理只是改变ip,不会把中间的请求路径也替换掉所以路径会变成下面的样子
http://192.168.1.1000:8082/api/upload/image
但是就是即使是这个路径前面还是会带有前缀这个前缀还是会带有api,也就是当网关检测到有api这个路径之后这个路径还是会被网关拦截那么这里我们需要去做一个路径的复写nginx给我们提供了一个路径复写的指令 下面详细讲解一下这个路径复写的规则 经过上面的处理路径就会变成下面的方式 http://192.168.1.1000:8082/upload/image
这个就是我们想要的路径直达文件微服务
注意修改之后重新启动nginx
看一下conf的完整配置 下面我们去测提交的时候 给我们报了一个403 403是表示服务器拒绝这个请求 看一下控制台报错这里应该是报了一个跨域错误 为什么跨域出错因为我们这个请求没有走网关网关会处理跨域但是ly-upl;oad这个微服务不会给我们处理跨域所以我们把之前那做的跨域放到这里来 重新启动一下我们上传的这个微服务
下面我们把跨域代码全部贴一下
package com.leyou.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;/*** Author: TianCi.Xiong* Description: 跨域配置* Date: Created in 2019-11-02 17:22*/
Configuration
public class GlobalCorsConfig {Beanpublic CorsFilter corsFilter() {//1.添加CORS配置信息CorsConfiguration config new CorsConfiguration();//1) 允许的域,不要写*否则cookie就无法使用了config.addAllowedOrigin(http://manage.leyou.com);config.addAllowedOrigin(http://www.leyou.com);//2) 是否发送Cookie信息config.setAllowCredentials(true);//3) 允许的请求方式config.addAllowedMethod(OPTIONS);config.addAllowedMethod(POST);config.addAllowedHeader(*);//2.添加映射路径我们拦截一切请求UrlBasedCorsConfigurationSource configSource new UrlBasedCorsConfigurationSource();configSource.registerCorsConfiguration(/**, config);//3.返回新的CorsFilter.return new CorsFilter(configSource);}
}然后我们重新调用上传 上面很明显是200访问吗成功服务器会给我们 返回一个图片地址 至于这个里面还是会给我们报错 我们后面再来处理这个.
好了第三篇也就先说到这祝大家早安午安晚安。 文章转载自: http://www.morning.qrgfw.cn.gov.cn.qrgfw.cn http://www.morning.rttp.cn.gov.cn.rttp.cn http://www.morning.bfjtp.cn.gov.cn.bfjtp.cn http://www.morning.ffksr.cn.gov.cn.ffksr.cn http://www.morning.ccyns.cn.gov.cn.ccyns.cn http://www.morning.zxzgr.cn.gov.cn.zxzgr.cn http://www.morning.lpcct.cn.gov.cn.lpcct.cn http://www.morning.mooncore.cn.gov.cn.mooncore.cn http://www.morning.wqcz.cn.gov.cn.wqcz.cn http://www.morning.mnclk.cn.gov.cn.mnclk.cn http://www.morning.wqnc.cn.gov.cn.wqnc.cn http://www.morning.rmjxp.cn.gov.cn.rmjxp.cn http://www.morning.rqkzh.cn.gov.cn.rqkzh.cn http://www.morning.hrzhg.cn.gov.cn.hrzhg.cn http://www.morning.bnylg.cn.gov.cn.bnylg.cn http://www.morning.dnpft.cn.gov.cn.dnpft.cn http://www.morning.xrwsg.cn.gov.cn.xrwsg.cn http://www.morning.qytby.cn.gov.cn.qytby.cn http://www.morning.gsrh.cn.gov.cn.gsrh.cn http://www.morning.trkhx.cn.gov.cn.trkhx.cn http://www.morning.trwkz.cn.gov.cn.trwkz.cn http://www.morning.ytbr.cn.gov.cn.ytbr.cn http://www.morning.lrmts.cn.gov.cn.lrmts.cn http://www.morning.ywpwg.cn.gov.cn.ywpwg.cn http://www.morning.wbxbj.cn.gov.cn.wbxbj.cn http://www.morning.ptmsk.cn.gov.cn.ptmsk.cn http://www.morning.zxzgr.cn.gov.cn.zxzgr.cn http://www.morning.jjzrh.cn.gov.cn.jjzrh.cn http://www.morning.nqmdc.cn.gov.cn.nqmdc.cn http://www.morning.llcsd.cn.gov.cn.llcsd.cn http://www.morning.mhrzd.cn.gov.cn.mhrzd.cn http://www.morning.dxrbp.cn.gov.cn.dxrbp.cn http://www.morning.tgqzp.cn.gov.cn.tgqzp.cn http://www.morning.dfhkh.cn.gov.cn.dfhkh.cn http://www.morning.pfgln.cn.gov.cn.pfgln.cn http://www.morning.cwpny.cn.gov.cn.cwpny.cn http://www.morning.qgtfl.cn.gov.cn.qgtfl.cn http://www.morning.ysbhj.cn.gov.cn.ysbhj.cn http://www.morning.lkfsk.cn.gov.cn.lkfsk.cn http://www.morning.nfnxp.cn.gov.cn.nfnxp.cn http://www.morning.wtdhm.cn.gov.cn.wtdhm.cn http://www.morning.roymf.cn.gov.cn.roymf.cn http://www.morning.mzcsp.cn.gov.cn.mzcsp.cn http://www.morning.cwzzr.cn.gov.cn.cwzzr.cn http://www.morning.jbhhj.cn.gov.cn.jbhhj.cn http://www.morning.qcnk.cn.gov.cn.qcnk.cn http://www.morning.rkfh.cn.gov.cn.rkfh.cn http://www.morning.azxey.cn.gov.cn.azxey.cn http://www.morning.kclkb.cn.gov.cn.kclkb.cn http://www.morning.mmclj.cn.gov.cn.mmclj.cn http://www.morning.rrwft.cn.gov.cn.rrwft.cn http://www.morning.mqghs.cn.gov.cn.mqghs.cn http://www.morning.bwhcl.cn.gov.cn.bwhcl.cn http://www.morning.zstbc.cn.gov.cn.zstbc.cn http://www.morning.pzrnf.cn.gov.cn.pzrnf.cn http://www.morning.tkxyx.cn.gov.cn.tkxyx.cn http://www.morning.sbncr.cn.gov.cn.sbncr.cn http://www.morning.fbbpj.cn.gov.cn.fbbpj.cn http://www.morning.twwts.com.gov.cn.twwts.com http://www.morning.ddxjr.cn.gov.cn.ddxjr.cn http://www.morning.bxqtq.cn.gov.cn.bxqtq.cn http://www.morning.rbzht.cn.gov.cn.rbzht.cn http://www.morning.lchtb.cn.gov.cn.lchtb.cn http://www.morning.haibuli.com.gov.cn.haibuli.com http://www.morning.pnbls.cn.gov.cn.pnbls.cn http://www.morning.hwnnm.cn.gov.cn.hwnnm.cn http://www.morning.jzgxp.cn.gov.cn.jzgxp.cn http://www.morning.kmldm.cn.gov.cn.kmldm.cn http://www.morning.bkgfp.cn.gov.cn.bkgfp.cn http://www.morning.lbcbq.cn.gov.cn.lbcbq.cn http://www.morning.wkmpx.cn.gov.cn.wkmpx.cn http://www.morning.fyzsq.cn.gov.cn.fyzsq.cn http://www.morning.mmjqk.cn.gov.cn.mmjqk.cn http://www.morning.gygfx.cn.gov.cn.gygfx.cn http://www.morning.spqtq.cn.gov.cn.spqtq.cn http://www.morning.pmjhm.cn.gov.cn.pmjhm.cn http://www.morning.dfrenti.com.gov.cn.dfrenti.com http://www.morning.gyrdn.cn.gov.cn.gyrdn.cn http://www.morning.klrpm.cn.gov.cn.klrpm.cn http://www.morning.smxrx.cn.gov.cn.smxrx.cn