JavaWeb综合项目——快递e栈(微信前端部分)(二)

本文涉及的产品
.cn 域名,1个 12个月
简介: JavaWeb综合项目——快递e栈(微信前端部分)(二)

4 ngrok内网穿透


42.png


ngrok官网

43.png


44.png


45.png


下载后启动服务器


46.png


输入隧道id:ae2d4bac22…

47.png


当访问http://wjwezhan.free.idcfengye.com时会跳转到本地。

为了防止free.idcfengye.com域名被别人恶意使用后被举报,重新编辑一下域名

48.png


此时再浏览器中输入 即可访问主页。


5 微信js扫码


5.1 微信JSSDK引入


5.1.1 前置需求


 申请个人微信公众号


5.1.2 引入并修改工具类


 在wx包下创建servlet包,并导入配置类。


package com.wangjiawei.wx.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.wangjiawei.wx.util.SignatureUtil;
@WebServlet("/wxconf.do")
public class WXConfig extends HttpServlet {
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  request.setCharacterEncoding("UTF-8");
  response.setCharacterEncoding("UTF-8");
  PrintWriter pw = response.getWriter();
  String urlText = request.getParameter("xurl");
  try {
    String json = SignatureUtil.getConfig(urlText ).toJSON();
    pw.println(json);
  } catch (Exception e) {
    e.printStackTrace();
  }
  pw.close();
  }
  /**
  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  */
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  doGet(request, response);
  }
}


 在wx包下创建util包,并导入三个工具类,SignatureUtil.java,TicketUtil.java,TokenUtil.java


进行如下修改:


1.SignatureUtil类 88 行的appid 否则无法调用api

2.TokenUtil类的34行的appid

3.TokenUtil类的35行的secret


appid和密钥来自于:

 mp.weixin.qq.com --> 基本配置


5.1.3 添加js安全域名


 公众号设置 —> 功能设置 —> JS接口安全域名


 按照给出的提示设置上面定义过的wjwezhan.zaixianke.cn


5.1.4 添加白名单ip


 映射服务器地址:64.69.43.237

49.png


本机ip地址: 211.162.81.72

50.png


5.1.5 设置自动回复


 公众号设置自动回复后连接到http://wjwezhan.zaixianke.cn/login.html,登录后是用快递助手,点击扫码按钮即可跳出扫码界面。


6 取件


设计两种取件方式:

 第一种是扫描用户的二维码,展示出该用户所有的快递,再对每一个快递可以有取件的操作。

 第二种是快递员扫描某个快递的二维码,再将其显示后可以有一个取件的操作。


6.1 完善后台代码


 BaseExpressDao中添加根据手机号和快递状态查询的方法:


/**
 * 根据用户手机号和快递状态查询所有快递
 * @param userPhone 手机号
 * @param status    快递状态
 * @return 查询的快递信息,手机号不存在时返回null
 */
List<Express> findByUserPhoneAndStatus(String userPhone, int status);


在接口实现类中进行实现:


@Override
public List<Express> findByUserPhoneAndStatus(String userPhone, int status) {
    ArrayList<Express> data = new ArrayList<>();
    Connection conn = DruidUtil.getConnection();
    PreparedStatement state = null;
    ResultSet result = null;
    try {
        state = conn.prepareStatement(SQL_FIND_BY_USERPHONE_AND_STATUS);
        state.setString(1,userPhone);
        state.setInt(2,status);
        result = state.executeQuery();
        while (result.next()){
            int id = result.getInt("id");
            String number = result.getString("number");
            String username = result.getString("username");
            String company = result.getString("company");
            String code = result.getString("code");
            Timestamp inTime = result.getTimestamp("inTime");
            Timestamp outTime = result.getTimestamp("outTime");
            String sysPhone = result.getString("sysPhone");
            Express e = new Express(id, number, username, userPhone, company, code, inTime, outTime, status, sysPhone);
            data.add(e);
        }
    }catch (SQLException throwables){
        throwables.printStackTrace();
    }finally {
        DruidUtil.close(conn,state,result);
    }
    return data;
}


service中添加相应方法:


public static List<Express> findByUserPhoneAndStatus(String userPhone, int status) {
    return dao.findByUserPhoneAndStatus(userPhone, status);
}


6.2 微信端后台实现


6.2.1 快递展示操作


 wx包下ExpressController中添加查询快递的方法,如果用户扫描的是个人二维码,则展示其所有快递:


@ResponseBody("/wx/userExpressList.do")
public String expressList(HttpServletRequest request, HttpServletResponse response){
    String userPhone = request.getParameter("userPhone");
    List<Express> list = ExpressService.findByUserPhoneAndStatus(userPhone, 0);
    // 转变为更好显示的格式
    List<BootStrapTableExpress> list2 = new ArrayList<>();
    for (Express e:list){
        String inTime = DateFormatUtil.format(e.getInTime());
        String outTime = e.getOutTime()==null?"未出库":DateFormatUtil.format(e.getOutTime());
        String status = e.getStatus() == 0 ? "待取件":"已取件";
        String code = e.getCode()==null ? "已取件":e.getCode();
        BootStrapTableExpress e2 = new BootStrapTableExpress(e.getId(),e.getNumber(),e.getUsername(),e.getUserPhone(),e.getCompany(),code,inTime,outTime,status,e.getSysPhone());
        list2.add(e2);
    }
    Message msg = new Message();
    if (list.size() == 0){
        msg.setStatus(-1);
        msg.setResult("未查询到快递");
    }else {
        msg.setStatus(0);
        msg.setResult("查询成功");
        msg.setData(list2);
    }
    String json = JSONUtil.toJSON(msg);
    return json;
}


