微信小程序模板消息接口下线了,不用慌,调用统一服务消息接口来实现相同功能

做过微信开发的应该都有一点感触,就是他的开发文档不是一成不变的,接口有时候会被下线,但也不是一下子就不能用了,一般会兼容旧接口,然后提醒你使用新接口有更多好处。

如果接口真的直接下线了,也会提供另一种能够实现相同功能的接口给你替换。所以有天你以为代码都写好了,没有bug了,悠哉悠哉的时候,忽然产品经理说微信的哪个接口不能用了,快去改一下,不要惊讶,老老实实去改就对了哈。

这不,微信将小程序的模板消息接口下线了,之前用formid来调这个接口的功能都就用不了了。

看官方文档提示,是提供了订阅消息的功能来替换,顾名思义,要用户主动订阅了才可以发送成功,像下面这样:

除了这种订阅消息外,还有没有其他方法来实现同等效果呢,答案是of course。

翻阅小程序开发文档发现,官方还提供了一个统一服务消息的接口。为便于开发者对用户进行服务消息触达,简化小程序和公众号模板消息下发流程,小程序提供统一的服务消息下发接口。就是在小程序里发送公众号模板消息,这个好处就是不需要formid的,文档地址:

https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/uniform-message/uniformMessage.send.html

要注意:以下几类消息是目前不允许发的模板消息

1、模板内容与服务场景(含标题、关键词)不一致的模板

2、涉嫌广告营销类消息模板

3、发送频率过高,有骚扰用户倾向类消息模板

4、涉及红包、卡券、优惠券、代金券、会员卡、积分类消息模板

接下来我们就来实现下。

1、准备

调用这个接口的前提是公众号和小程序有绑定且是同主体的,这个好办,登录公众号后台 -> 小程序 -> 小程序管理 -> 添加即可绑定小程序。

因为实质上还是发的公众号模板消息,所以还是要在公众号后台添加消息模板获取模板id。

2、开发

好了,做好以上两个准备就可以开发了,主要代码如下面:

 /**
     * 在小程序里使用同主体的关联公众号发送模板消息
     * https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html
     * @param vo
     * @return   {"errcode":0,"errmsg":"ok"}   向没有关注公众号的用户发送会返回{"errcode":43004,"errmsg":"require subscribe hint: [LGcpYa05528672]"}
     */
    public static JSONObject uniformSend(SendVo vo){
        boolean flag = false;
        JSONObject object = new JSONObject();
        JSONObject mpTemplateMsg = new JSONObject();
        JSONObject miniprogram = new JSONObject();
        String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token="+vo.getToken();
        object.put("touser", vo.getToUser());
        mpTemplateMsg.put("appid", vo.getPublicAppId());
        mpTemplateMsg.put("url", vo.getUrl());
        mpTemplateMsg.put("template_id", vo.getTemplateId());
        miniprogram.put("appid",vo.getMiniAppId());
        miniprogram.put("pagepath",vo.getPagePath());
        mpTemplateMsg.put("miniprogram",miniprogram);
        List<String> list = vo.getValue();
        JSONObject jsonObject = null;
        if (list != null && list.size() > 0) {
            int size = list.size();
            JSONObject data = new JSONObject();
            for (int i = 0; i < size; i++) {
                if (i == 0) {
                    JSONObject first = new JSONObject();
                    first.put("value",list.get(0));
                    first.put("color",vo.getColor());
                    data.put("first",first);
                } else if (i == size-1) {
                    JSONObject remark = new JSONObject();
                    remark.put("value",list.get(0));
                    remark.put("color",vo.getColor());
                    data.put("remark",remark);
                } else {
                    JSONObject keyword = new JSONObject();
                    keyword.put("value",list.get(i));
                    keyword.put("color",vo.getColor());
                    data.put("keyword"+i,keyword);
                }
            }
            mpTemplateMsg.put("data",data);
            object.put("mp_template_msg",mpTemplateMsg);
            jsonObject = CommonUtil.httpsRequestJson(url, "POST", object.toJSONString());
            logger.info("统一消息推送模板json======{}",jsonObject);
        }
        return jsonObject;
    }

针对入参要说下mpTemplateMsg.put("data",data)里面的data这个参数,它是first.DATA,

