博客列表 >【记账小程序】记账系统备注与收入功能完善、用户登陆与用户账目统计功能开发

【记账小程序】记账系统备注与收入功能完善、用户登陆与用户账目统计功能开发

 一纸荒凉* Armani
 一纸荒凉* Armani原创
2021年06月07日 15:22:011410浏览

记账备注信息添加

添加点击事件,判断备注信息是否为空,不为空则显示内容,为空则显示默认的添加备注信息

  1. <a class="color-blue" bindtap="edit_bt" href="#">
  2. <block wx:if="{{content}}">
  3. {{content}}
  4. </block>
  5. <block wx:else>
  6. 添加备注
  7. </block>
  8. </a>

在data数据中添加content字段默认为空,事件调用模态框获取并设置备注信息到data中

  1. edit_bt(e){
  2. wx.showModal({
  3. title: '请输入备注',
  4. content: this.data.content,
  5. editable: true,
  6. success:(e)=>{
  7. // 判断是否点击了确认
  8. if(e.confirm){
  9. this.setData({
  10. content: e.content
  11. })
  12. }
  13. }
  14. })
  15. }


收入和支出Tab栏切换时,再次返回来重新默认选择收入或支出下面的第一个分类图标

  1. // 收入和支出tab栏切换事件
  2. changeTab: function( e ) {
  3. // 当点击支出的时候,支出是1 收入是2
  4. // 为支出1的时候,我们把支出分类全部拿出来,this.data.zhichu
  5. if(e.currentTarget.dataset.current==1){
  6. var zhichu = this.data.zhichu;
  7. // 目的是当点击回到支出的时候,让他重新选择第一个
  8. // 拿到数据后,进行循环吧图标改变,第一个也就是第0项,修改为选中图标,其他全部修改为未选中
  9. for(var i=0;i<zhichu.length;i++){
  10. if(i==0){
  11. // 将当前选中的索引也赋值为0
  12. zhichu_select = 0;
  13. // 将当前的分类id赋值记录
  14. cat_id = zhichu[i].id;
  15. // 将第一个设置为选中
  16. zhichu[i].select_img = zhichu[i].img_s;
  17. }else{
  18. // 如果不是第一个全部设置为未选中
  19. zhichu[i].select_img = zhichu[i].img;
  20. }
  21. }
  22. this.setData({
  23. zhichu:zhichu
  24. })
  25. }else{
  26. var shouru = this.data.shouru;
  27. for(var i=0;i<shouru.length;i++){
  28. if(i==0){
  29. shouru_select = 0;
  30. cat_id = shouru[i].id;
  31. shouru[i].select_img = shouru[i].img_s;
  32. }else{
  33. shouru[i].select_img = shouru[i].img;
  34. }
  35. }
  36. this.setData({
  37. shouru:shouru
  38. })
  39. }
  40. // 存储当前选中的Tab栏是哪一个 状态:1支出 2收入
  41. this.setData({
  42. currentData:e.currentTarget.dataset.current
  43. })
  44. },

前面做了支出金额的添加和支出分类图片的选中,这里来完善收入分类的图片选中及添加信息

  1. select_cat(e){
  2. console.log(e.currentTarget.dataset.key);
  3. // 选中的key 也就是分类的ID
  4. var key = e.currentTarget.dataset.key;
  5. // currentData=1 支出页面图标选择
  6. if(this.data.currentData==1){
  7. // 判断当前选中如果不是自己才执行
  8. if(key != zhichu_select){
  9. // 修改当前选中的key的img为选中图片
  10. this.data.zhichu[key].select_img = this.data.zhichu[key].img_s;
  11. // key === zhichu_select 将上一次选中的修改为未选中图片
  12. this.data.zhichu[zhichu_select].select_img = this.data.zhichu[zhichu_select].img;
  13. // 将这次的key赋值
  14. zhichu_select = key;
  15. // 同步数据
  16. this.setData({
  17. zhichu : this.data.zhichu
  18. })
  19. // 将当前选中的id赋值给
  20. cat_id = e.currentTarget.dataset.id;
  21. }
  22. }else{
  23. // 收入页面图标选择
  24. // 判断当前选中如果不是自己才执行
  25. if(key != shouru_select){
  26. // 修改当前选中的key的img为选中图片
  27. this.data.shouru[key].select_img = this.data.shouru[key].img_s;
  28. // key === shouru_select 将上一次选中的修改为未选中图片
  29. this.data.shouru[shouru_select].select_img = this.data.shouru[shouru_select].img;
  30. // 将这次的key赋值
  31. shouru_select = key;
  32. // 同步数据
  33. this.setData({
  34. shouru : this.data.shouru
  35. })
  36. // 将当前选中的id赋值给
  37. cat_id = e.currentTarget.dataset.id;
  38. }
  39. }
  40. },
  41. submit(){
  42. // 请求添加记账明细
  43. wx.request({
  44. url : 'https://jz.easys.ltd/index.php/api/Jizhang/add_jizhang',
  45. data : {
  46. input_v : this.data.input_v, //金额
  47. type : this.data.currentData, // 类型
  48. uid : 1, // 用户ID
  49. cid : cat_id, // 分类ID
  50. date : this.data.date, // 日期
  51. remarks : this.data.content // 备注
  52. },
  53. method : 'POST',
  54. success:(e)=>{
  55. // 如果返回的code不为1,表示添加失败
  56. if(e.data.code != 0){
  57. wx.showToast({
  58. title: e.data.msg,
  59. icon: 'error',
  60. duration: 2000
  61. })
  62. return false;
  63. }else{
  64. // 记账成功提示
  65. wx.showToast({
  66. title: e.data.msg,
  67. icon: 'success',
  68. duration: 2000
  69. });
  70. // 清空还原所有数据
  71. this.setData({
  72. currentData: 1,
  73. input_v : '',
  74. zhichu : default_zhichu,
  75. shouru : default_shouru,
  76. date : default_shijian,
  77. week : default_week,
  78. content: '',
  79. })
  80. }
  81. }
  82. })
  83. }

