第五篇 Scrum冲刺博客
目录
Part one 作业地址
这个作业属于哪个课程 | 软件工程 |
---|---|
作业要求 | 第五篇 Scrum冲刺博客 |
作业目标 | 团队集体协作完成项目开发,促进彼此间的交流 |
Part two 站立式会议
1.1 微信会议照片
注:这次开会主要还是讨论昨天个人的进度问题以及做任务时候遇到的困难,然后大家一起解决。
1.2成员工作情况
成员 | 昨天已完成的工作 | 今天计划完成的工作 | 工作中遇到的困难 |
---|---|---|---|
张天 | 做好接下来二天的计划 | 基本完成项目,对项目当中存在的问题进行总结归纳 | 商城的运行依旧出了问题 |
黄炜恒 | 商家入驻环境基本搭建好 | 实现上架入驻模式的规则 | 商家入驻有些规则仍然在考虑 |
黄浩捷 | 完成商城按钮轮转界面 | 继续优化商品的显示界面 | 跳转按钮设计不美观 |
陈伟升 | 商城跳转支付界面 | 优化支付模块 | 支付模块跳转卡顿 |
曾广宁 | 整理商城架构 | 完成设计购物车的整体架构 | 购物车排列不美观 |
曾春华 | 整理商城架构并查阅了相关资料 | 构思商品的整体架构 | 商品名命名不成功 |
Part three 项目燃尽图
注:接下来的任务主要是对模块当中的一些细节进行优化。
Part four 代码/文档签入记录
3.1 代码签入
说明:第五天git操作明显进步了不少
3.2 Issue链接
成员 | Issue链接 |
---|---|
张天 | 实现一些工具组件类1 |
黄炜恒 | 商家入驻模块 |
黄浩捷 | 商城主界面 |
陈伟升 | 支付模块 |
曾广宁 | 商品的整体架构 |
曾春华 | 商品的整体架构 |
Part five 最新程序/模块
4.1 程序代码
package com.nanrailgun.mall_gateway.controller; //商城管理界面
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeWapPayModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.nanrailgun.config.common.Constants;
import com.nanrailgun.config.common.ServiceResultEnum;
import com.nanrailgun.config.config.annotation.MallToken;
import com.nanrailgun.config.utils.PageQueryUtil;
import com.nanrailgun.config.utils.Result;
import com.nanrailgun.config.utils.ResultGenerator;
import com.nanrailgun.mall_gateway.config.AlipayConfig;
import com.nanrailgun.mall_gateway.controller.param.MallOrderSaveParam;
import com.nanrailgun.order_api.api.MallOrderService;
import com.nanrailgun.order_api.api.dto.MallOrderDetailDTO;
import com.nanrailgun.user_api.api.MallUserAddressService;
import com.nanrailgun.user_api.entity.MallUser;
import com.nanrailgun.user_api.entity.MallUserAddress;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
@RestController
public class MallOrderController {
@Reference
private MallOrderService mallOrderService;
@Reference
private MallUserAddressService mallUserAddressService;
@GetMapping("/order")
public Result getOrderList(@RequestParam(required = false) Integer pageNumber,
@RequestParam(required = false) Integer status,
@MallToken MallUser loginMallUser) {
Map params = new HashMap();
if (pageNumber == null || pageNumber < 1) {
pageNumber = 1;
}
params.put("userId", loginMallUser.getUserId());
params.put("orderStatus", status);
params.put("page", pageNumber);
params.put("limit", Constants.ORDER_SEARCH_PAGE_LIMIT);
PageQueryUtil util = new PageQueryUtil(params);
return ResultGenerator.genSuccessResult(mallOrderService.getMyOrders(util, util.getPage(), util.getLimit()));
}
@GetMapping("/order/{orderNo}")
public Result getOrderDetail(@PathVariable("orderNo") String orderNo, @MallToken MallUser user) {
return ResultGenerator.genSuccessResult(mallOrderService.getOrderDetailByOrderNo(orderNo, user.getUserId()));
}
@PutMapping("/order/{orderNo}/cancel")
public Result cancelOrder(@PathVariable("orderNo") String orderNo, @MallToken MallUser user) {
String result = mallOrderService.cancelOrder(orderNo, user.getUserId());
if (ServiceResultEnum.SUCCESS.getResult().equals(result)) {
return ResultGenerator.genSuccessResult();
}
return ResultGenerator.genFailResult(result);
}
@PutMapping("/order/{orderNo}/finish")
public Result finishOrder(@PathVariable("orderNo") String orderNo, @MallToken MallUser user) {
String result = mallOrderService.finishOrder(orderNo, user.getUserId());
if (ServiceResultEnum.SUCCESS.getResult().equals(result)) {
return ResultGenerator.genSuccessResult();
}
return ResultGenerator.genFailResult(result);
}
@PostMapping("/saveOrder")
public Result saveOrder(@RequestBody MallOrderSaveParam param, @MallToken MallUser user) {
if (param == null || param.getAddressId() == null || param.getCartItemIds() == null || param.getCartItemIds().length < 1) {
return ResultGenerator.genFailResult(ServiceResultEnum.PARAM_ERROR.getResult());
}
MallUserAddress address = mallUserAddressService.getAddressByAddressId(param.getAddressId());
if (!address.getUserId().equals(user.getUserId())) {
return ResultGenerator.genFailResult(ServiceResultEnum.REQUEST_FORBIDEN_ERROR.getResult());
}
List<Long> cartItemIds = Arrays.asList(param.getCartItemIds());
String orderNo = mallOrderService.saveOrder(user, cartItemIds, address);
return ResultGenerator.genSuccessResult((Object) orderNo);
}
@GetMapping("/pay")
public void mockPaySuccess(@RequestParam("orderNo") String orderNo,
@RequestParam("payType") int payType,
@MallToken MallUser user,
HttpServletResponse response) {
if (payType == 2) payType = 1;
String result = mallOrderService.pay(orderNo, payType);
MallOrderDetailDTO mallOrder = mallOrderService.getOrderDetailByOrderNo(orderNo, user.getUserId());
if (ServiceResultEnum.SUCCESS.getResult().equals(result)) {
//返回支付宝表单
AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE);
AlipayTradeWapPayRequest alipay_request = new AlipayTradeWapPayRequest();
// 封装请求支付信息
AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
model.setOutTradeNo(orderNo);
model.setSubject(mallOrder.getOrderNo());
model.setTotalAmount(String.valueOf(mallOrder.getTotalPrice()));
model.setBody("订单");
model.setProductCode("QUICK_WAP_WAY");
alipay_request.setBizModel(model);
// 设置异步通知地址
//alipay_request.setNotifyUrl(AlipayConfig.notify_url);
// 设置同步地址
alipay_request.setReturnUrl(AlipayConfig.return_url);
// form表单生产
String form;
try {
// 调用SDK生成表单
form = client.pageExecute(alipay_request).getBody();
response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
response.getWriter().write(form);//直接将完整的表单html输出到页面
response.getWriter().flush();
response.getWriter().close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@GetMapping("/payValidation")
public void payValidation(HttpServletRequest request, HttpServletResponse response) throws Exception {
//获取支付宝GET过来反馈信息
Map<String, String> params = new HashMap<>();
Map requestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
//商户订单号
String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
//支付宝交易号
String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
//计算得出通知验证结果
//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA2");
if (verify_result) {//验证成功
//////////////////////////////////////////////////////////////////////////////////////////
//请在这里加上商户的业务逻辑程序代码
//该页面可做页面美工编辑
mallOrderService.paySuccess(out_trade_no);
//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
//////////////////////////////////////////////////////////////////////////////////////////
}
response.sendRedirect("http://10.203.109.200:8080/#/order");
}
}
4.2 运行截图
商城支付订单:
Part six 每人每日总结
成员 | 小结 |
---|---|
张天 | 项目开发到这里,感觉越来越吃力 |
黄炜恒 | 任务越来越难,剩下的路还很长 |
黄浩捷 | 经过努力学习,编程的能力已经有了明显的提升 |
陈伟升 | java的支付模块已经基本实现 |
曾广宁 | 需要继续努力,多学习 |
曾春华 | 继续与同学保持良好的沟通 |