用uni-app和springboot做出的高效记忆小程序,技术点总结

临时起意

老早前就听说过一些高效记忆的方法,其中听的最多的就是艾宾浩斯记忆法和费曼学习法。

恰好赶上过年放假,就在想除了吃吃吃之外,还能干点什么。

本来想学习理财的知识,一看概念还真不少,什么市盈率,市净率,ROI,XXX。

怎么学的牢固点不容易忘呢?一搜高效学习的方法,这俩货又出来了,那干脆把他们结合起来做个小程序好了。

产品概念

作为一个和产品经理斗争多年的老后端,终于有一天要考虑产品怎么呈现了,有种苍天饶过谁的感觉。。

记得之前吐槽产品最多的话就是:产品逻辑这么复杂,我都理解不了,让用户怎么用。

本着这个原则,做出来的东西就是要简单,简单,再简单。看一眼就知道怎么用。

所以这个程序本质上就三个点:

  • 内容输入
  • 艾宾浩斯曲线复习。共有8个阶段,根据笔记创建时间判断是否需要复习。
  • 费曼学习法-讲出来
introduce.png

开发框架

最终选择的开发组合是uni-app + springboot。

后端服务就是用自己最熟悉的springboot,同时使用一个非常好用的微信开发包:weixin-java-miniapp

在小程序端的框架选择上是费了点时间。由于之前有过一些vue的基础,就想着最好还是用vue来做,那么小程序的vue框架就有个mp-vue。

但是这时的想法是,万一之后用户多了,是不是可以搞出ios和android的app呢(梦想是要有的,万一实现了呢)。起码PC页面还是要做一个的。

基于这些考虑,就需要一个基于vue开发的多端代码生成框架,最终选择了uni-app。

uni-app

uni-app官方提供了一个编辑器HBuilderX,但是对于新学一个编辑器感觉没有必要,使用vscode开发也是可以的。

这里通过@vue/cli来创建环境,搭建只需要两条命令。

  • 创建代码库:vue create -p dcloudio/uni-preset-vue my-project
  • 生成微信小程序代码:npm run dev:mp-weixin

之后使用微信小程序官方开发工具,打开uni-app生成的代码目录就可以了,dev命令是实时监听修改的,开发体验还不错,上图。

work-screen.png

登录

通过uni-app的统一登录接口,可以获取到微信小程序中的openid等信息,这里发送到后端,用来创建系统用户。

后端创建或登录成功后返回一个token,将token缓存到手机中,在之后的每次请求中发送给后端。

login() {
    var that = this;
    uni.login({
        provider: 'weixin',
        success: function (res) {
            // 获取用户信息
            uni.getUserInfo({
                provider: 'weixin',
                success: function (infoRes) {
                    that.$request({
                        header: {
                            'X-WX-Code': res.code,
                            'X-WX-Encrypted-Data': infoRes.encryptedData,
                            'X-WX-IV': infoRes.iv,
                        },
                        url: "/user/wx/login",
                    }).then(res => {
                        uni.setStorageSync("mkey", res.data.mkey)
                        //保存用户信息
                        uni.setStorageSync('userInfo', res.data.mainUser);
                        that.$goto('/pages/home/home')
                    })
                }
            });
        }
    });
}

封装request函数实现加载中效果

小程序中请求api会有等待的时间,要在每次请求时加一个等待请求的页面提示,通过封装底层的request,统一加等待效果。

export default (params) => {
    //判断用户登录状态
    var mkey = uni.getStorageSync('mkey')
    //加载中页面
    uni.showLoading({
        title: '加载中',
        mask: true
    })
    var loginHeader = {
        'X-MKEY': mkey
    };

    var header = params.header == undefined ? loginHeader : params.header
    return new Promise((resolve, reject) => {
        uni.request({
            header: header,
            success: ({ data, statusCode, header }) => {
                resolve(data)
            },
            fail: (error) => {
                reject(error)
            },
            complete: () => {
                //关闭加载中
                uni.hideLoading()
            },
            ...params,
            url
        })
    })
}

文件上传与存储

编辑器中可以通过启用相机或相册,添加图片,需要将图片保存起来。

这里使用腾讯云的cos保存图片信息,需要在后端生成cos的带有鉴权信息的上传连接,返回给小程序。

然后通过链接直接上传图片到cos,不再通过后端,节省服务器资源。