格式化当前选中的时间,传给后台接口,将其2021-06-06转换为年月日星期几形式的数据

  1. // 执行日期的选中方法
  2. edit_date(e){
  3. var date = e.detail.value
  4. console.log(date);
  5. // 将当前选择的时间请求发送给后台接口
  6. wx.request({
  7. url: 'https://jz.easys.ltd/index.php/api/Jizhang/format_date',
  8. data: {date},
  9. method : 'POST',
  10. success:(e)=>{
  11. this.setData({
  12. date: e.data.data.date,
  13. week: e.data.data.week
  14. })
  15. }
  16. });
  17. },

后台处理格式化时间接口

  1. <?php
  2. namespace app\api\controller;
  3. use app\api\controller\Base;
  4. use think\facade\Db;
  5. use think\facade\Request;
  6. class Jizhang extends Base{
  7. // 获取分类列表接口
  8. public function cat_list(){
  9. // 查询支出分类列表,并处理图片链接
  10. $zhichu = Db::table('oyk_cat')->where('status',1)->where('type',1)->select()->each(function($res){
  11. $res['img'] = 'https://'.$_SERVER['SERVER_NAME'] . $res['img'];
  12. $res['img_s'] = 'https://'.$_SERVER['SERVER_NAME'] . $res['img_s'];
  13. return $res;
  14. });
  15. // 查询收入分类列表,并处理图片链接
  16. $shouru = Db::table('oyk_cat')->where('status',1)->where('type',2)->select()->each(function($res){
  17. $res['img'] = 'https://'.$_SERVER['SERVER_NAME']. $res['img'];
  18. $res['img_s'] = 'https://'.$_SERVER['SERVER_NAME'] . $res['img_s'];
  19. return $res;
  20. });
  21. // 返回当前时间格式化年月日数据
  22. $date = date('Y年m月d日',time());
  23. $arr = [
  24. 'zhichu' => $zhichu,
  25. 'shouru' => $shouru,
  26. 'date' => $date
  27. ];
  28. $this->returnCode(0,$arr);
  29. }
  30. // 添加记账记录数据
  31. public function add_jizhang(){
  32. // 判断是否输入金额
  33. $input_v = Request::post('input_v');
  34. if(empty($input_v)){
  35. $this->returnCode(1,'请输入数字');
  36. }
  37. // 接受添加记录数据
  38. $uid = Request::post('uid');
  39. $cid = Request::post('cid',1);
  40. $date = Request::post('date');
  41. $type = Request::post('type',1);
  42. $remarks = Request::post('remarks','');
  43. // 处理前台返回的年月日时间
  44. $date =str_replace('年','-',$date);
  45. $date =str_replace('月','-',$date);
  46. $date =str_replace('日','-',$date);
  47. // 执行添加操作
  48. $insert = Db::table('oyk_jz')->insert([
  49. 'uid' => $uid,
  50. 'cid' => $cid,
  51. 'date' => $date,
  52. 'type' => $type,
  53. 'money' => $input_v,
  54. 'add_time' => time(),
  55. 'remarks' => $remarks,
  56. ]);
  57. // 返回错误信息
  58. if(empty($insert)){
  59. $this->returnCode(1,'记录失败');
  60. }
  61. $this->returnCode(0,'成功');
  62. }
  63. // 将时间格式化为年月日星期几形式
  64. public function format_date(){
  65. $date = Request::post('date');
  66. if(empty($date)){
  67. $this->returnCode(1,'请选择年月日');
  68. }
  69. // 获取当前时间为星期几
  70. $array = ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'];
  71. // 将传递过来的时间转换为时间戳
  72. $time = strtotime($date);
  73. // 获取星期几
  74. $week = $array[date('w',$time)];
  75. // 年月日
  76. // $time = explode('-'$date);
  77. // $date = $time[0].'年'.$time[1]."月".$time[0].'日';
  78. $date = date('Y年m月d日',$time);
  79. $this->returnCode(0,[
  80. 'week'=>$week,
  81. 'date'=>$date
  82. ]);
  83. }
  84. }


完整记账页面代码

