vue.js移动端记账本完成的总结(未完待续,电脑快没电了)

Posted 志学Python

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue.js移动端记账本完成的总结(未完待续,电脑快没电了)相关的知识,希望对你有一定的参考价值。

两个目的

第一个目的: 这一个移动端记账本的创作来源呢,其实是我在学习了理财的课程之后,突然想为自己写一个记账的东西来记录自己每天花费的钱,从而可以降低那些不必要的开销,从而达到理财的第一步。当然还有另一个目的就是: 做这个移动端简单的项目,主要是为了熟悉vue.js,从项目构建到完成目录,以及后台数据库的设计,后台逻辑的处理,全程由我自己一个人完成,这个项目历史大概有1个多月吧,虽然项目看起来很小,但是简单亦不简单啊,这个时间段遇到很多问题,都是自己一个人靠着百度,自己理解解决了问题,总的来说,这个项目对我来还是蛮重要的,还是我的第一个开源项目吧,希望大佬不要嘲笑,看到的尽管留言,给出完善的意见,感谢

项目用的技术展

holderjs:一开始设计原型的时候使用站位图插件

其用法如下: holder.js 可以帮我们快速生成占位图片,而且还能定义占位图片的一些基本样式。

用法简单,可以直接去官网下载,或直接引用Bootcss的CDN :

1、基本:默认单位为px,用小写的x连接图片的宽高:

 
   
   
 
  1. <img data-src="holder.js/200x100"/>

vue.js移动端记账本完成的总结(未完待续,电脑快没电了)2、使用p代表%:

 
   
   
 
  1. <img src="holder.js/100px200"/>

vue.js移动端记账本完成的总结(未完待续,电脑快没电了)

3、让占位图片在缩放长宽比,可以加上auto参数:

 
   
   
 
  1. <img src="holder.js/300x200?auto=yes">

4、配色方案:

holder.js共定义了6种占位图片配色,分别是:sky、vine、lava、gray、industrial、social 配色可以通过theme参数设置:

 
   
   
 
  1. <img src="holder.js/300x200?theme=sky">

vue.js移动端记账本完成的总结(未完待续,电脑快没电了)5、随机配色:

<img src="/img?url=holder.js/300x200?text=图片 n 300x200">


带边框与交叉线:fastclick:这个用来处理移动端click事件 300 毫秒延迟

其用法如下:

处理移动端click事件 300 毫秒延迟, 由FT Labs开发,Github 项目地址:https://github.com/ftlabs/fastclick。

从点击屏幕上的元素到触发元素的click事件,移动浏览器会有大约 300 毫秒的等待时间。为什么这么设计呢? 因为它想看看你是不是要进行双击(double tap)操作。

兼容性

Mobile Safari on ios 3 and upwards
Chrome on iOS 5 and upwards
Chrome on android (ICS)
Opera Mobile 11.5 and upwards
Android Browser since Android 2
PlayBook OS 1 and upwards

不应用 FastClick 的场景

桌面浏览器;如果viewport meta 标签中设置了width=device-width, Android 上的 Chrome 32+ 会禁用 300ms 延时;

Copyviewport meta 标签如果设置了user-scalable=no,Android 上的 Chrome(所有版本)都会禁用 300ms 延迟。

IE10 中,可以使用 css 属性-ms-touch-action: none禁止元素双击缩放(参考文章)。

引入插件步骤

