前言
来,和魔王哪吒总结一下,分享一下本人对前端学习总结,教训分享,以及写过的我的项目教训分享过程。
如果感觉还不错的话,浏览的过程中,须要您:
- 点赞,分享,评论
- 有钱的捧个钱场,没钱的捧集体场
技术实际、读书笔记、编程技巧、随笔杂谈、原创翻译,漫谈本人人生感触
学习总结
hello,大家好,来给大家分享我的业余学习教训和日常学习教训。对于编码的学习,我认为基础知识和编程实际是最重要的。刚开始学习前端的时候,是将基础知识学习一遍,所用教材能够靠学校发的教材即可。根底学习过后,最重要的就是实际,能够一直做一些模拟网站,以及到最初本人设计网站等。
珍藏平时交换的信息:
- 技术学的再好,没有开发教训,和产品教训,是很难写出好的代码。因为写代码自身是带有目的性的,解决问题。
- 如果在校,学习程序很迷茫,是因为不晓得学这个用来干嘛,本身没有想做的货色,所以就很迷茫,不晓得学什么,为什么要学。
- 工作,要对一个产品理解到什么深度,代码就越强壮。
- 学习形式是有捷径的避开所有看不懂学习材料,找看的懂的,拿起一本材料或者网上找的材料,细度几分钟,看不懂间接找早别的材料
- 有可能能力未达到 所有看不懂 也有可能 材料自身形容 很难懂 更有可能 材料形容不适宜本人浏览习惯
- 优先 实现性能 再思考优化
那么你是否本人保持了呢?当你想要学习,拿起手机时,你会不会发现,你曾经人不知;鬼不觉偏离了正规,从娱乐新闻到头版头条,微信99+未读的音讯,你心里想的就是看一会儿,就看一会儿。后果人不知;鬼不觉工夫过来了10分钟,半小时,1小时溜走了。而后你开始烦躁,悔恨,自责,然而到了第二天,你又掉进了雷同的坑里。
你会不会也很纳闷,为什么我的自制力这么差,为什么有些货色让我骑虎难下,因为你曾经上瘾了,有个试验小白鼠遇到电流会规避,然而奇怪的景象产生了,小白鼠岂但没有规避,反而一次又一次的自我电击,通过发现,原来是试验中不小心把某地位弄错,刚好刺激了快感中枢的地位。所以,你兴许就像这小白鼠一样上了瘾。
一个假相是,科技巨头们在社交软件视频平台,网络游戏中精心安排了一个又一个沉迷的钩子,目标就是为了截取更多的用户,获取他们的更多工夫和金钱,咱们正在被一个算法和娱乐所包裹的电子海洛因中,但很多人却不自知,那么如何解脱上瘾的行为呢?
就是去理解让人沉迷于网络的钩子:
- 可望而不可即的迷人指标
- 无奈抵御无奈预知的踊跃反馈
- 渐进式的提高和改善的感觉
- 越来越艰难的工作须要解决,但暂未解决的紧张感
如,你公布了某音讯,你会去暗中察看,有没有人给我点赞,写文章,有没有人给我点赞,有没有人给我评论等等。(我很期待!!!)
其实你能够把这些钩子投入学习中,把学习当做趣味,降级打怪,一直晋升本人。
你的抉择
本人的人生本人抉择,你能够抉择一条简略的路,抉择沉迷在你的手机里,刷视频,打游戏,煲剧,毫不费力的播种大把大把的高兴,你也能够抉择一条更加艰巨的路,抉择自律,抉择提早慢走,抉择成长。
用你的右手做什么,由你本人决定
我的项目教训
上面钻研封装工具代码块:
权限管制等信息auth.js
用来存储localStorage 本地缓存的办法
// 操作用户tokenexport function setToken(value) { uni.setStorageSync('token', value); console.log('存储用户信息胜利');}export function getToken() { let token = uni.getStorageSync('token'); return token;}export function removeToken() { uni.removeStorageSync('token');}
操作用户信息代码如下:
export function setUserInfo(value) { try { let newValue = JSON.stringify(value); uni.setStorageSync('userInfo', newValue); console.log('存储用户信息胜利'); } catch (e) { return; }}export function getUserInfo() { let userInfo = uni.getStorageSync('userInfo'); console.log('userInfo获取用户信息胜利', userInfo); if(userInfo) { return JSON.parse(userInfo); }}
我的项目主题色彩封装:
export function setConfig(value) { try { let configColor = JSON.stringify(value); uni.setStorageSync('configColor', configColor); console.log('存储主题色彩胜利'); }catch(e){ return; }}export function getConfig() { let configColor = uni.getStorageSync('configColor'); if(configColor){ return JSON.parse(configColor); }}
获取推荐人id
export function setRecommend(value) { uni.setStorageSync('recommend', value); console.log('recommend', value);}export function getRecommend() { let recommend = uni.getStorageSync('recommend'); return recommend;}
如果你须要用来存储我的项目内应用的第三方api key,能够创立keys.js文件:
let txMapKey = 'xxxx' // 腾讯地图的keyexport { txMapKey}
封装必不可少的领取性能:
创立文件pay.js,代码如下:
微信公众号领取
// description:微信公众号领取// data 微信领取申请胜利之后返回的领取参数// payParams {object} 微信领取须要的参数function onBridgeReady(data, payParams) { window.WeixinJSBridge.invoke('getBrandWCPayRequest', { appId: data.appId, timeStamp: data.timeStamp, nonceStr: data.nonceStr, package: data.package, signType: data.signType, paySign: data.paySign // 微信签名}, function(res) { // console.log(res); if(res.err_msg === 'get_brand_wcpay_request:ok') { // 领取胜利页面 if(payParams.type === 'SHYY') { toastMsg('correct','领取胜利'); setTimeout(()=>{ router.push('/home'); },500); }else{ router.push({ path: '/success', query: { orderId: payParams.orderId, totalFree: payParams.totalFree } }); } }else if(res.err_msg === 'get_brand_wcpay_request:fail') { // 领取失败 return alert(res.err_desc); }else{ // 跳转订单详情 toastMsg('warn', '领取勾销'); }});}
支付宝领取
/** * 支付宝领取 */function alipay(res) { console.log('调起领取alipay',res); uni.requestPayment({ provider: 'alipay', orderInfo: { "dealId": res.dealId, "appKey": res.appKey, "totalAmount": res.totalAmount, "tpOrderId": res.tpOrderId, "dealTitle": res.dealTitle, "rsaSign": res.rsaSign, "bizInfo": res.bizInfo }, //订单数据 success: function(res) { console.log('success:' + JSON.stringify(res)); }, fail: function(err) { console.log('fail:' + JSON.stringify(err)); } });}
微信小程序领取
function wxpay(ret, orderid) { console.log('调起领取wxpay', ret); let res = ret; let status = false; uni.requestPayment({ timeStamp: res.timeStamp, nonceStr: res.nonceStr, package: res.package, signType: res.signType, paySign: res.paySign, appId: res.appId, success: function (res) { console.log('success:' + JSON.stringify(res), res); uni.showToast({ title: '领取胜利!' }); }, fail: function (err) { console.log('fail:' + JSON.stringify(err)); } });}
封装的异步申请处理函数代码封装,创立文件request.js
request('接口名称', {key:value}, '申请形式(默认为GET)').then(res=>{console.log(res)})
import { getToken, removeToken } from './auth';let baseUrl = '';async function request(method,params,type,callBack){ // 创立一个名为request申请的办法函数 if (!type) { type = 'GET'; } let header = { //设置申请头信息 'Authorization': getToken(), 'X-Requested-With': 'XMLHttpRequest', "Accept": "application/json", "Content-Type": "application/json; charset=UTF-8" }; let http = { url: baseUrl + mehtod, data: params, method: type, header: header }; let promise = new Promise((resolve, reject) => { uni.request(http).then(res => { let newdata = res[1].data; // if (newdata.code == 403) { if (newdata == -1) { uni.showToast({ title: res[1].data.msg, icon: 'none' }); } resolve(res[1].data); }).catch(err => { reject(err); console.log(err); }); }); return promise;}export default { request};
创立util.js文件:(工夫工具)
const formatTime = date => { const year = date.getFullYear(); const month = date.getMonth() + 1; const day = date.getDate(); const hour = date.getHours(); const minute = date.getMinutes(); const second = date.getSeconds(); return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':');};const formatNumber = n => { n = n.toString(); return n[1] ? n : '0' + n;};module.exports = { formatTime: formatTime};
store-index.js
创立store-index.js
import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)const store = new Vuex.Store({ state: { hasLogin: false, userInfo: {}, }, mutations: { login(state, provider) { state.hasLogin = true; state.userInfo = provider; uni.setStorage({//缓存用户登陆状态 key: 'userInfo', data: provider }) console.log(state.userInfo); }, logout(state) { state.hasLogin = false; state.userInfo = {}; uni.removeStorage({ key: 'userInfo' }) } }, actions: { }})export default store
App.vue
vuex治理登陆状态
<script> /** * vuex治理登陆状态 */ import { mapMutations } from 'vuex'; export default { methods: { ...mapMutations(['login']) }, onLaunch: function() { let userInfo = uni.getStorageSync('userInfo') || ''; if(userInfo.id){ //更新登陆状态 uni.getStorage({ key: 'userInfo', success: (res) => { this.login(res.data); } }); } }, onShow: function() { console.log('App Show') }, onHide: function() { console.log('App Hide') }, }</script>
main.js
import Vue from 'vue'import store from './store'import App from './App'const msg = (title, duration=1500, mask=false, icon='none')=>{ //对立提醒不便全局批改 if(Boolean(title) === false){ return; } uni.showToast({ title, duration, mask, icon });}const json = type=>{ //模仿异步申请数据 return new Promise(resolve=>{ setTimeout(()=>{ resolve(Json[type]); }, 500) })}
app.vue
vuex 治理登录状态
<script> // vuex 治理登录状态 import { mapMutations } from 'vuex'; export default { methods: { ...mapMutations(['login']) }, onLaunch: function() { let userInfo = uni.getStorageSync('userInfo') || ''; if (userInfo.id) { // 更新登录状态 uni.getStorage({ key: 'userInfo', success: (res) => { this.login(res.data) } }) } }, onShow: function() { console.log('App Show') }, onHide: function() { console.log('App Hide') } }</script>
main.js
import Vue from 'vue'import App from './App'//引入vueximport store from './store'import * as filters from './filters' // global filtersconst msg = (title, duration=1500, mask=false, icon='none')=>{ //对立提醒不便全局批改 if(Boolean(title) === false){ return; } uni.showToast({ title, duration, mask, icon });}//把vuex定义成为全局组件Vue.prototype.$store = storeVue.prototype.$api = {msg};Vue.config.productionTip = falseObject.keys(filters).forEach(key => { Vue.filter(key, filters[key])})App.mpType = 'app'const app = new Vue({ ...App, // 挂载 store})app.$mount()
点餐零碎
成果动画:
main.js
import Vue from 'vue'import App from './App'import router from './router'Vue.config.productionTip = false;import store from './assets/js/store';new Vue({ el: '#app', router, store, components: {App}, template: '<App/>'})
App.vue
<template> <div id="app"> <!--首页的goods数据要缓存--> <keep-alive> <router-view v-if="$route.meta.keepAlive"/> </keep-alive> <router-view v-if="!$route.meta.keepAlive"/> </div></template><script> //引入样式表 import "./assets/css/ico.css"; import "./assets/css/style.css"; import "./assets/css/animate.min.css"; export default { name: 'App' }</script>
router/index.js
import Vue from 'vue'import Router from 'vue-router';import home from '@/components/home';import detail from '@/components/detail';import list from '@/components/list';import pay from '@/components/pay';Vue.use(Router)export default new Router({ routes: [ { path: '/', redirect:"/home" }, { path: '/home', name: 'home', meta:{keepAlive:true}, //缓存首页数据 component: home }, { path: '/detail', name: 'detail', component: detail }, { path: '/list', name: 'list', component: list }, { path: '/pay', name: 'pay', component: pay } ]})
components目录
components/detail.vue
<template> <div class="detail"> <header> <h1>详情</h1> <a class="goback-btn icon-chevron-left" href="javascript:;" @click="goback"> </a> </header> <div class="cont"> <h4>{{$route.params.item.name}} <span class="price">¥{{$route.params.item.price}}</span> </h4> <button class="plus-btn icon-shopping-cart" :class="$route.params.item.checked?'ac':''" :disabled="$route.params.item.checked" @click="order"></button> <div class="swiper-container"> <div class="swiper-wrapper"> <div class="swiper-slide" v-for="src in $route.params.item.slide"><img class="slide-img" :src="src"></div> </div> <div class="swiper-pagination"></div> </div> <div> </div> <div class="describe"> {{$route.params.item.describe}} </div> </div> </div></template><script> import swiper from "swiper"; import "swiper/dist/css/swiper.min.css"; export default { created() { this.shopping_cart = this.$store.state.shopping_cart; }, data:()=>({ shopping_cart:[]//购物车 }), mounted() { //加载轮播图 var mySwiper = new swiper('.swiper-container', { autoplay: { delay: 2500, disableOnInteraction: false, }, pagination: { el: '.swiper-pagination', }, }) }, methods:{ //返回前页 goback(){ this.$router.go(-1); }, //点餐 order(){ var item=this.$route.params.item; this.shopping_cart.push({ id:item.id, name:item.name, price:item.price, num: 1 }); //item与goods[key]是同一个对象 item.checked=true; //shopping_cart是个数组(援用数据类型),所以,能够不必commit,官网要求用commit //放入store里 this.$store.commit("update_shopping_cart",{ shopping_cart:this.shopping_cart, }); } } }</script><style></style>
components/home.vue
<template> <div class="home"> <!--头部--> <header> <label><input type="search" v-model="keyword" :placeholder="search_ico"></label> <button type="button" class="search-btn" @click="search">搜寻</button> </header> <!--侧边固定栏--> <aside class="animated bounceInLeft"> <ul> <li v-for="(menu,index) in goods_cls" :class="{'ac':cur_goods_cls==menu.id}" @click="changeMenu(index)">{{menu.name}}</li> </ul> </aside> <!--主菜谱 外层容器用于打消animate动画的bug--> <div style="width:100%; overflow: hidden;"> <div class="order-bar animated bounceInRight"> <div class="order-class" v-for="item in goods_cls"> <h3>{{item.name}}</h3> <ul class="good-list"> <li v-for="id in item.goods"> <router-link :to="{name:'detail',params:{item:goods[id]}}"><img :src="goods[id].img"></router-link> <h4>{{goods[id].name}}</h4> <p class="ellipsis">{{goods[id].describe}}</p> <strong>¥{{goods[id].price}}</strong> <button type="button" @click="order(goods[id],$event)" :class="['pointer-btn',goods[id].checked? 'ac':'']" :disabled="goods[id].checked"><b>点餐</b><i>已点</i></button> </li> </ul> </div> </div> </div> <!--底部--> <footer> <!--购物车--> <div class="shoping-cart animated" :class="{'bounceInUp':showShoppingCart,'shoping-list-slide':showShoppingCart}"> <div class="empty"> <span class="icon-trash" @click="clearShopping"></span> </div> <ul v-if="shopping_cart.length>0"> <li v-for="(itm,index) in shopping_cart">{{itm.name}} <em>¥{{itm.price}}</em> <div> <button class="shoping-sub icon-minus" type="button" @click="s_sub(itm,index)"></button> <span>{{itm.num}}</span> <button class="shoping-add icon-plus" type="button" @click="s_add(itm)"></button> </div> </li> </ul> <ul v-else> <li style="text-align: center">还没有点菜哟!!</li> </ul> <!--id给抛物线用--> <button type="button" id="shoppingBtn" class="shopping-btn icon-shopping-cart" @click="showShoppingCart=!showShoppingCart"></button> <span class="count" :class="{'hide':totalNum==0}">{{totalNum}}</span> </div> <!--底部菜单--> <div class="cont"> <div class="order-pointer-footer"> <div class="total"><em>¥{{totalPrice}}</em></div> <a v-if="totalNum>0" href="javascript:;" class="pay-btn" @click="pay">去下单</a> </div> </div> </footer> <!--模态层--> <div class="modal" :class="{'hide':!showShoppingCart}" @click="showShoppingCart=!showShoppingCart"></div> </div></template><script> import axios from "axios"; //zepto不反对commonJS,只能用jquery import $ from "jquery"; //自定义抛物线 模块 import par from "../assets/js/parabola.js"; export default { name: 'home', data: () => ({ //菜品 "goods": null, //分类 goods_cls: null, //购物车 shopping_cart: [ /*{ "id":1, "name":"宫保鸡丁", "price":22, "num":1 },*/ ], cur_goods_cls: 1, //以后分类id //总价格 totalPrice: 0, //总数量 totalNum: 0, //显示购物车 showShoppingCart: false, //搜寻关键字 keyword: "", //vue只能用属性绑定形式定义placeholder图标 search_ico: "\ue903 请输出菜品名称" }), created() { //本模块被keepalive,created钩子只运行一次 axios.get("/static/data.json").then( msg => { this.goods = msg.data.goods this.goods_cls = msg.data.goods_cls; //存入store this.$store.commit("update_goods", this.goods); }, () => { alert("连贯失败"); } ); //全局路由钩子 this.$router.beforeEach((to, from, next) => { //回调函数 //从搜寻页回来,革除关键字 this.keyword = "", //如果关上购物车,间接路由到下单页,再从下单页返回,不显示购物车 this.showShoppingCart = false; next() //肯定要记着执行,不然路由不能跳转了 }) }, watch: { //监听购物车变动 shopping_cart: { handler(curval, oldval) { //清空所有数据 this.totalNum = this.totalPrice = 0; //清空所有菜品checked for(var key in this.goods) { this.goods[key].checked = false; } curval.forEach(item => { //从新计算总额 总数 this.totalNum += item.num; this.totalPrice += item.num * item.price; //禁用已选菜品按钮 this.goods[item.id].checked = true; }); //向vuex的store存储数据 this.$store.commit("update_shopping_cart", this.shopping_cart); }, deep: true //对象外部的属性监听,也叫深度监听 }, }, mounted() { //监听window滚动 window.addEventListener('scroll', this.winScroll) }, methods: { //滚动 winScroll() { var _this = this; var scrollTop = $(window).scrollTop(); var oItem = $('.order-class'); oItem.each(function(i, elm) { //此处不能应用箭头函数,因为$(this) //offset if($(this).offset().top < scrollTop + 200) { _this.cur_goods_cls = i + 1; } }) }, //搜寻 search() { if(this.keyword == "") { alert("请输出搜寻关键字!!"); } else { //搜寻页面的菜品,也能够进入详情页,所以,所有数据都要放在store内 this.$store.commit("update_keyword", this.keyword); this.$router.push("list") } }, //点餐 order(item, ev) { this.shopping_cart.push({ id: item.id, name: item.name, price: item.price, num: 1 }); //退出购物车抛物线 var el = $('<div class="parabola-el"></div>'); $(document.body).append(el); new par.parabola({ origin: ev.target, target: '#shoppingBtn', element: el, time: 500, a: 0.01, callback(el) { el.remove(); } }).move() }, //左侧切换 changeMenu(i) { var aUl = $('.order-class'); //应用position判断的ul $(window).scrollTop(aUl.eq(i).position().top); }, //清空购物车 clearShopping() { this.showShoppingCart = !this.showShoppingCart; this.shopping_cart = []; }, //购物车add s_add(item) { item.num++; }, //购物车sub s_sub(item, i) { item.num--; if(item.num == 0) { this.shopping_cart.splice(i, 1); }; }, //去下单 pay() { this.$router.push({ name: "pay", params: { totalPrice: this.totalPrice } }) }, }, }</script><style scoped></style>
components/list.vue
<template> <div class="list"> <header> <h1>搜寻后果</h1> <router-link to="/home" class="goback-btn icon-chevron-left"> </router-link> <span class="total">共{{search_list.length}}条</span> </header> <ul id="scrollMenu" class="good-list"> <li v-for="item in search_list"> <img :src="item.img" @click="show_detail(item)"> <h4>{{item.name}}</h4> <p>{{item.describe}}</p> <strong>¥{{item.price}}</strong> <button type="button" @click="point(item)" :class="['pointer-btn',item.checked? 'ac':'']" :disabled="item.checked"><b>点餐</b><i>已点</i></button> </li> </ul> <div style="text-align: center;" v-if="search_list.length==0"> 没有搜寻后果!</div> </div></template><script> export default { created() { //搜寻页面的菜品,也能够进入详情页,所以,所有数据都要放在store内 let keyword=this.$store.state.keyword; let goods=this.$store.state.goods; this.shopping_cart = this.$store.state.shopping_cart; for(var key in goods){ //ES6 字符串新增办法 includes:判断是否存在某个字符 //留神 : //console.log(str.includes('')); //空字符串 返回:true //console.log(str.indexOf('')); //空字符串 返回:0 if(goods[key].name.includes(keyword) && keyword!=""){ this.search_list.push(goods[key]); } } }, data:()=>({ search_list:[], shopping_cart:[] }), methods:{ //点餐 point(item){ this.shopping_cart.push({ id: item.id, name: item.name, price: item.price, num: 1 }); item.checked=true; //放入store里 this.$store.commit("update_shopping_cart",this.shopping_cart); }, //显示详情页 show_detail(item){ this.$router.push({name:"detail",params:{item}}); } }, }</script><style scoped> </style>
components/pay.vue
<template> <div class="pay bounceInDown animated"> <h2>订单提交胜利</h2> <p>订单总额:<em style="color: red; font-size:.3rem;">{{$route.params.totalPrice}}</em> 元</p> <br> <h3>您的订单编号是:</h3> <p class="order-num">123456789</p> <p><button class="pay-btn">去付款</button></p> <p><button class="goback-btn" @click="goback">返回菜单</button></p> </div></template><script> export default{ methods: { goback() { this.$router.push("home"); } } }</script><style></style>
js/store.js
import Vue from "vue";import Vuex from "vuex";//利用插件Vue.use(Vuex);//定义vuex状态export default new Vuex.Store({ state:{ shopping_cart:[], //购物车 goods:{}, keyword:"", }, mutations:{ update_shopping_cart(state,paylod){// console.log(paylod); this.state.shopping_cart=paylod; }, update_goods(state,paylod){ state.goods=paylod; }, update_keyword(state,paylod){ state.keyword=paylod; } }})
js/parabola.js
// JavaScript Documentvar parabola = function(config){ var b = 0, INTERVAL = 15, timer = null, x1,y1,x2,y2,originx,originy,diffx,diffy,speedx; this.config = config || {}; // 终点 this.origin = $(this.config.origin)||null; // 起点 this.target = $(this.config.target)||null; // 静止的元素 this.element = $(this.config.element)||null; // 曲线弧度 this.a = this.config.a || 0.001; // 静止工夫(ms) this.time = this.config.time || 1000; this.init = function(){ x1 = this.origin.offset().left; y1 = this.origin.offset().top; x2 = this.target.offset().left; y2 = this.target.offset().top; originx = x1; originy = y1; diffx = x2-x1; diffy = y2-y1; speedx = diffx/this.time; b = (diffy - this.a*diffx*diffx)/diffx; this.element.css({ left: x1, top: y1 }) return this; } // 确定动画形式 this.moveStyle = function(){ var moveStyle = 'position', testDiv = document.createElement('div'); if('placeholder' in testDiv){ ['','ms','moz','webkit'].forEach(function(pre){ var transform = pre + (pre ? 'T' : 't') + 'ransform'; if(transform in testDiv.style){ moveStyle = transform; } }) } return moveStyle; } this.move = function(){ var start = new Date().getTime(), moveStyle = this.moveStyle(), _this = this; timer = setInterval(function(){ if(new Date().getTime() - start > _this.time){ clearInterval(timer); _this.element.css({ left: x2, top: y2 }) typeof _this.config.callback === 'function' && _this.config.callback(_this.element); return; } var x = speedx * (new Date().getTime() - start); var y = _this.a*x*x + b*x; if(moveStyle === 'position'){ _this.element.css({ left: x+originx, top: y+originy }) }else{ if(window.requestAnimationFrame){ window.requestAnimationFrame(_this.element[0].style[moveStyle] = 'translate('+x+'px,'+y+'px)'); }else{ _this.element[0].style[moveStyle] = 'translate('+x+'px,'+y+'px)'; } } },INTERVAL) return this; } this.init();}//引入依赖jqueryimport $ from "jquery";//输入apiexport default{ parabola}
小程序
工夫util.js
const formatTime = date => { const year = date.getFullYear() const month = date.getMonth() + 1 const day = date.getDate() const hour = date.getHours() const minute = date.getMinutes() const second = date.getSeconds() return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')}const formatNumber = n => { n = n.toString() return n[1] ? n : '0' + n}module.exports = { formatTime: formatTime}
权限治理auth.js
// 获取指定权限function getAuth(param) { wx.getSetting({ success(res) { if (res.authSetting[param.auth] == undefined || res.authSetting[param.auth] == true) { param.success(); } else { // 没有权限就提醒去关上 wx.showModal({ title: '提醒', content: '须要手动关上' + param.text + '的权限', confirmText: '去关上', cancelText: '放弃', success(res) { if (res.confirm) { wx.openSetting({ success(res) { if (res.authSetting[param.auth] == true) { param.success(); } else { param.fail(); } } }) } else if (res.cancel) { param.fail(); } } }) } }, fail() { param.fail(); }, })}module.exports = getAuth;
举荐篇
浏览更多我本人写的文章内容:
- 前端面试必备ES6全方位总结
- 考前温习必备MySQL数据库(关系型数据库管理系统)
- 长篇总结之JavaScript,坚固前端根底
- 学习总结之HTML5剑指前端(倡议珍藏,图文并茂)
- 前端必学必会-多媒体-本地存储-浏览器与服务器的交互-通信性能
- 【倡议????】记录一次BAT一线互联网公司前端JavaScript面试
- Web页面制作根底
- 【思维导图】前端开发-坚固你的JavaScript常识体系
- 【图文并茂,点赞珍藏哦!】重学坚固你的Vuejs常识体系
- 【高能笔记】如何取得令人心动的前端offer | 掘金技术征文
- 11期前端冲刺必备指南-执行上下文/作用域链/闭包/一等公民
- 12期前端冲刺必备指南-HTTP/HTTPS/HTTP2/DNS/TCP/经典题
- 13期前端冲刺必备指南-this/call/apply/bind(万字长文)
- 14期-连肝7个早晨,总结了计算机网络的知识点!(共66条)
- 熬夜总结了 “HTML5画布” 的知识点(共10条)
- 16期-熬夜7天,我总结了JavaScript与ES的25个重要知识点!
- 17期-什么是MySQL数据库?看这一篇干货文章就够了!
- 18期-后端逆袭,一份不可多得的PHP学习指南
- 19期-当你在百度搜寻关键字的时候,哪个网站会排在最后面?明天给大家科普一下“网站SEO”
???? 掘金技术征文|双节特别篇
点关注,不迷路
好了各位,以上就是这篇文章的全部内容,能看到这里的人都是人才。我前面会不断更新技术相干的文章,如果感觉文章对你有用,欢送给个“赞”,也欢送分享,感激大家 !!