index.wxml

  1. <!--index.wxml-->
  2. <view class="wrapper-bg">
  3. <view class="income-wrap">
  4. <view class="income-header">
  5. <!-- 支出和收入切换 -->
  6. <view class="layout-row layout-align-start-start income-tab">
  7. <view class="{{currentData == 1 ? 'outlay' : ''}}" data-current="1" bindtap="changeTab">支出
  8. <text data-current="0" class="tab-active"></text>
  9. </view>
  10. <view class="{{currentData == 2 ? 'income-nav' : ''}}" data-current="2" bindtap="changeTab">
  11. 收入
  12. <text data-current="1" class="tab-active"></text>
  13. </view>
  14. </view>
  15. <!-- 金额输入框 -->
  16. <view class="int layout-row layout-align-start-start">
  17. <text style="{{currentData == 2 ? 'color:#cda337' : ''}}"></text><input value="{{input_v}}" disabled></input>
  18. </view>
  19. </view>
  20. <scroll-view scroll-y='ture' class="income-center text-center">
  21. <!-- 支出分类列表 -->
  22. <view class="layout-row layout-align-start-start layout-wrap" hidden="{{currentData != 1}}">
  23. <view class="in-icon" wx:for="{{zhichu}}" wx:key="index" bindtap="select_cat" data-id="{{item.id}}" data-key="{{index}}">
  24. <image src="{{item.select_img}}"></image>
  25. <text>{{item.name}}</text>
  26. </view>
  27. </view>
  28. <!-- 收入分类列表 -->
  29. <view class="layout-row layout-align-start-start layout-wrap" hidden="{{currentData != 2}}">
  30. <view class="in-icon" wx:for="{{shouru}}" wx:key="index" bindtap="select_cat" data-id="{{item.id}}" data-key="{{index}}">
  31. <image src="{{item.select_img}}"></image>
  32. <text>{{item.name}}</text>
  33. </view>
  34. </view>
  35. </scroll-view>
  36. <!-- 备注和日期 -->
  37. <view class="income-footer layout-row layout-align-space-between-center">
  38. <a class="color-blue" bindtap="edit_bt" href="#">
  39. <block wx:if="{{content}}">
  40. {{content}}
  41. </block>
  42. <block wx:else>
  43. 添加备注
  44. </block>
  45. </a>
  46. <picker mode="date" class="income-time" bindchange="edit_date">{{date}} <text>{{week}}</text></picker>
  47. </view>
  48. </view>
  49. <!-- 数字键 -->
  50. <view class="calculator layout-row layout-align-start-start">
  51. <view class="calculator-left layout-row layout-align-start-center layout-wrap text-center">
  52. <view class="calculator-key" bindtap="input_num" data-num="1">1</view>
  53. <view class="calculator-key" bindtap="input_num" data-num="2">2</view>
  54. <view class="calculator-key" bindtap="input_num" data-num="3">3</view>
  55. <view class="calculator-key" bindtap="input_num" data-num="4">4</view>
  56. <view class="calculator-key" bindtap="input_num" data-num="5">5</view>
  57. <view class="calculator-key" bindtap="input_num" data-num="6">6</view>
  58. <view class="calculator-key" bindtap="input_num" data-num="7">7</view>
  59. <view class="calculator-key" bindtap="input_num" data-num="8">8</view>
  60. <view class="calculator-key" bindtap="input_num" data-num="9">9</view>
  61. <view class="calculator-key calculator-in" bindtap="input_num" data-num="0">0</view>
  62. <view class="calculator-key" bindtap="input_num" data-num=".">.</view>
  63. </view>
  64. <view class="calculator-right">
  65. <view class="calculator-delete" style="text-align:center;" bindtap="input_del">
  66. <image style="width:40rpx;height:40rpx;margin-top:20rpx;" src="/img/del.png"></image>
  67. </view>
  68. <view class="calculator-enter" bindtap="submit">确定</view>
  69. </view>
  70. </view>
  71. </view>

