• 基于微信小程序云开(统计学生信息并导出excel)


    前言
    随着移动端的不断发展,人们大部分的办公及生活应用都开始趋向于移动端。然而在2017年“微信之父”张小龙带领团队,开发了一款叫做微信小程序的东西,它的出现打破了人们认识移动端的隔膜,由以前的需要先下载app然后在开始工作的老式模式,逐渐的趋向于小程序app(无需下载)的形式。

    一、微信小程序是什么?
    微信小程序是一种不需要下载安装即可使用的应用,它实现了应用的随开随用,用户只需要用微信扫一扫或者通过微信搜一下即可打开应用,使用完即可关闭,还可以把小程序添加到桌面,真正的做到了便捷方便,用完就走。

    二、什么是微信小程序的云开发
    云开发为开发者提供完整的云端支持,弱化了后端和运维概念,无需搭建服务器,使用平台提供的 API 进行核心业务开发,即可实现快速上线和迭代,同时这一能力,同开发者已经使用的云服务相互兼容,并不互斥。

    从开发流程来看,以往开发一个微信小程序需要经过产品功能构思、模块划分、原型设计、UI 设计、前端开发、后端开发、接口联调、测试上线等开发阶段。有了「小程序·云开发」后,前端工程师将可以独立实现前端开发、后端开发、接口联调工作,且无需太多后端知识。

    一、首先我们要创建一个云环境(用来开云数据库,云储存等)

    这里我开了一个名叫xinwen的云环境(至于名字是因为我把前面写新闻共享平台的云数据库和这个程序的云数据库放到一个环境中了,所以懒得起名字,直接拿来用了)

    创建好云环境之后我们要创建云数据库

    这里我创建了一个users云数据库来作为接收页面传递的数据并将其保存。

    好!接下来可是部署我们的云函数:

    这里我部署了一个名字为:stuexcel的云函数,作为操作云数据库以及云储存的方式。

     云函数(stuexcel):

    注意:env代表你的app的环境变量,在你的程序的app.js的env中!

    1. const cloud = require('wx-server-sdk')
    2. cloud.init({
    3. env:'xxx'//xxx表示你的app.js里的env注册号
    4. })
    5. const xlsx = require('node-xlsx') //导入Excel类库
    6. const db = cloud.database() //声明数据库对象
    7. const _ = db.command
    8. exports.main = async (event, context) => { //主函数入口
    9. try {
    10. let schoolBusInfo = await db.collection('users').where({}).get() //将获取到的数据对象赋值给变量,接下来需要用该对象向Excel表中添加数据
    11. // return schoolBusInfo.data[0].banji
    12. // let schoolBusInfo = event.clssdata;
    13. // console.log(schoolBusInfo);
    14. let dataCVS = `schoolBusInfo-${Math.floor(Math.random()*1000000000)}.xlsx`
    15. //声明一个Excel表,表的名字用随机数产生
    16. let alldata = [];
    17. let row = ['姓名', '班级','学号','出生年月','联系方式','通信地址','父亲姓名','父亲工作单位','父亲联系方式','母亲姓名','母亲工作单位','母亲联系方式','高考成绩','个人目标','特殊说明']; //表格的属性,也就是表头说明对象
    18. alldata.push(row); //将此行数据添加到一个向表格中存数据的数组中
    19. //接下来是通过循环将数据存到向表格中存数据的数组中
    20. for (let key = 0; keydata.length; key++) {
    21. let arr = [];
    22. arr.push(schoolBusInfo.data[key].xingming);
    23. arr.push(schoolBusInfo.data[key].banji);
    24. arr.push(schoolBusInfo.data[key].xuehao);
    25. arr.push(schoolBusInfo.data[key].chushengnianyue);
    26. arr.push(schoolBusInfo.data[key].lianxifangshi);
    27. arr.push(schoolBusInfo.data[key].tongxindizhi);
    28. arr.push(schoolBusInfo.data[key].fuqinxingming);
    29. arr.push(schoolBusInfo.data[key].gongzuodanwei_fuqin);
    30. arr.push(schoolBusInfo.data[key].lianxifangshi_fuqin);
    31. arr.push(schoolBusInfo.data[key].muqinxingming);
    32. arr.push(schoolBusInfo.data[key].gongzuodanwei_muqin);
    33. arr.push(schoolBusInfo.data[key].lianxifangshi_muqin);
    34. arr.push(schoolBusInfo.data[key].gaokaochengji);
    35. arr.push(schoolBusInfo.data[key].gerenmubiao);
    36. arr.push(schoolBusInfo.data[key].teshushuoming);
    37. alldata.push(arr)
    38. }
    39. var buffer = xlsx.build([{
    40. name: "mySheetName",
    41. data: alldata
    42. }]);
    43. // return alldata
    44. //将表格存入到存储库中并返回文件ID
    45. return await cloud.uploadFile({
    46. cloudPath: dataCVS,
    47. fileContent: buffer, //excel二进制文件
    48. })
    49. } catch (error) {
    50. console.error(error)
    51. }
    52. }

     好!云函数创建并部署后,我们开始创建页面:

    我们先来构思一下,需要:

    1.用户填写页面一个

    2.需要用户填写表后提交之后,点击可在excel表中的信息,所以需要查看页面一个

    3.需要表明该产品的作者以及出处,并写明联系方式方便测试bug后的运维情况,也需要页面一个

    好!构思就需要这些!我们只是简单的做一个学生信息的填入及生成excel表并提供给用户网站查看信息的系统,并不需很复杂的东西,只不过需要借用云函数来控制操作一下云数据库,以及需要暂时用户点击提交时,暂时存在储存的云储存里面的excel网址,即可!

    上代码!!!

    首先我把三个页面的tabbar按钮命名为:首页(shouye),浏览(liulan),作者(lianxizuozhe) 

     

    liulan.wxml:

    1. <view class="dabox">
    2. <view class="xiaobox">
    3. <text>1.本人基本信息text>
    4. <text>姓名:text>
    5. <view><input
    6. class="input"
    7. name="xingming"
    8. bindinput ="xingmingInput">input>view>
    9. <text>班级:text>
    10. <view><input class="input"
    11. name="banji"
    12. bindinput ="banjiInput">input>view>
    13. <text>学号:text>
    14. <view><input class="input"
    15. name="xuehao"
    16. bindinput ="xuehaoInput">input>view>
    17. <text>出生年月:text>
    18. <view><input class="input"
    19. name="chushengnianyue"
    20. bindinput ="chushengnianyueInput">input>view>
    21. <text>联系方式:text>
    22. <view><input class="input"
    23. name="lianxifangshi"
    24. bindinput ="lianxifangshiInput">input>view>
    25. <text>通信地址:text>
    26. <view><input class="input"
    27. name="tongxindizhi"
    28. bindinput ="tongxindizhiInput">input>view>
    29. view>
    30. view>
    31. <view class="jiange">view>
    32. <view class="dabox">
    33. <view class="xiaobox">
    34. <text>2.联系人1-父亲信息text>
    35. <text>父亲姓名:text>
    36. <view><input class="input"
    37. name="fuqinxingming"
    38. bindinput ="fuqinxingmingInput">input>view>
    39. <text>工作单位:text>
    40. <view><input class="input"
    41. name="gongzuodanwei_fuqin"
    42. bindinput ="gongzuodanwei_fuqinInput">input>view>
    43. <text>联系方式:text>
    44. <view><input class="input"
    45. name="lianxifangshi_fuqin"
    46. bindinput ="lianxifangshi_fuqinInput">input>view>
    47. view>
    48. view>
    49. <view class="jiange">view>
    50. <view class="dabox">
    51. <view class="xiaobox">
    52. <text>3.联系人2-父亲信息text>
    53. <text>母亲姓名:text>
    54. <view><input class="input"
    55. name="muqinxingming"
    56. bindinput ="muqinxingmingInput">input>view>
    57. <text>工作单位:text>
    58. <view><input class="input"
    59. name="gongzuodanwei_muqin"
    60. bindinput ="gongzuodanwei_muqinInput">input>view>
    61. <text>联系方式:text>
    62. <view><input class="input"
    63. name="lianxifangshi_muqin"
    64. bindinput ="lianxifangshi_muqinInput">input>view>
    65. view>
    66. view>
    67. <view class="jiange">view>
    68. <view class="dabox">
    69. <view class="xiaobox">
    70. <text>4.其他信息text>
    71. <text>高考成绩:text>
    72. <view><input class="input"
    73. name="gongkaochengji"
    74. bindinput ="gaokaochengjiInput">input>view>
    75. <text>个人目标:text>
    76. <view><input class="input"
    77. name="gerenmubiao"
    78. bindinput ="gerenmubiaoInput">input>view>
    79. <text>特殊说明:text>
    80. <view><input class="input"
    81. name="teshushuoming"
    82. bindinput ="teshushuomingInput">input>view>
    83. view>
    84. view>
    85. <view class="jiange">view>
    86. <view>
    87. <button type="primary" bindtap="addData">提交button>
    88. view>
    89. <view class="jiange">view>

    shouye.wxss:

    1. text{
    2. padding-top:20rpx;
    3. padding-bottom: 20rpx ;
    4. }
    5. input{
    6. width: 660rpx;
    7. height: 70rpx;
    8. border: 2rpx gray solid;
    9. }
    10. .dabox{
    11. width: 100%;
    12. display: flex;
    13. flex-direction: row;
    14. justify-content: space-around;
    15. }
    16. .xiaobox{
    17. width: 660rpx;
    18. display: flex;
    19. flex-direction: column;
    20. }
    21. .jiange{
    22. margin: 30rpx 0 30rpx 0;
    23. background-color: rgb(240, 219, 241);
    24. width: 100%;
    25. height: 20rpx;
    26. }

    shouye.js:

    1. // pages/timu/timu.js
    2. const db = wx.cloud.database()
    3. var xingming = ""
    4. var banji = ""
    5. var xuehao = ""
    6. var chushengnianyue = ""
    7. var lianxifangshi = ""
    8. var tongxindizhi = ""
    9. var fuqinxingming = ""
    10. var gongzuodanwei_fuqin = ""
    11. var lianxifangshi_fuqin = ""
    12. var muqinxingming = ""
    13. var gongzuodanwei_muqin = ""
    14. var lianxifangshi_muqin = ""
    15. var gaokaochengji=""
    16. var gerenmubiao=""
    17. var teshushuoming=""
    18. Page({
    19. data: {
    20. xingming: '',
    21. banji:'',
    22. xuehao:'',
    23. chushengnianyue:'',
    24. lianxifangshi:'',
    25. tongxindizhi:'',
    26. fuqinxingming:'',
    27. gongzuodanwei_fuqin:'',
    28. lianxifangshi_fuqin:'',
    29. muqinxingming:'',
    30. gongzuodanwei_muqin:'',
    31. lianxifangshi_muqin:'',
    32. gaokaochengji:'',
    33. gerenmubiao:'',
    34. teshushuoming:'',
    35. tempFileURL:'',//保存要导出的cvs文件云端路径
    36. },
    37. //获取用户输入的姓名
    38. xingmingInput:function(e){
    39. xingming= e.detail.value
    40. },
    41. // 获取用户输入的班级
    42. banjiInput:function(e){
    43. banji = e.detail.value
    44. },
    45. // 获取用户输入的学号
    46. xuehaoInput:function(e){
    47. xuehao= e.detail.value
    48. },
    49. // 获取用户输入的出生年月
    50. chushengnianyueInput:function(e){
    51. chushengnianyue= e.detail.value
    52. },
    53. // 获取用户输入的联系方式
    54. lianxifangshiInput:function(e){
    55. lianxifangshi= e.detail.value
    56. },
    57. // 获取用户输入的通信地址
    58. tongxindizhiInput:function(e){
    59. tongxindizhi= e.detail.value
    60. },
    61. // 获取用户输入的父亲姓名
    62. fuqinxingmingInput:function(e){
    63. fuqinxingming= e.detail.value
    64. },
    65. // 获取用户输入的父亲工作单位
    66. gongzuodanwei_fuqinInput:function(e){
    67. gongzuodanwei_fuqin= e.detail.value
    68. },
    69. // 获取用户输入的父亲联系方式
    70. lianxifangshi_fuqinInput:function(e){
    71. lianxifangshi_fuqin= e.detail.value
    72. },
    73. // 获取用户输入的母亲姓名
    74. muqinxingmingInput:function(e){
    75. muqinxingming= e.detail.value
    76. },
    77. // 获取用户输入的母亲工作单位
    78. gongzuodanwei_muqinInput:function(e){
    79. gongzuodanwei_muqin= e.detail.value
    80. },
    81. // 获取用户输入的母亲联系方式
    82. lianxifangshi_muqinInput:function(e){
    83. lianxifangshi_muqin= e.detail.value
    84. },
    85. // 获取用户输入的高考成绩
    86. gaokaochengjiInput:function(e){
    87. gaokaochengji= e.detail.value
    88. },
    89. // 获取用户输入的个人目标
    90. gerenmubiaoInput:function(e){
    91. gerenmubiao= e.detail.value
    92. },
    93. // 获取用户的特殊说明
    94. teshushuomingInput:function(e){
    95. teshushuoming= e.detail.value
    96. },
    97. //添加数据
    98. addData(){
    99. wx.showLoading({
    100. title: '数据提交中...',
    101. mask:true
    102. })
    103. db.collection("users").add({
    104. data:{
    105. xingming:xingming,
    106. banji:banji,
    107. xuehao:xuehao,
    108. chushengnianyue:chushengnianyue,
    109. lianxifangshi:lianxifangshi,
    110. tongxindizhi:tongxindizhi,
    111. fuqinxingming:fuqinxingming,
    112. gongzuodanwei_fuqin:gongzuodanwei_fuqin,
    113. lianxifangshi_fuqin:lianxifangshi_fuqin,
    114. muqinxingming:muqinxingming,
    115. gongzuodanwei_muqin:gongzuodanwei_muqin,
    116. lianxifangshi_muqin:lianxifangshi_muqin,
    117. gaokaochengji:gaokaochengji,
    118. gerenmubiao:gerenmubiao,
    119. teshushuoming:teshushuoming,
    120. }
    121. }).then(res=>{
    122. console.log(res)
    123. wx.hideLoading()
    124. })
    125. },
    126. //响应云函数按钮
    127. // getyunhanshu(){
    128. // wx.cloud.callFunction({
    129. // name:"stuexcel", // 调用的云函数名
    130. // data:{
    131. // clssdata:'1111' //根据班级字段,导出班级成员信息 ===对应云函数clssdata
    132. // },
    133. // complete:res=>{
    134. // console.log(res.result)
    135. // // return
    136. // //获取文件下载地址(24小时内有效)
    137. // wx.cloud.getTempFileURL({
    138. // fileList:[res.result.fileID],
    139. // success:res=>{
    140. // console.log('文件下载链接:',res.fileList[0].tempFileURL)
    141. // this.setData({ //设置data中定义相应的变量
    142. // tempFileURL:res.fileList[0].tempFileURL,
    143. // })
    144. // //复制刚获取到链接,成功后会自动弹窗提示已复制
    145. // wx.setClipboardData({
    146. // data:this.data.tempFileURL,
    147. // success (res) {
    148. // wx.getClipboardData({
    149. // success (res) {
    150. // console.log('复制成功:',res.data) // data
    151. // }
    152. // })
    153. // }
    154. // })
    155. // }
    156. // })
    157. // }
    158. // })
    159. // },
    160. })

    shouye.json:

    1. {
    2. "component": true,
    3. "usingComponents": {}
    4. }

     

    liulan.wxml:(代码内有详细注释)

    1. <view class="jiange">view>
    2. <view>
    3. <button type="primary" bindtap="getyunhanshu">表格获取并浏览button>
    4. view>
    5. <view class="shuoming">说明:点击“表格获取并浏览”后系统会自动把表格网页地址赋值到您的设备的粘贴板,直接可以在浏览器粘贴浏览,无需再次手动复制。感谢使用本小程序!view>
    6. <view class="jiange">view>

    liulan.wxss:

    1. .shuoming{
    2. padding: 50rpx 50rpx 0 50rpx;
    3. color: red;
    4. }

    liulan.js:

    1. Page({
    2. /**
    3. * 页面的初始数据
    4. */
    5. data: {
    6. },
    7. //响应云函数按钮
    8. getyunhanshu(){
    9. wx.cloud.callFunction({
    10. name:"stuexcel", // 调用的云函数名
    11. data:{
    12. clssdata:'1111' //根据班级字段,导出班级成员信息 ===对应云函数clssdata
    13. },
    14. complete:res=>{
    15. console.log(res.result)
    16. // return
    17. //获取文件下载地址(24小时内有效)
    18. wx.cloud.getTempFileURL({
    19. fileList:[res.result.fileID],
    20. success:res=>{
    21. console.log('文件下载链接:',res.fileList[0].tempFileURL)
    22. this.setData({ //设置data中定义相应的变量
    23. tempFileURL:res.fileList[0].tempFileURL,
    24. })
    25. //复制刚获取到链接,成功后会自动弹窗提示已复制
    26. wx.setClipboardData({
    27. data:this.data.tempFileURL,
    28. success (res) {
    29. wx.getClipboardData({
    30. success (res) {
    31. console.log('复制成功:',res.data) // data
    32. }
    33. })
    34. }
    35. })
    36. }
    37. })
    38. }
    39. })
    40. },
    41. /**
    42. * 生命周期函数--监听页面加载
    43. */
    44. onLoad: function (options) {
    45. },
    46. /**
    47. * 生命周期函数--监听页面初次渲染完成
    48. */
    49. onReady: function () {
    50. },
    51. /**
    52. * 生命周期函数--监听页面显示
    53. */
    54. onShow: function () {
    55. },
    56. /**
    57. * 生命周期函数--监听页面隐藏
    58. */
    59. onHide: function () {
    60. },
    61. /**
    62. * 生命周期函数--监听页面卸载
    63. */
    64. onUnload: function () {
    65. },
    66. /**
    67. * 页面相关事件处理函数--监听用户下拉动作
    68. */
    69. onPullDownRefresh: function () {
    70. },
    71. /**
    72. * 页面上拉触底事件的处理函数
    73. */
    74. onReachBottom: function () {
    75. },
    76. /**
    77. * 用户点击右上角分享
    78. */
    79. onShareAppMessage: function () {
    80. }
    81. })

    liulan.json:

    1. {
    2. "component": true,
    3. "usingComponents": {}
    4. }

     lianxizuozhe.wxml:

    1. <view class="lianxi">
    2. 如果有什么需要联系作者:
    3. view>
    4. <view class="qianduan">
    5. <view>前端:view>
    6. <view>VX:anran8024view>
    7. <view>QQ:1650696279view>
    8. <view>CSDN:lqj_本人view>
    9. view>
    10. <view class="qianduan">
    11. <view>后端:view>
    12. <view>VX:anran8024view>
    13. <view>QQ:3110689397view>
    14. <view>QQ:1650696279view>
    15. <view>CSDN:lqj_本人view>
    16. view>
    17. <button open-type="contact" bindcontact="handleContact" type="primary">
    18. <text>在线客服text>
    19. button>

    lianxizuozhe.wxss:

    1. .lianxi{
    2. color: red;
    3. padding: 50rpx;
    4. }
    5. .qianduan{
    6. padding: 50rpx;
    7. color: red;
    8. }

    lianxizuozhe.js:

    略!

    lianxizuozhe.json:

    1. {
    2. "component": true,
    3. "usingComponents": {}
    4. }

    app.wxss:

    app.wxss为一个程序的公共样式,可以在app.wxss中写入class类名,可以在每一个页面的wxml的标签中调用此类样式所谓(app.wxss公共样式)

    1. /**app.wxss**/
    2. .container {
    3. display: flex;
    4. flex-direction: column;
    5. align-items: center;
    6. box-sizing: border-box;
    7. }
    8. button {
    9. background: initial;
    10. }
    11. button:focus{
    12. outline: 0;
    13. }
    14. button::after{
    15. border: none;
    16. }
    17. page {
    18. background: #f6f6f6;
    19. display: flex;
    20. flex-direction: column;
    21. justify-content: flex-start;
    22. }

    app.js:

    1. // app.js
    2. App({
    3. onLaunch() {
    4. wx.cloud.init({
    5. env:"xxx",//填写你的env
    6. })
    7. // 展示本地存储能力
    8. const lqjs = wx.getStorageSync('lqjs') || []
    9. lqjs.unshift(Date.now())
    10. wx.setStorageSync('lqjs', lqjs)
    11. // 登录
    12. wx.login({
    13. success: res => {
    14. // 发送 res.code 到后台换取 openId, sessionKey, unionId
    15. }
    16. })
    17. },
    18. globalData: {
    19. userInfo: null
    20. }
    21. })

    最终效果展示:

    当我们点击提交时,后台的控制台:

     

     这时我们再看我们的数据库:

     发现已经有我们提交的信息了

    我们点击"表格获取并浏览"这时会自动复制到我们的复制板上,我们只需要在浏览器中打开即可:

     

     o~~~k!!!

    当然后期我们还可以借助云函数的控制来进行对数据库的增删改查,来实现更多花样的操作

    你的每一次失败,都是老天在考验你是否真的热爱,所以别放弃!!!

    键盘敲出我们的梦想,我们都能为未来的自己痴狂!!!

    当你的天赋不够支撑起你的野心时,你要告诉自己:呵!游戏继续,只不过我要认真了!

    我是lqj_本人,关注我,觉醒你内心的猛虎!!!

  • 相关阅读:
    Kafka数据同步原理详解
    [C/C++]数据结构 链表OJ题: 链表分割
    HTML导航栏二级菜单(垂直、水平方向)
    多功能计数器为例讲解电压比较器的用法
    算法题练习——JS Node+python题解合并k个已排序的链表及链表的奇偶重排
    chrome_elf.dll丢失怎么办?修复chrome_elf.dll文件的方法
    Spring MVC @Controller和@RequestMapping注解
    【Nginx】nginx配置文件学习
    python爬虫+django新闻推荐系统可视化分析
    接口自动化之测试数据动态生成并替换
  • 原文地址:https://blog.csdn.net/lbcyllqj/article/details/127115812