一直做单机版应用程序开发,这不客户都需要手机端的小程序嘛!眼看着客户要纷纷“掉粉”,急了!必须马上学起!起步的确有点难,好在掉了些头发(摸摸还好)突破了通路,高兴之余写下来,希望能够帮到大家(瞧瞧这大局观~~~哈哈)。
微信小程序的创建就不赘述了,只是打开微信开发者工具后,眼前黑乎乎的背景,脑子里一片片空白,该怎么搞啊!大家就不用着急了,还好有我经历过,从这里开始吧!
设想一个场景---你的客户需要通过微信小程序查询积分情况,简单的只需要输入会员卡号,点击查询就显示出积分额等信息。好了,有了需求流,程序流也就很快画出来了:

一、介绍四个小程序文件
js---逻辑层控制脚本文件,主要是它发送请求和接收数据,
json--- 用于此页面局部,配置并且覆盖全局app.json配置,
wxss---页面样式设置,相当于html的CSS配置文件,
wxml---渲染层,就是页面,相当于html
二、简单的页面设计

哈哈,UI不是特长,说明问题就好^~^
1、index.wxml代码
<!--index.wxml-->
<view class="container" style="width: 750rpx; height: 153rpx; display: flex; box-sizing: border-box">
<view class="title">加油站客户积分查询</view>
<view class="top_tip">I love “油”</view>
<cloud-tip-modal showUploadTipProps="{{showUploadTip}}"></
cloud-tip-modal>
</view>
<view>
<!-- 图片直接 -->
<image bindload='imgLoad' src="../../images/petrol.jpg" style="width: 756rpx; height: 306rpx; display: inline-block; box-sizing: border-box; left: -4rpx; top: 10rpx; position: relative"></image>
</view>
<navigator url="test.wxml" open-type="navigate" target="self" ><view class="top_tip">加油!我们一直在一起!
</view></navigator>
<form bindsubmit="formSubmit" >
<view class="section" style="width: 750rpx; height: 82rpx; display: block; box-sizing: border-box">
<input class="class_input" name="card_id" placeholder="请输入卡号" />
<button formType="submit" class="button" style="width: 168rpx; height: 46rpx; display: block; box-sizing: border-box; left: 114rpx; top: -96rpx; position: relative">提交</button>
</view>
<view class="btn-area">
<text class="my-name">{{Str_Custom}}</text>
</view>
</form>
注意:
(1)Form表单,需要绑定一个属性为bindsubmit事件,bindsubmit=”formSubmit” 这里的属性值formSubmit,命名可以为符合规范的任意值,相当于以前html中的 οnsubmit=”formSubmit()”,是一个函数名,当提交的时候触发formSubmit这个函数事件,这个函数写在js中。
(2)input控件一定要有name="card_id"属性,后端处理和以前一样,比如name="card_id" PHP用 $_POST[‘card_id']来接收。
(3)由于小程序没有input submit这个按钮,所以在每个form表单中都要有一个提交按钮,<button formType="submit">提交</button>,这个按钮就是用来开启提交事件的。
(4)在页面上设置一个<text>控件,将来用来返现数据查询结果。
<view class="btn-area">
<text class="my-name">{{Str_Custom}}</text>
</view>
其中:{{Str_Custom}}是渲染层的动态变量,通过改变这个变量,返回查询结果。
2、index.js代码
// index.js
const { envList } = require('../../envList.js');
const app = getApp()
Page({
//图片加载完成后执行的方法
imgLoad(image) {
console.log(image.detail.width);
},
data: {
Str_Custom:'查询结果',
defaultClass:'my-name',
backgroudColor:'#e4393c'
},
formSubmit: function (e) {
console.log(e.detail.value);
let that = this;
if (e.detail.value.card_id.length == 0 || e.detail.value.card_id.length >= 25) {
wx.showToast({
title: '卡号不能为空或过长!',
icon: 'loading',
duration: 1500
})
setTimeout(function () {
wx.hideToast()
}, 2000)
} else {
wx.request({
url: 'https://www.ygcomputer.cn/points/show_sql.php', //替换成你们的php后台程序
header: {
"Content-Type": "application/x-www-form-urlencoded"
},
method: "POST",
data: { card_id: e.detail.value.card_id },
success: function (res) {
console.log(res.data);
if (res.data.status == 0) {
wx.showToast({
title: '提交失败!!!',
icon: 'loading',
duration: 1500
})
} else {
that.setData({
Str_Custom: res.data.name + '积分余额[' + res.data.ye + ']' //显示姓名+余额
});
wx.showToast({
title: '提交成功!!!',//这里打印出登录成功
icon: 'success',
duration: 1000
})
}
}
})
}
}
})
要点:
(1)初始数据的赋值
data: {
Str_Custom:'查询结果',
...
},
通过data给渲染层Str_Custom变量赋值。
(2)函数 formSubmit解释
formSubmit: function (e) { ----e代表事件引起的本函数
console.log(e.detail.value); ----主控台显出,便于调试
let that = this; ---- 关键点,这里将page的保存至that容器中,此后this会改变
......
that.setData({ ---- 关键点,上面代表page的that在这里,通过setData改变Str_Custom值
Str_Custom: res.data.name + '积分余额[' + res.data.ye + ']'
});
3、index.wxss代码
/**index.wxss**/
page {
padding-top: 54rpx;
background-color: #e2dddd;
padding-bottom: 60rpx;
}
.title {
font-family: PingFang SC;
font-weight: 500;
color: #e04343;
font-size: 44rpx;
margin-bottom: 40rpx;
}
.top_tip {
font-size: 28rpx;
font-family: PingFang SC;
font-weight: 400;
color: #000000;
margin-bottom: 28rpx;
text-align: center;
}
.button {
width: 300rpx;
text-align: center;
margin: 5% auto 5% auto;
height: 70rpx;
color: white;
border-radius: 5rpx;
line-height: 10rpx;
background-color: #07c160;
text-align: center;
font-size: 30rpx;
}
.box>text:first-child {
color: #e4393c;
}
input:active {
border: 1px solid #ddd;
}
.class_input{
width: 150px;
text-align: center;
height: 70rpx;
color: rgb(0, 0, 0);
border-radius: 3px;
line-height: 70rpx;
background-color: #b5f7d4;
}
.box{
width: 400rpx;
height: 400rpx;
display: block;
background-color: antiquewhite;
}
.my-name {
height: 30px;
width: 168px;
text-align: center;
line-height: 30px;
color: rgb(83, 81, 81);
background-color: #b5f7d4;
}
.section{
text-align: center;
align-items:center;
}
一些class文件,为控件的样式,不重要。
三、后台PHP文件
我的数据库为sqlserver2016,php版本为4.2,后台php文件编写方法为(说明:php4.2以上版本MSSQL访问函数变化,不适用这个脚本):
<?php
//说明:测试的时候是连接的是远程的mssql数据库,没有在本机运行
//初始化mssql数据库连接,分别是 主机(ip:端口号默认1433), 用户名, 密码
//header("Content-Type: text/html;charset=utf-8");
header("Cache-Control: no-cache");
$card_id=$_POST['card_id']; //接收参数
$serverName = "XXXXXXXX";
$conn=mssql_connect( $serverName ,'userxxx','passwordxxx') or die("SQL SERVER 数据库连接失败!");
//选择数据库
mssql_select_db('points',$conn);
ini_set("date.timezone", "PRC");
//sql语句
$sql="SELECT id,name,shouji,ye FROM sell_user where id = '".$card_id."'";
$result= mssql_query( $sql );
$num = mssql_num_rows($result);
if($num){
while( $row = mssql_fetch_assoc( $result) ){
$row[name] = iconv("GB2312","UTF-8//IGNORE",$row[name]);
foreach ( $row as $key => $value ) {
$row[$key] = urlencode ( $value );
}
echo urldecode( json_encode($row ) );
}
}
//关闭连接
mssql_close($conn);
?>
重点:
(1)header("Cache-Control: no-cache"); 清理服务器缓存
(2)ini_set("date.timezone", "PRC"); 同步时区;
(3) $row[name] = iconv("GB2312","UTF-8//IGNORE",$row[name]); 注意json只接受utf-字符集,而mssl汉字为GBk类型,因此必须在这里首先将汉字编码转变为UTF-8类型;(独立知识产权哦,老费劲了!)
(4)foreach ( $row as $key => $value ) { ----- 遍历字符
$row[$key] = urlencode ( $value ); ------ 转换为16进制,为 json_encode函数转换
}
echo urldecode( json_encode($row ) );------ json_encode函数后,再将字符由16进制转换为正常
四、运行结果

哈哈,大功告成,整个流程跑通,剩下就是细节了,如果要求低一些,这也是一个商用小程序哦~(不知道能不能通过微信审核~哈哈)。
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_
我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit