快乐每一天

自己选择的路,跪着也要走下去...

tp5 加载 extend 类库的方法 (有命名空间和没有命名空间的调用)

如下自己开始的写法,还是会报错 ( 错误写法) : 没有命名空间的 调用

2019-04-01T13:17:42.png

没有命名空间的 调用 (正确写法)

2019-04-01T13:18:10.png

没有命名空间的 调用 (错误写法)

2019-04-01T13:18:35.png

有命名空间的调用

首先我想知道命名空间的名称 : 必须按照路径来书写吗? (是的)

2019-04-01T13:19:11.png

解决上述4 的问题,如果仔细看 tp5 的命名规范的话,估计也不会饶这么大的弯子

2019-04-01T13:19:33.png

有命名空间的调用 : 命名空间是自己随便命名的 : 错误写法

2019-04-01T13:19:54.png

有命名空间的调用 : 错误写法
命名空间是自己随便命名的 (想法错误) 2. 类名跟类文件名称一致 (想法正确)
2019-04-01T13:20:22.png

有命名空间的调用 : 正确写法
命名空间是类库所在的文件夹名称 (想法正确) 2. 类名跟类文件名称一致 (想法正确)
2019-04-01T13:20:48.png

有命名空间的调用 : 错误写法
命名空间是类库所在的文件夹名称 (想法正确) 2. 类名跟类文件名称不一致 (想法错误)

2019-04-01T13:21:10.png

参考链接1:https://segmentfault.com/a/1190000017093338
参考链接2:https://blog.csdn.net/qq_35669659/article/details/84558239

阅读全文

微信关于网页授权access_token和普通access_token的区别

本文也是做一个笔记,根据自己的调用经历,再到网上查阅资料去验证,防止自己弄混淆。如果以后发现了新的异同,会在进行补充.

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单中,点击查看设置方法,否则将无法调用成功。小程序无需配置IP白名单。

一、两种access_token的获取:

网页授权access_token的获取:
https://blog.csdn.net/cl11992/article/details/86528704
全局access_token的获取:
https://blog.csdn.net/cl11992/article/details/86304653

二、官方解释
关于网页授权access_token和普通access_token的区别

微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授权access_token),通过网页授权access_token可以进行授权后接口调用,如获取用户基本信息;
其他微信接口,需要通过基础支持中的“获取access_token”接口来获取到的普通access_token调用。

三、自己相同点
同名
有效期:两者有效时间都是7200s。

四、自己不同点
网页授权access_token需要先获取code,才能才获取网页授权access_token;全局access_token可以直接调接口进行获取。
使用范围:通过网页授权获得的access_token,只能获取到对应的微信用户信息(授权作用域scope必须为snsapi_userinfo),与微信用户是一对一关系;而全局的access_token可以获取所有用户信息。
次数限制:网页授权的access_token获取次数没有限制;全局access_token每天获取最多次数为2000次(这个次数可以申请增加)。

阅读全文

小程序地址选择仿美团(附源码)

2019-03-22T07:16:15.png

代码很简单

