vue cli2.0 + php + mysql 面向过程升级成面向对象

上期内容回顾

一、前言

       上期用最简单技术形式走通了前后台的需求,制作了一个任务管理系统,方便记录并规划每天的成长。

        写任务的核心是为了更好的规划时间,想象让你做一个计划系统你该如何考虑?

        1)首先你必须有地方去写,有地方展示

        2)展示时需区别未完成已完成的状态

        3)需要规定一个结束日期,并且加入提醒,到指定时间未完成的任务,需要写清理由。

        4)......

所以这期做一下调整:

1. 整体界面需要重新修改

2.PHP从面向过程升级成面向对象

3.删除接口从物理删除变为逻辑删除

4.因布局调整所影响前端逻辑的改良

5.基础SQL语法举一反三

二、调整样式

修改前
修改后

三、业务梳理

 前端逻辑主要是练习vue基本语法,以及事件触发之间的逻辑关系,如何跟php交互数据。

    主要功能:

    用户输入添加后变为待办项,完成后用户勾选变为已办项,每一项计划可删除和编辑,还记录了计划的条数和未完成的条数

勾选的样子


修改内容的样子


四、前端布局

上期的布局及样式完全推倒重做,代码如下:

 <div class="hello"

       id="box">

    <h4>任务便签</h4>

    <p style="font-size:12px;">总数为 <span style="color:#35b96d;">{{ arr.length}}</span>个,还有 <span style="color:#35b96d;">{{ choose() }}</span>个未完成</p>

    <p style="font-size:12px; text-align: right;">【<span style="color:#35b96d;"

            class="span1"

            @click='finish()'>清除已选</span>】【<span class="span1"

            @click='Allfinish()'

            style="color:#35b96d;">全部清除</span>】</p>

    <ul>

      <li v-for="(item,index) in arr"

          v-bind:class='{finish: item.bol}'>

        <span class="icon_num">{{index+1}}</span>

        <input type="checkbox"

               v-model='item.bol'

               @change="updataFn()"></input>

        <span v-text='item.des'

              v-show='!item.edit'

              @click='edit(index)'></span>

        <input type="text"

               v-model='item.des'

               v-show='item.edit'

               v-on:keyup.13='item.edit = !item.edit'

               @blur='item.edit = false;updataFn()'>

        <span class="redStyle delBtn"

              @click='del(item.des)'></span>

      </li>

    </ul>

    <textarea placeholder="安排新的任务吧"

              type="text"

              class="add"

              v-model='msg'

              v-on:keyup.13="add"></textarea><button @click='add()'>保存</button>

  </div>

-------------------------------------------------------------------------------------------------------------------

export default {

  name: 'HelloWorld',

  data () {

    return {

      arr: [

        // 数据结构:

        // des: 任务描述

        // bol: 任务完成标志

        // edit: 任务编辑标志

        // { des:'设计', bol:false, edit:false }

      ],

      msg: ''

    }

  },

  created () {

    if (localStorage.getItem('msg')) {

      //如果有就读取msg存到arr数组中

      this.arr = JSON.parse(localStorage.getItem('msg'))

    }

  },

  methods: {

    // 添加(判断msg是否为空,如果不为空就给arr数组里push内容,然后在把msg设置为空)

    add: function () {

      if (this.msg.replace(/[\r\n]/g, "") == '') {

        this.msg = ''

        alert('请输入名称');

        return;

      } else {

        for (var i = 0; i < this.arr.length; i++) {

          if (this.arr[i].des == this.msg.replace(/[\r\n]/g, "")) {

            this.msg = ''

            alert('任务名称不能重复');

            return;

          }

        }

      }

      this.arr.push({ des: this.msg.replace(/[\r\n]/g, ""), bol: false, edit: false });

      localStorage.setItem('msg', JSON.stringify(this.arr))

      this.msg = ''

    },

    //更新到本地存储中

    updataFn: function () {

      localStorage.setItem('msg', JSON.stringify(this.arr))

    },

    // 返回未完成的数量

    choose: function () {

      var num = 0;    // 未完成的数量

      this.arr.forEach(function (item) {

        if (!item.bol) {

          num += 1;

        }

      });

      return num;

    },

    // 返回未完成的任务

    finish: function () {

      var forNum = 0;

      for (var i = 0; i < this.arr.length; i++) {

        if (this.arr[i].bol) {

          forNum++

        }

      }

      if (forNum == 0) {

        alert('您需要选中复选框删除');

      }

      var temp = this.arr;

      this.arr = []

      for (var i = 0; i < temp.length; i++) {

        if (!temp[i].bol) {

          this.arr.push(temp[i]);

          console.log(temp[i])

        }

      }

      this.updataFn();

    },

    //单条删除

    del (des) {

      var index = this.arr.findIndex(item => {

        if (item.des == des) {

          return true

        }

      })

      this.arr.splice(index, 1)

      this.updataFn();

    },

    //清除每条数据

    Allfinish () {

      if (this.arr.length == 0) {

        alert('没有可删除的选项')

      } else {

        this.arr = [];

        this.updataFn();

      }

    },

    // 编辑

    edit: function (i) {

      if (this.arr[i].bol) {

        return;

      }

      this.arr[i].edit = true;

    }

  }

}

</script>

--------------------------------------------------------------------------------------------------------------

.redStyle{background:#ccc;display:inline-block;width:20px;height:20px;vertical-align:middle}

h4{color:#252434}

.delBtn{margin-top:15px;float:right;background:url(../../src/assets/del.png) no-repeat;background-size:60%;vertical-align:middle}

#box{width:580px;margin:30px auto;background:#fff;color:#222131;padding:30px 50px;border:1px solid #252434;border-bottom-width:4px;border-radius:3px;font-family:"Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei"}

li:nth-child(2n+2){margin-right:0}

.icon_num{opacity:.8;color:#fff;box-sizing:border-box;border-radius:100%;display:inline-block;background:#35b96d;font-size:11px;left:-5px;width:15px;height:15px;line-height:15px;vertical-align:middle;text-align:center;bottom:-8px;border-radius:100%}

input[type=text]{outline:0;width:100%;border:1px solid #f9f9f9}

li{position:relative;background:#fff;border:1px solid #ccc;border-radius:3px;box-sizing:border-box;padding:0 11px;list-style-type:none;width:47%;line-height:40px;font-size:14px;color:#5e5d6d;margin-bottom:10px;margin-right:16px;float:left;font-size:12px;overflow:hidden}

ul{padding-left:0;margin-top:30px;margin-bottom:20px;overflow:hidden}

.add{width:100%;height:80px;margin-right:10px;margin-bottom:5px;outline:0}

.span1{color:#87ceeb}

.finish{box-sizing:border-box;color:#ccc;text-decoration:line-through;height:40px;line-height:40px;background:#eee;font-size:14px;border:none}

textarea{border:1px solid #252434;font-family:"Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei";padding:5px 10px;box-sizing:border-box;background:#fff;color:#252434}

button{outline:0;width:100%;background:#252434;border:none;height:40px;color:#ccc}

五、后台逻辑


六、下期预告

⚠ 下期会增加定时提醒(包含声音和弹窗提示),历史查询和显示以天为单位。

⚠ 下期会增加删除的再次询问功能,避免误删。

⚠ 下期会调整修改的布局样式。

⚠ 下下期做一个响应式布局,来适配手机端、平板、pc端。

⚠  下下期加入登录和注册功能,加入users表。

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