6.2.2 取件操作(更新status)


 QRCodeController中添加取件的操作:


@ResponseBody("/wx/updateStatus.do")
public String updateExpressStatus(HttpServletRequest request, HttpServletResponse response){
    String code = request.getParameter("code");
    boolean flag = ExpressService.updateStatus(code);
    Message msg = new Message();
    if (flag){
        msg.setStatus(0);
        msg.setResult("取件成功");
    }else {
        msg.setStatus(-1);
        msg.setResult("取件码不存在,请更新二维码");
    }
    String json = JSONUtil.toJSON(msg);
    return json;
}
QRCodeController中添加根据取件码输入框中的取件码查询快递的操作(应用于第二种取件方式):
@ResponseBody("/wx/findExpressByCode.do")
public String findExpressByCode(HttpServletRequest request, HttpServletResponse response){
    String code = request.getParameter("code");
    Express e = ExpressService.findByCode(code);
    BootStrapTableExpress e2 = null;
    if (e != null){
        String inTime = DateFormatUtil.format(e.getInTime());
        String status = "待取件";
        e2 = new BootStrapTableExpress(e.getId(),e.getNumber(),e.getUsername(),e.getUserPhone(),e.getCompany(),code,inTime,null,status,e.getSysPhone());
    }
    Message msg = new Message();
    if (e == null){
        msg.setStatus(-1);
        msg.setResult("取件码不存在");
    }else {
        msg.setStatus(0);
        msg.setResult("查询成功");
        msg.setData(e2);
    }
    String json = JSONUtil.toJSON(msg);
    return json;
}


相关文章
|
22天前
|
监控 前端开发 数据可视化
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
@icraft/player-react 是 iCraft Editor 推出的 React 组件库,旨在简化3D数字孪生场景的前端集成。它支持零配置快速接入、自定义插件、丰富的事件和方法、动画控制及实时数据接入,帮助开发者轻松实现3D场景与React项目的无缝融合。
85 8
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
|
2月前
|
JavaScript 前端开发 Docker
前端全栈之路Deno篇(二):几行代码打包后接近100M?别慌,带你掌握Deno2.0的安装到项目构建全流程、剖析构建物并了解其好处
在使用 Deno 构建项目时,生成的可执行文件体积较大,通常接近 100 MB,而 Node.js 构建的项目体积则要小得多。这是由于 Deno 包含了完整的 V8 引擎和运行时,使其能够在目标设备上独立运行,无需额外安装依赖。尽管体积较大,但 Deno 提供了更好的安全性和部署便利性。通过裁剪功能、使用压缩工具等方法,可以优化可执行文件的体积。
139 3
前端全栈之路Deno篇(二):几行代码打包后接近100M?别慌,带你掌握Deno2.0的安装到项目构建全流程、剖析构建物并了解其好处
|
26天前
|
前端开发 测试技术
前端工程化的分支策略要如何与项目的具体情况相结合?
前端工程化的分支策略要紧密结合项目的实际情况,以实现高效的开发、稳定的版本控制和顺利的发布流程。
24 1
|
1月前
|
前端开发 Unix 测试技术
揭秘!前端大牛们如何高效管理项目,确保按时交付高质量作品!
【10月更文挑战第30天】前端开发项目涉及从需求分析到最终交付的多个环节。本文解答了如何制定合理项目计划、提高团队协作效率、确保代码质量和应对项目风险等问题,帮助你学习前端大牛们的项目管理技巧,确保按时交付高质量的作品。
35 2
|
2月前
|
缓存 前端开发 JavaScript
前端架构思考:代码复用带来的隐形耦合,可能让大模型造轮子是更好的选择-从 CDN 依赖包被删导致个站打不开到数年前因11 行代码导致上千项目崩溃谈谈npm黑洞 - 统计下你的项目有多少个依赖吧!
最近,我的个人网站因免费CDN上的Vue.js包路径变更导致无法访问,引发了我对前端依赖管理的深刻反思。文章探讨了NPM依赖陷阱、开源库所有权与维护压力、NPM生态问题,并提出减少不必要的依赖、重视模块设计等建议,以提升前端项目的稳定性和可控性。通过“left_pad”事件及个人经历,强调了依赖管理的重要性和让大模型代替人造轮子的潜在收益
|
2月前
|
前端开发 JavaScript 开发工具
前端代码规范和质量是确保项目可维护性、可读性和可扩展性的关键(三)
前端代码规范和质量是确保项目可维护性、可读性和可扩展性的关键(三)
39 0
|
2月前
|
Web App开发 前端开发 JavaScript
前端代码规范和质量是确保项目可维护性、可读性和可扩展性的关键(二)
前端代码规范和质量是确保项目可维护性、可读性和可扩展性的关键(二)
55 0
|
2月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
170 2
|
2月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
46 0
|
2月前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。