var city = require('../../utils/city.js');
var app = getApp()
Page({
  data: {
    searchLetter: [],
    showLetter: "",
    winHeight: 0,
    // tHeight: 0,
    // bHeight: 0,
    cityList: [],
    isShowLetter: false,
    scrollTop: 0,//置顶高度
    scrollTopId: '',//置顶id
    city: "上海市",
    hotcityList: [{ cityCode: 110000, city: '北京市' }, { cityCode: 310000, city: '上海市' }, { cityCode: 440100, city: '广州市' }, { cityCode: 440300, city: '深圳市' }, { cityCode: 330100, city: '杭州市' }, { cityCode: 320100, city: '南京市' }, { cityCode: 420100, city: '武汉市' }, { cityCode: 410100, city: '郑州市' }, { cityCode: 120000, city: '天津市' }, { cityCode: 610100, city: '西安市' }, { cityCode: 510100, city: '成都市' }, { cityCode: 500000, city: '重庆市' }]
  },
  onLoad: function () {
    // 生命周期函数--监听页面加载
    var searchLetter = city.searchLetter;
    var cityList = city.cityList();
    var sysInfo = wx.getSystemInfoSync();
    var winHeight = sysInfo.windowHeight;
    var itemH = winHeight / searchLetter.length;
    var tempObj = [];
    for (var i = 0; i < searchLetter.length; i++) {
      var temp = {};
      temp.name = searchLetter[i];
      temp.tHeight = i * itemH;
      temp.bHeight = (i + 1) * itemH;
      tempObj.push(temp)
    }
    this.setData({
      winHeight: winHeight,
      itemH: itemH,
      searchLetter: tempObj,
      cityList: cityList
    })

  },
  onReady: function () {
    // 生命周期函数--监听页面初次渲染完成

  },
  onShow: function () {
    // 生命周期函数--监听页面显示

  },
  onHide: function () {
    // 生命周期函数--监听页面隐藏

  },
  onUnload: function () {
    // 生命周期函数--监听页面卸载

  },
  onPullDownRefresh: function () {
    // 页面相关事件处理函数--监听用户下拉动作

  },
  onReachBottom: function () {
    // 页面上拉触底事件的处理函数

  },
  clickLetter: function (e) {
    console.log(e.currentTarget.dataset.letter)
    var showLetter = e.currentTarget.dataset.letter;
    this.setData({
      showLetter: showLetter,
      isShowLetter: true,
      scrollTopId: showLetter,
    })
    var that = this;
    setTimeout(function () {
      that.setData({
        isShowLetter: false
      })
    }, 1000)
  },
  //选择城市
  bindCity: function (e) {
    console.log("bindCity")
    this.setData({ city: e.currentTarget.dataset.city })
  },
  //选择热门城市
  bindHotCity: function (e) {
    console.log("bindHotCity")
    this.setData({
      city: e.currentTarget.dataset.city
    })
  },
  //点击热门城市回到顶部
  hotCity: function () {
    this.setData({
      scrollTop: 0,
    })
  }
})

Git源码下载

阅读全文

Javascript控制页面物理返回事件处理

点击物理返回键.关闭窗口

pushHistory();
window.addEventListener("popstate", function(e) {
    //alert("我监听到了浏览器的返回按钮事件啦");//根据自己的需求实现自己的功能
    //alert('guanbi');
    WeixinJSBridge.call('closeWindow');
    if (typeof(WeixinJSBridge) != "undefined") {
        WeixinJSBridge.call('closeWindow');
    } else {
        if (navigator.userAgent.indexOf("MSIE") > 0) {
            if (navigator.userAgent.indexOf("MSIE 6.0") > 0) {
                window.opener = null;
                window.close();
            } else {
                window.open('', '_top');
                window.top.close();
            }
        } else if (navigator.userAgent.indexOf("Firefox") > 0) {
            window.location.href = 'about:blank ';
            //window.history.go(-2);  
        } else {
            window.opener = null;
            window.open('', '_self', '');
            window.close();
        }
    }
}, false);
window.onbeforeunload = function() {
    return;
}
function pushHistory() {
    var state = {
        title: "title",
        url: ""
    };
    window.history.pushState(state, "title", "");
}

点击物理返回键,返回到指定页面

window.addEventListener("popstate", function(e) {
    window.location.href="{:url('sdns/index/index')}";
}, false);
function pushHistory() { 
    var state = { 
        title: "title", 
        url: "#"
    }; 
    window.history.pushState(null,null, "#"); 
}

禁用物理返回键