index.js

  1. var zhichu_select = 0;
  2. var cat_id = 0; // 要传给接口的id
  3. var shouru_select = 0;
  4. // 初始化默认数据
  5. var default_zhichu ;
  6. var default_shouru ;
  7. var default_shijian;
  8. var default_week;
  9. Page({
  10. data: {
  11. currentData: 1, // 状态:1支出 2收入
  12. input_v : '',
  13. zhichu : [],
  14. shouru : [],
  15. date : '',
  16. week: '',
  17. content: ''
  18. },
  19. onLoad: function (options) {
  20. wx.request({
  21. url : 'http://jz.easys.ltd/index.php/api/Jizhang/cat_list',
  22. data :{},
  23. method:'POST',
  24. success:(e)=>{
  25. var zhichu = e.data.data.zhichu;
  26. // 循环支出列表
  27. for(var i=0;i<zhichu.length;i++){
  28. if(i == 0){
  29. // 如果是第一项,将id赋值给当前的id
  30. cat_id = zhichu[i].id; // 第一次获取接口时,默认也第一个分类的id,就是要传的id,是选中的分类id
  31. // 将选中图标复制给变量select_img,我们在渲染列表的时候就用select_img默认第一项是选中的图片
  32. zhichu[i].select_img = zhichu[i].img_s;
  33. }else{
  34. // 否则则赋值未选中的图片
  35. zhichu[i].select_img = zhichu[i].img;
  36. }
  37. }
  38. // 收入列表同上
  39. var shouru = e.data.data.shouru;
  40. for(var i=0;i<shouru.length;i++){
  41. if(i==0){
  42. shouru[i].select_img = shouru[i].img_s;
  43. }else{
  44. shouru[i].select_img = shouru[i].img;
  45. }
  46. }
  47. this.setData({
  48. zhichu : zhichu,
  49. shouru : shouru,
  50. date : e.data.data.date,
  51. week: e.data.data.week
  52. });
  53. // 记录初始化的默认数据
  54. default_zhichu = zhichu;
  55. default_shouru = shouru;
  56. default_shijian = e.data.data.date;
  57. default_week = e.data.data.week;
  58. }
  59. })
  60. },
  61. changeTab: function( e ) {
  62. // 当点击支出的时候,支出是1 收入是2
  63. // 为支出1的时候,我们把支出分类全部拿出来,this.data.zhichu
  64. if(e.currentTarget.dataset.current==1){
  65. var zhichu = this.data.zhichu;
  66. // 目的是当点击回到支出的时候,让他重新选择第一个
  67. // 拿到数据后,进行循环吧图标改变,第一个也就是第0项,修改为选中图标,其他全部修改为未选中
  68. for(var i=0;i<zhichu.length;i++){
  69. if(i==0){
  70. zhichu_select = 0;
  71. cat_id = zhichu[i].id;
  72. zhichu[i].select_img = zhichu[i].img_s;
  73. }else{
  74. zhichu[i].select_img = zhichu[i].img;
  75. }
  76. }
  77. this.setData({
  78. zhichu:zhichu
  79. })
  80. }else{
  81. var shouru = this.data.shouru;
  82. for(var i=0;i<shouru.length;i++){
  83. if(i==0){
  84. shouru_select = 0;
  85. cat_id = shouru[i].id;
  86. shouru[i].select_img = shouru[i].img_s;
  87. }else{
  88. shouru[i].select_img = shouru[i].img;
  89. }
  90. }
  91. this.setData({
  92. shouru:shouru
  93. })
  94. }
  95. // 存储当前选中的Tab栏是哪一个
  96. this.setData({
  97. currentData:e.currentTarget.dataset.current
  98. })
  99. },
  100. bindChange: function( e ) {
  101. this.setData( { currentTab: e.detail.current });
  102. },
  103. select_cat(e){
  104. console.log(e.currentTarget.dataset.key);
  105. // 选中的key 也就是分类的ID
  106. var key = e.currentTarget.dataset.key;
  107. // current=1 支出页面图标选择
  108. if(this.data.currentData==1){
  109. // 判断当前选中如果不是自己才执行
  110. if(key != zhichu_select){
  111. // 修改当前选中的key的img为选中图片
  112. this.data.zhichu[key].select_img = this.data.zhichu[key].img_s;
  113. // key === zhichu_select 将上一次选中的修改为未选中图片
  114. this.data.zhichu[zhichu_select].select_img = this.data.zhichu[zhichu_select].img;
  115. // 将这次的key赋值
  116. zhichu_select = key;
  117. // 同步数据
  118. this.setData({
  119. zhichu : this.data.zhichu
  120. })
  121. // 将当前选中的id赋值给
  122. cat_id = e.currentTarget.dataset.id;
  123. }
  124. }else{
  125. // 收入页面图标选择
  126. // 判断当前选中如果不是自己才执行
  127. if(key != shouru_select){
  128. // 修改当前选中的key的img为选中图片
  129. this.data.shouru[key].select_img = this.data.shouru[key].img_s;
  130. // key === shouru_select 将上一次选中的修改为未选中图片
  131. this.data.shouru[shouru_select].select_img = this.data.shouru[shouru_select].img;
  132. // 将这次的key赋值
  133. shouru_select = key;
  134. // 同步数据
  135. this.setData({
  136. shouru : this.data.shouru
  137. })
  138. // 将当前选中的id赋值给
  139. cat_id = e.currentTarget.dataset.id;
  140. }
  141. }
  142. },
  143. // 执行日期的选中方法
  144. edit_date(e){
  145. var date = e.detail.value
  146. console.log(date);
  147. // 将当前选择的时间请求发送给后台接口
  148. wx.request({
  149. url: 'https://jz.easys.ltd/index.php/api/Jizhang/format_date',
  150. data: {date},
  151. method : 'POST',
  152. success:(e)=>{
  153. this.setData({
  154. date: e.data.data.date,
  155. week: e.data.data.week
  156. })
  157. }
  158. });
  159. },
  160. input_num(e){
  161. // 获取点击的数字按钮的自定义属性dataset
  162. var input_v = e.target.dataset.num;
  163. // 判断当前点击的是否为小数点
  164. if(input_v == '.'){
  165. // 如果小数点已经存在则累加一个空值
  166. if(this.data.input_v.indexOf(".") != -1 ){
  167. input_v = '';
  168. }
  169. // 如果还没有输入内容则不能输入小数点
  170. if(!this.data.input_v){
  171. input_v = '';
  172. }
  173. // 判断点击的是否是0
  174. }else if(input_v == 0){
  175. // 如果值已经是0则不在添加0,否则则添加0
  176. if(this.data.input_v == '0'){
  177. input_v = '';
  178. }else{
  179. input_v = 0;
  180. }
  181. }
  182. if(this.data.input_v>=100000){
  183. wx.showToast({
  184. title: '请输入小于10万的值',
  185. icon: 'error'
  186. });
  187. input_v = '';
  188. }
  189. this.setData({
  190. // 将当前输入的值和原始值合并
  191. input_v : this.data.input_v.concat(input_v)
  192. })
  193. },
  194. input_del(e){
  195. var input_v = this.data.input_v;
  196. // 删除最后一个字符
  197. input_v = input_v.substr(0, input_v.length - 1);
  198. this.setData({
  199. input_v : input_v
  200. })
  201. },
  202. submit(){
  203. // 请求添加记账明细
  204. wx.request({
  205. url : 'https://jz.easys.ltd/index.php/api/Jizhang/add_jizhang',
  206. data : {
  207. input_v : this.data.input_v, //金额
  208. type : this.data.currentData, // 类型
  209. uid : 1, // 用户ID
  210. cid : cat_id, // 分类ID
  211. date : this.data.date, // 日期
  212. remarks : this.data.content // 备注
  213. },
  214. method : 'POST',
  215. success:(e)=>{
  216. // 如果返回的code不为1,表示添加失败
  217. if(e.data.code != 0){
  218. wx.showToast({
  219. title: e.data.msg,
  220. icon: 'error',
  221. duration: 2000
  222. })
  223. return false;
  224. }else{
  225. // 记账成功提示
  226. wx.showToast({
  227. title: e.data.msg,
  228. icon: 'success',
  229. duration: 2000
  230. });
  231. // 清空还原所有数据
  232. this.setData({
  233. currentData: 1,
  234. input_v : '',
  235. zhichu : default_zhichu,
  236. shouru : default_shouru,
  237. date : default_shijian,
  238. week : default_week,
  239. content: '',
  240. })
  241. }
  242. }
  243. })
  244. },
  245. // 添加备注
  246. edit_bt(e){
  247. wx.showModal({
  248. title: '请输入备注',
  249. content: this.data.content,
  250. editable: true,
  251. success:(e)=>{
  252. // 判断是否点击了确认
  253. if(e.confirm){
  254. this.setData({
  255. content: e.content
  256. })
  257. }
  258. }
  259. })
  260. }
  261. })

