当前位置: 首页 > news >正文

暗潮:微信小程序第一弹:虐狗结婚证

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

本小程序会持续完善,现在只是一个小模块。

二话不说,先贴效果图。

开发环境及框架

  1. 后端:国产java极速框架JFinal(超级好用有木有啊)
  2. 前端:WEUI WXSS版(微信团队出品的,自己写样式不管怎么写都丑啊)
  3. 数据库:MySQL
  4. 服务器:Linux Nginx Tomcat

开发流程

  1. 用户打开小程序后,本程序获取用户的昵称,头像展示在前台
  2. 用户输入姓名后,系统根据用户的openid生成结婚证图片链接(重复生成自动覆盖上一张)
  3. 判断如果是在开发者工具里面运行。则提示需找我获取体验资格。

后端关键代码详情

2个方法,一个是接收前台传入的参数生成图片并返回处理结果的,一个是获取用户openid时候的前置请求

 private static final WeixinInfo weixinInfo = WeixinInfo.dao.getWeixinInfoById(5);

    /**
     * 创建一个接口,用户需传递姓名和微信openid
     * 每个用户只能创建一张(为服务器考虑,重复生成则覆盖上一张)
     * 返回结果有fail和ok两种
     */
    public void getMarryPic() {
        Map map = new HashMap<>();
        String result = "fail";
        String openid = getPara("openid");
        String name = getPara("name");
        if (name != null && !name.equals("")) {
            ImgMarkUtil.mark(getRequest().getServletContext().getRealPath("/") + "/jiehun/yuan2.jpg", getRequest().getServletContext().getRealPath("/") + "jiehun/" + openid + ".jpg", name);
            result = "ok";
            map.put("imgurl", weixinInfo.get("host") + "/jiehun/" + openid + ".jpg");
        }
        map.put("result", result);
        renderJson(map);
    }

    public void getWxCode() {
        String js_code = getPara("js_code");
        String alipayURL = "https://api.weixin.qq.com/sns/jscode2session?";
        renderText(HttpUtils.post(alipayURL, "appid=" + weixinInfo.get("appid") + "&secret=" + weixinInfo.get("appsecret")
                + "&grant_type=authorization_code" + "&js_code=" + js_code));
    }

通过读取本地原图片,把用户传入的姓名弄成水印附在图片上,随后根据openid生成文件名。