上传成功后,会返回图片的url,这里要注意url是在返回的header里面。

useCamera() {
    var that = this;
    uni.chooseImage({
        count: 1, //最多可选图片张数
        success: async function (res) {
            //图片路径
            var filePath = res.tempFilePaths[0];
            //获取腾讯云COS预签名url
            var urlData = await that.request({
                url: "/resource/cosurl"
            });
            that.preUrl = urlData.data.preUrl;
            //获取图片信息
            var fileInfo = await uni.getImageInfo({
                src: filePath
            })
            //上传图片
            uni.uploadFile({
                url: that.preUrl,
                filePath: filePath,
                name: "file",
                formData: {
                    "key": urlData.data.key + "." + fileInfo[1].type
                },
                success: (res) => {
                    that.imgUrl = res.header.Location
                }
            });
        }
    });
}

没域名没证书怎么提供后端服务?

微信小程序中,要求调用后端接口只能使用https,这意味着要购买并备案一个域名,并且要搞到证书才可以提供后端服务。

不过现在,腾讯提供了一个云开发的服务,可以在小程序中使用。

云开发提供了完整的云函数和云数据库的支持,完全可以满足后端服务的需求。但是看了下文档后,发现代码编写和云数据库操作与我之前常用的springboot+mysql+redis开发体系差距较大,学习成本比较高。

但是云函数中调用外部接口却没有https的限制,这就是说完全可以把云函数当成一个网关来使用,通过云函数来调用后端服务。并且云开发现在提供免费额度。

yunfunc.png

云开发的使用步骤

  • 注册小程序开发账号后,在开发工具上点击云开发。
yunfunc-1.png
  • 之后会选择使用哪种方式,直接选择预付费,会提供免费使用的额度。
  • 开通后,在开发工具中,创建时选择云开发,也可以在小程序代码同级目录下,新建一个云函数目录。


    yunfunc-3.png
yunfunc-2.png
  • 之后在云函数目录中,新建一个云函数:httpApi,写好代码后,直接右键点击就可以上传云函数。
yunfunc-4.png
  • 云函数只实现一个通用的http请求转发功能,将请求代理到实际的服务器上。代码实现如下:
// 云函数入口文件
const cloud = require('wx-server-sdk')
// 这里使用了request-promise
var rp = require('request-promise');
cloud.init()
// 实际服务的ip地址,可以直接用ip端口
var host = "http://xxx.xxx.xxx.xx:8990";
// 云函数入口函数
exports.main = async (event, context) => {
  var options = {
    url: host + event.url,
    method: event.method,
    json: true,
    headers: event.header
  }
  // 判断请求类型
  if (event.method != 'post') {
    options.qs = event.data
  } else {
    options.body = event.data
  }
  var res = await rp(options)
    .then(function (res) {
      return res
    })
    .catch(function (err) {
      return err
    });

  return res;
}

小程序代码的改造

小程序中,之前的https请求,需要替换为云函数请求。之前已经把请求封装到了request方法中,直接对request方法内部改造就可以。

  • 首先在main.js中声明要使用云函数,加入下面的代码。
wx.cloud.init({
    // 此处请填入环境 ID, 环境 ID 可打开云控制台查看
    env: '你的环境id',
    traceUser: true,
})
  • 修改request为使用云函数
export default (params) => {
    //判断用户登录状态
    var mkey = uni.getStorageSync('mkey')
    //加载中页面
    uni.showLoading({
        title: '加载中',
        mask: true
    })
    var loginHeader = {
        'X-MKEY': mkey
    };

    var header = params.header == undefined ? loginHeader : params.header
    return new Promise((resolve, reject) => {
        //使用云函数
        wx.cloud.callFunction({
            name: 'httpApi',
            data: {
                url: params.url,
                header: header,
                data: params.data,
                method: params.method
            },
            success: function (res) {
                uni.hideLoading();
                var data = res.result
                resolve(data)
            },
            fail: (err) => {
                console.log("err", err)
                uni.hideLoading();
            }
        })
    })
}

这样就可以把之前对后端服务的请求,通过云函数代理后,发送给服务器,直接省了域名。通过这篇文章希望可以帮助想要开发小程序的同学少走些弯路。

微信中搜索:记忆笔记。或关注公众号:技术Fun。就可以找到这个小程序,欢迎试用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355

推荐阅读更多精彩内容