①在html页面中添加注:必须在页面所有Element之前加载脚本文件先实例化fastclick
②在JS中添加fastclick的身体,推荐以下做法: 
 if(" addeventlistener'="" in="" document)="" {="" document.addeventlistener('domcontentloaded',function()="" fastclick.attach(document.body);="" },false);="" }="" 如果你使用了jquery,那么js引入就可以改用下面的写法:="" $(function()="" });="" 如果你使用browserify或者其他commonjs-style="" 系统,当你调用`require('fastclick')`时,`fastclick.attach`事件会被返回,加载fastclick最简单的方式就是下面的方法了:="" var="" attachfastclick="require('fastclick');" attachfastclick(document.body);="" <="" code="" alt="图片 
 300x200"></code></pre><p><img src [300x200]"  data-holder-rendered="true" style="box-sizing: border-box; border: 2px solid rgb(238, 238, 238); border-radius: 6px; width: 300px; height: 200px;">


移动端调试插件

VConsole:移动端调试插件 使用 废话不多说,说说怎么使用的吧。 首先去下载相关的代码,由于只需要在页面引入一个js文件,直接去下载就可以,https://github.com/Tencent/vConsole/releases/tag/v3.1.0

或者使用 npm 安装:

 
   
   
 
  1. npm install vconsole

使用webpack,然后js代码中

 
   
   
 
  1. import VConsole from 'vconsole/dist/vconsole.min.js' //import vconsole

  2. let vConsole = new VConsole() // 初始化

或者找到这个模块下面的 dist/vconsole.min.js ,然后复制到自己的项目中

 
   
   
 
  1. <head>

  2.    <script src="dist/vconsole.min.js"></script>

  3. </head>

  4. <!--建议在 `<head>` 中引入哦~ -->

  5. <script>

  6.  // 初始化

  7.  var vConsole = new VConsole();

  8.  console.log('VConsole is cool');

  9. </script>

优秀的远程服务插件

 
   
   
 
  1. $ npm install axios

使用 bower:

 
   
   
 
  1. $ bower install axios

使用 cdn:

 
   
   
 
  1. <script src="https://unpkg.com/axios/dist/axios.min.js"></script>

Example 执行 GET 请求

 
   
   
 
  1. // 为给定 ID 的 user 创建请求

  2. axios.get('/user?ID=12345')

  3.  .then(function (response) {

  4.    console.log(response);

  5.  })

  6.  .catch(function (error) {

  7.    console.log(error);

  8.  });


  9. // 可选地,上面的请求可以这样做

  10. axios.get('/user', {

  11.    params: {

  12.      ID: 12345

  13.    }

  14.  })

  15.  .then(function (response) {

  16.    console.log(response);

  17.  })

  18.  .catch(function (error) {

  19.    console.log(error);

  20.  });

执行 POST 请求

 
   
   
 
  1. axios.post('/user', {

  2.    firstName: 'Fred',

  3.    lastName: 'Flintstone'

  4.  })

  5.  .then(function (response) {

  6.    console.log(response);

  7.  })

  8.  .catch(function (error) {

  9.    console.log(error);

  10.  });

执行多个并发请求

 
   
   
 
  1. function getUserAccount() {

  2.  return axios.get('/user/12345');

  3. }


  4. function getUserPermissions() {

  5.  return axios.get('/user/12345/permissions');

  6. }


  7. axios.all([getUserAccount(), getUserPermissions()])

  8.  .then(axios.spread(function (acct, perms) {

  9.    // 两个请求现在都执行完成

  10.  }));

axios API 可以通过向 axios 传递相关配置来创建请求

 
   
   
 
  1. axios(config)

// 发送 POST 请求

 
   
   
 
  1. axios({

  2.  method: 'post',

  3.  url: '/user/12345',

  4.  data: {

  5.    firstName: 'Fred',

  6.    lastName: 'Flintstone'

  7.  }

  8. });

  9. axios(url[, config])

  10. // 发送 GET 请求(默认的方法)

  11. axios('/user/12345');

请求方法的别名 为方便起见,为所有支持的请求方法提供了别名

 
   
   
 
  1. axios.request(config)

  2. axios.get(url[, config])

  3. axios.delete(url[, config])

  4. axios.head(url[, config])

  5. axios.post(url[, data[, config]])

  6. axios.put(url[, data[, config]])

  7. axios.patch(url[, data[, config]])

自己封装了一下字体响应式改变

rem.js

 
   
   
 
  1. // 设置字体大小

  2. setFontSize(){

  3.  (function(doc,win){

  4.      var docEl = doc.documentElement,  //文档根标签

  5.          resizeEvent =  'orientationchange' in window ? 'orientationchang' :'resize'; //viewport变化事件源

  6.      var rescale = function(){

  7.          //重置方法

  8.          win.clientWidth = docEl.clientWidth;

  9.          if (!win.clientWidth) return;

  10.          // 改变DOM根节点fontSize大小的值;

  11.          // (屏幕宽度/设计图宽度) = 缩放或扩大的比例值;

  12.          docEl.style.fontSize = 40 * (win.clientWidth / 750) + 'px';

  13.      }

  14.      if (!doc.addEventListener) return;

  15.      win.addEventListener(resizeEvent, rescale, false);

  16.      doc.addEventListener('DOMContentLoaded', rescale, false);

  17.  })(document, window);

  18. }

自己对axios.post()和axios.get()方法进行二次封装

axiosgetpost.js

 
   
   
 
  1. // eslint-disable-next-line

  2. /* eslint-disable */

  3. // 对 axios.get() 和 axios.post()进行封装

  4. import axios from 'axios'

  5. import qs from 'qs'


  6. /*

  7. post 方式

  8. axios({

  9.    method: 'post',

  10.    url: '/user/123456',

  11.    data: {

  12.        username: 'ken',

  13.        password: '123456'

  14.    }

  15. })

  16. axios.post('/user', {

  17.    firstName: 'Fred',

  18.    lastName: 'Flintstone'

  19. })


  20. get 方式

  21. axios({

  22.    method: 'get',

  23.    url: '/user/123456',

  24. })


  25. // 可选地,上面的请求可以这样做

  26. axios.get('/user', {

  27.    params: {

  28.      ID: 12345

  29.    }

  30. })



  31. //伪代码的编写

  32. axios({

  33.    method: 'post' || 'get',

  34.    url: '/user/123456',

  35.    data: {

  36.        username: 'ken',

  37.        password: '123456',

  38.    } || params: {

  39.        ID: '123456'

  40.    }

  41. })

  42. */

  43. export default function axios_get_post(params){

  44.    return new Promise((resolve, reject)=>{

  45.        let opt = {

  46.            method: params.method || 'get',

  47.            url: params.url,

  48.            headers: {

  49.                'Content-Type':'application/x-www-form-urlencoded'

  50.            },

  51.        }

  52.        if(params.method == 'post'){

  53.            opt.data = params.data

  54.        }else {

  55.            //

  56.            opt.params = params

  57.        }

  58.        // 拦截处理

  59.        axios.interceptors.request.use((req) => {

  60.            if (req.method === 'post') {

  61.                // 转换成JSON格式

  62.                req.data = qs.stringify(req.data);

  63.            }

  64.            return req;

  65.        }, (error) => Promise.reject(error));


  66.        axios(opt).then(res=>{

  67.            resolve(res.data)

  68.        }).catch(err=>{

  69.            reject(err)

  70.        })

  71.    })

  72. }

当初封装上述函数的时候遇到一个问题如下:

axios.js以post方式传递数据后台获取不到数据,这到底是什么原因

mint-ui的插件的使用

在这个项目中使用的最多就是MessageBox()这个组件 npm 安装 推荐使用 npm 的方式安装,它能更好地和 webpack 打包工具配合使用。

 
   
   
 
  1. npm i mint-ui@1 -S

CDN 目前可以通过 unpkg.com/mint-ui@1 获取到最新版本的资源,在页面上引入 js 和 css 文件即可开始使用。

 
   
   
 
  1. <!-- 引入样式 -->

  2. <link rel="stylesheet" href="https://unpkg.com/mint-ui@1/lib/style.css">

  3. <!-- 引入组件库 -->

  4. <script src="https://unpkg.com/mint-ui@1/lib/index.js"></script>

Hello world 通过 CDN 的方式我们可以很容易地使用 Mint UI 写出一个 Hello world 页面。

 
   
   
 
  1. <!DOCTYPE html>

  2. <html>

  3. <head>

  4.  <meta charset="UTF-8">

  5.  <!-- 引入样式 -->

  6.  <link rel="stylesheet" href="https://unpkg.com/mint-ui@1/lib/style.css">

  7. </head>

  8. <body>

  9.  <div id="app">

  10.    <mt-button @click.native="handleClick">按钮</mt-button>

  11.  </div>

  12. </body>

  13.  <!-- 先引入 Vue -->

  14.  <script src="https://unpkg.com/vue@1/dist/vue.js"></script>

  15.  <!-- 引入组件库 -->

  16.  <script src="https://unpkg.com/mint-ui@1/lib/index.js"></script>

  17.  <script>

  18.    new Vue({

  19.      el: '#app',

  20.      methods: {

  21.        handleClick: function() {

  22.          this.$toast('Hello world!')

  23.        }

  24.      }

  25.    })

  26.  </script>

  27. </html>

Message box使用

引入

 
   
   
 
  1. import { MessageBox } from 'mint-ui';

例子 以标题与内容字符串为参数进行调用

 
   
   
 
  1. MessageBox('提示', '操作成功');

或者传入一个对象

 
   
   
 
  1. MessageBox({

  2.  title: '提示',

  3.  message: '确定执行此操作?',

  4.  showCancelButton: true

  5. });

此外,MessageBox 还提供了 alert、confirm 和 prompt 三个方法,它们都返回一个 Promise

 
   
   
 
  1. MessageBox.alert(message, title);

  2. MessageBox.alert('操作成功').then(action => {

  3.  ...

  4. });

  5. MessageBox.confirm(message, title);

  6. MessageBox.confirm('确定执行此操作?').then(action => {

  7.  ...

  8. });

  9. MessageBox.prompt(message, title);

  10. MessageBox.prompt('请输入姓名').then(({ value, action }) => {

  11.  ...

  12. });

滚动加载数据组件

Infinite scroll 引入

 
   
   
 
  1. import { InfiniteScroll } from 'mint-ui';


  2. Vue.use(InfiniteScroll);

例子 为 HTML 元素添加 v-infinite-scroll 指令即可使用无限滚动。滚动该元素,当其底部与被滚动元素底部的距离小于给定的阈值(通过 infinite-scroll-distance 设置)时,绑定到 v-infinite-scroll 指令的方法就会被触发。

 
   
   
 
  1. <ul

  2.  v-infinite-scroll="loadMore"

  3.  infinite-scroll-disabled="loading"

  4.  infinite-scroll-distance="10">

  5.  <li v-for="item in list">{{ item }}</li>

  6. </ul>

  7. loadMore() {

  8.  this.loading = true;

  9.  setTimeout(() => {

  10.    let last = this.list[this.list.length - 1];

  11.    for (let i = 1; i <= 10; i++) {

  12.      this.list.push(last + i);

  13.    }

  14.    this.loading = false;

  15.  }, 2500);

  16. }

自己还封装一个简单的滚动加载组件

之前有些过一篇关于这个组件的博客文章:https://blog.csdn.net/qq_36772866/article/details/86530684 也在知乎写过同样的文章: https://zhuanlan.zhihu.com/p/55123532

 
   
   
 
  1. cd vue_component //进入vue_component目录

  2. npm install //执行此命令

  3. npm run serve //执行此命令即可将项目跑起来

vue.js移动端记账本完成的总结(未完待续,电脑快没电了)

遇到跨域问题的解决方案如下

vue.js请求后台遇到跨域引爆这篇文章

Vue CLI3本地代理配置

vue-cli3的本地代理配置

使用了vue-lazyload图片懒加载

一. vue lazyload插件:

demo:http://hilongjw.github.io/vue-lazyload/

二. 简单使用实例: 这个插件还是蛮好用的,就是感觉这个插件的开发文档有点太啰嗦了,一股脑把所有的api扩展都罗列出来,源码中并没有可以运行的实例提供。

其实这个插件做简单使用的话是很简单的,看官方文档的话反而被误导了,可以先按下边的实例实现简单引用,后边再根据开发文档做扩展。

  1. 安装插件:

 
   
   
 
  1.    npm install vue-lazyload --save-dev

  1. main.js引入插件:

 
   
   
 
  1. import VueLazyLoad from 'vue-lazyload'

  2.    Vue.use(VueLazyLoad,{

  3.        error:'./static/error.png',

  4.        loading:'./static/loading.png'

  5.    })

  1. vue文件中将需要懒加载的图片绑定 v-bind:src 修改为 v-lazy

 
   
   
 
  1. <img class="item-pic" v-lazy="newItem.picUrl"/>

vue-router的使用

 
   
   
 
  1. // 在进入下一个路由的时候,就获取到下一个页面的title显示出来

  2. // 需要注册一个全局守卫

  3. router.beforeEach((to, from, next)=>{


  4.  if(to.path=='/'){

  5.    //如果即将进入登录页面就是直接放心进入

  6.    next()

  7.  }else{

  8.    if(to.meta.requiresAuth && !localStorage.getItem('token')){

  9.      // 验证token是否存在

  10.      // to.meta.requiresAuth 是否为真

  11.      next({

  12.        path: '/',

  13.      })

  14.    }else{

  15.      if(to.meta.title){

  16.        document.title = to.meta.title

  17.      }

  18.      next();

  19.    }

  20.  }

  21. })

router.js

 
   
   
 
  1. // eslint-disable-next-line

  2. /* eslint-disable */

  3. import Vue from 'vue'

  4. import Router from 'vue-router'

  5. // import Login from "./views/Login.vue"

  6. Vue.use(Router)


  7. export default new Router({

  8.    routes:[

  9.        {

  10.            name: 'login',

  11.            path: '/',

  12.            component: ()=>import("./views/Login.vue"),

  13.            meta: {

  14.                title: '登录'

  15.            },

  16.        },

  17.        {

  18.            name: 'register',

  19.            path: '/register',

  20.            component: ()=>import("./views/Register.vue"),

  21.            meta: {

  22.                title: "注册"

  23.            }

  24.        },

  25.        {

  26.            name: 'addinfo',

  27.            path: '/addinfo',

  28.            component: ()=>import("./views/AddInfo.vue"),

  29.            meta: {

  30.                title: '记账',

  31.                requiresAuth: true,

  32.            }

  33.        },

  34.        {

  35.            name: 'editinfo',

  36.            path: '/editinfo/:id',

  37.            component: ()=>import("./views/EditInfo.vue"),

  38.            meta: {

  39.                title: '编辑',

  40.                requiresAuth: true,

  41.            }

  42.        },

  43.        {

  44.            name: 'showinfo',

  45.            path: '/showinfo',

  46.            component: ()=>import("./views/ShowInfo.vue"),

  47.            meta: {

  48.                title: '显示信息',

  49.                requiresAuth: true,

  50.            }

  51.        },

  52.        {

  53.            name: 'editriqi',

  54.            path: '/editriji',

  55.            component: ()=>import("./views/EditRiQi.vue"),

  56.            meta: {

  57.                title: '写日记',

  58.                requiresAuth: true

  59.            }

  60.        },

  61.        {

  62.            name: 'info',

  63.            path: '/info/:id',

  64.            component: ()=>import("./views/Info.vue"),

  65.            meta: {

  66.                title: '详细信息',

  67.                requiresAuth: true

  68.            }

  69.        }

  70.    ]

  71. })

此间遇到一个问题就是前台传递数据给后台,但是后台获取不到数据,数据格式是Request Payload

 
   
   
 
  1. 最近在调试代码时发现有Request Payload的情况,从网上查一些文件,

  2. 也都有较多的描述。下面我只是说明一下大家没有注意的地方


  3. 关于HTTP请求,都是通过URL及参数向后台发送数据。

  4. 主要方式有GET, POST。对这两种方式,GET的参数都会放在URL的后面,

  5. 一般称之为query参数。

  6. POST的都放在HTTP的报文BODY里,可以query参数的形式,

  7. 也可以multipart格式,还有一种JSON格式,即Request Payload格式。


  8. multipart, Request Payload是通过request Header中的ContentType区分的:


  9. multipart格式:ContentType: multipart/form-data;boundary=--xxxxxxx

  10. 注意对multipart的格式都要有boundary做为BODY中的参数分隔符,

  11. (关于该格式的讲解以后再写)


  12. Request Payload格式:ContentType: application/json


  13. 在后台的处理中对这三种格式的处理是不相同的。


  14. GET格式都在URL后面,以key1=value1&key2=value2KV格式存在,

  15. 且不会很长(协议规定为1024个字节,但现在浏览器都会适当加长一些)。

  16. 后台处理这种参数时可以使用同步处理,因为报文头收到后参数也就收全了。


  17. POST时参数也可以使用上面的KV格式存在,但是会放在报文体中。

  18. 当数据量不大时,一般也会和报文头一起收到。

  19. 但数据量大的时会被拆分到多个报文中。因此必须使用异步方式收取。收全后处理同GET相同。


  20. 对于multipart格式,需要使用流方式边收边解析,因为有可能是大文件上传。


  21. 对于RequestPayload格式,可能也是异步发送(这个没有验证过),

  22. 但数据量一般不会太大,因此它是一个JSON格式,因此必须等报文收全后才能处理。

  23. 目前对JSON格式的支持比较普遍,都有相关的函数来解析JSON字符串,

  24. 直接生成JSON对象,因此这种方式也是最方便的。

  25. 特别是使用nodejs server时就可以直接在代码中使用了。

解决方法就是:

 
   
   
 
  1. import qs from "qs"

  2. axios.interceptors.request.use((req) => {

  3.    if (req.method === 'post') {

  4.      // 转换成JSON格式

  5.      req.data = qs.stringify(req.data);

  6.    }

  7.    return req;

  8. }, (error) => Promise.reject(error));

http协议的Request Payload 和 Form Data 的区别

https://www.cnblogs.com/xuzhudong/p/8487119.html https://blog.csdn.net/zwq912318834/article/details/79930423

Axios传参的两种方式,表单数据和json字符串(Form Data和Request Payload)

 
   
   
 
  1. 第一种方式:Form Data

  2.  return request({

  3.    headers: {

  4.      'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'

  5.    },

  6.    transformRequest: [function(data) {      //在请求之前对data传参进行格式转换

  7.      data = Qs.stringify(data)

  8.      return data

  9.    }],

  10.    method: 'post',                             //请求类型

  11.    params: {},

  12.    data: {

  13.      'name': params.name,                      //传的参数

  14.      'jobId': params.jobId,

  15.      'department': params.department,

  16.      'phone': params.phone,

  17.      'position ': params.position,

  18.      'permis': params.permis,

  19.      'entryTime': params.entryTime

  20.    }

  21.  })

 
   
   
 
  1. 第二种方式:Json字符串

  2.  return request({

  3.    headers: {

  4.      'Content-Type': 'application/json'

  5.    },

  6.    transformRequest: [function(data) {

  7.      data = JSON.stringify(data)

  8.      return data

  9.    }],

  10.    url: '/test/add',

  11.    method: 'post',

  12.    params: {},

  13.    data: {

  14.      'name': params.name,                      //传的参数

  15.      'jobId': params.jobId,

  16.      'department': params.department,

  17.      'phone': params.phone,

  18.      'position ': params.position,

  19.      'permis': params.permis,

  20.      'entryTime': params.entryTime

  21.    }

  22.  })

前台讲完将后台

php不能获取前台传过来post的数据

 
   
   
 
  1. 原因是 Content-Type类型设置为payload

浅谈php接收POST数据的三种方式

 
   
   
 
  1. Web开发中,当用户使用浏览器向服务器POST提交数据时,

  2. 我们使用php接受用户POST到服务器的数据,并对数据进行解析和相应的处理.

  3. 以下是php接受POST数据的几种方式:


  4. 一.$_POST 方式接受数据

  5.   $_POST 方式是由通过HTTPPOST方法传递过来的数据组成的数组,

  6.   是一个自动全局变量.

  7. 注:只能接收Content-Type:application/x-www-form-urlencode提交的数据.

  8. 也就是只能接收表单POST过来的数据.


  9. 二.GLOBLES[‘HTTP_RAW_POST_DATA’]

  10.   如果访问原始POST数据不是php能够识别的文档类型,

  11.   比如:text/xml 或者soap等等,我们可以用$GLOBLES[‘HTTP_RAW_POST_DATA’]来接收,

  12.   $HTTP_RAW_POST_DATA变量包含有原始POST数据.此变量仅在碰到未识别的MIME数据时产生.

  13. 注: $HTTP_RAW_POST_DATA对于enctype=”multipart/form-data”表单数据不可用,

  14. 也就是说使用$HTTP_RAW_POST_DATA无法接受网页表单post过来的数据.


  15. 三. file_get_content(“php://input”);

  16.   如果访问原始POST数据, 更好的方法是使用file_get_content(“php://input”);

  17.   对于未指定Content-TypePOST数据,可以使用该方法读取POST原始数据,

  18.   包括二进制流也可以.和$HTTP_RAW_POST_DATA比起来.

  19.   它带来的生存眼里更小,并且不需要任何特殊的php.ini设置.

  20. 注: php://input不能用于 enctype=”multipart/form-data”.

  21. 例如:

  22. $postStr = file_get_contents("php://input"); //获取POST数据


  23. 四.名词解释

  24. 1.MIME数据类型:多用途互联网邮件扩展(MIME, Multipurpose Internet Mail Extension)是一个互联网标准,它扩展了电子邮箱标准, 使其能够支持ASCII字符,

  25. 二进制格式附件等多种格式的邮件消息.MIME规定了用于表示各种各样的数据类型的符号化方法.此外,在万维网中使用的HTTP协议中也使用MIME的框架.


  26. 2.原始数据:原始数据是指尚未处理的数据, 这些数据需要经过萃取,组织甚至分析与格式化后才能呈现给他人看.

php的header函数之设置content-type

 
   
   
 
  1. //定义编码  

  2. header( 'Content-Type:text/html;charset=utf-8 ');  


  3. //Atom  

  4. header('Content-type: application/atom+xml');  


  5. //CSS  

  6. header('Content-type: text/css');  


  7. //javascript  

  8. header('Content-type: text/javascript');  


  9. //JPEG Image  

  10. header('Content-type: image/jpeg');  


  11. //JSON  

  12. header('Content-type: application/json');  


  13. //PDF  

  14. header('Content-type: application/pdf');  


  15. //RSS  

  16. header('Content-Type: application/rss+xml; charset=ISO-8859-1');  


  17. //Text (Plain)  

  18. header('Content-type: text/plain');  


  19. //XML  

  20. header('Content-type: text/xml');  


  21. // ok  

  22. header('HTTP/1.1 200 OK');  


  23. //设置一个404头:  

  24. header('HTTP/1.1 404 Not Found');  


  25. header('HTTP/1.1 301 Moved Permanently');  


  26. header('Location: http://www.example.org/');  


  27. //文件延迟转向:  

  28. header('Refresh: 10; url=http://www.example.org/');  

  29. print 'You will be redirected in 10 seconds';  


  30. //当然,也可以使用html语法实现  

  31. // <meta http-equiv="refresh" content="10;http://www.example.org/ />  


  32. // override X-Powered-By: PHP:  

  33. header('X-Powered-By: PHP/4.4.0');  

  34. header('X-Powered-By: Brain/0.6b');  


  35. //文档语言  

  36. header('Content-language: en');  


  37. //告诉浏览器最后一次修改时间  

  38. $time = time() - 60; // or filemtime($fn), etc  

  39. header('Last-Modified: '.gmdate('D, d M Y H:i:s', $time).' GMT');  


  40. //告诉浏览器文档内容没有发生改变  

  41. header('HTTP/1.1 304 Not Modified');  


  42. //设置内容长度  

  43. header('Content-Length: 1234');  


  44. //设置为一个下载类型  

  45. header('Content-Type: application/octet-stream');  

  46. header('Content-Disposition: attachment; filename="example.zip"');  

  47. header('Content-Transfer-Encoding: binary');  

  48. // load the file to send:  

  49. readfile('example.zip');  


  50. // 对当前文档禁用缓存  

  51. header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');  

  52. header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past  

  53. header('Pragma: no-cache');  


  54. //设置内容类型:  

  55. header('Content-Type: text/html; charset=iso-8859-1');  

  56. header('Content-Type: text/html; charset=utf-8');  

  57. header('Content-Type: text/plain'); //纯文本格式  

  58. header('Content-Type: image/jpeg'); //JPG***  

  59. header('Content-Type: application/zip'); // ZIP文件  

  60. header('Content-Type: application/pdf'); // PDF文件  

  61. header('Content-Type: audio/mpeg'); // 音频文件  

  62. header('Content-Type: application/x-shockw**e-flash'); //Flash动画  


  63. //显示登陆对话框  

  64. header('HTTP/1.1 401 Unauthorized');  

  65. header('WWW-Authenticate: Basic realm="Top Secret"');  

  66. print 'Text that will be displayed if the user hits cancel or ';  

  67. print 'enters wrong login data';

下载xlsx文件

 
   
   
 
  1. $filename = rtrim($_SERVER['DOCUMENT_ROOT'],'/').'/app/files/payment_status.csv';  

  2. header('Content-Disposition: attachment; filename=payment_status.xlsx');  

  3. header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');  

  4. header('Content-Length: ' . filesize($filename));  

  5. header('Content-Transfer-Encoding: binary');  

  6. header('Cache-Control: must-revalidate');  

  7. header('Pragma: public');  

  8. readfile($filename);

php命名空间的学习

https://zhuanlan.zhihu.com/p/53981022

php empty 与 unset 区别

https://zhuanlan.zhihu.com/p/54716875

阿里云服务器ubantu14.04部署lavaral5.7博客

https://zhuanlan.zhihu.com/p/54818773

ubuntu14.04 apache修改网站根目录以及默认网页

https://zhuanlan.zhihu.com/p/54867843

php操作mysql数据库中fetch_array/assoc/row/object区别

https://zhuanlan.zhihu.com/p/55029525

今天写开源项目用到的几个php应用

https://zhuanlan.zhihu.com/p/55169371

php生成token

https://blog.csdn.net/panxiaomao11/article/details/71663032

mysql学习(一)MySQL存储引擎

https://zhuanlan.zhihu.com/p/55226412

mysql学习(二)数据类型

https://zhuanlan.zhihu.com/p/55256359

mysql学习(三)运算符

https://zhuanlan.zhihu.com/p/55265206

mysql学习(四)数据库

https://zhuanlan.zhihu.com/p/55279412

开源项目移动端记账本接口文档编写

登录界面Login.vue 每个页面都要认证,如果说他是没有登录,无论访问哪个页面都跳转到首页登录

 
   
   
 
  1. request 请求

  2. {

  3.    user_name: String 用户名,

  4.    user_pass: String 密码

  5. }

  6. response 响应

  7. 点击请求登录前台记录本地缓存用户名

  8. 缓存用户id

  9. 缓存token验证

  10. 缓存用户头像img

  11. 缓存

  12. {

  13.    code: int 0表示成功,其他表示失败,

  14.    user_id: int 用户 id,

  15.    user_name: string 用户昵称,

  16.    user_img: string 用户头像,

  17.    message: "登录成功",

  18.    token: string,


  19. }

  20. 如果用户没有注册过就去登录,要提醒用户去注册

注册页面Register.vue

 
   
   
 
  1. request 请求

  2. {

  3.    user_name: String 用户名,

  4.    user_pass: String 密码

  5. }

  6. 将用户名写入本地缓存中。

  7. response 响应

  8. {

  9.    user_id: int 用户id,

  10.    user_name: string 用户昵称,

  11.    code: int 0表示成功,其他表示失败,


  12. }

  13. token写入缓存中

  14. 注册成功之后,跳转到登录页面

记账页面AddInfo.vue

 
   
   
 
  1. request 请求

  2. {

  3.    date: string 日期,

  4.    morning: string 早餐花费,

  5.    afternoon: string 午餐花费,

  6.    evening: string 晚餐花费,

  7.    other: string 其他花费,

  8.    token: string token验证,

  9.    userid: int 用户id

  10. }

 
   
   
 
  1. response 响应

  2. {

  3.    code: int 0表示成功,其他表示失败,

  4.    message: string 用户提示语,

  5.    user_id: int 用户id

  6.    id: int 数据插入的id

  7. }

修改记账EditInfo.vue

 
   
   
 
  1. request 初始化请求

  2. {

  3.    userid: int 用户id,

  4.    editid: int 编辑id,

  5.    token: string 验证,

  6. }

  7. reponse 初始化,返回特定的一条数据

  8. {

  9.    userid: int 用户id,

  10.    editid: int 编辑id,

  11.    code: int 0表示成功,其他表示失败,

  12.    date: string 日期,

  13.    morning: string 早餐花费,

  14.    afternoon: string 午餐花费,

  15.    evening: string 晚餐花费,

  16.    other: string 其他花费,

  17.    msg: "提示语"

  18. }


  19. 修改后request请求

  20. {

  21.    date: string 日期,

  22.    morning: string 早餐花费,

  23.    afternoon: string 午餐花费,

  24.    evening: string 晚餐花费,

  25.    other: string 其他花费,

  26.    userid: int 用户id,

  27.    editid: int 编辑id,

  28.    token: string 验证,

  29. }


  30. 修改后reponse响应

  31. {

  32.    userid: int 用户id,

  33.    editid: int 编辑id,

  34.    code: int 0表示成功,其他表示失败,

  35.    msg:"提示语",

  36. }

展示记账简略信息ShowInfo.vue

 
   
   
 
  1. request 初始化请求

  2. {

  3.    userid: int 用户id,

  4.    page: int 页数,

  5.    count: int 一页显示的数量,

  6.    token: string 验证,

  7. }

  8. reponse 初始化,返回特定的一条数据

  9. {

  10.    userid: int 用户id,

  11.    code: int 0表示成功,其他表示失败,

  12.    data: [

  13.        {

  14.            id: int ,

  15.            date: string 日期,

  16.            path: string头像

  17.        },

  18.        {

  19.            id: int ,

  20.            date: string 日期,

  21.            path: string头像

  22.        },

  23.        {

  24.            id: int ,

  25.            date: string 日期,

  26.            path: string头像

  27.        }

  28.    ],

  29.    msg: "提示语"

  30. }


  31. 修改后request请求

  32. {

  33.    date: string 日期,

  34.    userid: int 用户id,

  35.    editid: int 编辑id,

  36.    token: string 验证,

  37. }


  38. 修改后reponse响应

  39. {

  40.    userid: int 用户id,

  41.    editid: int 编辑id,

  42.    code: int 0表示成功,其他表示失败,

  43.    msg:"提示语",

  44. }

显示详细信息Info.vue

 
   
   
 
  1. request 请求

  2. {

  3.    userid: int 用户id,

  4.    infoid: int 信息id,

  5.    token: string 验证,

  6. }


  7. response 响应

  8. {

  9.    userid: int 用户id,

  10.    editid: int 编辑id,

  11.    code: int 0表示成功,其他表示失败,

  12.    date: string 日期,

  13.    morning: string 早餐花费,

  14.    afternoon: string 午餐花费,

  15.    evening: string 晚餐花费,

  16.    other: string 其他花费,

  17.    msg: "提示语"

  18. }

写日记EditRiQi.vue

 
   
   
 
  1. request 请求

  2. {

  3.    userid: int 用户id,

  4.    content: string 日记内容,

  5.    token: string 验证

  6. }


  7. reponse 响应

  8. {

  9.    userid: int 用户id,

  10.    code: int 0表示成功,其他表示失败,

  11.    msg: "提示语"

  12. }

学习了一下mint-ui

今天研究了一下上拉加载数据组件

https://blog.csdn.net/qq_36772866/article/details/86530684

最终界面如下:

vue.js移动端记账本完成的总结(未完待续,电脑快没电了)

登录

vue.js移动端记账本完成的总结(未完待续,电脑快没电了)

记账

vue.js移动端记账本完成的总结(未完待续,电脑快没电了)

显示信息

vue.js移动端记账本完成的总结(未完待续,电脑快没电了)

编辑

详细信息

前台代码

https://gitee.com/kennana/mobileaccountbook

 
   
   
 
  1. git clone https://gitee.com/kennana/mobile_account_book.git

  2. cd mobile_account_book

  3. npm install

  4. npm run serve

后台代码

https://gitee.com/kennana/accounting_backstage

 
   
   
 
  1. git clone https://gitee.com/kennana/accounting_backstage.git

工作总结

https://gitee.com/kennana/work_summary

 
   
   
 
  1. https://gitee.com/kennana/work_summary.git


以上是关于vue.js移动端记账本完成的总结(未完待续,电脑快没电了)的主要内容,如果未能解决你的问题,请参考以下文章

浅析Socket建立过程(未完待续)

DevExpress Ribbon 相关总结(未完待续)

iOS面试题总结-未完待续

iOS面试题总结-未完待续

javascript有用小功能总结(未完待续)

关于DOM的一些总结(未完待续......)