登录流程时序

img

说明:

  1. 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
  2. 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 、 用户在微信开放平台帐号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台帐号) 和 会话密钥 session_key

之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。

注意:

  1. 会话密钥 session_key 是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥
  2. 临时登录凭证 code 只能使用一次

调用接口获取登录凭证(code)。通过凭证进而换取用户登录态信息,包括用户在当前小程序的唯一标识(openid)、微信开放平台帐号下的唯一标识(unionid,若当前小程序已绑定到微信开放平台帐号)及本次登录的会话密钥(session_key)等。用户数据的加解密通讯需要依赖会话密钥完成。

https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html

登录凭证校验。通过 wx.login 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。

https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html

我的页面获取微信头像和微信登陆功能开发

主要思路:当用户第一次进入小程序未点击登陆的时候,我们将默认创建一个用户,返回uid,当用户点击了登陆获取到唯一识别码openid时,在修改对应uid的用户信息,将其openid添加进去。小程序端通过缓存来保持用户登陆状态。

  1. <!--pages/my/index.wxml-->
  2. <view style="padding:130rpx 13rpx 13rpx; font-size: 30rpx;background:url('../../img/background.png')">
  3. <view style="text-align:center;background: rgb(251 250 250 / 0.8);box-shadow: 3px 3px 6px #eee;padding: 30rpx;border-radius: 4%;" >
  4. <image src="{{userInfo['avatarUrl']}}" style="width:160rpx;height:160rpx;border-radius:50%;margin-bottom:22rpx;"></image>
  5. <view>{{userInfo['nickName']}}</view>
  6. <view>
  7. <text>地区:{{userInfo['province']}} {{userInfo['city']}}</text>
  8. <text> 性别:<block wx:if="{{userInfo['gender']==1}}"> 男</block><block wx:elif="{{userInfo['gender']==2}}"> 女</block><block wx:else> 未知</block></text>
  9. </view>
  10. <block wx:if="{{!hasUserInfo}}"><button style="margin-top:20rpx;background:#eee" bindtap="getUserProfile">使用微信头像</button></block>
  11. <block wx:if="{{!hasLogin}}"><button style="margin-top:20rpx;" plain="true" open-type='getUserInfo' bindgetuserinfo='bindGetUserInfo' lang="zh_CN">使用微信登陆</button></block>
  12. </view>
  13. <view style="text-align:center;display:flex;margin-top:40rpx;background: rgb(251 250 250 / 0.8);padding: 30rpx 15rpx;box-shadow: 3px 3px 6px #eee;">
  14. <view style="width:33%;">
  15. <view style="color:#CFA348">+{{shouru}}</view>
  16. <view style="font-size:26rpx;">年收入</view>
  17. </view>
  18. <view style="width:34%">
  19. <view>-{{zhichu}}</view>
  20. <view style="font-size:26rpx;">年支出</view>
  21. </view>
  22. <view style="width:33%" bindtap="setMoney">
  23. <view wx:if="{{yusuan == 0}}">未设置</view>
  24. <view wx:elif="{{yusuan < 0}}" style="color:red;">{{yusuan}}</view>
  25. <view wx:elif="{{yusuan > 0}}" style="color:green;">{{yusuan}}</view>
  26. <view style="font-size:26rpx;">月预算余额</view>
  27. </view>
  28. </view>
  29. <view style="text-align:center;display:flex;margin-top:40rpx;background: rgb(251 250 250 / 0.8);padding: 30rpx;box-shadow: 3px 3px 6px #eee;">
  30. <view style="width:20%;" >
  31. <image src="{{userInfo['avatarUrl']}}" style="width:100rpx;height:100rpx;border-radius:50%;"></image>
  32. <view style="font-size:20rpx;">{{userInfo['nickName']}}</view>
  33. </view>
  34. <view style="width:20%;">
  35. <button style="width:100%;padding:0;background: transparent;" open-type="share" >
  36. <image src="../../img/index.png" style="width:90rpx;height:90rpx;border-radius:50%;"></image>
  37. <view>添加</view>
  38. </button>
  39. </view>
  40. </view>
  41. <view style="margin-top:40rpx;background: rgb(251 250 250 / 0.8);padding: 26rpx;box-shadow: 3px 3px 6px #eee;">
  42. <button style="width:100%;padding:0;text-align: left;background: transparent;" open-type="feedback">
  43. <view style="border-bottom: 3px solid #eee;padding: 10px 0;" >
  44. <image src="../../img/feedback.png" style="width:30px;height:30px;padding-right:20px"></image>
  45. <text style="vertical-align: super;">反馈问题</text>
  46. </view>
  47. </button>
  48. <button style="width:100%;padding:0;text-align: left;background: transparent;" open-type="share">
  49. <view style="width:100%;border-bottom: 3px solid #eee;padding: 10px 0;" >
  50. <image src="../../img/share.png" style="width:30px;height:30px;padding-right:20px"></image>
  51. <text style="vertical-align: super;">推荐好友</text>
  52. </view>
  53. </button>
  54. <view style="margin-top:26rpx;">
  55. <text style="font-size:30rpx">设置手机亮度</text>
  56. <slider value="{{Brightness}}" bindchange="sliderchange" min="0" max="100" step='1' left-icon="cancel" show-value right-icon="success_no_circle"/>
  57. </view>
  58. </view>
  59. <view style="margin-top:26rpx;">
  60. <text>当前手机亮度:<block wx:if="{{Brightness==100}}">闪瞎眼</block><block wx:elif="{{Brightness>=80}}">刺眼</block><block wx:elif="{{Brightness>=60}}">超量</block><block wx:elif="{{Brightness>=40}}">适合</block><block wx:elif="{{Brightness>=20}}">较暗</block><block wx:else>看不见</block>
  61. </text>
  62. <progress percent="{{Brightness}}" show-info border-radius='50' stroke-width="10"/>
  63. </view>
  64. <view style="margin-top:26rpx;">
  65. <text>当前手机电量:<block wx:if="{{isCharging}}">正在充电</block></text>
  66. <progress percent="{{level}}" show-info border-radius='50' stroke-width="10"/>
  67. </view>
  68. </view>
  1. // pages/my/index.js
  2. Page({
  3. /**
  4. * 页面的初始数据
  5. */
  6. data: {
  7. userInfo :'',
  8. hasUserInfo: false,
  9. hasLogin: false,
  10. shouru:100000,
  11. zhichu:30000,
  12. yusuan:0,
  13. Brightness: 0,
  14. level:'',
  15. isCharging:false
  16. },
  17. getUserProfile(){
  18. if(!this.data.hasUserInfo){
  19. wx.getUserProfile({
  20. desc: '展示用户信息', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
  21. lang:'zh_CN',
  22. success: (res) => {
  23. console.log(res);
  24. this.setData({
  25. userInfo: res.userInfo,
  26. hasUserInfo: true
  27. });
  28. wx.setStorage({
  29. key:"userInfo",
  30. data: res.userInfo
  31. })
  32. }
  33. });
  34. }
  35. },
  36. bindGetUserInfo: function(res) {
  37. if (res.detail.userInfo) {
  38. var nickName = res.detail.userInfo.nickName;
  39. var avatarUrl = res.detail.userInfo.avatarUrl;
  40. var gender = res.detail.userInfo.gender;
  41. var province = res.detail.userInfo.province;
  42. var city = res.detail.userInfo.city;
  43. var userInfo = res.detail.userInfo;
  44. wx.login({
  45. success:(res)=>{
  46. if(!res.code){
  47. wx.showToast({
  48. title: '微信授权失败,请刷新重试',
  49. icon: 'none',
  50. duration: 1200
  51. })
  52. return;
  53. }
  54. wx.request({
  55. url: 'https://jz.easys.ltd/index.php/api/Jizhang/wx_login',
  56. data: {
  57. code: res.code,
  58. nickName:nickName,
  59. avatarUrl:avatarUrl,
  60. gender:gender,
  61. province:province,
  62. city:city
  63. },
  64. method : 'POST',
  65. success:(e)=>{
  66. if(e.data.code!=0){
  67. wx.showToast({
  68. title: e.data.msg,
  69. icon: 'error',
  70. duration: 2000
  71. });
  72. return false;
  73. }
  74. console.log(userInfo);
  75. wx.setStorage({
  76. key: 'userInfo',
  77. data: userInfo
  78. })
  79. wx.setStorage({
  80. key: 'user',
  81. data: e.data.data
  82. });
  83. this.setData({
  84. hasLogin: true,
  85. hasUserInfo:true,
  86. userInfo: userInfo
  87. })
  88. }
  89. });
  90. },
  91. fail:()=>{
  92. wx.showToast({
  93. title: '网络错误,请刷新重试',
  94. icon: 'none',
  95. duration: 1200
  96. });
  97. }
  98. })
  99. }
  100. },
  101. sliderchange(event){
  102. // 获取当前滑块的值
  103. console.log(event.detail.value);
  104. this.setData({
  105. Brightness: parseInt(event.detail.value)
  106. });
  107. // 设置手机屏幕亮度0~1
  108. wx.setScreenBrightness({
  109. value: this.data.Brightness/100,
  110. success(e){
  111. console.log(e);
  112. }
  113. });
  114. // 获取屏幕亮度
  115. wx.getScreenBrightness({
  116. success:(e)=>{
  117. console.log("屏幕当前亮度:",e.value);
  118. }
  119. });
  120. },
  121. /**
  122. * 生命周期函数--监听页面加载
  123. */
  124. onLoad: function (options) {
  125. wx.getStorage({
  126. key: 'user',
  127. success:(res)=>{
  128. console.log(res.data)
  129. this.setData({
  130. hasLogin: true
  131. });
  132. wx.request({
  133. url: 'https://jz.easys.ltd/index.php/api/Jizhang/user_info',
  134. data: {
  135. uid: res.data.uid
  136. },
  137. method: 'POST',
  138. success:(e)=>{
  139. this.setData({
  140. shouru: e.data.data.shouru,
  141. zhichu: e.data.data.zhichu,
  142. yusuan: e.data.data.yue,
  143. })
  144. }
  145. })
  146. }
  147. })
  148. wx.getStorage({
  149. key: 'userInfo',
  150. success:(res)=>{
  151. console.log(res.data)
  152. this.setData({
  153. userInfo: res.data,
  154. hasUserInfo: true
  155. });
  156. },
  157. fail:(e)=>{
  158. wx.getUserInfo({
  159. lang: 'zh_CN',
  160. success: (res)=>{
  161. this.setData({
  162. userInfo: res.userInfo
  163. })
  164. }
  165. });
  166. }
  167. })
  168. // 获取手机屏幕亮度
  169. wx.getScreenBrightness({
  170. success:(e)=>{
  171. this.setData({
  172. Brightness: Math.ceil(e.value*100)
  173. })
  174. }
  175. });
  176. // 同步调用获取电量
  177. const BatteryInfo = wx.getBatteryInfoSync();
  178. // 设备电量,范围 1 - 100
  179. console.log(BatteryInfo.level);
  180. // 是否正在充电中
  181. console.log(BatteryInfo.isCharging);
  182. this.setData({
  183. level: BatteryInfo.level,
  184. isCharging: BatteryInfo.isCharging
  185. })
  186. },
  187. /**
  188. * 生命周期函数--监听页面初次渲染完成
  189. */
  190. onReady: function () {
  191. },
  192. /**
  193. * 生命周期函数--监听页面显示
  194. */
  195. onShow: function () {
  196. },
  197. /**
  198. * 生命周期函数--监听页面隐藏
  199. */
  200. onHide: function () {
  201. },
  202. /**
  203. * 生命周期函数--监听页面卸载
  204. */
  205. onUnload: function () {
  206. },
  207. /**
  208. * 页面相关事件处理函数--监听用户下拉动作
  209. */
  210. onPullDownRefresh: function () {
  211. },
  212. /**
  213. * 页面上拉触底事件的处理函数
  214. */
  215. onReachBottom: function () {
  216. },
  217. /**
  218. * 用户点击右上角分享
  219. */
  220. onShareAppMessage: function () {
  221. wx.showShareMenu({
  222. withShareTicket: true,
  223. menus: ['shareAppMessage', 'shareTimeline']
  224. });
  225. }
  226. })

