• vue-ui


    vue ui组件库

     vue 当前很火前端框架vue用户群非常多, vue 开始针对PC端设备而不针对移动设备开发

     pc端与移动端区别:

      -屏幕宽度: <=750px

      -操作方式:pc 鼠标 移动 手指

     国内团队:饿了么:基于vue开发移动端组件库 mint-ui

              mui   移动组件库

    vue ui使用组件库

     -下载组件 js;css;fonts 在项目中即可使用

     -使用脚手架 下载配置使用

       *脚手架管理非常多第三方模块

     *webpack将项目打包

     -node_modules  第三方模块

       mint-ui

      -package.json

      "script":{

        "serve":"...."

      }

     vue 脚手创建新组件(网页)

      -创建空组件

           src/components/Test.vue

      -为空组件配置访问路径 router.js

         /Test

      -测试

        http://127.0.0.1:8080/#/Test

        创建组件List.vue

        位置:src/componets/List.vue

        访问路径: /List

        在data中保存数组数据其中3用户对象 {id:1,name:"tom"}

        并且将用户对象值显示模板中

      

    常见错误:

       1: ERROR  Failed to compile with 1 errors 

          error  in ./src/router.js

         This relative module was not found:

         ./components/Test1.vue

        错误: compile 编译出错(书写代码出错)

       

       2: ERROR  Failed to compile with 1 errors 

       tag <template> has no matching end tag

       原因:<template></template>

     为脚手架添加组件库:

        移动端组件库(mint-ui)   官方网站: http://mint-ui.github.io/#!/zh-cn

       (1)下载mint-ui组件库

          npm i mint-ui  -S

       (2)在main.js 引入组件(按需加载)

          import {Header} from "mint-ui"

       (3)在main.js 注册组件

          Vue.component(Header.name,Header);

       (4)在指定组件使用组件 List.vue

          <template>

             <mt-header title="XX商城"></mt-header>

          </template>

       #注意:css文件单独引入

    1.1 vue ui学子商城--创建表app_server_00/db.sql

         xz_login

         id        INT PRIMARY KEY AUTO_INCREMENT

         uname    VARCHAR(25)

         upwd     VARCHAR(32)

        #mysql函数 md5('123')=>8sxj23jksd89xcjkw2

        1   tom   202cb962ac59075b964b07152d234b70

        #用户登录判断

        --用户输入 tom  123

        --程序  md5(123)  202cb962ac59075b964b07152d234b70

    1.2 创建服务器端程序  app_server_00/app.js

           功能一:用户登录

          -客户请求方法GET  客户请求路径 /login

          -获取客户参数 用户名/密码 uname;upwd

          -sql 

             SELECT id FROM xz_login

             WHERE uname =? AND upwd = 'md5(?)

          -返回数据格式 json

             {code:1,msg:"登录成功"}

             {code:-1,msg:"用户名或密码有误"}

    常见错误

     1: 该网页无法正常运作

         node.js 程序己经停止工作出错

         解决问题:查看node.js 窗口出现信息

         res.send(status, body):: Invalid status code

         res.send()中间只能字符串;数组;js对象

     2: Error: Can't set headers after they are sent

         原因:你在程序中一个流程执行二次 res.send();

         res.send(); 功能:发送数据+再也不发数据停止工作

         res.send()

         解决问题:将前面send注释

    3: Error: listen EADDRINUSE :::3000

         原因: 有下程序正在运行占用3000端口

               再启动程序占用3000 报错地址冲突

         解决:关闭原先程序 vs code 点击回收站

      1.3脚手架创建 Login.vue

         1:打开脚手架创建空组件

           src/components/tabbar/Login.vue

          2:配置路径 /Login

     

    2.1:学子商城--用户登录

         -为登录按钮绑定点击事件 @click="btnClick"

          为用户和密码双向绑定

         -btnClick

          获取用户名和密码

          发送ajax

          this.axios.get();

    2.2:提示用户信息  登录成功 用户名格式不正确

         mint-ui   Toast("提示消息");

         -由于此功能不是每个组件都使用

         -在main.js 引入注册全局组件,所有自定义组件都要使用

         -局部组件使用Toast

         (1)在当前组件 import {Toast} from "mint-ui"

         (2)Toast("消息")

     2.3:发送ajax  使用axios第三方模块

         -下载第三方模块 npm i axios

         -在main.js 引入模块

          import axios from "axios"

         -在main.js 配置跨域访问保存session值选项

          axios.defaults.withCredentials=true

         -在main.js 将axios配置vue实例中

          Vue.prototype.axios = axios

         -在当前组件库中使用axios

          this.axios.get(url).then(result=>{})

     常见错误:

          - Access-Control-Allow-Origin 跨域访问

          脚手架8080  -->  node.js 3000   端口不同

          解决问题

          -node.js下载第三方模块 cors

          -app.js 引入模块

          const cors = require("cors");

           -在服务器配置允许来自8080所有请求

          app.use(cors({

            origin:["http://127.0.0.1:8080","http://localhost:8080"],

            credentials:true

           }))

          origin:允许访问列表

          credentials:每次访问验证

    常见错误:

         1:用户名无论正确或者错误,服务器都是错误

         -分析原因

         -解析:F12 network控制面板

      2.4:学子商城--商品列表

       功能:用户选中商品列表组件显示商品列表(一页)

       点击[加载更多]显示下一页...

        完成上述功能

        -数据库表

        -node.js 程序

        -脚手架

    2.5:学子商城--商品列表-数据库表[多表查询]

         1:xz_laptop   lid[商品编号]/lname[商品名称]/price[价格]

         2:xz_laptop_pic  laptop_id ,md[商品中图]

         多表查询(套路)

         -将表名保存from关键字后面

          from xz_laptop,xz_laptop_pic

         -为每张表起一个别名

          from xz_laptop l,xz_laptop_pic p

         -查找两张表关系(二张表某一列 相等 大于 小于)

          WHERE l.lid = p.laptop_id

         最终结果

         SELECT l.lid,l.lname,l.price,p.md

         from xz_laptop l,xz_laptop_pic p

         WHERE l.lid = p.laptop_id

         GROUP BY l.lid

         LIMIT 0,7;

         小结:多表查询方法使用三步套路

              多行相同数据只取第一个 GROUP BY

              分页 LIMIT

       -node.js 程序学子商城--商品列表

        获取脚手架发送二个数据 第几页 一页几行

        查询数据库内容并且将结果返回

        -参数 pno[第几页]  pageSize[一页几行]

              默认值 pno=1 pageSize=4

        -sql   现成

        -json  {code:1,data:[..]}

     常见错误:

        1: 无法访问此网站

        原因:node.js 出错停止工作

        解决:看node.js 窗口出错信息

        SQL syntax sql语法出错 在附近 LIMIT

     2.6:学子商城--商品列表-脚手架

        -分析设计外观

         最外层父元素弹性布局

         子元素弹性布局

         子元素宽度 49%

        -创建空组件 src/componet/tabbar/GoodList.vue

        -指定组件访问路径 /GoodList

        #项目很多图片:商品图片,广告..

        #所有图片都保存服务器  node.js

    学子商城--商品列表(mint-ui)

      1.1 发送ajax请求获取商品列表

       1:什么发送请求 [打开组件时候 1页][点击按钮 2 3]

       2:在哪实现功能 当前组件 created()

       通用方法:

       -先创建方法 loadMore() 加载更多

       -created(){this.loadMore()}

       -点击加载更多按钮 this.loadMore();

      1.2:完成学子商城--商品列表-添加按钮(mint-ui)

       mint-ui button

       -main.js 引入Button组件

       -main.js 注册 Button组件

       -<mt-button>加载更多</mt-button>

       -为button组件绑定点击事件,完成加载下一页功能

       #解决问题:加载一页完成追加功能

       #数组拼接操作

       [一页 二页]

       var rows = this.list.concat(result.data.data);

       this.list = rows;

    1.3:完成学子商城--首页(mint-ui/mui)

       #主要完成功能   脚手架

       -创建首页组件   src/componets/tabbar/Home.vue

       -指定首页路径   /Home

      (1)顶部导航条

     完成学子商城--首页-顶部导航条

     -mint-ui组件库 header 组件

     -main.js 引入组件 import {Header} from "mint-ui"

     -注册组件        Vue.component(Header.name,Header)

     -在模板中调用    <mt-header></mt-header>

      属性:

      title="显示文字"

      fixed  固定在顶部

       (2)轮播图

    完成学子商城--首页-轮播图

      -引入组件 main.js

        import {Swipe,SwipeItem} from "mint-ui"

      -注册组件 main.js

        Vue.component(Swipe.name,Swipe);

        Vue.component(SwipeItem.name,SwipeItem);

      -在模板调用 Home.vue

       <mt-swipe>

         <mt-swipe-item> 1 img..</mt-swipe-item>

         ...

       </mt-swipe>

      #属性

        :auto="4000"  自动播放的时间间隔

      #注意:默认轮播图高度为 0

       (3)九宫格

    完成学子商城--首页-九宫格

       -九宫格组件库 MUI 独立库与VUE关系不是绑定

       -下载对应文件 mui [css;js;fonts]

       -src/lib/mui/....

       -main.js 直接加载css文件即可

        import './lib/mui/css/mui.css'

        import './lib/mui/css/icons-extra.css'

       -在对应组件添加标签和样式

       (4)tabbar

     完成学子商城--首页-tabbar

       mui 库

       复制 tabbar.html 标签到 Home.vue组件

     1.4: 扩展知识-图片宽度

       公司前端设计师:[PS]设计效果图

       前端开发工程师:  html/css/js/vue...

       物理像素:设计效果图中像素  120px

       逻辑像素:程序中使用中像素  60PX

       #智能手机:iphone4 技术标准

       #手机系列:苹果/安卓

       #公司工作:效果图片 iphone6

       #iphone6 逻辑像素与物理    2x  DPR

      1.1:学子商城--购物车(重点)

    XZ cart
    id    img_ _url price count title uid

    1.2:购物车--购物车--appjs

    -查询指定用户购物车列表   tom/123   登录
    (1)参数(不用脚手架传递参数) 1
    var uid = req.session.uid;
    (2)sq|
    SELECT id,img_ url,price,title FROM xz_ _cart WHERE uid= ?
    (3)json

    {code:1,data:([...]}

    示例:
    (1)先登录
    http://127.0.0.1:3000/login?uname=tom&upwd=123

    别关闭浏览器
    (2)查购物车

    http://127.0.0.1:3000/cart
    -删除指定购物车中一个商品

    -app.js
    参数:id
    sq|:
    DELETE FROM XZ_ cart WHERE id= ?
    json: {code:1,msg:"删除成功"}

    测试: http://127.0.0.1:3000/delltem?id=4

    -Cart.vue
    -删除指定购物车中多个商品
    -显示确认框this.$messagebox(",");

    1.3:购物车--购物车--Cart.vue

    2.1:购物车完成


    服务器端程序完成
    测试
    http://127.0.0.1:3000/delAll?ids=7,9
    http://127.0.0.1:3000/delAll?ids=8

    -<mt- button>删除指定数据</mt-button>
    --判断选哪个商品lst:[{cb:true,id:1},{cb:true,id:2},{cb:false,d:3}]
    --拼接字符串1,2
    --判断如果用户没有选中商品提示

    2.2:vuex作用


    vuex  是一个容器用于保存多个组件共享数据
    当前组件data其中数据可以在当前组件中使用,其它组件
    不能使用data中数据
    解决问题

    (1)使用vuex多个组件共享使用数据
    (2)当某个组件修改共享数据

    vuex通知所有使用此数据组件更新数据.保证所有组件使用数据状态统一

    2.3:vuex使用方式

    -脚手架下载vuex第三方模块     npm i vuex -S
    结果:node_ modules/vuex/...

    -main.js引入   vuex

    import Vue from "vuex"
    -创建vuex实例对象

    var store = new Vuex.Store({
    state:{},
    mutations:{},
    getters:{}
    })
    state:      保存全局共享数据
    mutations:修改全局共享数据函数
    getters:获取全局共享数据函数

    -main.js-将vuex注册vue实例中

    Vue.use(vuex);
    new Vue({strore})

    -其它组件获取vuex数据<template>

    {{$store.getters.获取数据方法}}

    -其它组件操作vuex数据   js

    this. $store.commit("修改数据方法")

    2.4:示例:将购物车中数量保存vuex

    state:{cartCount:0}      #购物车数量
    mutations:{
    increment(state){ #将购物车数量加 1
          state.cartCount++;
          }

        }

    getters:{
    getCartCount(state){
    return state.cartCount; #获取购物车 数量
           }
       }

    <template>
    <div>{{$store.getters. getCartCount }}</div>
    </template>

     购物车:功能保存用户希望购买商品,需要长期保存

      数据库;cookie;...

      分析购物车外观

      (1)mui card.html

      (2)mui media-list.html

      开始流程:

      -先创建组件 ShopCart.vue   /ShopCart

     2.5:学子商城--购物车(重点)--删除指定商品

      -数据库表:

      xz_cart[id, uid,pid,pname, price]

      -node.js 程序:

       /removeItem

       参数:id购物车id

       sql:DELETE FROM xz_cart WHERE id = ?

      -脚手架组件:

       [button] onclick ajax

       脚手架删除当前商品

      -常见错误

      (1)node.js NaN   id=undefined

      原因:数据从组件没有发送node.js

      post请求

      解决:F12->NETWORK->Header->response

      Header标签

      FormData post请求发送数据格式与内容

      id:3

    3.1:学子商城-商品列表-主页

    3.2:学子商城--商品列表数据库xz_ laptop


    (1)修改xz_ laptop 添加一列img_ url
    (2)更新   "01.jpg"   "02.png"
    (3)vue_ server_ 00/public/img/01.jpg 02.png 图片保存目录


    3.3:学子商城--商品列表-app.js

    (1)指定静态目录public
    (2)分页显示商品信息
    -参数pno页码pageSize 页大小(每页几行)
    默认值:pno:1 pageSize:4

    -sql
    (1)查询当前页内容

    SELECT lid,price,title,img_ url FROM XZ_ laptop  
    LIMIT ?,?

    ?起始记录数(pno-1)* pageSize;
    ?几行
    示例:
    第一页:SELECT lid,price,title,img_ url FROM Xz_ _laptop LIMIT;

    第二页:SELECT lid,price,title,img_ url FROM Xz_ _laptop LIMIT 4,4; 

    (2)总页数
    SELECT count(*) as C FROM XZ_ laptop;
    Math.ceil(43/4)==11
    json
    {code:1,msg:"查询成功",data:[],pageCount:11})

    问题一:是单页面程序
    脚手架打包命令: npm run build
    生成单页面程序
    生成目录dist/
    问题二:pool.query为什么嵌套平行
    var sq|1
    var sq|2

    pool.query(sq|1);
    pool.query(sq|2);

    3.4:学子商城--商品列表Product.vue显示商品列表

    (1)创建Product.vue
    (2)发送ajax请求获取分页数据created()
    /product
    (3)获取服务器返回数据循环显示内容
    (4)当用户点击"加载更多"显示下一页

     学子商城项目小结

       -用户登录

         表    xz_login[id,uname,upwd]   md5()

                       1  tom  202s03kd93827899b07

         app.js app.get("/login",(req,res));

               *参数 uname;upwd

               *sql  SELECT id FROM xz_login

                    WHERE uname = ? AND upwd = md5(?)

               *json {code:1,msg:"登录成功"}

                    {code:-1,msg:"用户名或密码有误"}

         Login.vue

              <form>

                  <input type="text" v-model="uname" />

                  ..

                  <input type="button" value="" @click="loginBtn" />

              </form>

              Toast("提示")

      -商品列表

         表:xz_laptop(商品表) xz_laptop_pic(商品图片表)

         app.js:

           *参数:pno 页码 pageSize 页大小(一页几行)

           *sql:SELECT l.lid,l.lname,l.price,p.md

              FROM xz_laptop l,xz_laptop_pic p

              WHERE l.lid = p.laptop_id

              LIMIT ?,?

              ?:offset = (pno-1)*pageSize;

              ?:pageSize = parseInt(pageSize)

           *json:{code:1,data:[]}

         GoodList.vue

           <div class="item"> 

                <img src="" />

                <span>999.00</span>

           </div>

           -loadMore  加载下一页数据

            *显示第一页第二页数据.. concat 数组拼接

            *点击下载更多按钮

            *created()

           -pno:0 list:[]

       -首页

           -表

           -app.js

            app.get("/imglist")   轮播图

            app.get("/grid")     九宫格

           -Home.vue

            *顶部导航栏 mint-ui Header

            *轮播图     mint-ui Swipe/SwipeItem

            *九宫格     mui/grid_default.html

            *tabbar      mui/tabbar.html

     1.1:完成weixin--面板

            <mt- tab-container v-mode|=" active">

        <mt-tab-container-item id="message">

            <messagelist></messagelist>

       </mt-tab-container-item>

     </mt-tab-container>

    1.2:完成weixin--底部导航条

    <mt-tabbar v-model=" active" fixed>.
    <mt-tab-item id="message">.
    图片:子组件
    文字
    </mt-tab-item>
    </mt-tabbar>

     

    1.3:完成weixin--底部导航条-按钮.上显示图片子组件

    TabBarlcon.vue
    -focused:false当 前按钮是否是焦点
    -selectedlmage:选中显示图片
    -normallmage:默认显示图片

    1.4:修改tabbar默认样式

    /*修改tabbar默认文字颜色*/
    .mint-tabbar>.mint-tab-item{
    color:#99999;
    }
    /*修改tabbar选中文字颜色*/
    .mint-tabbar>.mint-tab-item.is-selected{

    color:#45c018;
    }


    父元素给子元素绑定事件 native#注意: vue事件有- -些修饰符native: 原生事件
    如果自定义属性直使用事件绑定即可,如果调用组件库中组件
    直接绑定失败情况,清加修饰符native启动原生事件绑定

    #注意:去除默认边框
    -App.vue根组件它的内补丁影响我们组件
    -normalize.css通用样式文件
    public/n.css
    public/index.html

     

     1.1:学子商城--新闻列表

       分析功能:创建新闻列表组件 NewsList.vue

       -创建新组件 src/component/home/NewsList.vue

       -为组件指定路径  /NewsList 

       -修改组件外观    mui/media-list.html

       -组件创建成功后发送第一页请求

       -点击组件"加载更多"按钮 发送下一页请求

     1.2:学子商城--新闻列表-日期格式错误

       网页通常日期格式货币格式不满足要求使用过滤器

       解决问题

       格式:

       *main.js创建全局过滤器其它任意组件都可以直接调用

       Vue.filter("过滤器名称",function(原始数据格式){

          对原始数据格式处理

          返回字符串

       })

       *在模板中直接调用过滤器

       {{item.ctime | 过滤器名称}}

     1.3:组件之间跳转与数据传递

         (1)组件之间跳转

           方式一:标签

             <router-link to="组件路径">文字</router-link>

             示例:Exam01 -> Exam02

             <router-link to="/Exam02">跳转组件</router-link>

           方式二:编程

             this.$router.push("组件路径");

             示例:

             <img src="1.jpg"  @click="jump"/>

             function jump(){

                this.$router.push("组件路径")

             }

         (2)数据传递

           发送数据:

            方式一:<router-link :to="'/Exam02?nid='+item.id">...

            方式二:this.$router.push("/Exam02?nid=5")

           接收数据: this.$route.query.nid

           #最早接收数 created()

    2.4:学子商城--新闻详细--评论列表(子组件)

       -创建空组件 src/component/home/NewsInfo.vue

       -为此组件绑定路径  /NewsInfo

       -显示新闻详细信息  mui/card.html

       -当用户点击新闻列表中某条新闻

        跳转NewsInfo.vue 组件nid=3

       -将当前新闻编号传递NewsInfo.vue组件

     2.5:学子商城--新闻详细

        表:xz_news

       id INT

       img_url VARCHAR(255)

       title   VARCHAR(225)

       ctime  DATETIME

       point   INT

       content VARCHAR(20000)

     

       技巧1:SQL

        var sql = "INSERT INTO xz_comment VALUES(null,?,?,now())";

        1年项目升级,在表xz_comment添加3列

        var sql = "INSERT INTO xz_comment(id,nid,content,ctime)";

        sql+="VALUES(null,?,?,now())";

       技巧2:post请求 vue 使用ajax库 axios

        #原因 axios 处理post请求参数有一个内部问题.

        #第三方式 qs 将js对象转换字符串

        1:在main.js 引入qs 模块,将模块注册Vue实例

          import qs from "qs"

          Vue.prototype.qs = qs;

        2:发送post数据将数据先创建js对象再用qs转换

         字符串.

        var postData = this.qs.stringify({

           nid:3,

           content:"..."

         });

       this.axios.post(url,postData).then(...)

    -session(会话)会话指用户操作过程


    (1)会话开始:用户打开某个网站第一个网页
    (2)会话中:中间可以打开网站多个网页
    (3)会话结束:当用户关闭浏览器
    -session对象

    session对象用来保存此次会话中所有网页共享数据
    如果会话结束session 中保存数据丢失
    将哪些数据保存session对象:uid当前登录用户编号
    #此编号是当前用户登录成功唯一凭证

    -程序中如何使用session(1)服务器node app.js

    -引入express-session模块
    const session = require("express-session")
    -配置express-session模块
    server.use(session({
    secret:"128位字符串“,#自定义字符串用于加密数据使用

    reserve:true,#每次请求更新数据

    saveUninitialized:true  #保存初始化数据。

    }))
    -将数据保存session对象

    req.session.uid = 2;  #正确
    req.session.id = 2;  #错误
    #为什么不能用id原因,session 对象自己有一个属性id

    -从session中获取数据

    var uid = req.session.uid;

    示例(1):
    用户登录成功将uid保存session中,用户获取购物中内容读取session中uid作为判断条件

    app.get("/login" ,(req,res)=>{
    if(result.length> 0){
    req.session.uid= 1;
    }
    })

    -app.get("/cart' ',(req,res)=>{
    var uid = req.session.uid;,
    if(!uid){
    //没登录. 
    }
    })

     

    (2)脚手架

    main.js
    1:配置axios发送ajax请求时保存session信息
    axios.defaults.widthCredentials=true
    2:配:置axios基础路径
    axios.defaults.baseURL = "http://127.0.0.1:3000/"
    示例:登录
    this.axios.get("login")

    常见错误
    -this.axios.get("http://127.0.0.1:3000/login");
    -this.axios.get("http://localhost:3000/cart");

    #######如何调试ajax错误

    (1)按F12->network网络控制面板->
    -登录操作
    -出现新请求信息login  xhr   点击项目
    -查询header标签:检测出参数传递是否正确
    -查询response标签:检测出返回结果是否正确

     

    2.1:错误集锦


    (1)脚手架启动错误
    errno -4058
    -启动目标没有脚手架程序

    -node_ modules 出错造成启动。
    (2)原因:前一个脚手架没有停止   ctrl+C
    http://127.0.0.1:8081/

    (3)原因:node.js出错停止工作
    查询node.js控制台
    Uncaught (in promise) Error: Network Error

    (4)原因: connect ECONNREFUSED 127.0.0.1:3306
    mysql停止工作

    (5) Unknown column 'name' in 'where clause'
    原因:未知列  name
    sq|语句中操作name列,但是表中没有此列

    解决:sq|语句错误/表没有不存在

    2.2:用户登录成功-跳转操作/Home1


    this. $router.push("组件路径");
    示例:
    登录成功跳转/Home1组件
    this .$router.push("/Home1");

    #创建空组件/Home1

  • 相关阅读:
    Nginx平滑升级
    svn部署-linux
    svn服务备份与还原
    vmware exsi安装部署
    redis主从复制读写分离
    redis配置文件详解
    zabbix与agent端通信加密
    部署owa预览服务
    zabbix-3.4邮件报警
    centos7--zabbix3.4微信报警
  • 原文地址:https://www.cnblogs.com/liuqingqing-bloom/p/13176834.html
Copyright © 2020-2023  润新知