public static void mark(String srcImgPath, String outImgPath, String waterMarkContent) {
        try {
            // 读取原图片信息
            File srcImgFile = new File(srcImgPath);
            Image srcImg = ImageIO.read(srcImgFile);
            int srcImgWidth = srcImg.getWidth(null);
            int srcImgHeight = srcImg.getHeight(null);
            // 加水印
            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = bufImg.createGraphics();
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
            Font font = new Font("Songti TC", Font.PLAIN, 22);
            g.setColor(Color.GRAY); //根据图片的背景设置水印颜色
            g.setFont(font);
            int x = srcImgWidth - getWatermarkLength(waterMarkContent, g) - 3;
            int y = srcImgHeight - 3;
            g.drawString(waterMarkContent, 222, 213);
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
            String dateString = dateFormat.format(new Date());
            g.drawString(dateString, 222, 310);
            g.drawString("J421122-2", 242, 403);
            g.dispose();
            // 输出图片
            FileOutputStream outImgStream = new FileOutputStream(outImgPath);
            ImageIO.write(bufImg, "jpg", outImgStream);
            outImgStream.flush();
            outImgStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 

小程序代码

index.js

//index.js
//获取应用实例
var app = getApp()
Page({
  data: {
    imgurl: "",
    userInfo: {},
    openid: "",
    username: "",
    imagehide:true
  }, nameChange: function (e) {
    this.setData({
      username: e.detail.value
    })
  },
  makeit: function () {
    var that = this;
    if ( app.isnull(this.data.username)) {
      app.alert("姓名必填哦");
    }else if(app.isnull(this.data.openid)){
      app.alert("本程序需要获取微信昵称头像,故在开发者工具上无法运行,只能在实体机上进行体验。请加QQ群560656394获取体验资格");
    } else {
      wx.request({
        url: 'https://www.0713jc.com/wx/getMarryPic',
        data: { name: this.data.username, openid: this.data.openid },
        method: 'GET',
        success: function (res) {
          var timestamp = new Date().getTime();
          that.setData({
            imgurl: res.data.imgurl + "?t=" + timestamp,
            imagehide:false
          })
        }
      })
    }


  },
  onLoad: function () {
    var that = this;
    wx.login({
      success: function (res) {
        if (res.code) {
          //发起网络请求
          wx.request({
            url: 'https://www.0713jc.com/wx/getWxCode',
            data: {
              js_code: res.code
            }, success: function (res) {
              var openid = res.data.openid;
              wx.getUserInfo({
                success: function (res) {
                  var userInfo = res.userInfo
                  that.setData({
                    userInfo: userInfo,
                    openid: openid
                  })
                }
              })
            }
          })
        } else {
          console.log('获取用户登录态失败!' + res.errMsg)
        }
      }
    });
  }, tobig: function () {
    var that = this;
    wx.previewImage({
      urls: [that.data.imgurl] // 需要预览的图片http链接列表
    })
  }

})

为了简洁易读,没有放表现层的一些东西,所有的源代码我放在服务器了。

地址是:http://www.czcczc.cc/lgjhz.zip

注意:出于图片生成对服务器的消耗,本小程序默认不能在开发者工具上直接运行,要体验可以加群QQ:560656394,提供临时真机体验资格(说得好像很值钱的样子,实际上免费提供)。

当然,如果你本身会小程序,这个还是很好去跳过限制的

顺带这里求一个人一起玩小程序,共享服务器。(尼玛吃不消啊)

如果你觉得,哎哟,这小伙子不错,请赞助我。

转载于:https://my.oschina.net/u/2356272/blog/810649

相关文章:

  • Linux网卡配置(一)网卡配置文件
  • 使用X Manager远程CentOS 7服务器(XDMCP)
  • 怎么中文版也看不懂哦,茜色的剧本真强大
  • 探讨 ADO.NET DataRow
  • 数据库中的索引
  • 亲历北京Top 500
  • 【翻译】使用IIS 7.0 PowerShell 创建web站点,Web应用,虚拟路径和应用程序池
  • @ModelAttribute使用详解
  • 在园子里吵架属正常
  • Java socket(三)使用TCP传输文件
  • [独库骑行之我们穿过草原]巴音布鲁克大草原
  • angular-ui-bootstrap (1)
  • firefox播放mms流媒体(网络电视)
  • 学习Oracle的好地方
  • easyui datagrid 行右键生成 动态获取(toolbar) 按钮
  • JS 中的深拷贝与浅拷贝
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • angular学习第一篇-----环境搭建
  • Laravel Telescope:优雅的应用调试工具
  • nodejs:开发并发布一个nodejs包
  • php中curl和soap方式请求服务超时问题
  • Swoft 源码剖析 - 代码自动更新机制
  • vue的全局变量和全局拦截请求器
  • 动态规划入门(以爬楼梯为例)
  • 构造函数(constructor)与原型链(prototype)关系
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 前嗅ForeSpider中数据浏览界面介绍
  • 驱动程序原理
  • 入手阿里云新服务器的部署NODE
  • 算法之不定期更新(一)(2018-04-12)
  • 自定义函数
  • 走向全栈之MongoDB的使用
  • 关于Android全面屏虚拟导航栏的适配总结
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​Spring Boot 分片上传文件
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • #预处理和函数的对比以及条件编译
  • (3)STL算法之搜索
  • (7)STL算法之交换赋值
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (HAL库版)freeRTOS移植STMF103
  • (编译到47%失败)to be deleted
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .NET Core 中插件式开发实现
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .Net 垃圾回收机制原理(二)
  • .NET开发不可不知、不可不用的辅助类(一)
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [20171113]修改表结构删除列相关问题4.txt
  • [android] 切换界面的通用处理
  • [C++11 多线程同步] --- 条件变量的那些坑【条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)】