// 如果需要分页器
pagination: {
el: '.swiper-pagination',
},
// 如果需要前进后退按钮
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
// 如果需要滚动条
scrollbar: {
el: '.swiper-scrollbar',
},
})
}
}
})
}
//渲染商品列表
function render(){
$.ajax({
url:'http://127.0.0.1:4000/api/list',
method:'get',
success:function(data){
if(data.status==0){
let list=data.data
//拿到数据后遍历出来
let productStr=list.map(item=>{
return `
<div class="listSingle">
<img src="${item.url}" οnclick=shoplist(${item.id})>
<div>
<p>${item.product}</p>
<p>¥${item.id}</p>
</div>
<span class="iconfont icon-gouwuche" data-index="${item.id}")></span>
</div>
`
}).join('')
$('.render').html(productStr)
//加入购物车
addCart()
}
}
})
}
//搜索框搜索功能
function search(){
$('.icon-sousuo').on('click',function(){
$.ajax({
url:'http://127.0.0.1:4000/api/search',
method:'get',
data:{
info:$('input[name="search"]').val()
},
success:function(data){
if(data.status==1){
alert(data.message)
}else{
let list=data.data
let productStr=list.map(item=>{
return `
<div class="listSingle")>
<img src="${item.url}">
<div>
<p>${item.product}</p>
<p>¥${item.id}</p>
</div>
<span class="iconfont icon-gouwuche"></span>
</div>
`
}).join('')
$('.render').html(productStr)
}
}
})
})
}
//底部跳转功能
function jump(){
$('#foot').on('click','.icon-dingdan',function(){
location.href='index.html'
}).on('click','.icon-gouwuche',function(){
location.href='gouwuche.html'
}).on('click','.icon-yonghu',function(){
location.href="user.html"
})
}
//加入购物车
function addCart(){
$('.listSingle').on('click','.icon-gouwuche',function(){
//获取购物车
let id=$(this).attr('data-index');
$.ajax({
url:'http://127.0.0.1:4000/api//list/id',
method:'get',
data:{
id:id
},
success:function(data){
console.log(data);
if(data.status==0){
//拿到本地存储的购物车信息
let product=localStorage.getItem('shopList')
let productArr=JSON.parse(product)||[]
//判定是否已经有该商品
let isOk=productArr.some(item=>item[0].id==id)
if(!isOk){
productArr.push(data.data)
localStorage.setItem('shopList',JSON.stringify(productArr))
}
}
}
})
})
}
//进入商品信息界面
function shoplist(id){
location.href='shoplist.html?id='+id
}
getBanner()
render()
search()
jump()
* CSS
#main {
width: 100%;
flex: 1;
overflow: auto;
background-color: aquamarine;
}
#main .swiper {
width: 100%;
height: 350px;
}
#main .specificFunctions {
width: 100%;
height: 288px;
background: url(“…/images/bc1.jpg”) no-repeat 0px -228px;
background-size: 700px auto;
}
#main .render .listSingle {
transition: 0.25s transform ease-in-out;
margin-top: 30px;
display: flex;
}
#main .render .listSingle img {
width: 438px;
height: 350px;
}
#main .render .listSingle div {
margin-left: 20px;
}
#main .render .listSingle div p:nth-child(1) {
font-size: 40px;
font-weight: 700;
}
#main .render .listSingle div p:nth-child(2) {
margin-top: 110px;
font-size: 20px;
color: grey;
}
#main .render .listSingle span {
margin-left: 18px;
margin-top: 86px;
font-size: 77px;
color: #f06c60;
}
/*# sourceMappingURL=index.css.map */
2. 购物车代码
* HTML
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="../lib/font/iconfont.css">
<link rel="stylesheet" href="../css/common.css">
<link rel="stylesheet" href="../css/gouwuche.css">
<div id="head">
<div>云点餐项目</div>
<div class="search">
<input type="text" name="search">
<span class="iconfont icon-sousuo"></span>
</div>
</div>
<div id="main">
<table></table>
<div class="total"></div>
</div>
<div id="foot">
<span class="iconfont icon-dingdan"></span>
<span class="iconfont icon-gouwuche"></span>
<span class="iconfont icon-yonghu"></span>
</div>
<script src="../js/jquery.js"></script>
<script src="../js/gouwuche.js"></script>
* JS
//底部跳转功能
function jump(){
$('#foot').on('click','.icon-dingdan',function(){
location.href='index.html'
}).on('click','.icon-gouwuche',function(){
location.href='gouwuche.html'
}).on('click','.icon-yonghu',function(){
location.href="user.html"
})
}
//渲染商品信息
function getlist(){
let product=localStorage.getItem('shopList')
let productArr=JSON.parse(product)||[]
let tableHead=`
<tr>
<td>商品名</td>
<td>图片</td>
<td>价格</td>
<td>数量</td>
<td>总价</td>
<td>删除</td>
</tr>
`
let tableStr=productArr.map(item=>{
return `
<tr>
<td>${item[0].product}</td>
<td><img src="${item[0].url}"></td>
<td>${item[0].id}</td>
<td class="fun"><input type="button" name="sub" value="-"><input type="text" name="text" value="1"><input type="button" name="add" value="+"></td>
<td class="singleTotal">${item[0].id}</td>
<td class="del" data-index="${item[0].id}">删除</td>
<tr>
`
}).join('')
$('table').html(tableHead+tableStr)
}
//删除功能
$(‘table’).on(‘click’,‘.del’,function(){
//拿到id根据id删除
let id=$(this).attr('data-index')
let data=JSON.parse(localStorage.getItem('shopList'))
let productIndex=data.findIndex(item=>item.id==id)
data.splice(productIndex,1)
localStorage.setItem('shopList',JSON.stringify(data))
getlist()
})
//增加和减少
$(‘table’).on(‘click’,‘input[name=“sub”]’,function(){
if($(this).next().val()>1){
$(this).next().val($(this).next().val()-1)
let priceAll=$(this).next().val()*$(this).parent().prev().html()
$(this).parent().next().html(priceAll.toFixed(2))
}
total()
}).on(‘click’,‘input[name=“add”]’,function(){
$(this).prev().val(parseInt($(this).prev().val())+1)
let priceAll=$(this).prev().val()*$(this).parent().prev().html()
$(this).parent().next().html(priceAll.toFixed(2))
total()
})
//计算总价
function total(){
let sum=0
$('.singleTotal').each((index,item)=>{
sum=sum+Number($(item).html())
})
$('.total').html('¥'+sum)
}
total()
getlist()
jump()
* CSS
#main {
width: 100%;
flex: 1;
overflow: auto;
background-color: aquamarine;
}
#main table {
width: 100%;
height: 100%;
}
#main table tr td img {
width: 80px;
height: 80px;
}
#main table tr .fun {
width: 100px;
}
#main table tr .fun input {
vertical-align: top;
width: 20px;
height: 20px;
}
#main .total {
margin-left: 30px;
font-size: 30px;
color: red;
}
/*# sourceMappingURL=gouwuche.css.map */
3. 用户界面代码
* HTML
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="../lib/font/iconfont.css">
<link rel="stylesheet" href="../css/common.css">
<style>
#head{
height: 300px;
}
#main{
height: 100%;
}
#main .login,.sigin,.siginout{
width: 700px;
height: 50px;
background-color: #f46c60;
text-align: center;
line-height: 50px;
cursor: pointer;
}
.input{
width: 700px;
height: 50px;
text-align: center;
}
.input input{
width: 400px;
height: 50px;
outline: none;
}
</style>
<div id="head">
<div>云点餐项目</div>
<div class="search">
<input type="text" name="search">
<span class="iconfont icon-sousuo"></span>
</div>
</div>
<div class="sigin">登录</div>
<div class="login">注册</div>
<div class="input">
<!-- <form class="loginInput">
<input type="text" name="name"><br>
<input type="password" name="password"><br>
<input type="submit" name="submit" value="登录提交">
</form> -->
</div>
<div id="foot">
<span class="iconfont icon-dingdan"></span>
<span class="iconfont icon-gouwuche"></span>
<span class="iconfont icon-yonghu"></span>
</div>
<script src="../js/jquery.js"></script>
<script src="../js/user.js"></script>
<script>
</script>
* JS
//底部跳转功能
function jump(){
$('#foot').on('click','.icon-dingdan',function(){
location.href='index.html'
}).on('click','.icon-gouwuche',function(){
location.href='gouwuche.html'
}).on('click','.icon-yonghu',function(){
location.href="user.html"
})
}
//渲染注册输入框
$(‘.login’).on(‘click’,function(){
let str=`
<form class="loginInput">
<input type="text" name="name"><br>
<input type="password" name="password"><br>
<input type="submit" name="submit" value="注册提交">
</form>
`
$('.input').html(str)
login()
})
//渲染登录输入框
$(‘.sigin’).on(‘click’,function(){
let str=`
<form class="siginInput">
<input type="text" name="name"><br>
<input type="password" name="password"><br>
<input type="submit" name="submit" value="登录提交">
</form>
`
$('.input').html(str)
sigin()
})
//注册功能
function login(){
$('.loginInput').on('submit',function(e){
e.preventDefault()
$.ajax({
url:'http://127.0.0.1:4000/api/login',
method:'get',
data:{
username:$('.loginInput input[name="name"]').val(),
password:$('.loginInput input[name="password"]').val(),
},
success:function(data){
if(data.status==0){
alert('注册成功')
}
}
})
})
}
//登录功能
function sigin(){
$('.siginInput').on('submit',function(e){
e.preventDefault()
console.log($('input[name="name"]').val());
$.ajax({
url:'http://127.0.0.1:4000/api/sigin',
method:'get',
data:{
username:$('input[name="name"]').val(),
password:$('input[name="password"]').val(),
},
success:function(data){
console.log(data);
if(data.status==0){
//登录成功渲染欢迎界面
alert('登录成功')
let str=`
<div>欢迎${data.data[0].username}</div>
<div class="siginout">退出</div>
`
$('#main').html(str)
//退出功能
siginout()
}
}
})
})
}
//欢迎界面和退出
function siginout(){
$('.siginout').on('click',function(){
let str=`
<div class="sigin">登录</div>
<div class="login">注册</div>
<div class="input"></div>
`
$('#main').html(str)
})
}
jump()
4. 商品详细代码
* HTML
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="../lib/font/iconfont.css">
<div class="back"><span class="iconfont icon-shangyiye"></span></div>
<div class="render"></div>
<script src="../js/jquery.js"></script>
<script src="../js/shoplist.js"></script>
* JS
function getShop(){
//分割字符串拿到url中的id
let url=location.href
let idArr=url.substring((url.indexOf('?')+1))
let id=idArr.split('=')[1]
console.log(id);
$.ajax({
url:'http://127.0.0.1:4000/api//list/id',
method:'get',
data:{
id:id
},
success:function(data){
if(data.status==0){
let list=data.data
let productStr=list.map(item=>{
return `
<div class="listSingle")>
<img src="${item.url}">
<div>
<p>${item.product}</p>
<p>¥${item.id}</p>
</div>
</div>
<div class="buyNow">立即购买</div>
`
}).join('')
$('.render').html(productStr)
}
}
})
}
//回到主界面
$(‘.back’).on(‘click’,function(){
location.href='index.html'
})
getShop()
* CSS
.back span {
margin-left: 10px;
font-size: 40px;
}
.listSingle img {
width: 700px;
}
.listSingle div p:nth-child(1) {
font-size: 30px;
color: black;
}
.listSingle div p:nth-child(2) {
font-size: 20px;
color: grey;
}
.buyNow {
width: 100px;
height: 50px;
border-radius: 25px;
background-color: #f4606c;
text-align: center;
line-height: 50px;
cursor: pointer;
}
/*# sourceMappingURL=shoplist.css.map */
[]( )后端
=====================================================================
1. 主界面代码app.js
//导入express模块
const express=require(‘express’)
const app=express()
const joi=require(‘joi’)
//解决跨域问题
const cors=require(‘cors’)
app.use(cors())
//解析表单数据
app.use(express.urlencoded({extended:false}))
//封装res.send()响应错误信息
app.use(function(req,res,next){
//status值默认失败1
res.cc=function(err,status=1){
res.send({
status,
message:err instanceof Error ?err.message:err,
})
}
next()
})
//导入用户路由模块
const apiRouter=require(‘./router/api’)
app.use(‘/api’,apiRouter)
//定义错误级别中间件
app.use((err,req,res,next)=>{
//验证失败错误
if(err instanceof joi.ValidationError) return res.cc(err)
//身份认证出错
if(err.name==='UnauthorizedError') return res.cc('身份认证出错')
res.cc(err)
})
//启动监听端口
app.listen(4000,function(){
console.log('express listen running at 4000');
})
2. 路由代码router/api.js
const express=require(‘express’)
const router=express.Router()
//引入路由处理模块
const api_handler=require(‘…/router_handler/api_handler’)
//验证模块 模式验证
const expressJoi=require(‘@escook/express-joi’)
const {login_schema,sigin_schema,listId_schema}=require(‘…/schema/user’)
//注册接口
router.get(‘/login’,expressJoi(login_schema),api_handler.login)
//登录接口
router.get(‘/sigin’,expressJoi(sigin_schema),api_handler.sigin)
//商品列表接口
router.get(‘/list’,api_handler.list)
//查询商品接口
router.get(‘/list/id’,expressJoi(listId_schema),api_handler.listId)
//搜索框搜索
router.get(‘/search’,api_handler.search)
//轮播图
router.get(‘/banner’,api_handler.banner)
module.exports=router
3. 路由处理函数router\_handler
const db=require(‘…/db/index’)
//注册处理函数
exports.login=function(req,res){
let userinfo=req.query
let sql='SELECT * FROM ev_users WHERE username=?'
ES6
-
列举常用的ES6特性:
-
箭头函数需要注意哪些地方?
-
let、const、var
-
拓展:var方式定义的变量有什么样的bug?
-
Set数据结构
-
拓展:数组去重的方法
-
箭头函数this的指向。
-
手写ES6 class继承。
微信小程序
-
简单描述一下微信小程序的相关文件类型?
-
你是怎么封装微信小程序的数据请求?
-
有哪些参数传值的方法?
-
你使用过哪些方法,来提高微信小程序的应用速度?
-
小程序和原生App哪个好?
-
简述微信小程序原理?
-
分析微信小程序的优劣势
-
怎么解决小程序的异步请求问题?
其他知识点面试
-
webpack的原理
-
webpack的loader和plugin的区别?
-
怎么使用webpack对项目进行优化?
-
防抖、节流
-
浏览器的缓存机制
-
描述一下二叉树, 并说明二叉树的几种遍历方式?
-
项目类问题
-
笔试编程题:
最后
技术栈比较搭,基本用过的东西都是一模一样的。快手终面喜欢问智力题,校招也是终面问智力题,大家要准备一下一些经典智力题。如果排列组合、概率论这些基础忘了,建议回去补一下。