photoshop网站视觉设计步骤网站和自媒体都可以做

news/2025/10/7 3:42:24/文章来源:
photoshop网站视觉设计步骤,网站和自媒体都可以做,可以推广的平台,wordpress 恢复数据库 白屏文章目录 苍穹外卖-day06课程内容1. HttpClient1.1 介绍1.2 入门案例1.2.1 GET方式请求1.2.2 POST方式请求 2. 微信小程序开发2.1 介绍2.2 准备工作2.3 入门案例2.3.1 小程序目录结构2.3.2 编写和编译小程序2.3.3 发布小程序 3. 微信登录3.1 导入小程序代码3.2 微信登录流程3.3… 文章目录 苍穹外卖-day06课程内容1. HttpClient1.1 介绍1.2 入门案例1.2.1 GET方式请求1.2.2 POST方式请求 2. 微信小程序开发2.1 介绍2.2 准备工作2.3 入门案例2.3.1 小程序目录结构2.3.2 编写和编译小程序2.3.3 发布小程序 3. 微信登录3.1 导入小程序代码3.2 微信登录流程3.3 需求分析和设计3.3.1 产品原型3.3.2 接口设计3.3.3 表设计 3.4 代码开发3.4.1 定义相关配置3.4.2 DTO设计3.4.3 VO设计3.4.4 Controller层3.4.5 Service层接口3.4.6 Service层实现类3.4.7 Mapper层3.4.8 编写拦截器 3.5 功能测试 4. 导入商品浏览功能代码4.1 需求分析和设计4.1.1 产品原型4.1.2 接口设计 4.2 代码导入4.2.1 Mapper层4.2.2 Service层4.2.3 Controller层 4.3 功能测试4.4 代码提交 苍穹外卖-day06 课程内容 HttpClient微信小程序开发微信登录导入商品浏览功能代码 功能实现微信登录、商品浏览 微信登录效果图 商品浏览效果图 1. HttpClient 1.1 介绍 HttpClient 是Apache Jakarta Common 下的子项目可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包并且它支持 HTTP 协议最新的版本和建议。 HttpClient作用 发送HTTP请求接收响应数据 为什么要在Java程序中发送Http请求有哪些应用场景呢 HttpClient应用场景 当我们在使用扫描支付、查看地图、获取验证码、查看天气等功能时 其实应用程序本身并未实现这些功能都是在应用程序里访问提供这些功能的服务访问这些服务需要发送HTTP请求并且接收响应数据可通过HttpClient来实现。 HttpClient的maven坐标 dependencygroupIdorg.apache.httpcomponents/groupIdartifactIdhttpclient/artifactIdversion4.5.13/version /dependencyHttpClient的核心API HttpClientHttp客户端对象类型使用该类型对象可发起Http请求。HttpClients可认为是构建器可创建HttpClient对象。CloseableHttpClient实现类实现了HttpClient接口。HttpGetGet方式请求类型。HttpPostPost方式请求类型。 HttpClient发送请求步骤 创建HttpClient对象创建Http请求对象调用HttpClient的execute方法发送请求 1.2 入门案例 对HttpClient编程工具包有了一定了解后那么我们使用HttpClient在Java程序当中来构造Http的请求并且把请求发送出去接下来就通过入门案例分别发送GET请求和POST请求具体来学习一下它的使用方法。 1.2.1 GET方式请求 正常来说首先应该导入HttpClient相关的坐标但在项目中就算不导入也可以使用相关的API。 因为在项目中已经引入了aliyun-sdk-oss坐标 dependencygroupIdcom.aliyun.oss/groupIdartifactIdaliyun-sdk-oss/artifactId /dependency上述依赖的底层已经包含了HttpClient相关依赖。 故选择导入或者不导入均可。 进入到sky-server模块编写测试代码发送GET请求。 实现步骤 创建HttpClient对象创建请求对象发送请求接受响应结果解析结果关闭资源 package com.sky.test;import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest;SpringBootTest public class HttpClientTest {/*** 测试通过httpclient发送GET方式的请求*/Testpublic void testGET() throws Exception{//创建httpclient对象CloseableHttpClient httpClient HttpClients.createDefault();//创建请求对象HttpGet httpGet new HttpGet(http://localhost:8080/user/shop/status);//发送请求接受响应结果CloseableHttpResponse response httpClient.execute(httpGet);//获取服务端返回的状态码int statusCode response.getStatusLine().getStatusCode();System.out.println(服务端返回的状态码为 statusCode);HttpEntity entity response.getEntity();String body EntityUtils.toString(entity);System.out.println(服务端返回的数据为 body);//关闭资源response.close();httpClient.close();} }在访问http://localhost:8080/user/shop/status请求时需要提前启动项目。 测试结果 1.2.2 POST方式请求 在HttpClientTest中添加POST方式请求方法相比GET请求来说POST请求若携带参数需要封装请求体对象并将该对象设置在请求对象中。 实现步骤 创建HttpClient对象创建请求对象发送请求接收响应结果解析响应结果关闭资源 /*** 测试通过httpclient发送POST方式的请求*/Testpublic void testPOST() throws Exception{// 创建httpclient对象CloseableHttpClient httpClient HttpClients.createDefault();//创建请求对象HttpPost httpPost new HttpPost(http://localhost:8080/admin/employee/login);JSONObject jsonObject new JSONObject();jsonObject.put(username,admin);jsonObject.put(password,123456);StringEntity entity new StringEntity(jsonObject.toString());//指定请求编码方式entity.setContentEncoding(utf-8);//数据格式entity.setContentType(application/json);httpPost.setEntity(entity);//发送请求CloseableHttpResponse response httpClient.execute(httpPost);//解析返回结果int statusCode response.getStatusLine().getStatusCode();System.out.println(响应码为 statusCode);HttpEntity entity1 response.getEntity();String body EntityUtils.toString(entity1);System.out.println(响应数据为 body);//关闭资源response.close();httpClient.close();}测试结果 2. 微信小程序开发 2.1 介绍 小程序是一种新的开放能力开发者可以快速地开发一个小程序。可以在微信内被便捷地获取和传播同时具有出色的使用体验。 官方网址 https://mp.weixin.qq.com/cgi-bin/wx?tokenlangzh_CN 小程序主要运行微信内部可通过上述网站来整体了解微信小程序的开发。 首先 在进行小程序开发时需要先去注册一个小程序在注册的时候它实际上又分成了不同的注册的主体。我们可以以个人的身份来注册一个小程序当然也可以以企业政府、媒体或者其他组织的方式来注册小程序。那么不同的主体注册小程序最终开放的权限也是不一样的。比如以个人身份来注册小程序是无法开通支付权限的。若要提供支付功能必须是企业、政府或者其它组织等。所以不同的主体注册小程序后可开发的功能是不一样的。 然后 微信小程序我们提供的一些开发的支持实际上微信的官方是提供了一系列的工具来帮助开发者快速的接入 并且完成小程序的开发提供了完善的开发文档并且专门提供了一个开发者工具还提供了相应的设计指南同时也提供了一些小程序体验DEMO可以快速的体验小程序实现的功能。 最后 开发完一个小程序要上线也给我们提供了详细地接入流程。 2.2 准备工作 开发微信小程序之前需要做如下准备工作 注册小程序完善小程序信息下载开发者工具 1). 注册小程序 注册地址https://mp.weixin.qq.com/cgi-bin/wx?tokenlangzh_CN 2). 完善小程序信息 登录小程序后台https://mp.weixin.qq.com/ 两种登录方式选其一即可 完善小程序信息、小程序类目 查看小程序的 AppID 3). 下载开发者工具 资料中已提供无需下载熟悉下载步骤即可。 下载地址 https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html 扫描登录开发者工具 创建小程序项目 熟悉开发者工具布局 设置不校验合法域名 注 开发阶段小程序发出请求到后端的Tomcat服务器若不勾选请求发送失败。 2.3 入门案例 实际上小程序的开发本质上属于前端开发主要使用JavaScript开发咱们现在的定位主要还是在后端所以对于小程序开发简单了解即可。 2.3.1 小程序目录结构 小程序包含一个描述整体程序的 app 和多个描述各自页面的 page。一个小程序主体部分由三个文件组成必须放在项目的根目录如下 文件说明 app.js 必须存在主要存放小程序的逻辑代码 app.json 必须存在小程序配置文件主要存放小程序的公共配置 app.wxss: 非必须存在主要存放小程序公共样式表类似于前端的CSS样式 对小程序主体三个文件了解后其实一个小程序又有多个页面。比如说有商品浏览页面、购物车的页面、订单支付的页面、商品的详情页面等等。那这些页面会放在哪呢 会存放在pages目录。 每个小程序页面主要由四个文件组成 文件说明 js文件 必须存在存放页面业务逻辑代码编写的js代码。 wxml文件 必须存在存放页面结构主要是做页面布局页面效果展示的类似于HTML页面。 json文件 非必须存放页面相关的配置。 wxss文件 非必须存放页面样式表相当于CSS文件。 2.3.2 编写和编译小程序 1). 编写 进入到index.wxml编写页面布局 view classcontainerview{{msg}}/viewviewbutton typedefault bindtapgetUserInfo获取用户信息/buttonimage stylewidth: 100px;height: 100px; src{{avatarUrl}}/image{{nickName}}/viewviewbutton typeprimary bindtapwxlogin微信登录/button授权码{{code}}/viewviewbutton typewarn bindtapsendRequest发送请求/button响应结果{{result}}/view /view进入到index.js编写业务逻辑代码 Page({data:{msg:hello world,avatarUrl:,nickName:,code:,result:},getUserInfo:function(){wx.getUserProfile({desc: 获取用户信息,success:(res) {console.log(res)this.setData({avatarUrl:res.userInfo.avatarUrl,nickName:res.userInfo.nickName})}})},wxlogin:function(){wx.login({success: (res) {console.log(授权码res.code)this.setData({code:res.code})}})},sendRequest:function(){wx.request({url: http://localhost:8080/user/shop/status,method:GET,success:(res) {console.log(响应结果 res.data.data)this.setData({result:res.data.data})}})}})2). 编译 点击编译按钮 3). 运行效果 点击获取用户信息 点击微信登录 点击发送请求 因为请求http://localhost:8080/user/shop/status先要启动后台项目。 注 设置不校验合法域名若不勾选请求发送失败。 2.3.3 发布小程序 小程序的代码都已经开发完毕要将小程序发布上线让所有的用户都能使用到这个小程序。 点击上传按钮 指定版本号 上传成功 把代码上传到微信服务器就表示小程序已经发布了吗 其实并不是。 当前小程序版本只是一个开发版本。 进到微信公众平台打开版本管理页面。 需提交审核变成审核版本审核通过后进行发布变成线上版本。 一旦成为线上版本这就说明小程序就已经发布上线了微信用户就可以在微信里面去搜索和使用这个小程序了。 3. 微信登录 3.1 导入小程序代码 开发微信小程序本质上是属于前端的开发我们的重点其实还是后端代码开发。所以小程序的代码已经提供好了直接导入到微信开发者工具当中直接来使用就可以了。 1). 找到资料 2). 导入代码 AppID使用自己的AppID 3). 查看项目结构 主体的文件:app.js app.json app.wxss 项目的页面比较多主要存放在pages目录。 4). 修改配置 因为小程序要请求后端服务需要修改为自己后端服务的ip地址和端口号(默认不需要修改) common–vendor.js–搜索(ctrlf)–baseUri 3.2 微信登录流程 微信登录https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 流程图 步骤分析 小程序端调用wx.login()获取code就是授权码。小程序端调用wx.request()发送请求并携带code请求开发者服务器(自己编写的后端服务)。开发者服务端通过HttpClient向微信接口服务发送请求并携带appIdappsecretcode三个参数。开发者服务端接收微信接口服务返回的数据session_keyopendId等。opendId是微信用户的唯一标识。开发者服务端自定义登录态生成令牌(token)和openid等数据返回给小程序端方便后绪请求身份校验。小程序端收到自定义登录态存储storage。小程序端后绪通过wx.request()发起业务请求时携带token。开发者服务端收到请求后通过携带的token解析当前登录用户的id。开发者服务端身份校验通过后继续相关的业务逻辑处理最终返回业务数据。 接下来我们使用Postman进行测试。 说明 调用 wx.login() 获取 临时登录凭证code 并回传到开发者服务器。调用 auth.code2Session 接口换取 用户唯一标识 OpenID 、 用户在微信开放平台帐号下的唯一标识UnionID若当前小程序已绑定到微信开放平台帐号 和 会话密钥 session_key。 之后开发者服务器可以根据用户标识来生成自定义登录态用于后续业务逻辑中前后端交互时识别用户身份。 实现步骤 1). 获取授权码 点击确定按钮获取授权码每个授权码只能使用一次每次测试需重新获取。 2). 明确请求接口 请求方式、请求路径、请求参数 3). 发送请求 https://api.weixin.qq.com/sns/jscode2session 获取session_key和openid 若出现code been used错误提示说明授权码已被使用过请重新获取 3.3 需求分析和设计 3.3.1 产品原型 用户进入到小程序的时候微信授权登录之后才能点餐。需要获取当前微信用户的相关信息比如昵称、头像等这样才能够进入到小程序进行下单操作。是基于微信登录来实现小程序的登录功能没有采用传统账户密码登录的方式。若第一次使用小程序来点餐就是一个新用户需要把这个新的用户保存到数据库当中完成自动注册。 登录功能原型图 业务规则 基于微信登录实现小程序的登录功能如果是新用户需要自动完成注册 3.3.2 接口设计 通过微信登录的流程如果要完成微信登录的话最终就要获得微信用户的openid。在小程序端获取授权码后向后端服务发送请求并携带授权码这样后端服务在收到授权码后就可以去请求微信接口服务。最终后端向小程序返回openid和token等数据。 基于上述的登录流程就可以设计出该接口的请求参数和返回数据。 说明 请求路径/user/user/login,第一个user代表用户端第二个user代表用户模块。 3.3.3 表设计 当用户第一次使用小程序时会完成自动注册把用户信息存储到user表中。 字段名数据类型说明备注idbigint主键自增openidvarchar(45)微信用户的唯一标识namevarchar(32)用户姓名phonevarchar(11)手机号sexvarchar(2)性别id_numbervarchar(18)身份证号avatarvarchar(500)微信用户头像路径create_timedatetime注册时间 说明 手机号字段比较特殊个人身份注册的小程序没有权限获取到微信用户的手机号。如果是以企业的资质注册的小程序就能够拿到微信用户的手机号。 3.4 代码开发 3.4.1 定义相关配置 配置微信登录所需配置项 application-dev.yml sky:wechat:appid: wxffb3637a228223b8secret: 84311df9199ecacdf4f12d27b6b9522dapplication.yml sky:wechat:appid: ${sky.wechat.appid}secret: ${sky.wechat.secret}配置为微信用户生成jwt令牌时使用的配置项 application.yml sky:jwt:# 设置jwt签名加密时使用的秘钥admin-secret-key: itcast# 设置jwt过期时间admin-ttl: 7200000# 设置前端传递过来的令牌名称admin-token-name: tokenuser-secret-key: itheimauser-ttl: 7200000user-token-name: authentication3.4.2 DTO设计 根据传入参数设计DTO类 在sky-pojo模块UserLoginDTO.java已定义 package com.sky.dto;import lombok.Data;import java.io.Serializable;/*** C端用户登录*/ Data public class UserLoginDTO implements Serializable {private String code;}3.4.3 VO设计 根据返回数据设计VO类 在sky-pojo模块UserLoginVO.java已定义 package com.sky.vo;import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor;import java.io.Serializable;Data Builder NoArgsConstructor AllArgsConstructor public class UserLoginVO implements Serializable {private Long id;private String openid;private String token;}3.4.4 Controller层 根据接口定义创建UserController的login方法 package com.sky.controller.user;import com.sky.constant.JwtClaimsConstant; import com.sky.dto.UserLoginDTO; import com.sky.entity.User; import com.sky.properties.JwtProperties; import com.sky.result.Result; import com.sky.service.UserService; import com.sky.utils.JwtUtil; import com.sky.vo.UserLoginVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map;RestController RequestMapping(/user/user) Api(tags C端用户相关接口) Slf4j public class UserController {Autowiredprivate UserService userService;Autowiredprivate JwtProperties jwtProperties;/*** 微信登录* param userLoginDTO* return*/PostMapping(/login)ApiOperation(微信登录)public ResultUserLoginVO login(RequestBody UserLoginDTO userLoginDTO){log.info(微信用户登录{},userLoginDTO.getCode());//微信登录User user userService.wxLogin(userLoginDTO);//后绪步骤实现//为微信用户生成jwt令牌MapString, Object claims new HashMap();claims.put(JwtClaimsConstant.USER_ID,user.getId());String token JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims);UserLoginVO userLoginVO UserLoginVO.builder().id(user.getId()).openid(user.getOpenid()).token(token).build();return Result.success(userLoginVO);} }其中JwtClaimsConstant.USER_ID常量已定义。 3.4.5 Service层接口 创建UserService接口 package com.sky.service;import com.sky.dto.UserLoginDTO; import com.sky.entity.User;public interface UserService {/*** 微信登录* param userLoginDTO* return*/User wxLogin(UserLoginDTO userLoginDTO); }3.4.6 Service层实现类 创建UserServiceImpl实现类 实现获取微信用户的openid和微信登录功能 package com.sky.service.impl;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.sky.constant.MessageConstant; import com.sky.dto.UserLoginDTO; import com.sky.entity.User; import com.sky.exception.LoginFailedException; import com.sky.mapper.UserMapper; import com.sky.properties.WeChatProperties; import com.sky.service.UserService; import com.sky.utils.HttpClientUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import java.time.LocalDateTime; import java.util.HashMap; import java.util.Map;Service Slf4j public class UserServiceImpl implements UserService {//微信服务接口地址public static final String WX_LOGIN https://api.weixin.qq.com/sns/jscode2session;Autowiredprivate WeChatProperties weChatProperties;Autowiredprivate UserMapper userMapper;/*** 微信登录* param userLoginDTO* return*/public User wxLogin(UserLoginDTO userLoginDTO) {String openid getOpenid(userLoginDTO.getCode());//判断openid是否为空如果为空表示登录失败抛出业务异常if(openid null){throw new LoginFailedException(MessageConstant.LOGIN_FAILED);}//判断当前用户是否为新用户User user userMapper.getByOpenid(openid);//如果是新用户自动完成注册if(user null){user User.builder().openid(openid).createTime(LocalDateTime.now()).build();userMapper.insert(user);//后绪步骤实现}//返回这个用户对象return user;}/*** 调用微信接口服务获取微信用户的openid* param code* return*/private String getOpenid(String code){//调用微信接口服务获得当前微信用户的openidMapString, String map new HashMap();map.put(appid,weChatProperties.getAppid());map.put(secret,weChatProperties.getSecret());map.put(js_code,code);map.put(grant_type,authorization_code);String json HttpClientUtil.doGet(WX_LOGIN, map);JSONObject jsonObject JSON.parseObject(json);String openid jsonObject.getString(openid);return openid;} }3.4.7 Mapper层 创建UserMapper接口 package com.sky.mapper;import com.sky.entity.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select;Mapper public interface UserMapper {/*** 根据openid查询用户* param openid* return*/Select(select * from user where openid #{openid})User getByOpenid(String openid);/*** 插入数据* param user*/void insert(User user); }创建UserMapper.xml映射文件 ?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.sky.mapper.UserMapperinsert idinsert useGeneratedKeystrue keyPropertyidinsert into user (openid, name, phone, sex, id_number, avatar, create_time)values (#{openid}, #{name}, #{phone}, #{sex}, #{idNumber}, #{avatar}, #{createTime})/insert/mapper3.4.8 编写拦截器 编写拦截器JwtTokenUserInterceptor 统一拦截用户端发送的请求并进行jwt校验 package com.sky.interceptor;import com.sky.constant.JwtClaimsConstant; import com.sky.context.BaseContext; import com.sky.properties.JwtProperties; import com.sky.utils.JwtUtil; import io.jsonwebtoken.Claims; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;/*** jwt令牌校验的拦截器*/ Component Slf4j public class JwtTokenUserInterceptor implements HandlerInterceptor {Autowiredprivate JwtProperties jwtProperties;/*** 校验jwt** param request* param response* param handler* return* throws Exception*/public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//判断当前拦截到的是Controller的方法还是其他资源if (!(handler instanceof HandlerMethod)) {//当前拦截到的不是动态方法直接放行return true;}//1、从请求头中获取令牌String token request.getHeader(jwtProperties.getUserTokenName());//2、校验令牌try {log.info(jwt校验:{}, token);Claims claims JwtUtil.parseJWT(jwtProperties.getUserSecretKey(), token);Long userId Long.valueOf(claims.get(JwtClaimsConstant.USER_ID).toString());log.info(当前用户的id, userId);BaseContext.setCurrentId(userId);//3、通过放行return true;} catch (Exception ex) {//4、不通过响应401状态码response.setStatus(401);return false;}} }在WebMvcConfiguration配置类中注册拦截器 Autowiredprivate JwtTokenUserInterceptor jwtTokenUserInterceptor;/*** 注册自定义拦截器* param registry*/protected void addInterceptors(InterceptorRegistry registry) {log.info(开始注册自定义拦截器...);//.........registry.addInterceptor(jwtTokenUserInterceptor).addPathPatterns(/user/**).excludePathPatterns(/user/user/login).excludePathPatterns(/user/shop/status);}3.5 功能测试 重新编译小程序进行登录获取到openid和token数据 查看后台日志 查看数据库user表第一次登录会自动注册 4. 导入商品浏览功能代码 4.1 需求分析和设计 4.1.1 产品原型 用户登录成功后跳转到系统首页在首页需要根据分类来展示菜品和套餐。如果菜品设置了口味信息需要展示按钮否则显示按钮。 4.1.2 接口设计 根据上述原型图先粗粒度设计接口共包含4个接口。 接口设计 查询分类根据分类id查询菜品根据分类id查询套餐根据套餐id查询包含的菜品 接下来细粒度分析每个接口明确每个接口的请求方式、请求路径、传入参数和返回值。 1). 查询分类 2). 根据分类id查询菜品 3). 根据分类id查询套餐 4). 根据套餐id查询包含的菜品 4.2 代码导入 导入资料中的商品浏览功能代码即可 可按照mapper–service–controller依次导入这样代码不会显示相应的报错。 进入到sky-server模块中 4.2.1 Mapper层 在SetmealMapper.java中添加list和getDishItemBySetmealId两个方法 /*** 动态条件查询套餐* param setmeal* return*/ListSetmeal list(Setmeal setmeal);/*** 根据套餐id查询菜品选项* param setmealId* return*/Select(select sd.name, sd.copies, d.image, d.description from setmeal_dish sd left join dish d on sd.dish_id d.id where sd.setmeal_id #{setmealId})ListDishItemVO getDishItemBySetmealId(Long setmealId);在SetmealMapper.xml文件添加代码 select idlist parameterTypeSetmeal resultTypeSetmealselect * from setmealwhereif testname ! nulland name like concat(%,#{name},%)/ifif testcategoryId ! nulland category_id #{categoryId}/ifif teststatus ! nulland status #{status}/if/where/select4.2.2 Service层 在SetmealService.java新增代码 /*** 条件查询* param setmeal* return*/ListSetmeal list(Setmeal setmeal);/*** 根据id查询菜品选项* param id* return*/ListDishItemVO getDishItemById(Long id);在SetmealServiceImpl.java新增代码 /*** 条件查询* param setmeal* return*/public ListSetmeal list(Setmeal setmeal) {ListSetmeal list setmealMapper.list(setmeal);return list;}/*** 根据id查询菜品选项* param id* return*/public ListDishItemVO getDishItemById(Long id) {return setmealMapper.getDishItemBySetmealId(id);}在DishService.java中添加listWithFlavor方法定义 /*** 条件查询菜品和口味* param dish* return*/ListDishVO listWithFlavor(Dish dish);在DishServiceImpl.java中实现listWithFlavor方法 /*** 条件查询菜品和口味* param dish* return*/public ListDishVO listWithFlavor(Dish dish) {ListDish dishList dishMapper.list(dish);ListDishVO dishVOList new ArrayList();for (Dish d : dishList) {DishVO dishVO new DishVO();BeanUtils.copyProperties(d,dishVO);//根据菜品id查询对应的口味ListDishFlavor flavors dishFlavorMapper.getByDishId(d.getId());dishVO.setFlavors(flavors);dishVOList.add(dishVO);}return dishVOList;}4.2.3 Controller层 创建DishController.java package com.sky.controller.user;import com.sky.constant.StatusConstant; import com.sky.entity.Dish; import com.sky.result.Result; import com.sky.service.DishService; import com.sky.vo.DishVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List;RestController(userDishController) RequestMapping(/user/dish) Slf4j Api(tags C端-菜品浏览接口) public class DishController {Autowiredprivate DishService dishService;/*** 根据分类id查询菜品** param categoryId* return*/GetMapping(/list)ApiOperation(根据分类id查询菜品)public ResultListDishVO list(Long categoryId) {Dish dish new Dish();dish.setCategoryId(categoryId);dish.setStatus(StatusConstant.ENABLE);//查询起售中的菜品ListDishVO list dishService.listWithFlavor(dish);return Result.success(list);}}创建CategoryController.java package com.sky.controller.user;import com.sky.entity.Category; import com.sky.result.Result; import com.sky.service.CategoryService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List;RestController(userCategoryController) RequestMapping(/user/category) Api(tags C端-分类接口) public class CategoryController {Autowiredprivate CategoryService categoryService;/*** 查询分类* param type* return*/GetMapping(/list)ApiOperation(查询分类)public ResultListCategory list(Integer type) {ListCategory list categoryService.list(type);return Result.success(list);} }创建SetmealController.java package com.sky.controller.user;import com.sky.constant.StatusConstant; import com.sky.entity.Setmeal; import com.sky.result.Result; import com.sky.service.SetmealService; import com.sky.vo.DishItemVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List;RestController(userSetmealController) RequestMapping(/user/setmeal) Api(tags C端-套餐浏览接口) public class SetmealController {Autowiredprivate SetmealService setmealService;/*** 条件查询** param categoryId* return*/GetMapping(/list)ApiOperation(根据分类id查询套餐)public ResultListSetmeal list(Long categoryId) {Setmeal setmeal new Setmeal();setmeal.setCategoryId(categoryId);setmeal.setStatus(StatusConstant.ENABLE);ListSetmeal list setmealService.list(setmeal);return Result.success(list);}/*** 根据套餐id查询包含的菜品列表** param id* return*/GetMapping(/dish/{id})ApiOperation(根据套餐id查询包含的菜品列表)public ResultListDishItemVO dishList(PathVariable(id) Long id) {ListDishItemVO list setmealService.getDishItemById(id);return Result.success(list);} }4.3 功能测试 重启服务器、重新编译小程序 微信登录进入首页 菜品和套餐分类查询 具体分类下的菜品查询 菜品口味查询 4.4 代码提交 后续步骤和其它功能代码提交一致不再赘述。 资料来源b站黑马程序员

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

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

相关文章

vps主机上搭建网站商务办公名片

1.namespace k8s中的namespace和docker中namespace是两码事,可以理解为k8s中的namespace是为了多租户,dockers中的namespace是为了网络、资源等隔离 2.deployment kubectl create #新建 kubectl aply #新建 更新 升级: 滚动升级&#x…

炒股网站怎么做大学生对校园网站建设的需求是什么意思

文章目录 1.查看目前python的版本2.添加软件源并更新3.选择你想要下载的版本4.警示:没必要设置默认版本误区千万千万不要覆盖python3软链接解决办法 5.pip软件包管理最省心稍微麻烦换源 网上有很多教程都是教导小白去官方下载之后编译安装。但是,小白连c…

php医疗网站咨询源码携程网建设网站的理由

题目 传入一个数字,统计小于这个数字的素数个数。 原理 素数只能被1和它本身整除,所以小的数能够通过乘法计算出来的数都不是素数。埃筛法就是不断地用小的数做乘法标记出哪些数不是素数,从而减少遍历次数。 代码 public static void mai…

可以和外国人做朋友的网站免费发布信息网站大全

1、auto rename tag :HTML 标签自动闭合;避免了在整个页面中费劲查找。你想将一个H2标签更改为H3标签,或者你想将一个div标签更改为span标签,不管要做什么,你都要浪费时间来查找结束标签,这时候就该用这个插…

济源新站seo关键词排名推广信誉好的网站开发

ORM ORM 即对象关系映射(Object Relational Mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。下面从基本概念、工作原理、优势与劣势、常见的 ORM 框架等方面详细介绍 ORM。 常见的orm框架…

2018做网站开发一个月工资多少wordpress默认登录页修改

简介:在 PolarDB 存储计算分离的架构基础上我们研发了基于共享存储的MPP架构步具备了 HTAP 的能力,对一套 TP的数据支持两套执行引擎:单机执行引擎用于处理高并发的 OLTP;MPP跨机分布式执行引擎用于复杂的 OLAP 查询,发…

爱做网站县网站建设方案

不久前,阿里云宣布了一个让人稍感唏嘘的消息——它们的一年期免费SSL证书服务将停步,转而提供三个月期限的证书。这一变化,无疑会使得网站开发的公司在维持用户信任和网站安全上多出心思。然而,免费的午餐并没有彻底消失&#xff…

西安做网站seo域名格式正确的是

项目在文件处理微服务不使用数据库时,项目启动异常。 解决办法如下:

网站空间权限查询网站访问量

0 Preface/Foreword Gitlab是代码托管平台,DevOps。因其免费,被广泛使用。GitLab不但可以管理代码,也可以管理issue,创建milestone等等。针对issue管理,支持描述模版功能,即对于新建的issue,可…

网站建设协议个人备案能公司网站

欢迎关注博主 六月暴雪飞梨花 或加入【六月暴雪飞梨花】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术…

电子商务网站建设规划开题报告河南省建设工程注册中心网站

左值和右值目录 一.左值和右值的报错1.简单定义2.函数返回值作左值3.表达式作左值 二.存储的层次结构1.CPU2.内存3.磁盘4.三者联系5.寄存器 三.左值和右值的概念1.左值2.右值3.转换 一.左值和右值的报错 1.简单定义 赋值号’左边的为左值,右边的为右值. 2.函数返回值作左值 …

网站开发要求描述安阳信息港

设计m序列发生器,其特征方程为,输出数字序列信号m_sequence码速率为10Mbps;设计串行转并行电路,每4位m序列并行输出,先输入的串行数据位于并行输出数据的高位。设计测试程序,进行功能仿真,将Ver…

怎么做网站发布利川网站网站建设

程序首先会让你输入一个奇数,即将要生成菱形的总行数,当你输入奇数后按Enter按键就会在控制台看到此菱形了。 效果演示: 代码展示 package com.zsh;import java.util.Scanner;public class lingxing {public static Scanner input new Sc…

游戏网站开发有限公司新手怎么做企业网站

文章目录一、调用流程1. 企业微信OAuth2接入流程2. 使用OAuth2前须知3. 构造网页授权链接4. 获取访问用户身份二、调试前准备2.1. 配置域名映射2.2. 跨域域名请求2.3. 设置可信任域名2.4. 登录企微2.5. 选择自建应用三、实战演练3.1. 前端编码触发后端api3.2. 后端构造授权链接…

动态小网站网站正在建设中

backup X老师忘记删除备份文件,他派小宁同学去把备份文件找出来,一起来帮小宁同学吧! 解法 使用 dirsearch 扫描目录。 dirsearch -u http://61.147.171.105:49361/下载: http://61.147.171.105:64289/index.php.bak打开 index.php.bak&am…

做网站复杂吗erp沙盘模拟实训报告

在项目中需要读取rvt文件,但是因为该格式为非公开格式,其数据需要revit的支持,但批量读取不可能一个一个用revit软件去打开。不过该方法还是需要revit的依赖,速度比开软件快了知道多少1.1. 新建一个控制台项目1.2. 添加Revit API引…

影视作品网站开发与设计摹客 2023年设计师必备设计工具

1 秘密共享问题模型 1.1 富翁和三个儿子的故事 问题: 富翁想在自己的三个儿子中找一个最聪明的来继承自己的遗产,在保护好财富的同时,让其他两个人也参与进来,使得兄弟间和睦相处,家庭和谐。 大儿子的方案&#xff…

何夜无雨 - Ishar

第二天感冒了整个西扩只剩下两个班,雨下了一整天,从四楼下来时候,几乎没什么人了,我顺了一把伞,撑起伞从教学楼朝出口看,两侧楼梯空荡荡,中间是门,门外灯光照着,地上泛着涟漪,我愣了一会,心中的感觉无法用言…

网站的文件夹品牌高端网站制作企业

★嵌入式ARM开发全套案例代码:https://pan.baidu.com/s/1ksCQN__jD8ZrJhw8sWzhwQ?pwdvvfz 3.3. OpenCV 编译和安装 不少客户遇到OpenCV的问题多集中在如何获取mipi摄像头的数据。因为OpenCV使用的V4l2协议和Rockchip编写的mipi摄像头驱动协议不同,所以…

建网站和app做卫生用品都在什么网站

文章目录 1. 协变 (`out`)1.1 协变概念1.2 协变示例1.3 为什么协变只能读取泛型,而不能修改泛型?1. 原因概述2. 类型安全性问题3. 类型一致性结论2. 逆变 (`in`)2.1 逆变概念2.2 逆变示例2.3 为什么逆变只能修改泛型,不能读取泛型?2.3.1 为什么逆变只能读取泛型,不能修改泛…