前端学习总结,经验分享,项目经验分享过程

article/2025/10/30 8:54:22

前言

来,和魔王哪吒总结一下,分享一下自己对前端学习总结,经验分享,以及写过的项目经验分享过程

如果觉得还不错的话,浏览的过程中,需要您:

  • 点赞,分享,评论
  • 有钱的捧个钱场,没钱的捧个人场

技术实践、读书笔记、编程技巧、随笔杂谈、原创翻译,漫谈自己人生感触

学习总结

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'//引入vuex
import store from './store'
import * as filters from './filters' // global filters
const msg = (title, duration=1500, mask=false, icon='none')=>{//统一提示方便全局修改if(Boolean(title) === false){return;}uni.showToast({title,duration,mask,icon});
}//把vuex定义成为全局组件
Vue.prototype.$store = store
Vue.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,只能用jqueryimport $ 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.goodsthis.goods_cls = msg.data.goods_cls;//存入storethis.$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;//清空所有菜品checkedfor(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)//offsetif($(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 = [];},//购物车adds_add(item) {item.num++;},//购物车subs_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('')); //空字符串 返回:0if(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 Document
var 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();
}//引入依赖jquery
import $ from "jquery";//输出api
export default{parabola
}

小程序

时间util.js

const formatTime = date => {const year = date.getFullYear()const month = date.getMonth() + 1const 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;

推荐篇

我自己写的文章内容:

  1. 前端面试必备ES6全方位总结
  2. 考前复习必备MySQL数据库(关系型数据库管理系统)
  3. 长篇总结之JavaScript,巩固前端基础
  4. 学习总结之HTML5剑指前端(建议收藏,图文并茂)
  5. 前端必学必会-多媒体-本地存储-浏览器与服务器的交互-通信功能
  6. 【建议👍】记录一次BAT一线互联网公司前端JavaScript面试
  7. Web页面制作基础
  8. 【思维导图】前端开发-巩固你的JavaScript知识体系
  9. 【图文并茂,点赞收藏哦!】重学巩固你的Vuejs知识体系
  10. 【高能笔记】如何获得令人心动的前端offer | 掘金技术征文
  11. 11期前端冲刺必备指南-执行上下文/作用域链/闭包/一等公民
  12. 12期前端冲刺必备指南-HTTP/HTTPS/HTTP2/DNS/TCP/经典题
  13. 13期前端冲刺必备指南-this/call/apply/bind(万字长文)
  14. 14期-连肝7个晚上,总结了计算机网络的知识点!(共66条)
  15. 熬夜总结了 “HTML5画布” 的知识点(共10条)
  16. 16期-熬夜7天,我总结了JavaScript与ES的25个重要知识点!
  17. 17期-什么是MySQL数据库?看这一篇干货文章就够了!
  18. 18期-后端逆袭,一份不可多得的PHP学习指南
  19. 19期-当你在百度搜索关键字的时候,哪个网站会排在最前面?今天给大家科普一下“网站SEO”

🏆 掘金技术征文|双节特别篇

点关注,不迷路

好了各位,以上就是这篇文章的全部内容,能看到这里的人都是人才。我后面会不断更新技术相关的文章,如果觉得文章对你有用,欢迎给个“赞”,也欢迎分享,感谢大家 !!


http://chatgpt.dhexx.cn/article/YFfilslx.shtml

相关文章

方法教程:一分钟把网易云音乐上的MV/mv视频下载到本地电脑

1、用Google Chrome浏览器把网易云上的MV打开。点击【分享】-【复制链接】-粘贴到浏览器地址栏打开&#xff1a; 2、在视频旁边的空白处右击鼠标&#xff0c;打开【检查】&#xff1a; 3、打开界面后点击【Network】–【All】&#xff0c;然后刷新浏览器&#xff0c;让视频播放…

网易云 计算机,网易云音乐电脑版2.7.4.198336_网易云音乐 - 系统之家

网易云音乐是一款播放、发现高品质音乐的专业音乐播放器&#xff0c;能找到许多小众的品位音乐、歌手&#xff0c;让你在电脑上听CD品质的音乐。网易云音乐是网易旗下主推的音乐播放器&#xff0c;依托专业音乐人、DJ、好友推荐及社交功能&#xff0c;为用户打造全新的音乐生活…

利用requests爬取网易云音乐榜单并下载

最近想爬取网易云音乐的歌单&#xff0c;发现网上很多教程都用Selenium&#xff0c;比较麻烦。因为研究网易云音乐排行榜html码源&#xff0c;发现榜单是iframe动态加载的。用原网址爬取是爬取不到内容的。想用requests爬取的话需要获取iframe的源码。 目录 一、url和请求头分…

JS逆向之网易云音乐

文章目录 1. 目标网站2. 初步分析3. 定位加密参数生成位置4. 编码测试4.1 定义AES加密方法4.2 调用两次AES加密获取params4.3 获取歌曲的url4.4 单曲下载初步测试代码4.5 飙升榜单音乐批量抓取文章内容仅用于学习和技术交流,如有侵权请联系我删除。 1. 目标网站 https://musi…

网易云音乐 For Mac

网易云音乐mac版专门为mac电脑用户使用的音乐播放软件&#xff0c;用户还可以使用网易云账号将电脑和手机上的音乐同步网易云音乐mac版中&#xff0c;使用更加方便。网易云音乐for mac比较人性化&#xff0c;它能根据你平时听音乐的喜好&#xff0c;自动给你推荐音乐&#xff0…

利用 Python 一键下载网易云音乐 10W+ 乐库

如果你常听音乐的话&#xff0c;肯定绕不开网易云&#xff0c;作为一款有情怀的音乐 App&#xff0c;我对网易云也是喜爱有加。虽然说现在都已经是 5G 时代了&#xff0c;大家的手机流量都绰绰有余&#xff0c;但在线播放还是不如本地存着音乐文件靠谱&#xff0c;今天我们就用…

网易云音乐虚化图片html,网易云音乐怎么换背景 背景图片设置方法

网易云音乐作为主流的手机音乐播放器&#xff0c;依托强大的社交功能&#xff0c;从众多播放器中脱颖而出&#xff0c;个性化的皮肤更是为它增加了不少魅力&#xff0c;下面就跟小编了解下具体的设置方法吧。 类别&#xff1a;影音播放 大小&#xff1a;90.81M 语言&#…

JAVA如何用URL下载网易云音乐

1.打开网易云&#xff0c;选择一首歌曲播放&#xff0c;然后按f12 2.找到并点击以.m4a结尾的链接 3.把输入框的链接替换代码里面的URL //1.获取资源地址URL url new URL("https://m801.music.126.net/20201006161345/802c3e2bd0240db619e27a7f1eeffcce/jdyyaac/5608/005a…

使用云函数快速升级网易云音乐等级

关于等级特权&#xff0c;网易云官网有介绍 https://music.163.com/#/level/details &#xff0c;最高级Lv10有100G音乐云盘免费容量 使用分享的脚本是每天自动在网易云音乐刷完300首歌&#xff0c;让你的账号快速升级&#xff08;等级数据每天下午2点更新&#xff09; 一个…

网易云linux版本如何安装包,网易云音乐Linux版提供64位和32位ubuntu16.04安装包

网易云音乐终于推出了官方Linux版本&#xff0c;提供的下载安装包有&#xff1a; deepin15(32位)&#xff1a;http://s1.music.126.net/download/pc/netease-cloud-music_0.9.0_i386.deb deepin15(64位)&#xff1a;http://s1.music.126.net/download/pc/netease-cloud-music_0…

干货,下载网易云课堂和B站的视频

原文网址&#xff1a;https://www.jianshu.com/p/ad20e5a63353 我们在平时的学习中&#xff0c;很有可能会接触 网易云课堂 和 BIlibili 这两个很棒的网站。 有的时候我们在线观看不方便&#xff0c;总是想把网站里面的视频下载到电脑&#xff0c;然后自己闲暇时间进行学习。 方…

EasyRecovery帮你一招找回网易云下载的单曲

科技迅速发展的时代里,人们越来越离不开手机、电脑、平板等电子产品,也更习惯于把重要的音频、视频和图片储存在这些电子产品中了。既然有储存,那就有丢失,大家一定遇到过因误删文件而抓狂的情况吧。不过如今处理误删的情况也完全是小事啦,所谓一物降一物,我们有文件恢复…

网易云API接口运行教程

1.网易云api下载地址&#xff1a; https://neteasecloudmusicapi.js.org/#/ 2.下载或者git clone到本地 3.解压缩NeteaseCloudMusicApi-master.zip 4.在搜索框中输入cmd打开终端&#xff0c;在终端中输入node app.js&#xff0c;服务器已经运行&#xff0c;可以将生成地址输入到…

HC05蓝牙模块(主从一体)简单使用

使用 按住蓝牙模块上的按键&#xff0c;再接通电源&#xff0c;进入AT指令模式&#xff0c;可以进行AT指令设置 引脚连接 PA2&#xff08;TX&#xff09; -RX PA3&#xff08;RX&#xff09; -TX 5V VCC GND …

蓝牙模块—HC-05调试

每次拿到蓝牙模块进行调试时&#xff0c;都会忘记一些细节等信息。因此为了将来能够顺利地调试蓝牙模块&#xff0c;以本文来记录一下调试过程。 调试所需的硬件有HC-05蓝牙模块&#xff0c;USB转TTL模块&#xff0c;杜邦线若干。 首先用杜邦线将HC05与USB转TTL模块正确连接&am…

【蓝牙模块】三款常用的基础蓝牙模块,HC05,JDY-31,CC2541介绍与测试说明

文章目录 一. HC05二.JDY-311.介绍2.测试 二.CC2541 一. HC05 HC05与其他两款的区别是&#xff0c;需要按住RST键进入AT指令模式 一. 上电进入AT模式方法 先按住HC05蓝牙模块上面的RST按键&#xff0c;再给蓝牙模块通电。蓝牙模块上面的LED进入慢闪模式(约1秒钟闪烁一次)&a…

ATK-HC05蓝牙模块的详细说明

前段时间买了个ATK的HC05蓝牙模块。HC05模块是一款高性能主从一体蓝牙串口模块&#xff0c;可以不用知道太多蓝牙相关知识就可以很好的上手。说白了&#xff0c;只是个蓝牙转串口的设备&#xff0c;你只要知道串口怎么编程使用&#xff0c;就可以了&#xff0c; 实现了所谓的透…

Arduino使用HC05蓝牙模块与手机连接

通过本文&#xff0c;可以了解到以下内容&#xff1a; 进入 AT 模式进行蓝牙基本参数设置Arduino 蓝牙控制 LED 电路设计以及代码编写利用 Andorid 蓝牙串口调试软件测试功能 进入 At 模式进行蓝牙基本参数设置 想要使用 Arduino 的蓝牙模块&#xff0c;首先要对蓝牙模块进行…

HC05和电脑蓝牙通讯

通常情况下都是将HC05和HC04进行主从配对&#xff0c;然后进行通讯。如果手边没有HC04其实可以使用笔记本自带的蓝牙和HC05进行通讯。 配置方法如下&#xff1a; 将HC05配置为主机模式将电脑和HC05的保存连接删除。 单击下方更多蓝牙设置&#xff0c;进行蓝牙串口的配置。 添…

HC05蓝牙点亮LED

本文是对基于STM32的HC05蓝牙点灯实验&#xff0c;目的在于认识HC05蓝牙模块&#xff0c;学会配置HC05&#xff0c;知道怎么用蓝牙在手机上控制单片机并且传输数据&#xff0c;虽然本文只控制led&#xff0c;但是点灯就是基础&#xff0c;主要在于学习hc05蓝牙模块。 1.认识一下…