使用 WebApi 交互打造原生的微信小程序 - 图灵小书架

目录

  • 介绍
  • 源码地址
  • 扫一扫体验
  • 代码分析
  • 其它相关信息(互联网搜集)

介绍

  定时抓取图灵社区官网的首页、最热、推荐和最新等栏目的相关图书信息进行展示,并且可以下载相关的 PDF 进行查阅...

主要功能

源码地址

  源码地址1:https://github.com/liqingwen2015/ituring_small_bookshelf

  源码地址2:https://gitee.com/liqingwen/ituring_small_bookshelf

  使用说明:

  1. 打开微信开发者工具;
  2. 路径引入 src 文件夹;
  3. 输入 APPID 和文件名即可;
  4. 本地不需要配置服务器地址,自动连接我的 WebAPI 接口资源,低成本配置;

  不过使用  git,我有一个这样的担忧:用了5年GIT,原来分支合并是这样协作的。假设团队3个人。 领导开创一个分支。 我和另外一个同事在领导的分支下创建一个新分支。 然后 我们各自开发。 有新功能就 去拉取 并将领导的分支合并到自己的分支。 这样,我改的东西,和同事改的不会冲突。最后,GIT 导出我们的差异,通过 QQ 传给领导。

-- 引用 https://my.oschina.net/lcsoft/tweet/17666900

扫一扫体验

  可以通过小程序(已上线)二维码扫一扫,也可以在小程序中搜一下【图灵小书架】进行体验:

  它真的非常小(轻量、快、占用内存小),接近 10 个页面所占用的空间大小(代码+图片等)才100KB+。

代码分析

结构简析

  config 文件夹(可选):存放配置信息;

  images 文件夹(可选):存放图片;

  pages 文件夹:存放每个页面信息;

  utils 文件夹(可选):工具类存放;

  app.js:项目的入口文件,如包含程序生命周期定义(页面初始化、页面渲染完成、页面显示、页面隐藏和页面关闭等);

  app.json:全局配置文件,如页面路径, tabBar(导航、图标和选中样式等);

  app.wxss:全局样式配置文件,如每个页面可以重用的样式;

  project.config.json:程序的配置文件,如项目名称、微信开发工具配置(是否校验合法域名、是否压缩和样式自动补全等);

  为了方便统一管理 api 请求的地址,我统一在 config/config.js 中配置 api 的请求地址:

const key = require('const.js');

// 服务器域名
const baseUrl = key.urlPrefix.server;
//const baseUrl = key.urlPrefix.local; //获取首页的图书
const getBooksOfIndex = baseUrl + 'books/v1/index'; //获取图书列表
const getBooksByShowType = baseUrl + 'books/v1/list'; //获取图书
const getBook = baseUrl + 'books/v1/detail'; const saveUserInfo = baseUrl + 'account/v1/save'; const submitComment = baseUrl + 'comment/v1/submit'; const getComments = baseUrl + 'comment/v1/list'; module.exports = {
getBooksOfIndex: getBooksOfIndex,
getBooksByShowType: getBooksByShowType,
getBook: getBook,
saveUserInfo: saveUserInfo,
submitComment: submitComment,
getComments: getComments
};

  同时,也把一些静态 const 变量统一存放在 config/const.js 中,方便管理和维护:

// Key 名
module.exports = {
// 用户标识
wxUserId: 'WxUserId', // 登录标识
loginFlag: 'LoginFlag', // 图标
icon: {
success: 'success',
loading: 'loading',
none: 'none'
}, // url 前缀
urlPrefix: {
server: 'https://api.nidie.com.cn/api/', //服务器
local: 'http://localhost:57196/api/', //本地
test: 'http://localhost:57196/api/', //测试
file: 'https://download.nidie.com.cn/', //文件
image: 'http://www.ituring.com.cn/' //图片
}
};

Pages 文件夹简析

  这里通过 detail (图书详情页)文件夹进行解析,从图中可以看到的文件夹中包含:

  1. .json 后缀的 JSON 配置文件
  2. .wxml 后缀的 WXML 模板文件
  3. .wxss 后缀的 WXSS 样式文件
  4. .js 后缀的 JS 脚本逻辑文件

  detail.wxml:

<view>
<block wx:if="{{showLoading}}">
<view class="donut-container">
<view class="donut"></view>
</view>
</block>
<block wx:else>
<view class="book-container bg-white">
<view class="book-info">
<image class="book-image" mode="scaleToFill" src="{{book.imageUrl}}"></image>
<view class="book-desc">
<text class="book-main-text">{{book.name}}</text>
<text class="book-text">{{book.author}}</text>
<text class="book-text">¥ {{book.price}} 元</text>
<view class="loading-container" wx:if="{{downloading}}">
<progress percent="{{downloadPercent}}" stroke-width="6" activeColor="#1aad19" backgroundColor="#cdcdcd" show-info />
</view>
</view>
</view>
</view>
<view class="comment-container">
<view class="comment-title">
<text>========== 简介 ==========</text>
</view>
<view class="comment-area">
<block>
<view class="comment-placeholder">
<text>{{book.intro}}</text>
</view>
</block>
</view>
</view>
<!-- bottom button -->
<view class="fixed-bottom block-full-width flex-container bg-white" wx:if="{{isAllowDownload}}">
<button class="full-button" type="primary" catchtap="download" data-id="{{bookInfo.id}}" data-name="{{bookInfo.name}}">
随书下载<text style="font-size:26rpx; color:gray">(已存在,则立即打开)</text>
</button>
</view>
</block> </view>

  该文件非常像我们所学过的 html 结构,只不过标签替换为了小程序自己包装的语义标签而已。

  detail.js

