Blogger Information
Blog 128
fans 9
comment 5
visits 241318
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
【记账小程序】记账系统备注与收入功能完善、用户登陆与用户账目统计功能开发
 一纸荒凉* Armani
Original
1403 people have browsed it

记账备注信息添加

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

  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. }



Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post