【nodeJS】从nodejs原生的博客网站搭建到 koa框架实现个人博客网站搭建
nodejs实现搭建博客网站
前言:原java后端渣渣一枚,因项目需要转学了nodejs进行开发,正式进行项目开发之前,师傅安排了一些项目训练,先熟悉js语法,然后熟悉nodejs,再慢慢重构向框架的使用。
写这一篇文章的目的在于记录自己学习的历程,同时也是给其他的nodejs学习者一点参考,如果有修正之处,请给予意见,感谢各位,希望对你有用~
开发环境
系统:可以的话建议使用Linux系统,推荐Ubuntu,笔者习惯了Windows开发,暂时使用的是win7
开发工具:Visual Studio Code
语言:node 5.6.0
npm 5.6.0(其他的依赖模块靠npm去安装)
语法基础
1.熟悉js的基本语法,把nodejs的req、res以及其他相关的api熟悉起来;
2.mysql的使用,熟悉的sql脚本的编写
项目开发
目标功能(主要功能还是比较简单的几个需求,要求一天内完成)
1.网站显示图片、文字、有简洁的样式
2.网站返回服务器时间
3.网站支持用户留言以及显示当前最新10条留言
4.网站显示当前访问的客户的客户端信息
5.底部显示当前网站的访问量(日访问量以及总访问量)
——————————————————————coding———————————————————————————
选定某个文件夹路径,先新建一个index.js文件,作为项目入口,然后,在命令提示符环境下运行以下命令
npm init
之后就按照提示,输入对应的项目信息,初始化项目工程,完成之后,就可以开始coding啦~
打开index.js文件,先把对应模块引入(经由师傅提醒,为项目导入的时候应同时建立依赖文件的记录,这样能保证工程在其他机器运行的前能够安装所有的依赖模块)
npm install 模块名 --save
好了,这么一来,依赖的模块也搞定了,剩下的只剩下博客的后台处理逻辑以及前端展示的页面了。
var http = require('http');
var util = require('util');
var url = require('url');
var fs = require('fs');
var path = require('path');
var querystring = require('querystring');
目前模块引入如上,关于搭建服务器的基本语法,菜鸟教程上讲的非常详细,我们就不赘述了
在入口index.js文件里面,我们搭建了服务器,监听对应的端口,并对相应的接口地址进行逻辑处理:
const http = require('http');
const util = require('util');
const url = require('url');
const fs = require('fs');
const path = require('path');
const querystring = require('querystring');
//连接数据库
const mysql = require('mysql');
const connection = mysql.createConnection({ host : 'localhost', user : 'root', password : '1234', port: '3306', database: 'mysql',
});
connection.connect();//留言功能
let message = [];
let mesLength = 0;
let messageShow = '';let sql = 'SELECT message FROM MyOwnPage_messageBox';const uriName = ['html','css','jsp','jpg','png'];console.log("项目已经启动……127.0.0.1:3000监听当中")var app = http.createServer(function (req, res) {let body = "";req.on('data', function (chunk) {body += chunk;});req.on('end',function(){body = querystring.parse(body);let pathName = url.parse(req.url).pathname;//static resourceif(req.method == 'GET' && pathName == '/' ){fs.readFile(__dirname+"\\LoginPage.html", function (err, data){if(err){res.writeHead(404, {'Content-Type': 'text/html'});}else{res.writeHead(200,{'Content-Type': 'text/html'});res.write(data);res.end();}})}if(req.method == 'GET' && uriName.indexOf(path.extname(pathName).substring(1)) != -1){if(pathName ==='/HomePage.html'){let addsql = 'INSERT INTO login_log (page,ip,login_time) value (?,?,?)';let ip = req.socket["remoteAddress"];let date = new Date();let day = date.getDate();let month = date.getMonth()+1;let year = date.getFullYear();let login_time = year+'-'+month+'-'+day;let sqlParams = [pathName,ip,login_time];connection.query(addsql,sqlParams,function(err,result){if(err){return;} })}fs.readFile(__dirname+"\\"+pathName.substring(1), function (err, data){if(err){res.writeHead(404, {'Content-Type': 'text/html'});}else{if(path.extname(pathName).substring(1) === 'css'){res.writeHead(200,{'Content-Type': 'text/css'});}else if(path.extname(pathName).substring(1) === 'html'){res.writeHead(200,{'Content-Type': 'text/html'});}else if(path.extname(pathName).substring(1) === 'jpg'){res.writeHead(200,{'Content-Type': 'image/jpeg'});}res.write(data);res.end();}})}//获取系统时间if(req.method == 'GET' && pathName == '/sysTime_wenzhiqun'){let time = new Date();let year = time.getFullYear();let month = time.getMonth()+1;let date= time.getDate();let hour = time.getHours();let minutes = time.getMinutes();let seconds = time.getSeconds();if(month<10){month = "0"+month; }if(date<10){date = "0"+date; }if(hour<10){hour = "0"+hour; }if(minutes<10){minutes = "0"+minutes; }if(seconds<10){seconds = "0"+seconds; }let currentTime = "当前服务器时间为:"+year+"年"+month+"月"+date+"日"+hour+":"+minutes+":"+seconds;res.write(currentTime); res.end();}//提交留言信息if(req.method == 'POST' && pathName == '/message'){// 新增留言栏中的留言let addsql = 'INSERT INTO MyOwnPage_messageBox (messageCount,message) value (?,?)'let userMes = body['message'];let sqlParams = [mesLength+1,userMes];connection.query(addsql,sqlParams,function(err,result){if(err){res.write("提交失败,请重试");res.end();return;} res.write("提交成功");res.end(); })}//获取留言栏if(req.method == 'GET' && pathName == '/message/list'){let sql = 'SELECT message FROM MyOwnPage_messageBox';//查询目前的留言栏connection.query(sql,function (err, result) {if(err){return;}message = [];mesLength = 0;for(i of result){message[mesLength]=i.message;mesLength++;} });let messageShow = '留言栏:';if(message.length<=10){for(let i = message.length,j=1;i>0;i--){messageShow = messageShow+'<br>'+'('+j+')'+message[i-1];j++;}}else if(message.length>10){for(let i = message.length,j=1;i>(message.length-10);i--){messageShow = messageShow+'<br>'+'('+j+')'+message[i-1];j++;}}res.write(messageShow);res.end();}//获取客户端信息if(req.method == 'GET' && pathName == '/sysinfo'){let ob = req.headers["user-agent"].split(" ");let system = ob[1].substring(1);let chrome = ob[9].split('/')[0];let ip = req.socket["remoteAddress"];let iptype = req.socket["remoteFamily"];res.write("<b>操作系统:</b>"+system+" <b>浏览器:</b> "+chrome+"<b>ip地址:</b> "+ip+" <b>ip类型:</b> "+iptype);res.end();}//获取访客量if(req.method == 'GET' && pathName == '/visit'){let sql = 'SELECT login_time FROM login_log';//查询目前的总访客量和日访客量connection.query(sql,function (err, result) {if(err){return;}let arr = [];//日访问量let date = new Date();let day = date.getDate();let month = date.getMonth()+1;let year = date.getFullYear();let login_date = year+'-'+month+'-'+day;let day_vi = 0;for(i of result){arr.push(i.login_time);}// 访问总量let vi = arr.length;for (let i = 0; i<arr.length;i++){if(arr[i] == login_date){day_vi++;}}console.log("总访问量为:"+vi+"\n今日访问量为:"+day_vi);res.write("当前页面总访问量为:"+vi+"次"+"\n今日访客量为:"+day_vi+"次");res.end(); });}})
});app.listen(3000);
以上是一个非常简单的实现,由于是很久很久以前写的了,所以会有很多不足的地方,包括:
1)数据库没有使用连接池去管理,没有考虑每条数据库连接之后的处理
2)有较多的模块没有抽象出来写成公共的工具类(其实也是想要一次性完成,毕竟只用一天的时间……比较粗糙)
3)听说没有error处理的代码不是好代码
另外关于具体的代码实现有几点是需要补充说明的:
1)读取静态文件,像html、css、jpg等文件时,需要判断请求文件的类型,并对其做出相应的处理,而不只是单纯的针对html后缀的文件进行返回(毕竟也是自己踩过的坑,对于html的基础没有学好,导致漏处理)
2)熟练的应用node的原生模块,可以使用querysthing、url等模块对http请求进行解析,以便于我们对于访问资源的处理以及请求的响应
3)依据restful风格,get请求与post请求归类之后针对其uri进行操作
4)由于当时对于整块html不算熟悉,用了最原生态的返回html源码去写页面,⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄
主要的代码如上,其实逻辑很简单,API也很简单,完成之后点击一波F5,或者在命令提示符窗口里,输入node index.js 运行工程…(其实我大部分的时间还是花在这个渣渣的前端页面编写上)
跑起来的工程大概就是这样了——
在浏览器输入localhost:3000/HomePage.html,前端显示如下——
至此,原生的博客网站搭建完成了,勉强完成以上的需求(页面有点丑…勿喷~)
——————————————————————我是分割线—————————————————————————
经过一番koa框架的学习,终于我要迈出从渣渣原生到美腻的框架实现的蜕变了!
学习资料参考:
1.koa官网:https://koa.bootcss.com/
2.ejs模板引擎学习
开始之前重新澄清一下需求,这一次,我们的需求更新了一些细节上的东西
目标功能
(包含之前的五个功能)
6.增加登录、注册功能
7.增加登录后的角色权限,并分配给管理员角色操作留言栏的功能
8.在页面中添加显示登录的角色的用户名
9.网站的样式定时更换
10.优化后台的数据持久化方式(使用连接池)
——————————————————————coding———————————————————————————
一、项目创建
选定文件夹作为工程存放位置,之后还是在cmd环境下使用
npm init
先对工程进行初始化,之后使用以下指令创建koa工程结构npm koa
好了,接下来还是需要我们手动创建一个index.js文件,开始敲我们的代码——
二、工程目录结构
三、开始书写我们的主代码:
主目录下的index.js(入口文件)
const koa = require('koa');
const app = new koa();
const static = require('koa-static');
const index = require('./routes/index');
const views = require('koa-views');
const bodyParser = require('koa-bodyparser');
var MysqlStore = require('koa-mysql-session');
const session = require('koa-session-minimal');
const config = require('./config/default.js');
const ejs = require('ejs');
const path = require('path');//静态资源加载
app.use(static(__dirname+'/public'));
//视图调用
// app.use(views(__dirname+'/views'));
app.use(views(path.join(__dirname, './views'), {extension: 'ejs'
}))// session存储配置
const sessionMysqlConfig= {user: config.database.USERNAME,password: config.database.PASSWORD,database: config.database.DATABASE,host: config.database.HOST,
}// 配置session中间件
app.use(session({key: 'USER_SID',store: new MysqlStore(sessionMysqlConfig)
}))app.use(bodyParser());//这里的 allowedMethods 用于校验请求的方法,如果用 post 请求访问 get 接口,就会直接返回失败
app.use(index.routes(),index.allowedMethods());app.listen(3000,function(){console.log("项目已经启动");
});
这里面,我们引入了本次工程依赖的模块,和原生的工程不同,我们这次加入了很多的“新面孔”,包括有处理静态资源的public、views模块,session模块(对于角色的控制)、ejs模块(模板引擎)以及数据库连接池配置等等
关于koa我有几点想说的:
1)koa框架将req和res封装到了ctx当中,方便我们直接使用ctx调用原来res和req的方法
2)koa中引入了中间件的概念,我们使用.use()的方法去调用我们需要使用的中间件,按照从上往下的顺序,中间件的使用是有顺序区分的
3)采用MVC的思想,我们会将整个工程目录去做分层,如同工程结构截图所示,views里存放的是我们返回的视图,routes存放的是控制器和我们的业务处理(核心所在)…
routes目录下的index.js
const fs = require('fs');
const router = require('koa-router')();
const timeGetter = require('../utils/timeGetter');
const sqlUser = require('../lib/mysql');
const session = require('koa-session-minimal');
let mesLength2 ;router.get('/HomePage',async (ctx)=>{//记录访客量let ip = ctx.request.socket["remoteAddress"];let currentTime = timeGetter.getServerDate();let path = '/HomePage.html' ;let value =[path,ip,currentTime]; if(ctx.session){await ctx.render('homePage',{session : ctx.session})}else{await ctx.render('homePage',{session : null})}sqlUser.addVisit(value);sqlUser.getAllMesCount().then(result=>{mesLength2 = result['count(message)'];})
})//获取服务器时间
router.get('/sysTime_wenzhiqun', ctx => {ctx.body = (timeGetter.getServerTime()).toString();
})//获取留言栏
router.get('/message/list', async(ctx) => {let mesLength = 0;let message = [];await sqlUser.getAllMes().then(result =>{for(i of result){message[mesLength]=i.message;mesLength++;}})let messageShow = '留言栏:';//普通用户if(ctx.session.role != 'admin'){if(message.length<=10){for(let i = message.length,j=1;i>0;i--){messageShow = messageShow+'<br>'+'('+j+')'+message[i-1];j++;}}else if(message.length>10){for(let i = message.length,j=1;i>(message.length-10);i--){messageShow = messageShow+'<br>'+'('+j+')'+message[i-1];j++;}}}else{if(message.length<=10){for(let i = message.length,j=1;i>0;i--){messageShow = '<table style="text-align: left"><tr><th>'+messageShow+'</th><th></th><th></th></tr>'+'<tr><td>('+j+')</td><td><p id="'+j+'">'+message[i-1]+'</p></td><td><button onclick = deleteMes('+j+')>删除留言</button></td></tr>';j++;}}else if(message.length>10){for(let i = message.length,j=1;i>(message.length-10);i--){messageShow = '<table style="text-align: left"><tr><th>'+messageShow+'</th><th></th><th></th></tr>'+'<tr><td>('+j+')</td><td><p id="'+j+'">'+message[i-1]+'</p></td><td><button onclick = deleteMes('+j+')>删除留言</button></td></tr>';j++;}}messageShow = messageShow +'</table>';}mesLength2 = mesLength;ctx.body = messageShow;
})//获取客户端信息
router.get('/sysinfo', ctx => {let ob = ctx.request.headers["user-agent"].split(" ");let system = ob[1].substring(1);let chrome = ob[9].split('/')[0];let ip = ctx.request.socket["remoteAddress"];let iptype = ctx.request.socket["remoteFamily"];ctx.body = "<b>操作系统:</b>"+system+" <b>浏览器:</b> "+chrome+"<b>ip地址:</b> "+ip+" <b>ip类型:</b> "+iptype;
})//获取访问量
router.get('/visit',async (ctx) => {await sqlUser.getVisitCount().then(result =>{let arr = [];let day_vi = 0;let today_date = timeGetter.getServerDate(); for(i of result){arr.push(i.login_time);}// 访问总量let vi = arr.length;for (let i = 0; i<arr.length;i++){if(arr[i] == today_date){day_vi++;}}ctx.body = "当前页面总访问量为:"+vi+"次"+"\n今日访客量为:"+day_vi+"次";});
})// 提交留言
router.post('/message',async (ctx) =>{let userMes = ctx.request.body.message;let sqlParams = [mesLength2+1,userMes];await sqlUser.insertMes(sqlParams).then(result=>{ctx.body = "成功了!";});
});//删除留言
router.post('/deleteMes',async (ctx) =>{let userMes = ctx.request.body.message;let sqlParams = [userMes];await sqlUser.deleteMes(sqlParams).then(result=>{ctx.body = "删除成功!";});
});//登陆
router.post('/login',async (ctx) =>{let username = ctx.request.body.profile;let pwd = ctx.request.body.pwd;let user = {'username':username};await sqlUser.findDataByUser(username,pwd).then( result=>{if(result[0]){user['role'] = result[0].role;ctx.session = user;ctx.body = '2';}else{ctx.body = '1' ;}})
})//登录引导页
router.get('/',async ctx =>{if(JSON.stringify(ctx.session) =='{}'){await ctx.render('login');}else{await ctx.render('homePage',{session : ctx.session});}
})//登出
router.get('/clearSession',async (ctx) =>{let clear = function(){ctx.session = null;}clear();await ctx.render('login');
})//注册
router.post('/register',async(ctx) =>{let profile = ctx.request.body.profile;let pwd = ctx.request.body.pwd;let username = ctx.request.body.username;let create_time = timeGetter.getServerDate();let role = 'normal_user';let value = [profile,pwd,username,role,create_time];await sqlUser.insertUser(value).then(result=>{if(result){let user = {username:username,role:role};ctx.session = user;ctx.body = "1";}else{ctx.body = '2';}})
})module.exports = router;
值得注意的是,我们在这里面开始应用上ES6、7标准的语法,async/await函数以及promise的语法:
1)在routes中的index文件,我们应该在装有异步的事件中使用async函数,部分api是不需要使用到async函数,因为不存在异步回调的使用,如返回服务器时间、获取客户端系统信息等
2)使用了async函数,参数列表是否使用next取决于函数的内容,next()会直接进入下一个中间件,等待中间件处理完毕之后再回到当前函数继续执行
3)我们在数据库操作完成返回了一个promise对象,可以利用promise对象的.then()对await 里获得的返回对象进行下一步的操作,并且建议await后面的语句是一个异步的事件,当然如果不是也没关系,await会按照正常的语句去处理,相当于同步处理
关于使用的几大模块:
1.session:直接对session的操作,依赖koa-session-minimal我们实现了对ctx.session非常简便的操作,进行用户角色和权限的控制
2.sql:将sql的管理控制抽离出来,在工程结构里集成管理
sql数据持久化操作
mysql.js
var mysql = require('mysql');
var config = require('../config/default.js')var pool = mysql.createPool({host : config.database.HOST,user : config.database.USERNAME,password : config.database.PASSWORD,database : config.database.DATABASE
});let query = function( sql, values ) {return new Promise(( resolve, reject ) => {pool.getConnection(function(err, connection) {if (err) {resolve( err )} else {connection.query(sql, values, ( err, rows) => {if ( err ) {reject( err )} else {resolve( rows )}connection.release()})}})})}// 提交留言
let insertMes = function(value) {let _sql = "INSERT INTO MyOwnPage_messageBox (messageCount,message) value (?,?) "return query( _sql, value )
}
// 删除留言
let deleteMes = function(value) {let _sql = "DELETE FROM MyOwnPage_messageBox WHERE message = ?"return query( _sql, value )
}// 获取所有的留言总量
let getAllMesCount = function() {let _sql = "SELECT count(message) FROM MyOwnPage_messageBox"return query( _sql)
}// 获取所有的留言
let getAllMes = function() {let _sql = "SELECT message FROM MyOwnPage_messageBox"return query( _sql)
}// 查询访客量
let getVisitCount = function() {let _sql = "SELECT login_time FROM login_log"return query( _sql)
}//增加访客量
let addVisit = function(value) {let _sql = "INSERT INTO login_log (page,ip,login_time) value (?,?,?) ";return query( _sql, value);
}//通过账户名密码查询登陆id及角色
let findDataByUser = function (profile,pwd) {let _sql = `SELECT username, role FROM USER_PROFILE WHERE email = "${profile}"`return query( _sql)
}//新增(注册)用户
let insertUser = function(value) {let _sql = "INSERT INTO user_profile (email,pwd,username,role,create_time) value (?,?,?,?,?) ";return query( _sql, value );
}module.exports={insertMes,deleteMes,getAllMes,findDataByUser,getVisitCount,addVisit,getAllMesCount,insertUser
}
登录页面
login.ejs
<!DOCTYPE html>
<html>
<head><meta charset="utf-8" /><title>IronMan 登陆页面</title><script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script><style>#header{background-color:black;color:white;text-align:center;padding:5px;height: 20px;}</style><script>function login(){let profile = $("#profile").val() ;let pwd = $("#pwd").val();$.ajax({type:'POST',url:'/login',data:{profile : profile,pwd : pwd},success: function(data){if(data == '2'){// alert(data);red(data);}else{alert('账号或密码出错了!');}}})}function red(data){// let dd = data.split(',');// let us = dd[0];// let ro = dd[1];let link = '/HomePage';window.location.href=link;}function register(){let profile = $("#profile2").val() ;let username = $("#username").val();let pwd = $("#pwd2").val();$.ajax({type:'POST',url:'/register',data:{profile : profile,username : username,pwd : pwd},success: function(data){if(data == '1'){alert("注册成功,跳转至首页!");red(data);}else{alert('账号名或密码已存在!');}}})}function changePwd(){let profile = $("#profile3").val() ;let old_pwd = $("#old_pwd").val();let new_pwd = $("#pwd3").val();let new_pwd2 = $("#pwd4").val();if(new_pwd != new_pwd2){alert("输入的两次密码不一致,请重新输入");}else{$.ajax({type:'POST',url:'/changePwd',data:{profile : profile,pwd : old_pwd,pwd2 : new_pwd},success: function(data){if(data){alert("修改成功");red(data);}else{alert('账号名或密码已存在!');}}})}}</script>
</head>
<body><p id="header">IronMan</p><h2 style="text-align: center"><b style="color: rgb(255, 180, 180)">欢迎来到IronMan的个站</b></h2><table><tr><th><h3 style="color: rgb(145, 145, 253)" >登陆</h3></th></tr><tr><td>账号:</td><td><input id="profile"></td></tr><tr><td>密码:</td><td><input id="pwd"></td></tr><tr><td><input value="登陆" type="submit" οnclick="login()"></td></tr></table><br><table style="text-align: left"><tr><th><h3 style="color: rgb(145, 145, 253)" >注册</h3></th></tr><tr><td><b>请填写以下信息并完成注册:</b></td></tr><tr><td>账号(邮箱):</td><td><input id="profile2"></td></tr><tr><td>用户名:</td><td><input id="username"></td></tr><tr><td>密码:</td><td><input id="pwd2"></td></tr><tr><td><input value="注册" type="submit" οnclick="register()"></td></tr></table><br><table style="text-align: left"><tr><th><h3 style="color: rgb(145, 145, 253)" >修改密码</h3></th></tr><tr><td>账号</td><td><input id="profile3"></td></tr><tr><td>请输入旧密码:</td><td><input id="old_pwd"></td></tr><tr><td>新密码:</td><td><input id="pwd3"></td></tr><tr><td>确认密码:</td><td><input id="pwd4"></td></tr><tr><td><input value="确认修改" type="submit" οnclick="changePwd()"></td></tr></table>
</body>
</html>
登录页面是常规的操作了,很简单,重点在于我们的主页,使用模板引擎去把session的内容展示出来
主页 homePage.ejs
<!DOCTYPE html>
<html>
<head><meta charset="utf-8" /><link type="text/css" rel="styleSheet" href="./iron.css" /><script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script><title>个人站点主页</title><script> //获取系统时间function getSystemTime(){$.ajax({type:'GET',url:'/sysTime_wenzhiqun',success: function(data){if(data){document.getElementById('time').innerHTML= data;}else{alert('失败了!');}}})}//获取访问次数function getVisit(){$.ajax({type:'GET',url:'/visit',success: function(data){if(data){document.getElementById('foot').innerHTML= data;}else{alert('失败了!');}}})}//获取留言信息function getMesBox(){$.ajax({type:'GET',url:'/message/list',success: function(data){if(data){document.getElementById('messageBox').innerHTML= data;}else{alert('失败了!');}}})}//提交留言function mesPost(){console.log($('.form').serialize())let mes = $("#message").val() ;alert(mes);if(mes == '' || mes.length >= 20){alert("留言不能为空或超过20个字符长度");}else{$.ajax({type:'POST',url:'/message',data:$('.form').serialize(),success: function(data){if(data){getMesBox();}else{alert('失败了!');}}})}}//获取客户端信息function getClientMes(){$.ajax({type:'GET',url:'/sysinfo',success: function(data){if(data){document.getElementById('xiugai').innerHTML= data;}else{alert('失败了!');}}})}function choose(){let choose = parseInt(3*Math.random())+1;if(choose === 1 ){document.getElementById('body').style.backgroundColor = 'white';}if(choose === 2){document.getElementById('body').style.backgroundColor = 'rgb(212, 211, 211)';}if(choose ===3){document.getElementById('body').style.backgroundColor = 'rgb(251, 255, 188)';}}function changeStyle(){setInterval('choose()',3000); }function deleteMes(j){let mes = document.getElementById(j).innerText;$.ajax({type:'POST',url:'/deleteMes',data:{message : mes },success: function(data){if(data){getMesBox();}else{alert('失败了!');}}})}</script></head>
<body id="body" οnlοad="changeStyle()" style="background-color: rgb(248, 211, 211)"></body><p id="header">IronMan</p><h4 id="time" οnclick="getSystemTime()">点我刷新服务器时间</h4><div class="user_name" style="text-align: right">您好,<% if(session.username){ %><%= session.username %><a href="/clearSession">退出登录</a><% } %><% if(!session.username){ %>您还未登录<% } %></div><div><div id="myimage"><img src="./iron2.jpg"></div><div id="kongbai"></div><div id="headDiv"><h3>个人介绍</h3><h4>IronMan</h4><h4>诞生地:Marvel</h4><h4>详细介绍:</h4><p>托尼·史塔克(Tony Stark)即钢铁侠(Iron Man),是美国漫威漫画旗下超级英雄,初次登场于《悬疑故事》(Tales of Suspense)第39期(1963年3月),由斯坦·李、赖瑞·理柏、唐·赫克以及杰克·科比联合创造。全名安东尼·爱德华·“托尼”·斯塔克(Anthony Edward “Tony” Stark),是斯塔克工业(STARK INDUSTRIES)的董事长,因于一场阴谋绑架中,胸部遭弹片穿入,生命危在旦夕,为了挽救自己的生命,在同被绑架的物理学家殷森(Yin Sen)的协助下托尼造出了防止弹片侵入心脏的方舟反应炉从而逃过一劫,后又用方舟反应炉作为能量运转的来源,暗中制造了一套高科技战衣杀出重围后逃脱,后参与创立复仇者联盟。</p></p></div></div><form class="form create" method="post "><div><label>留言板 :</label> <input placeholder="留言" type="text" name="message" id="message"></div><div class="submit" οnclick="mesPost()">提交</div></form> <div id="headDiv2"><h4 id="messageBox" οnclick="getMesBox()">点我显示留言栏</h4><h4 οnclick="getClientMes()" >点我显示当前访问的客户端信息为:</h4><p id="xiugai"></p></div><div ><p id="foot" οnclick="getVisit()">点我显示访问量</p></div></body>
</html>
实现后,管理员登录的页面如下图:
1)在服务器时间下多了登录的用户名显示
2)支持管理对留言栏的删除处理
3)其实还有一个隐藏的页面背景色的定时变化,截图所以看不出来~但是代码里面是可以发现的
结束语
到这里,基本上整个网站就已经完成了~
这个博客网站比较简单,代码有很多改进的地方,希望对你们有帮助,如果有什么建议可以和我联系,qq:657897294,有什么不懂得也可以问我,有空就会回复啦!
git地址:https://github.com/VeniesLoveJava/nodejs_Koa_BlogWeb.git
非常感谢你读完这篇这么长的文章!
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 《Node.js从入门到上线》入门篇 (持续更新中)
最近利用空闲时间写了一个从入门到上线的的node实战教程《Node.js从入门到上线》A blog build with Koa2. 目前还在更新中,入门篇已基本成型。 本项目使用es6语法,采用Koa2 + mongoose 搭建了一个博客系统,实现了文章管理、用户登录注册、权限控制、分类管理等功能。 GitHub…...
2024/4/27 17:18:04 - nodejs可以用来做什么
本文属于转载,原文地址:https://blog.csdn.net/xllily_11/article/details/50482468Node.JS 学习路线图从零开始nodejs系列文章, 将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的 Javascript引擎。chrome浏览器就…...
2024/4/27 15:36:40 - NodeJS笔记 一个完整的基于Node.js的web应用
作者: Manuel Kiessling翻译: goddyzhao & GrayZhang & MondayChen关于本书致力于教会你如何用Node.js来开发应用,过程中会传授你所有所需的“高级”JavaScript知识。本书绝不是一本“Hello World”的教程。状态你正在阅读的已经是本书的最终版。因此,只有当进行错…...
2024/4/15 3:59:13 - nodejs写接口-入门
首先默认装好了node环境 1、npm init 创建package.json文件; 2、创建一个app.js文件,当然别的名字也可以,这个文件是你整个程序的入口。 //引入express 创建服务器 var express = require(express); var app = express();// 需要对表单数据进行解析的,安装bodyParser var bo…...
2024/4/15 3:59:12 - Vue+Node+Mysql实现简单全栈开发入门
前言: 刚进一家新公司,安排我负责的模块还没有设计好。为了练手,用vue+node操作mysql,做一个简单的点餐系统,实现简单全栈开发,供前端想要入门了解node和mysql的朋友参考。 正文: 一、安装node.js环境 这个步骤请自行搜索百度经验,进行安装,当下nodejs已经无需配置环境…...
2024/4/27 13:54:46 - Nodejs开发博客01_项目准备
本项目重点内容Node基础 — 通过对Node基础的了解学习,打下Node基础NodeAPI — 开启服务提供API给前端调用Node连接MySQ L— 通过node操作数据库,实现增删改查的功能Node实战 — 个人博客从零开始,打造首页、作者主页、博客详情页、登录页、新建页、编辑页Node框架express重…...
2024/4/27 15:49:32 - ES6/ES7学习笔记 --- node.js开发
ES6/ES7学习笔记 — node.js开发最近开始学习Node.js开发,有很多基础知识和框架需要学习,所以打算将自己学习笔记记录下来,即可以和大家分享,也可以方便自己以后回顾知识。由于只是个人笔记,便不是详细的教程,有不懂的代码还请自行百度。主要模块babel-register babel-p…...
2024/4/27 13:26:36 - Node js入门
本书致力于教会你如何用Node.js来开发应用,过程中会传授你所有所需的“高级”JavaScript知识。本书绝不是一本“Hello World”的教程。 状态你正在阅读的已经是本书的最终版。因此,只有当进行错误更正以及针对新版本Node.js的改动进行对应的修正时,才会进行更新。 本书中的代…...
2024/4/18 16:00:15 - node.js资料
node.js相关的中文文档及教程from:http://www.douban.com/group/topic/35067110/ 收集帖: node.js 中文api (开放版) :http://nodeapi.ucdok.com/ node.js 中文api :http://jsfuns.com/ebook/#30d25070-118c-11e3-bc83-47c9e4e1d529 node.js入门中文版: http://nodebegi…...
2024/4/15 3:59:07 - Node.js是什么,何为Node.js ?
简介 如果您听说过 Node,或者阅读过一些文章,宣称 Node 是多么多么的棒,那么您可能会想:“Node 究竟是什么东西?” 即便是在参阅 Node 的主页之后,您甚至可能还是 不明白 Node 为何物?Node 肯定不适合每个程序员,但它可能是某些程序员一直苦苦追寻的东西。 为试图解释什…...
2024/4/17 22:10:24 - windows 10 下配置安装node.js
环境配置 node.js …...
2024/4/27 18:11:14 - Node.js 提升运行效率
Node.js 受益于它的事件驱动和异步的特征,已经很快了。但是,在现代网络中只是快是不行的。如果你打算用 Node.js 开发你的下一个Web 应用的话,那么你就应该无所不用其极,让你的应用更快,异常的快。本文将介绍 10 条,经过检验得知可大大提高 Node 应用的技巧。废话不多说,…...
2024/4/24 13:24:09 - 基于Node.js的爬虫工具 – Node Crawler
Node Crawler的目标是成为最好的node.js爬虫工具,目前已经停止维护。我们来抓取光合新知博客tech栏目中的文章信息。访问http://dev.guanghe.tv/category/tech/,右键查看页面源代码,可以看到文章信息等内容,如下所示:1 2 3 4 5 6 7 8 9 10 11<ul class="posts&quo…...
2024/4/27 15:54:41 - [一起学Node.js] Express MongoDB搭建多人博客-1
目录[-]学习环境快速开始安装Express新建一个工程工程结构路由控制工作原理路由规则添加路由规则模版引擎什么是模板引擎使用模板引擎页面布局搭建多人博客功能分析设计目标路由规划使用数据库MongoDB简介安装MongoDB连接MongoDB会话支持注册和登陆页面设计页面通知注册响应登录…...
2024/4/24 13:24:07 - 被误解的 Node.js
作者:王 群锋, 软件工程师, IBM 出处:http://www.ibm.com/developerworks/cn/web/1201_wangqf_nodejs/被误解的 Node.jsNode.js 被设计用来开发大规模高并发的网络应用,这种网络应用的瓶颈之一是在 I/O 的处理效率上。由于硬件及网络的限制,I/O 的速度往往是固定的,如何在…...
2024/4/27 14:51:40 - node.js中文资料导航 Mark
Node.js HomePage Infoq深入浅出Node.js系列(进阶必读) Node.js中文文档 被误解的 Node.js Node.js C++ addon编写实战系列 热门node.js模块排行榜,方便找出你想要的模块 nodejs多线程,真正的非阻塞 浅析nodejs的buffer类 利用libuv编写异步多线程的addon实例 Node.js中exp…...
2024/4/26 20:40:00 - 让你的Node.js应用跑得更快的10个技巧
让你的 Node.js 应用跑得更快的 10 个技巧Node.js 受益于它的事件驱动和异步的特征,已经很快了。但是,在现代网络中只是快是不行的。如果你打算用 Node.js 开发你的下一个Web 应用的话,那么你就应该无所不用其极,让你的应用更快,异常的快。本文将介绍 10 条,经过检验得知…...
2024/4/24 13:24:05 - Node.js + Express + handlebars搭建个人网站(1)
作为前端,需要学习的东西越来越多了,各种新框架,层出不穷。再加上Node.js的流行,需要学习的就更多了。很早就开始想学习Node,总是学了一半,又放下了,没有真正地掌握过。其中原因也是因为没有一个项目需求,只学API很容易就学不下去。1. 目标 使用Node.js 搭建个人网站,…...
2024/4/23 21:50:21 - #node.js资料
##Node.jsHomePageInfoq深入浅出Node.js系列(进阶必读)Io.js中文文档Node.js中文文档Node入门被误解的 Node.jsNode.js C++ addon编写实战系列热门node.js模块排行榜,方便找出你想要的模块nodejs多线程,真正的非阻塞浅析nodejs的buffer类利用libuv编写异步多线程的addon实例…...
2024/4/24 13:24:02 - node.js非安装配置
一般开发当中,jdk我们都会采用配置JAVA_HOME的方式直接引用jdk包,而不会去重新安装一个jdk.exe。那么nodejs是否可以也采用相同的方式安装呢? 当然有,不然我也不会写这篇博客了。好了,废话少说,上教程 首先下载nodejs非安装版,当然,也可以先安装,然后把安装好的Node…...
2024/4/24 13:24:01
最新文章
- 本地认证的密码去哪了?怎么保证安全的?
1. windows登录的明文密码,存储过程是怎么样的?密文存在哪个文件下?该文件是否可以打开,并且查看到密文? 系统将输入的明文密码通过hash算法转为哈希值,且输入的值会在内存中立即删除无法查看。 然后将密文存放在C:…...
2024/4/27 18:11:42 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 论文阅读AI工具链
文献检索 可以利用智谱清言来生成合适的文献检索式,并根据需要不断调整。 谷歌学术 在Google Scholar中进行检索时,您可以使用类似的逻辑来构建您的搜索式,但是语法会有所不同。Google Scholar的搜索框接受普通的文本搜索,但是…...
2024/4/23 6:25:51 - CSS使用clip-path实现元素动画
前言: 在日常开发当中,如果想要开发多边形,一般都需要多个盒子或者伪元素的帮助,有没有一直办法能只使用一个盒子实现呢? 有的:css裁剪 目录 前言: clip-path到底是什么? clip-pa…...
2024/4/26 6:25:10 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/26 18:09:39 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/26 20:12:18 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/26 23:05:52 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/27 4:00:35 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/26 21:56:58 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/27 9:01:45 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/25 18:39:16 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/26 22:01:59 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/26 23:04:58 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/25 2:10:52 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/25 18:39:00 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/26 19:46:12 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/27 11:43:08 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/27 8:32:30 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57