首页 前端知识 前端(jquery),科学技术协会面试问题

前端(jquery),科学技术协会面试问题

2024-05-10 22:05:49 前端知识 前端哥 311 448 我要收藏


`

$(‘.table’).html(str)

$(‘input[name=“btn”]’).on(‘click’,function(){

$.ajax({

type:‘post’,

url:‘http://10.7.178.116:4000/my/update/avatar’,

headers: {‘Authorization’: token},

dataType: ‘JSON’,

data:{

avatar:$(‘input[name=“avatar”]’).val(),

},

success:function(data){

console.log(data);

if(data.status==0){

alert(‘更换成功’)

getList()

}

}

})

})

}

//更换密码

function getPassword(){

let str=`



`

$(‘.table’).html(str)

$(‘input[name=“btn”]’).on(‘click’,function(){

$.ajax({

type:‘post’,

url:‘http://127.0.0.1:4000/my/updatePwd’,

headers: {‘Authorization’: token},

dataType: ‘JSON’,

data:{

oldPws:$(‘input[name=“oldPas”]’).val(),

newPws:$(‘input[name=“newPas”]’).val(),

},

success:function(data){

if(data.status==0){

alert(‘更改成功’)

getList()

}

}

})

})

}

//删除用户

$(‘.table’).on(‘click’,‘.del’,function(){

const id=$(this).attr(‘data-index’)

$.ajax({

type:‘post’,

url:‘http://127.0.0.1:4000/my/delUser’,

headers: {‘Authorization’: token},

dataType: ‘JSON’,

data:{

id:id,

},

success:function(data){

if(data.status==0){

alert(‘删除成功’)

getList()

}

}

})

})

后端

=====================================================================

  1. 连接数据库db/index.js

const mysql=require(‘mysql’)

//建立数据库连接

const db=mysql.createPool({

host:‘127.0.0.1’,

user:‘root’,

password:‘123456’,

database:‘test2’

})

module.exports=db

  1. 建立路由
  • 公开路由,不用身份验证router/user.js

const express=require(‘express’)

const router=express.Router()

//导入路由模块

const user_handler=require(‘…/router-handler/user’)

//导入验证数据中间件

const expressJoi=require(‘@escook/express-joi’)

//导入验证规则对象

const {reg_sign_schema}=require(‘…/schema/user’)

//注册新用户

router.post(‘/reguser’,expressJoi(reg_sign_schema),user_handler.reguser)

//登录

router.post(‘/sign’,expressJoi(reg_sign_schema),user_handler.sign)

module.exports=router

  • 私有路由要验证router/userinfo.js

const express=require(‘express’)

const router=express.Router()

//导入路由模块

const userinfo_handler=require(‘…/router-handler/userinfo’)

//导入数据验证中间件

const expressJoi=require(‘@escook/express-joi’)

//导入验证条件

const {update_userinfo_schema,update_password_schema,update_avatar_schema,delete_user_shema}=require(‘…/schema/user’)

//获取用户基本信息

router.get(‘/userinfo’,userinfo_handler.getUserinfo)

//更新用户信息

router.post(‘/updateUserinfo’,expressJoi(update_userinfo_schema),userinfo_handler.updataUserinfo)

//重置密码

router.post(‘/updatePwd’,expressJoi(update_password_schema),userinfo_handler.updatePassword)

//更换用户头像

router.post(‘/update/avatar’,expressJoi(update_avatar_schema),userinfo_handler.updateAvatar)

//获取访客列表

router.get(‘/list’,userinfo_handler.getList)

//删除用户

router.post(‘/delUser’,expressJoi(delete_user_shema),userinfo_handler.getDelUser)

module.exports=router

  1. 路由执行代码
  • 公开路由执行代码router-handler/user.js

//导入数据库模块

const db=require(‘…/db/index’)

//加密模块

const bcrypt=require(‘bcryptjs’)

//导入token模块

const jwt=require(‘jsonwebtoken’)

const config=require(‘…/schema/config’)

const { TokenExpiredError } = require(‘jsonwebtoken’)

//注册新用户

exports.reguser=(req,res)=>{

const userinfo=req.body

// if(!userinfo.name||!userinfo.password){

// // return res.send({

// // status:1,

// // message:‘用户名或密码不为空’

// // })

// return res.cc(‘用户名或密码不为空’)

// }

//定义数据库查询语句

const sqlStr=‘SELECT * FROM ev_users WHERE username=?’

db.query(sqlStr,[userinfo.username],function(err,results){

if(err)return res.cc(err)

if(results.length>0)return res.cc(‘用户名已占用’)

//加密

userinfo.password=bcrypt.hashSync(userinfo.password,10)

//注册新用户

const newUserSql=‘insert into ev_users set ?’

db.query(newUserSql,{username:userinfo.username,password:userinfo.password},(err,results)=>{

if(err)return res.cc(err)

if(results.affectedRows!==1)return res.cc(‘注册出错了’)

res.cc(err,0)

})

})

}

//登录

exports.sign=(req,res)=>{

const userinfo=req.body

let usernanmSql=‘SELECT * FROM ev_users WHERE username=?’

db.query(usernanmSql,userinfo.username,(err,results)=>{

//判断用户

if(err) return res.cc(err)

if(results.length==0) return res.cc(‘用户名不存在’)

//判断密码

const comparResults= bcrypt.compareSync(userinfo.password,results[0].password)

if(!comparResults)return res.cc(‘密码错误’)

//生成token字符串

const user={…results[0],password:‘’,user_pic:‘’}

//加密

const tokenStr=jwt.sign(user,config.jwtSecretKey,{expiresIn:‘10h’})

res.send({

status:0,

message:‘登录成功’,

token:'Bearer '+tokenStr

})

})

}

  • 私有路由执行代码router-handler/userinfo.js

//导入数据库模块

const db =require(‘…/db/index’)

//导入密码模块

const bcrypt=require(‘bcryptjs’)

//查询用户信息函数

exports.getUserinfo=(req,res)=>{

//定义字符串

const sql=‘SELECT id,username,nickname,email,user_pic FROM ev_users WHERE id=?’

//执行

db.query(sql,req.user.id,(err,results)=>{

if(err) return res.cc(err)

if(results.length!==1) return res.cc(‘获取用户信息失败’)

res.send({

status:0,

message:‘获取成功’,

data:results[0]

})

})

}

//更新用户数据

exports.updataUserinfo=(req,res)=>{

//定义字符串

const sql=‘UPDATE ev_users SET id=?,nickname=?,email=? WHERE id=?’

//执行语句

db.query(sql,[req.body.id,req.body.nickname,req.body.email,req.user.id],(err,results)=>{

//执行成功但影响函数不为一

if(err) return res.cc(err)

console.log(results);

if(results.affectedRows!==1) return res.cc(‘错误’)

return res.cc(‘修改成功’,0)

})

}

//重置密码

exports.updatePassword=(req,res)=>{

const sql=‘SELECT * FROM ev_users WHERE id=?’

//执行查询用户名是否存在操作

db.query(sql,[req.user.id],(err,results)=>{

if(err) return res.cc(err)

if(results.length!==1) return res.cc(‘查询失败’)

//判定密码是否正确

const comparePws= bcrypt.compareSync(req.body.oldPws,results[0].password)

if(!comparePws) return res.cc(‘密码出错’)

//执行重置密码

const sql=‘UPDATE ev_users SET password=? WHERE id=?’

const newPws=bcrypt.hashSync(req.body.newPws,10)

db.query(sql,[newPws,req.user.id],(err,results)=>{

if(err) return res.cc(err)

if(results.affectedRows!==1) return res.cc(‘更改密码出错’)

res.cc(‘成功’,0)

})

})

}

//更换用户头像

exports.updateAvatar=(req,res)=>{

const sql=‘UPDATE ev_users SET user_pic=? WHERE id=?’

db.query(sql,[req.body.avatar,req.user.id],(err,results)=>{

if(err) return res.cc(err)

if(results.affectedRows!==1) return res.cc(‘更改失败’)

res.cc(‘更换成功’,0)

})

}

//获取所有用户信息列表

exports.getList=(req,res)=>{

const sql=‘SELECT * FROM ev_users’

db.query(sql,(err,results)=>{

if(err) return res.cc(err)

res.send({

status:0,

message:‘获取成功’,

data:results

})

})

}

//删除用户

exports.getDelUser=(req,res)=>{

const sql=‘DELETE FROM ev_users WHERE id=?’

db.query(sql,[req.body.id],(err,results)=>{

console.log(req.body.id);

if(err) return res.cc(err)

if(results.affectedRows!==1) return res.cc(‘删除错误’)

res.cc(‘删除成功’,0)

})

}

  1. 模式验证与密钥
  • 模式验证schema/user,js

const joi=require(‘joi’)

//string()字符串

//alphanum()值只能是0-9a-zA-Z

//min()最小长度

//max()最大长度

//required()必填项

//pattren(正则表达式)

//用户名验证规则

const username=joi.string().min(4).max(10).required()

//密码验证规则

const password=joi.string().required()

//更换头像验证规则

const avatar=joi.string().required()

//注册和登录验证对象

exports.reg_sign_schema={

body:{

username,

password

},

}

//定义id,nickname,email验证规则

const id=joi.number().integer().min(1).required()

const nickname=joi.string().required()

const email=joi.string().email().required()

//更新用户名验证对象

exports.update_userinfo_schema={

body:{

id,

nickname,

email

}

}

//更新密码验证

exports.update_password_schema={

body:{

oldPws:password,

//ref继承,not不等于,concat合并两个条件

newPws:joi.not(joi.ref(‘oldPws’)).concat(password)

}

}

//更换头像规则验证

exports.update_avatar_schema={

body:{

avatar

}

}

//删除id验证

exports.delete_user_shema={

body:{

id

}

}

  • 密钥schema/config.js

//全局配置文件

module.exports={

//密钥

jwtSecretKey: ‘this is key’,

}

  1. 因为是在区域网内进行的测试还需要个代码web.js托管前端代码

const express=require(‘express’)

const app=express()

app.use(express.static(‘web’))

app.listen(3000,function(){

console.log(‘express server tunning’);

})

//浏览器输入http://localhost/index.html拿到html中内容

  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 config=require(‘./schema/config’)

//导入解析token模块

const expressJWT=require(‘express-jwt’)

//指定哪些接口不需要认证

app.use(expressJWT({secret:config.jwtSecretKey,algorithms: [‘HS256’]}).unless({path:[/^/api/]}))

//导入用户路由模块

const userRouter=require(‘./router/user’)

app.use(‘/api’,userRouter)

//导入用户信息路由模块

const userinfoRouter=require(‘./router/userinfo’)

app.use(‘/my’,userinfoRouter)

//定义错误级别中间件

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)

})

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

打开全栈工匠技能包-1小时轻松掌握SSR

两小时精通jq+bs插件开发

生产环境下如歌部署Node.js

网易内部VUE自定义插件库NPM集成

谁说前端不用懂安全,XSS跨站脚本的危害

webpack的loader到底是什么样的?两小时带你写一个自己loader

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

mMTg2ZGFlZV9oZC5qcGc?x-oss-process=image/format,png)

生产环境下如歌部署Node.js

网易内部VUE自定义插件库NPM集成

谁说前端不用懂安全,XSS跨站脚本的危害

webpack的loader到底是什么样的?两小时带你写一个自己loader

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-bGvf90Bt-1712751610353)]

转载请注明出处或者链接地址:https://www.qianduange.cn//article/8047.html
标签
评论
发布的文章

HTML5(H5)中的Web Workers

2024-05-19 09:05:52

HTML5

2024-02-27 11:02:15

HTML5 <option> 标签

2024-05-19 09:05:51

@JsonProperty 注解详解

2024-05-19 09:05:27

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!