(keyword1.DATA,keyword2.DATA。。。),remark.DATA组成的,所以for循环里面

拼接数据的时候要分三个,分别对应first.DATA,(keyword1.DATA,keyword2.DATA。。。),remark.DATA的字段值。

3、效果

您的一键三连,是我更新的最大动力,谢谢

山水有相逢,来日皆可期,谢谢阅读,我们再会

我手中的金箍棒,上能通天,下能探海

上一篇:基于element-ui封装的upload组件

本文转载于网络 如有侵权请联系删除

相关文章

  • Python - 面向对象编程 - 公共属性、保护属性、私有属性

    公共属性在Python的类里面,所有属性和方法默认都是公共的classPoloBlog: #公共属性 sum=0 #构造方法 def__init__(self,name): self.name=name #公共方法 deftest(self): ...复制但Python也可以设置受保护、私有类型的变量or方法私有类型的属性、方法在实际开发中,对象的某些属性或方法可能只希望在对象的内部被使用,而不希望在外部被访问到私有属性:就是对象不希望公开访问的属性私有方法:就是对象不希望公开访问的方法定义方式,类图在属性、方法名前加两个下划线就是私有属性、私有方法了代码#私有属性、方法 classPerson: #构造方法 def__init__(self,name,age): self.name=name self.__age=age #实例方法 defpinrtMsg(self): print("name:",self.name,"age:",self.__age) #私有方法 def__getAge(self): print("age

  • 制作NC掩膜文件,在python中裁剪全球数据

    01背景与思路对全球数据掩膜的重要性 鉴于很多数据如CRU、GLDAS、TerraClimate、GLASS数据等都是全球NC数据,如何利用Python对这些数据进行裁剪,得到属于自己研究区范围的数据一直困扰着许多人。在这里我的思路:1.利用全球和研究区的shp文件进行拼接 2.将shp转变为研究区属性为1,区以外为0的Raster文件 3.将Raster转变为NC文件 02数据在这里,我所使用的数据是研究区SHP文件、世界国家SHP文件,利用ARCGIS10.2软件完成下列操作世界国家和研究区shp文件 研究区展示03矢量文件融合与拼接1.分别将世界国家和研究区的shp文件进行融合,得到整个世界和研究区的面Shp。点击Edior开始编辑 在Editor找到Merge进行融合 融合结果展示2.将融合后的世界国家和研究区面矢量进行拼接至一个文件。 工具箱打开General-Append 选择需要拼接的数据04矢量数据转栅格 将具有研究区面的全球面矢量转变成栅格首先创建属性Field,对研究区赋值1,研究区以外赋值0 打开工具箱ToRaster-PolygontoRster 选择需要转成R

  • 为什么要学设计模式:本质、价值与收益

    文章首发于公众号「陈树义」及个人站点(https://shuyi.tech),欢迎访问。设计模式的本质说起设计模式,就不得不说起重构。在2017年,当我还是一个工作3年的菜鸟,我重构了公司一个十几年的老系统,弄得心力交瘁。为了能深刻吸取这次重构的教训,我写了一篇文章记录这次重构的心得:浅谈重构中踩过的坑-陈树义的博客。时隔三年,我再次刷了一遍设计模式相关知识,这次我对设计模式有了更深刻的认识。所以今天我们就来聊聊:设计模式的本质是什么?它的存在有什么价值?学了设计模式有什么好处?在这篇文章中,我对设计模式的总结是:设计模式用于承载复杂的业务逻辑,使写出的代码简洁、易扩展。简单地说,你需要去了解业务中哪些是变化的,哪些是不变的。这些变化的东西就是复杂的业务逻辑,你需要思考如何用一种合适的设计模式去承载它,使得当它发生变化的时候,能具有很好的扩展性。这时候如果你学过设计模式,对每种设计模式的使用场景都谙熟于心,那你做起来会更加得心应手。有些人说,我看有些人也没学过设计模式,但他们代码也写得挺好啊。这里我想表达我的第二个观点:抽象思维才是设计模式的内核。有些人接触的项目多了,其在项目中不知不

  • 【计算机本科补全计划】图的连通性check by 并查集Union Find

    正文之前前几天苦练图论,虽然还不算登堂入室?但是好歹还是懂了好几个概念,今天就讲讲我最开始认识的一个,很棒的检查图的连通性的算法--并查集!!!正文具体的想法来自一篇写的超好的博客,如果底子不是很好,建议看下面这篇,当然如果可以给我顺手点个赞就更好了!!http://blog.csdn.net/dellaserss/article/details/7724401具体的代码如下:#include<iostream> usingnamespacestd; //定义全局变量,作为并查集!!uf取自:unionfind intuf[100]; //定义并查集的查找根节点的函数 intFind_set(intx) { ints=x; while(uf[s]!=s) s=uf[s]; intd=x,j; //路径压缩算法 while(uf[d]!=d) { j=uf[d]; uf[d]=s; d=j; } returns; } //定义图的整合算法 voidmix(intx,inty) { ints=Find_set(x); intd=Find_set(y); if(s!=d)

  • 未来的云计算战场中,云存储战争什么时候开始?

    云提供商不但有机会帮助客户解决当今的挑战,还能够辅助客户迎接未来即将面临的挑战。面对未来的机遇,托管服务提供商的云计算看起来非常光明,可以帮助客户在复杂关联的,不稳定的托管环境中取得成功。云计算的价格战已经不是一个新鲜的事情。在2014年,微软、谷歌和亚马逊为了占据市场最大份额先后拉开价格战的序幕。接下来的几天,云计算市场迎来的大幅度降价,在某些情况中,云计算产品的收入平均下降了85%。对此,部分人认为,降价是一种解脱,这些公司一直在向客户收取过高费用。另外一部分人则认为这是市场达到饱和的迹象。在复杂的云环境中,价格削减已经开始逐步局限于虚拟机。这使得服务提供商能够长期在其产品组合的剩余部分中利用其稳定增长的利润率。我们正在目睹的是一个即将扩展到计算之外的转变,它将渗透到更加广泛的存储领域中去,包括数据库。>>>>存储,新的战场为了获得而不是失去市场份额,一些企业开始在竞争者日益增多的背景下降低虚拟机的价格。根据451研究表明:云价格指数,竞争的服务超出了计算的范围,保持了价格的稳定。然而,价格的雪崩似乎正在蔓延。 在过去的12个月里,每个地区的对象存储价格都有

  • 什么是数据分析的漏斗模型?

    作者:李启方很早之前就知道漏斗模型,但没有做更多的了解和运用,后来对漏斗模型的了解稍加深入之后,觉得它不仅仅是一个模型,更是一种可以普遍适用的方法论,或者说是一种思维方式。本文主要谈谈漏斗模型的本质、漏斗模型案例分析以及如何绘制漏斗模型。漏斗模型关于漏斗模型,我认为本质是分解和量化。为什么这么说,这里以营销漏斗模型举栗。百科给出的解释:营销漏斗模型指的是营销过程中,将非潜在客户逐步变为客户的转化量化模型。营销漏斗模型的价值在于量化了营销过程各个环节的效率,帮助找到薄弱环节。也就是说营销的环节指的是从获取用户到最终转化成购买这整个流程中的一个个子环节,相邻环节的转化率则就是指用数据指标来量化每一个步骤的表现。所以整个漏斗模型就是先将整个购买流程拆分成一个个步骤,然后用转化率来衡量每一个步骤的表现,最后通过异常的数据指标找出有问题的环节,从而解决问题,优化该步骤,最终达到提升整体购买转化率的目的,整体漏斗模型的核心思想其实可以归为分解和量化。无独有偶,OKR的核心思想也是这个,即分解和量化。OKR(ObjectivesandKeyResults)全称为“目标和主要成果”,OKR首先是设定一

  • 腾讯云实时音视频返回结果调用方式

    注意:目前只要请求被服务端正常处理了,响应的HTTP状态码均为200。例如返回的消息体里的错误码是签名失败,但HTTP状态码是200,而不是401。 正确返回结果以云服务器的接口查看实例状态列表(DescribeInstancesStatus)2017-03-12版本为例,若调用成功,其可能的返回如下为:{ "Response":{ "TotalCount":0, "InstanceStatusSet":[], "RequestId":"b5b41468-520d-4192-b42f-595cc34b6c1c" } }复制 Response及其内部的RequestId是固定的字段,无论请求成功与否,只要API处理了,则必定会返回。 RequestId用于一个API请求的唯一标识,如果API出现异常,可以联系我们,并提供该ID来解决问题。 除了固定的字段外,其余均为具体接口定义的字段,不同的接口所返回的字段参见接口文档中的定义。此例中的TotalCount和InstanceStatus

  • Spring Cloud Ribbon 客户端负载均衡

    Ribbon客户端组件提供一系列完善的配置选项,比如连接超时、重试、重试算法等,内置可插拔、可定制的负载均衡组件。下面是用到的一些负载均衡策略: 简单轮询负载均衡 加权轮询负载均衡 区域感知轮询负载均衡 随机负载均衡 先写一个类模拟一个IP列表: publicclassIpMap { //待路由的Ip列表,Key代表Ip,Value代表该Ip的权重 publicstaticHashMap<String,Integer>serverWeightMap= newHashMap<String,Integer>(); static { serverWeightMap.put("192.168.1.100",1); serverWeightMap.put("192.168.1.101",1); //权重为4 serverWeightMap.put("192.168.1.102",4); serverWeightMap.put("192.168.1.103",1); serverWeightMap.put("192.168.1.104",1); //权重为3 ser

  • Vue学习之--------深入理解Vuex之多组件共享数据(2022/9/4)

    在上篇文章的基础上:Vue学习之--------深入理解Vuex之getters、mapState、mapGetters 1、在state中新增用户数组 2、新增Person.vue组件 提示:这里使用nanoid来生成新用户的id。nanoid的安装:npminanoid。 如果提示权限不够,使用管理员命令窗口 只需要引入另外一个组件中操作的state的数据 computed:{ personList(){ returnthis.$store.state.personList; }, //另外一个组件操作的数据 Count(){ returnthis.$store.state.sum } }, 复制 <template> <div> <h1>人员信息展示</h1> <h3style="color:pink">Count组件的和为:{{Count}}</h3> <inputtype="text"placeholder="请输入姓名"v-model="name"/> <button@click

  • 客户答应两个月后下一个柜给我,却消失了,怎么办?

    有一个客户,做过一批单子,给我发了两次样品,说好了,两个月后会下一个柜给我,5月7号给他打了磨具,到现在我发信息给他都不回我了,这样要怎样跟进? 客户说好了下单,但是真的到了时间点,并没有下单,跟着跟着还消失了。 说话不算话,没下单的原因: 1、客户没有从他的客户那里拿下订单 2、客户说了大话,实际没有决定权,公司开会决定采购了别家 3、项目搁浅,选择了其他项目 4、市场不好,对方销售不理想,库存还没消化掉 5、货币贬值,产品买回去会面临亏本  因为客户已经说好了要下单了,不少业务员总觉得有这个把柄在手,超过半数人肯定的,会拿着这个客户口头答应的订单说事,会催促客户这个订单怎么回事,实际上客户这个时候是不好受的,他因为他没有能力接下这个订单,其实是很没面子的。 我们大多数人还是喜欢表现的。事情没办成,无脸面对江东父老。   我认为尤其是已经是老客户,尤其是客户来中国,大家一块吃饭的时候,有很多客户肯定会在面前说,订单包在我身上吧,过两个月会有一个大订单。 结果对方其实只是个采购

  • python实现二项分布

    二项分布的定义 在概率论和统计学中,二项分布是n个独立的成功/失败试验中成功的次数的离散概率分布,其中每次试验的成功概率为p 如果随机变量X服从参数为n和p的二项分布,我们记为X~B(n,p) n次试验中正好得到k次成功的概率由概率质量函数给出:\(P\{X=k\}={C_n^k}{p^k}{(1-p)^{n-k}}\),其中\({C_n^k}=\frac{n!}{k!(n-k)!}\) 代码实现 fromfunctoolsimportreduce deffactorial(n): """计算n的阶乘,即n!""" ifn==0: return1 returnreduce(lambdax,y:x*y,range(1,n+1)) defCnk(n,k): """计算从n个样本中取出k个样本,共有多少种组合""" returnint(factorial(n)/(factorial(k)*factorial(n-k))) defbinomial(n,p,k): """当X服从二项分布B(n,p)时,X取值为k的概率""" returnCnk(n,k)*(p**k)*((1-p)**

  • 12.1

    cookie是在服务端创建:cooki是保存在浏览器这一端 每次请求会携带与当前服务相关的键值对数据,cookie明文显示数据,用户可以知道cookie,数据存储在浏览器中容易被暴露,被获取,不存敏感数据 在判断页面是否有效前需要先对验证控件进行验证,即在 if   (Page.IsValid) 前加上: Page.Validate(); 如果检验页面是否有效的代码不是放在Page_Load方法而是提交按钮的Click事件处理程序中,并且该提交按钮的CausesValidation没有设为false(默认为true),则可直接用Page.IsValid来判断页面是否有效,因为Click事件已经自动引发了Page.Validate()方法。2、C# IsNullOrWhiteSpace:C# IsNullOrWhiteSpace() 方法用于检查指定的字符串是否为空,或仅由空白字符组成。它返回布尔值 True 或 False。签名:public&nb

  • 每日分享

    一。自适应和响应式 先说共同点,两者都是因为越来越多的移动设备(mobile,tabletdevice)加入到互联网中来而出现的为移动设备提供更好的体验的技术。用技术来使网页适应从小到大(现在到超大)的不同分辨率的屏幕.都是为了解决同一张页面在不同设备分辨率上合理展示的技术。 不同点: 响应式布局:不管用户使用的是什么设备都是在服务器把数据推送到浏览器后,脚本或CSS自行侦测屏幕大小后执行对应的样式表内容,并且一直通过本地脚本在监听屏幕大小的变化,随时做出样式响应的变化,所以是主动的。同一页面在不同大小设备可能呈现不一样的页面效果 自适应:不同大小设备呈现同样的页面效果,只是文字、图片等的大小不一样,但是相对位置一样。即在不同大小设备看起来一样 如图:   1.允许网页宽度自动调整 "自适应网页设计"到底是怎么做到的?其实并不难。 首先,在网页代码的头部,加入一行viewport元标签 <metaname="viewport"content="width=device-width,initial-scale=1"/>复制 viewport是网页默认的宽度和高

  • poj 1151 Atlantis(矩形面积并)

    题意:每组给出矩形左上角和右下角坐标,求矩形面积并; 思路:沿水平方向计算面积并;(切成水平条); #include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> usingnamespacestd; constintmaxn=500; structnode{ doublex; intl,r,t;//t为上下边标志 }f[maxn];//水平条 intn; doubleq[maxn],x1[maxn],yy1[maxn],x2[maxn],yy2[maxn]; //q存储排序后的x坐标 structsegment{ intmark;//并区间标志 doublelen;//并区间长度 }tree[maxn*20];//线段树 intcmp(nodea,nodeb){ returna.x<b.x; } intins(intk,intl,intr,intlc,intrc,intt){ if(lc<=l&a

  • 前端Js框架 UI框架汇总 特性 适用范围 选择

      身为一个资深后端工程师,面对层出不穷的前端框架,总让人眼花缭乱,做一个综合解析贴,从全局着眼,让我们明白各种前端框架的应用范围,为如何选择前端框架,从不同的维度提供一些线索,做为一个长期优化贴,欢迎指正留言讨论。(注:排名不分先后,好像也没有排名) ◆BootStrap1.02.03.0   分类:UI框架   适用范围:优化布局美化页面现成组件   使用方式:组件class   框架愿景:   组成:   特点:   说明:最早的前端框架,好像没有之一,笔者只用过它的组件(1.0)现在已经发展到4.0真的不知道现在是什么特性,所以按最初的印象,能用来美化页面优化布局使用一些现成组件 ◆LayUI   分类:UI框架   适用范围:优化布局美化页面现成组件   使用方式:组件class   框架愿景:源引官网我们都在有意或无意地追逐。而layui偏偏回望当初,奔赴在返璞归真的漫漫征途,自信并勇敢着,追寻于原生态的书写指令,试图以最简单的方式诠释高效。   组成:   特点:   说明:新出现的一个UI类框架,在Js框架大行其道UI框架越来越少的情况下,新出现做UI框架真的需要勇气,

  • 48-Command line is too long. Shorten command line for Test or also for

    Commandlineistoolong.ShortencommandlineforTestoralsoforApplicationdefaultconfiguration? 报错内容: Errorrunning'ServiceStarter':Commandlineistoolong.ShortencommandlineforServiceStarteroralsoforApplicationdefaultconfiguration. 解决办法: 修改项目下.idea\workspace.xml,找到标签,在标签里 写写代码。 blog文章中不懂的,可+v:keep4ing。 在线乐意解答。

  • PostgreSQL-join多表连接查询和子查询

    一、多表连接查询 1、连接方式概览 [inner]join 内连接:表A和表B以元组为单位做一个笛卡尔积,记为表C,然后在C中挑选出满足符合on语句后边的限制条件的内容。 left[outer]join 左外连接:在内连接的基础上,将A中有但C中没有的元组也加上。由于C的列数比A的行数多,所以这新增的元组左边照搬A,右边为null。 right[outer]join 右外连接:在内连接的基础上,将B中有但C中没有的元组也加上。由于C的列数比B的行数多,所以这新增的元组右边照搬B,左边为null。 full[outer]join 全外连接:相当于在内连接的基础上同时做左连接和右连接,表A和表B中的都要,两边不满足条件的都为null。   crossjoin 与上述内外连接可接连接条件不同,这一个本质是select*fromtableName1,tableName2这种无条件交叉连接的简写,如 select*fromtableName1crossjointableName2 仅是做笛卡尔积,表A的每一行都和表B的每一行相连接,没有条件,不可后接on,结果是两表行的乘积和列的和。

  • OpenStack介绍

    OpenStack起源 第一个提出计算机概念走向落地的厂商是亚马逊,因为当时的亚马逊有极大的计算力被浪费。 service,这种早期的“远程控制”方式是最早的一种云计算模式 当时,美国航天局和亚马逊合作才将OpenStack的初级形态构建完成 在2010年双方共同分开源OpenStack项目 云计算 概念 云计算管理的使网络资源,存储资源,服务器资源等物理硬件资源,可以使客户在任何时间,任意地点,通过网络获取所需要的资源或者服务,并且按需分配。 云计算 laas:基础设施服务:用户通过网络获取,虚拟机器,网络,然后用户根据自己的需求操作获取的资源 PaaS:平台即服务:将软件研发作为平台的一种服务,就是将下面的服务部署号,然后只需要跑你的代码就可以 SaaS:软件即服务:将软件作为一种服务通过网络提供给用户 OpenStack的优点 开放的构架:OpenStack的开放构架,额能够减少厂商锁定,减低风险 社区的力量:有全球的开发者的支持 与公有云互补:私有云与公有云混合为混合云 灵活可扩展:OpenStack一个高扩展性系统 架构图 各组逻辑关系图 OpenStack新建云主

  • 《java 核心技术一》第二章java程序设计环境

    java术语 术语名 缩写 解释 JavaDevelopmentKit JDK 编写程序的程序员使用的软件 JavaRuntimeEnviroment JRE 运行java程序的用户使用的软件 ServerJRE   在服务器上运行java程序的软件 StandardEdition   用于桌面或简单服务器应用的java平台 EnterprisedEdition   用于复杂服务器应用的java平台 MicroEdition   用于手机或其他小型设备的java平台 JavaFX   用于图形化用于界面的一个替代工具包,在Oracle的JavaSE发布版本中提供 OpenJDK   JavaSE一个免费的开源实现,不包含浏览器集成或JavaFX Java2   一个过时的术语,用于描述1998年~2006年之间的Java版本 SoftwareDevelopmentKit   一个过时的术语,用于描述1998年~2006年之间的JDK Update  

  • openresty

    drizzle 下载http://openresty.org/download/drizzle7-2011.07.21.tar.gz tarxzvfdrizzle7-2011.07.21.tar.gz cddrizzle7-2011.07.21/ ./configure--without-server makelibdrizzle-1.0 makeinstall-libdrizzle-1.0 openresty 下载https://openresty.org/download/openresty-1.13.6.2.tar.gz ./configure--with-cc-opt="-I/usr/local/opt/openssl/include/-I/usr/local/opt/pcre/include/"--with-ld-opt="-L/usr/local/opt/openssl/lib/-L/usr/local/opt/pcre/lib/"--with-http_drizzle_module--with-http_iconv_module--with-http_postgres_m

  • android之fragment

    觉得写得好:http://blog.csdn.net/shulianghan/article/details/38064191

相关推荐

推荐阅读