XBack = {};
(function(XBack) {
    XBack.STATE = 'x - back';
    XBack.element;
    XBack.onPopState = function(event) {
        event.state === XBack.STATE && XBack.fire();
        XBack.record(XBack.STATE); //初始化事件时,push一下
    };
    XBack.record = function(state) {
        history.pushState(state, null, location.href);
    };
    XBack.fire = function() {
        var event = document.createEvent('Events');
        event.initEvent(XBack.STATE, false, false);
        XBack.element.dispatchEvent(event);
    };
    XBack.listen = function(listener) {
        XBack.element.addEventListener(XBack.STATE, listener, false);
    };
    XBack.init = function() {
        XBack.element = document.createElement('span');
        window.addEventListener('popstate', XBack.onPopState);
        XBack.record(XBack.STATE);
    };
})(XBack); // 引入这段js文件
XBack.init();
XBack.listen(function() {});

禁止返回并给个提示

pushHistory(); 
window.addEventListener("popstate", function(e) { 
    popTip("禁止返回");
    XBack = {};
    (function(XBack) {
        XBack.STATE = 'x - back';
        XBack.element;
        XBack.onPopState = function(event) {
            event.state === XBack.STATE && XBack.fire();
            XBack.record(XBack.STATE); //初始化事件时,push一下
        };
        XBack.record = function(state) {
            history.pushState(state, null, location.href);
        };
        XBack.fire = function() {
            var event = document.createEvent('Events');
            event.initEvent(XBack.STATE, false, false);
            XBack.element.dispatchEvent(event);
        };
        XBack.listen = function(listener) {
            XBack.element.addEventListener(XBack.STATE, listener, false);
        };
        XBack.init = function() {
            XBack.element = document.createElement('span');
            window.addEventListener('popstate', XBack.onPopState);
            XBack.record(XBack.STATE);
        };
    })(XBack); // 引入这段js文件
    XBack.init();
    XBack.listen(function() {});
}, false);
function pushHistory() { 
    var state = { 
        title: "title", 
        url: "#"
    }; 
    window.history.pushState(null,null, "#"); 
}
阅读全文

VisualSVN项目管理技巧

第一步:找一台电脑,内存足够大,用来搭建局域网svn主机

安装VisualSVN教程:
https://jingyan.baidu.com/article/870c6fc36a31d0b03fe4be3f.html

汉化版svn下载
http://www.mycodes.net/70/1544.htm

2019-03-18T06:29:18.png

第二步:在VisualSVN里面选择Users创建所有开发人员的账号密码,用文本记录好
第三步:创建对应的项目分组,比如说我要创建一个电商的项目分组,可以直接创建对应的电商名称简写,勾选相关开发人员到对应的分组即可。
第四步:点击Reositories 创建对应的项目名称,可以用中文命名,创建项目的时候就可以直接勾选项目权限分组,切记千万别允许所有人访问。
1)第一步
2019-03-18T06:29:28.png
2)第二步:
2019-03-18T06:29:34.png
3)第三步:
2019-03-18T06:29:39.png
4)第四步:
2019-03-18T06:29:46.png
5)第五步:
2019-03-18T06:36:01.png
6)第六步:
2019-03-18T06:34:51.png

在每个项目下面分别有trunk跟tags两个目录。
Trunk目录为开发目录,tags目录为稳定的项目版本目录。下面分别对这两个目录的格式做一下规范。

上面就是一个完整项目的所有步骤,以及目录结构,每一个目录都可以单独设置权限,只有tags目录有最高管理权限,开发人员只有trunk目录的权限,项目经理或者项目负责人才有tags的权限,一旦项目结束,删除对应的开发人员的目录权限。
Db目录放置的是可以直接执行的sql文件,如果项目sql文件过大,需要另附上说明文档讲明导入方案。
Doc目录是项目相关的所有文件,包括线上线下项目安装运行的的详细步骤,以及psd图,项目确认函,功能表文档。
Html 静态html文件目录
Project 源码目录
MiniProgram 小程序源码目录

Tags里面的目录结构也是一样的,含义也是一样的。最外层包了一个版本号,主要是方便项目回退以及代码版本管理。

做这个的目的也是为了提高项目质量,严格做好codereview工作。

阅读全文