后台数据接口

  1. <?php
  2. namespace app\api\controller;
  3. use app\api\controller\Base;
  4. use think\facade\Db;
  5. use think\facade\Request;
  6. class Jizhang extends Base{
  7. // 获取分类列表接口
  8. public function cat_list(){
  9. // 查询支出分类列表,并处理图片链接
  10. $zhichu = Db::table('oyk_cat')->where('status',1)->where('type',1)->select()->each(function($res){
  11. $res['img'] = 'https://'.$_SERVER['SERVER_NAME'] . $res['img'];
  12. $res['img_s'] = 'https://'.$_SERVER['SERVER_NAME'] . $res['img_s'];
  13. return $res;
  14. });
  15. // 查询收入分类列表,并处理图片链接
  16. $shouru = Db::table('oyk_cat')->where('status',1)->where('type',2)->select()->each(function($res){
  17. $res['img'] = 'https://'.$_SERVER['SERVER_NAME']. $res['img'];
  18. $res['img_s'] = 'https://'.$_SERVER['SERVER_NAME'] . $res['img_s'];
  19. return $res;
  20. });
  21. // 返回当前时间格式化年月日数据
  22. $date = date('Y年m月d日',time());
  23. $array = ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'];
  24. $week = $array[date('w',time())];
  25. $arr = [
  26. 'zhichu' => $zhichu,
  27. 'shouru' => $shouru,
  28. 'date' => $date,
  29. 'week'=>$week,
  30. ];
  31. $this->returnCode(0,$arr);
  32. }
  33. // 添加记账记录数据
  34. public function add_jizhang(){
  35. // 判断是否输入金额
  36. $input_v = Request::post('input_v');
  37. if(empty($input_v)){
  38. $this->returnCode(1,'请输入数字');
  39. }
  40. // 接受添加记录数据
  41. $uid = Request::post('uid');
  42. $cid = Request::post('cid',1);
  43. $date = Request::post('date');
  44. $type = Request::post('type',1);
  45. $remarks = Request::post('remarks','');
  46. // 处理前台返回的年月日时间
  47. $date =str_replace('年','-',$date);
  48. $date =str_replace('月','-',$date);
  49. $date =str_replace('日','-',$date);
  50. // 执行添加操作
  51. $insert = Db::table('oyk_jz')->insert([
  52. 'uid' => $uid,
  53. 'cid' => $cid,
  54. 'date' => $date,
  55. 'type' => $type,
  56. 'money' => $input_v,
  57. 'add_time' => time(),
  58. 'remarks' => $remarks,
  59. ]);
  60. // 返回错误信息
  61. if(empty($insert)){
  62. $this->returnCode(1,'记录失败');
  63. }
  64. $this->returnCode(0,'成功');
  65. }
  66. // 将时间格式化为年月日星期几形式
  67. public function format_date(){
  68. $date = Request::post('date');
  69. if(empty($date)){
  70. $this->returnCode(1,'请选择年月日');
  71. }
  72. // 获取当前时间为星期几
  73. $array = ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'];
  74. // 将传递过来的时间转换为时间戳
  75. $time = strtotime($date);
  76. // 获取星期几
  77. $week = $array[date('w',$time)];
  78. // 年月日
  79. // $time = explode('-'$date);
  80. // $date = $time[0].'年'.$time[1]."月".$time[0].'日';
  81. $date = date('Y年m月d日',$time);
  82. $this->returnCode(0,[
  83. 'week'=>$week,
  84. 'date'=>$date
  85. ]);
  86. }
  87. public function wx_login(){
  88. $code = Request::post('code');
  89. $appid = "wxdd3486cff1c813a6";
  90. $appSecret = "4fb84f7fd1f8fbac1554f60de272720e";
  91. if (!$code) {
  92. $this->returnCode(1,'微信授权失败,请刷新重试!');
  93. }
  94. # 根据code获取openid
  95. $url = "https://api.weixin.qq.com/sns/jscode2session?appid={$appid}&secret={$appSecret}&js_code={$code}&grant_type=authorization_code";
  96. $auth = file_get_contents($url);
  97. $auth = json_decode($auth,true);
  98. $openid = $auth['openid'];
  99. if(!isset($auth['openid'])){
  100. $this->returnCode(1,'微信授权失败,请刷新重试!');
  101. }
  102. $data['openid'] = $auth['openid'];
  103. $data['nickname'] = input('post.nickName');
  104. $data['avatar'] = input('post.avatarUrl');
  105. $data['province'] = input('post.province');
  106. $data['city'] = input('post.city');
  107. $data['sex'] = input('post.gender');
  108. $data['last_time'] = time();
  109. //如果已经绑定账号,直接登录,返回ticket
  110. $user = Db::table('oyk_user')->where('openid',$openid)->find();
  111. if($user && $user['status'] !=1 ){
  112. $this->returnCode(1,'账号已被禁用');
  113. }
  114. // 如果用户openid不存在,则添加
  115. if (empty($user)) {
  116. $data['add_time'] = time();
  117. $ret = Db::table('oyk_user')->insertGetId($data);
  118. $user = Db::table('oyk_user')->where('uid',$ret)->find();
  119. }else{
  120. Db::table('oyk_user')->where('openid',$openid)->update($data);
  121. }
  122. // 返回uid和openid
  123. $arr = [
  124. 'uid' => $user['uid'],
  125. 'openid' => $openid
  126. ];
  127. $this->returnCode(0,$arr);
  128. }
  129. public function user_info(){
  130. $uid = Request::post('uid');
  131. $find = Db::table('oyk_user')->where('uid',$uid)->find();
  132. $y = date('Y',time());
  133. $start = $y.'-01-01';
  134. $end = $y.'-12-31';
  135. $zhichu = Db::table('oyk_jz')->where('uid','=',$uid)->whereTime('date','between',[$start,$end])->where('type','=',1)->sum('money');
  136. $shouru = Db::table('oyk_jz')->where('uid','=',$uid)->whereTime('date','between',[$start,$end])->where('type','=',2)->sum('money');
  137. $m = date('m',time());
  138. $start = $y.'-'.$m.'-01';
  139. $d = date('d',time());
  140. $end = $y.'-'.$m.'-'.$d;
  141. $yue = Db::table('oyk_jz')->where('uid','=',$uid)->whereTime('date','between',[$start,$end])->where('type','=',1)->sum('money');
  142. $arr = [
  143. 'zhichu' => $zhichu,
  144. 'shouru' => $shouru,
  145. 'yue' => $find['money']-$yue,
  146. 'find' => $find
  147. ];
  148. $this->returnCode(0,$arr);
  149. }
  150. }



声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议