// 获取服务器接口地址
const api = require('../../config/config.js');
const key = require('../../config/const.js');
const http = require('../../utils/http.js');
const file = require('../../utils/file.js');
const cache = require('../../utils/cache.js');
const tip = require('../../utils/tip.js'); Page({
data: {
bookIsBuy: 0,
downloading: false,
book: {},
id: '',
showLoading: true,
isAllowDownload: false, //是否允许下载
isDownloading: false //下载中标识
}, // 获取书籍
getBook: function (id) {
let that = this;
let key = `Book_${id}`;
let val = cache.getSync(key);
let obj = {
showLoading: false
}; if (val) {
if (val.pdfUrl && val.pdfUrl.trim() !== '') {
obj.isAllowDownload = true;
} obj.book = val;
that.setData(obj);
return;
} http.get(api.getBook + `/${id}`, function (data) {
if (data.pdfUrl && data.pdfUrl.trim() !== '') {
obj.isAllowDownload = true;
} obj.book = data;
that.setData(obj); cache.set(key, data);
});
}, // 下载
download: function () {
let that = this; if (that.data.isDownloading) {
tip.showToast('下载中,请稍安勿躁!!!');
return;
} let cachekey = `Book_PDF_${that.data.id}`;
let path = cache.getSync(cachekey); if (!path) {
that.setData({
isDownloading: true
}); let pdfUrl = that.data.book.pdfUrl.split(','); http.downloadFile(key.urlPrefix.file + pdfUrl[0],
function (filePath) {
file.openDocument(filePath);
cache.set(cachekey, filePath);
},
function () {
that.setData({
isDownloading: false
});
}); tip.showToast('已经开始下载,下载完毕后将自动打开,请稍后!!!');
return;
} file.openDocument(path);
}, /**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
let that = this;
let id = options.id; that.getBook(id);
that.setData({
id: id
});
},
});

  里面的语法类似 VUE,WXML 中的动态数据均来自对应 Page 的 data,因为我把很多自己封装的方法单独放到 utils 文件夹和 config 文件夹中,在希望调用对应的方法时需要使用 require 函数将其引入,小程序有许多丰富的 API,代码中就使用了如下载、请求 json 数组、提示弹出框和 localStorage 缓存等 API(含同步、异步)。

  detail.json

{
"navigationBarTitleText": "详情页"
}

  这里只是对应导航头文字进行了修改而已。

  detail.wxss 样式文件,并没有太多可以说的,按照自己的 css 样式进行编写就好了。

其它相关信息(互联网搜集)

  PC 的 IDE、苹果 IOS 和安卓 Android,它们的运行环境是存在差异,意味着不是所有提供的 API 都可以完全兼容。

  见 https://developers.weixin.qq.com/miniprogram/dev/devtools/details.html#运行环境差异

小程序 - MINA 框架

  微信团队为小程序提供的框架命名为MINA应用框架。MINA框架通过封装微信客户端提供的文件系统、网络通信、任务管理、数据安全等基础功能,对上层提供一整套JavaScript API,让开发者能够非常方便地使用微信客户端提供的各种基础功能与能力,快速构建一个应用。

小程序 - 启动运行机制

小程序 - 生命周期

玩玩小程序:使用 WebApi 交互打造原生的微信小程序 - 图灵小书架的更多相关文章

  1. 打造一款 刷Java 知识的小程序(二)

    学习Java的神器已上线,面向广大Java爱好者! 之前写的一篇:打造一款 刷Java 知识的小程序(一) 一.第二版做了什么? 第一版小程序只具有初级展示功能,知识点都是hardcode在代码里面的 ...

  2. 微信小程序:JS 交互逻辑

    微信小程序:JS 交互逻辑 一.JS 交互逻辑 一个服务仅仅只有界面展示是不够的,还需要和用户做交互:响应用户的点击.获取用户的位置等等.在小程序里边,我们就通过编写 JS 脚本文件来处理用户的操作. ...

  3. 鸿蒙的远程交互组件应用及微信小程序的远程交互组件应用

    注:鸿蒙的远程交互组件应用相对复杂 ,访问网络时,首先要配置网络权限,华为官方文档有问题,在此引用我老师配置的模板,见附件 过程:1.导入鸿蒙的网络请求模块fetch 2.发起对服务器的请求(在这过程 ...

  4. 【ASP.NET程序员福利】打造一款人见人爱的ORM(一)

          “很多人都不太认可以第三方ORM,因为考虑的点不够全面,没有大用户群体的ORM有保证,这点是不可否认确是事实.但是往往用户群体大的ORM又有不足之处,今天我们就来聊聊关于ORM的话题,打造 ...

  5. 从微信小程序开发者工具源码看实现原理(一)- - 小程序架构设计

    使用微信小程序开发已经很长时间了,对小程序开发已经相当熟练了:但是作为一名对技术有追求的前端开发,仅仅熟练掌握小程序的开发感觉还是不够的,我们应该更进一步的去理解其背后实现的原理以及对应的考量,这可能 ...

  6. 程序员的又一春,微信小程序带来的一个赚钱机遇

    微信小程序可能是原生的机遇,在程序员面对微信小程序的恐惧中说其实也是我们程序员创业的春天或者挣外快的一个机遇. 为什么这么说呢?且听我慢慢给你分析 成本角度 你想想,会ios开发的可能只会ios,会安 ...

  7. 微信公众号支付|微信H5支付|微信扫码支付|小程序支付|APP微信支付解决方案总结

    最近负责的一些项目开发,都用到了微信支付(微信公众号支付.微信H5支付.微信扫码支付.APP微信支付).在开发的过程中,在调试支付的过程中,或多或少都遇到了一些问题,今天总结下,分享,留存. 先说注意 ...

  8. PHP:微信小程序调用【统一下单】【微信支付】【支付回调】API;XML转Array,Array转XML方法(通用)

    1.微信公众号.微信小程序开发过程中,第三方服务器与微信服务器数据交互,需要进行数据转换,必须用到这两个函数: 分别是xml_to_array.array_to_xml ; /** * 输出xml字符 ...

  9. 微信小程序学习笔记(一)--创建微信小程序

    一.创建小程序 1.申请帐号.安装及创建小程序,请参照官方文档里面的操作 https://developers.weixin.qq.com/miniprogram/dev/. 小程序在创建的时候会要求 ...

随机推荐

  1. react VS vue 我们究竟该如何选择(从项目的角度帮你分析)

    一.序言 现在web开发最火的两个框架,react和vue.听起来就感觉很牛逼的样子.确实,不得不服,创造出这2种框架的人真的是牛逼.不过更牛逼的是为这2中框架不断完善的人.一个优秀的idea,会在很 ...

  2. Java调用Javascript、Python算法总结

    最近项目中经常需要将Javascript或者Python中的算法发布为服务,而发布Tomcat服务则需要在Java中调用这些算法,因此就不免要进行跨语言调用,即在Java程序中调用这些算法. 不管是调 ...

  3. 简单又实用的分享!SharePoint母版页引用(实战)

    分享人:广州华软 极简 一. 前言 此SharePoint 版本为2013,请注意版本号.此文以图文形式,描述了根网站及子网站引用母版页,需要注意的点已用图文形式以标明. 本文适用于初学者. 二. 目 ...

  4. 钉钉开发获取APPKEY, APPSECRET, CorpId和SSOSecret

    首先用自己的钉钉账号注册一个企业: https://oa.dingtalk.com/index.htm 一.获取应用APPKEY及APPSECRET方法: 1.登录钉钉开放平台创建应用: https: ...

  5. BF-9000 BMC任务关键型应急通信系统

    一.系统简介 BF-9000 BMC任务关键型应急通信系统,凝聚北峰通信近30年专网通信与应急通信研发的经验,并结合用户实际需求和应用场景所打造. 整体设计思路是采用骨干网.前指网.分队战斗网三层组网 ...

  6. 深入学习Redis(5):集群

    前言 在前面的文章中,已经介绍了Redis的几种高可用技术:持久化.主从复制和哨兵,但这些方案仍有不足,其中最主要的问题是存储能力受单机限制,以及无法实现写操作的负载均衡. Redis集群解决了上述问 ...

  7. java游戏开发杂谈 - 线程

    线程,让游戏拥有了动态变化的能力. java的图形界面,在启动的时候,就开始了一个线程. 这个线程负责处理:JFrame.JPanel等的绘制.事件处理. 它是由操作系统调用的,在程序启动时开启,程序 ...

  8. C#读写Excel的几种方法

    1 使用Office自带的库 前提是本机须安装office才能运行,且不同的office版本之间可能会有兼容问题,从Nuget下载 Microsoft.Office.Interop.Excel 读写代 ...

  9. Unity_新手必懂知识点

    翻车了!!!一个小例子带你了解闭包.事故现场:场景:6个button,上方1个text.点击button,text会显示button上的数字.代码如下: //在unity里面赋值public List ...

  10. SSM+Maven+MySQL实现简易的挂机修仙页游

    一段时间没有写过SSM的项目了,最近重新整合框架做了一个小Demo 学Java的萌新可以看一看:大佬呢,欢迎指出不足! 我一直钟爱挂机类游戏,同时也喜欢修仙和武侠小说,于是突发奇想,自己搞一个小游戏? ...