Angular前端 + Django后端 + Keycloak 实现SSO功能
目录
前言:
前端Angular集成Keycloak:
1.使用github开源的的库 keycloak-angular:
安装Keycloak Angular和keycloak客户端keycloak-js库:
Angular中设置Keycloak:
Keycloak登录:
2.自己实现集成Keycloak功能:
实现Keycloak登录:
登录成功,获取Keycloak相关信息:
3.关于Nginx配置:
后端Django集成Keycloak:
1.实现中间件:
2.实现Keycloak的API工具类:
代码地址:
前言:
一个企业往往拥有多个应用系统,如果每个应用都有独立的用户认证和授权管理功能,这不仅需要运维人员维护多套用户管理系统,用户使用每个系统时都要登录一次,非常不方便。如果能够将所有应用系统的用户集中管理,用户只登录一次,就可以无需再次登录而访问所有系统,这将会大大改善用户体验。本文前端Angular, 后端Django,基于Keycloak搭建单点登录系统。所以代码均经过验证,直接从工程代码中拷贝。
前端代码部署到nginx, 前后端代码分开部署
前端Angular集成Keycloak:
本文使用前端登录,而不是后端登录的方式。后端只负责检测前端发送的请求是否登陆过Keycloak,以及访问Keycloak server的几个API。
前端要怎样集成Keycloak呢? 本文提供两种方式
1.使用github开源的的库 keycloak-angular:
请参考github:https://github.com/mauriciovigolo/keycloak-angular
前端集成Keycloak,根据官方文档,keycloak提供了一个JavaScript adapter,详情请参考:https://www.keycloak.org/docs/latest/securing_apps/index.html#_javascript_adapter
这个keycloak-angular库对keycloak提供的这个JavaScript adapter进行了包装,可以帮助用户在Angular应用中更方便的使用, 它提供了以下特性:
- 提供了一个keycloak服务,它包装了要在Angular中使用的keycloak-js函数,为原始函数(keycloak-js文件中提供的函数)提供了额外的功能,并且还添加了新的函数,使其更容易被Angular应用程序使用
- 通用的AuthGuard实现,用户可以通过继承其认证逻辑和角色加载,自定义所需要的AuthGuard逻辑。
- 提供了一个HttpClient拦截器,登录成功之后,每个http请求都会在header中增加认证信息(其实就是登录成功之后的keycloak access token),用户可以禁用这个拦截器,也可以设置排除某个url的http请求。下面是拦截器源码中,给http请求的header中增加access token的代码:
/*** Adds the token of the current user to the Authorization header** @param req* @param next*/private handleRequestWithTokenHeader(req: HttpRequest<any>,next: HttpHandler): Observable<any> {return this.keycloak.addTokenToHeader(req.headers).pipe(mergeMap(headersWithBearer => {const kcReq = req.clone({ headers: headersWithBearer });return next.handle(kcReq);}));}
安装Keycloak Angular和keycloak客户端keycloak-js库:
具体版本请根据自己的angular版本和keycloak版本进行设置。
npm install keycloak-angular keycloak-js
本文所用版本:
当然,如果用户想用自己keycloak服务器中的keycloak-js,可以选择不安装keycloak-js库,而是在index.html入口文件中直接下载keycloak server中的keycloak.js文件。
<!doctype html>
<html>
<head><meta charset="utf-8"><title>Conduit</title><base href="/"><meta name="viewport" content="width=device-width, initial-scale=1"><link href="//code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css" rel="stylesheet" type="text/css"><link href="//fonts.googleapis.com/css?family=Titillium+Web:700|Source+Serif+Pro:400,700|Merriweather+Sans:400,700|Source+Sans+Pro:400,300,600,700,300italic,400italic,600italic,700italic" rel="stylesheet" type="text/css"><link rel="stylesheet" href="//demo.productionready.io/main.css"><!-- 导入keycloak服务器的keycloak.js脚本文件 --><script src="http://127.0.0.1:8082/auth/js/keycloak.js" type="text/javascript"></script>
</head>
Angular中设置Keycloak:
为了确保Keycloak在Angular应用启动时被初始化,必须在AppModule中添加一个APP_INITIALIZER provider。这个provider将调用如下所示的initializeKeycloak工厂函数,该函数将设置Keycloak服务,以便在应用程序中使用它。
keycloak-init.ts
import { KeycloakService } from 'keycloak-angular';export function initializeKeycloak(keycloak: KeycloakService) {return () =>keycloak.init({config: {realm: "master",//设置Realmurl: '/auth', //程序部署到nginx上,该请求将被反向代理到keycloak server。clientId: 'frontend-client', //设置clientcredentials : {secret : "8f28abe0-f4de-476d-bd8b-5354d78639de"}//设置client credentials},initOptions: {onLoad: 'login-required',flow: 'standard'},}).then(() => {//登录成功var roleId = "0";var roleTypes = {"ROLE_ADMIN": "1","ROLE_VIEWER": "2", "ROLE_OPERATOR": "3"};var roleArray = keycloak.getUserRoles(true); //登录成功,获取当前登录用户的role信息//登录成功后,将role信息保存到sessionStorage,以后整个应该中随时随处可以使用if(roleArray.length == 0){sessionStorage.setItem('userRole', "3");}else{roleArray.indexOf("ADMIN_ROLE") != -1 ? sessionStorage.setItem('userRole', "1"): roleArray.indexOf("OPERATOR_ROLE") != -1 ? sessionStorage.setItem('userRole', "2"): sessionStorage.setItem('userRole', "3")}console.log("Debug: the current user name is: " + keycloak.getUsername(),)//得到keycloak 的 access token。keycloak.getToken().then(data => {console.log("Debug: the keycloak access token is " + data);sessionStorage.setItem('accessToken', data);})}).catch((error) =>//登录失败console.error('Keycloak login failed: ', error));}
在AppModule中添加APP_INITIALIZER provider:
import { KeycloakAngularModule, KeycloakService } from 'keycloak-angular';
import { initializeKeycloak } from './core/services/keycloak-init'; //导入initializeKeycloak工厂函数@NgModule({declarations: [AppComponent, FooterComponent, HeaderComponent],imports: [BrowserModule,CoreModule,SharedModule,HomeModule,AuthModule,AppRoutingModule,KeycloakAngularModule],providers: [//添加APP_INITIALIZER provider{provide: APP_INITIALIZER,useFactory: initializeKeycloak,multi: true,deps: [KeycloakService],},],bootstrap: [AppComponent]
})
Keycloak登录:
Keycloak设置完成之后,启动Angular应用,浏览器中输入 https://localhost/ ,自动重定向到keycloak登录页面。
登录成功之后,每次向后端发送请求,发现header中加入了keycloak access token信息(keycloak-angular提供的HttpClient拦截器会加入access token)。
getBackendInfo(){this.brucetest = JSON.stringify({"hello":"bruce"});this.http.get(`/api/adminresource/`).subscribe(response => {console.log("Debug: the value of res is " + JSON.stringify(response));this.brucetest = JSON.stringify(response);},err => {console.log("Debug: error message" + err);})}
2.自己实现集成Keycloak功能:
如果担心开源的keycloak-angular库不安全或者有隐患,那么可以自己实现前端keycloak登录功能。
本文中Angular应用启动后,自动路由到login组件,我们在login组件中集成keycloak功能(用户自便,什么组件都行)。
首先判断是否登录了keycloak,如果已经登录的话,cookie中会有一个key,叫做"code"。
getCookie(cname) {var name = cname + "=";var ca = document.cookie.split(';');for (var i = 0; i < ca.length; i++) {if (ca[i].indexOf(name) >= 0) {console.log(ca[i].slice(ca[i].indexOf(name)));return ca[i].slice(ca[i].indexOf(name) + 5)}}return "";
}
this.code = this.getCookie('code');
实现Keycloak登录:
然后判断code的值是否为空,如果为空并且程序中没有保存过keycloak access token,说明没有登录,重定向到keycloak登录地址;如果不为空,说明登录了,获取keycloak 的access token, refresh token等信息。
if (this.code == '') {this.checkAccessToken();
} else {this.getAccessToken();
}//如果code为空,则判断是否保存过keycloak access token,如果没有,则说明没有登录过,需要登录keycloak。
checkAccessToken() {if (!this.getUser().accessToken) { this.getUser()是自己实现的一个函数,用来访问sessionStorage, 请自行实现,非常简单。this.redirectKeycloakSSO();} else {//已经登录,直接跳转到应用的主界面。this.router.navigateByUrl('/home');}
}
//重定向到keycloak登录页面。
redirectKeycloakSSO() {let url = "/auth/realms/" + this.keycloakRealm + "/protocol/openid-connect/auth";let params = "redirect_uri=" + this.redirect_uri + "/&client_id=" + this.client_id + "&response_type=" + this.response_type + "&scope=" + this.scope;window.location.href = url + "?" + params;
}
登录成功,获取Keycloak相关信息:
登录成功后,使用cookie中的code值,访问Django后端,获取keycloak的access token, refresh token等
//登录后使用cookie中的code值获取keycloak的access token, refresh token等信息。
getAccessToken() {let data = {"redirect_uri": this.redirect_uri + "/","code": this.code,}jQuery.ajax({url: this.csfWidgets.backendUrl + "/api/keycloak/token/",data: JSON.stringify(data),type: "POST",async: false,contentType: 'application/json',complete: (xhr) => {},success: (data, status, xhr) => {document.cookie = 'params=0;expires=' + new Date(0).toUTCString();if(! data.hasOwnProperty("access_token")){console.log('Error: Can not get keycloak access token!');return;}this.getUserInfo(data);},error: (data, status, xhr) => {console.log("Failed: " + JSON.parse(data.responseText).resMsg);},fail: (data, status, xhr) => {console.log("Failed: " + JSON.parse(data.responseText).resMsg);}});
}
下面只简单贴一下后端Django程序收到前端发送的request后,是怎样利用code和redirect_uri信息取得keycloak的access token,refresh token等信息。这个get_refresh_token函数肯定是在View中被调用,此处不贴代码了,太啰嗦。
def get_refresh_token(self, code, redirect_uri):payload = {"client_id": self.client_id,"code": code,"redirect_uri": redirect_uri,"grant_type": 'authorization_code',"client_secret": self.client_secret_key}#keycloak server的API。URL = '%s/realms/%s/protocol/openid-connect/token' % (self.server_url,self.realm)# sending get request and saving the response as response objecttry:#访问keycloak server,获取access token, refresh token等信息。#reponse = requests.get(url = URL, headers=self.headers,verify=False,proxies=self.proxies)response = requests.post(url = URL, data=payload,verify=False)responseData = ""if response.status_code > 201:if response.status_code == 403:responseData = {"res_status":403,"detail":"This user does not have permission to get keycloak refresh token from keycloak."}elif response.status_code == 401:responseData = {"res_status":401,"detail": str(response.text)}else:responseData = {"res_status":response.status_code,"detail":"Can't get access and refresh token from keycloak server, " + str(response.text)}return responseDataelif response.headers.get('Content-Type') is not None and 'json' in response.headers.get('Content-Type'):# extracting data in json formatdata = response.json()return dataelse:responseData = {"res_status":response.status_code,"detail":"Can't get access and refresh token from keycloak server, " + str(response.text)}return responseDataexcept Exception as e:print("Debug: Can't get keycloak refresh token because of: " + str(e))self.logger.error("Exception found when try to get refresh token from keycloak: " + str(e))if type(e) == requests.exceptions.ConnectionError :return {"res_status":500,"detail":"ConnectionError, can't connect the keycloak server."}return {"res_status":500,"detail":"Can't get keycloak refresh token."}
前端获取到response后,解析response信息,从中获得access token, refresh token等信息,并保存到sessionStorage中,解析access token 得到role信息,并且保存到sessionStorage中,以上操作完成后,认证过程全部完成,跳转到主界面 this.router.navigateByUrl('/home');
//解析response信息,参数data是传入的response信息
getUserInfo(data) {var tokenInfo = this.decodeToken(data.access_token);var roleId = "0";var roleArray = tokenInfo['realm_access']['roles'];//console.log("Debug: the current user roles is " + roleArray);if(roleArray.length == 0){roleId = '3';}else{roleArray.indexOf("ADMIN_ROLE") != -1 ? sessionStorage.setItem('userRole', "1"): roleArray.indexOf("OPERATOR_ROLE") != -1 ? sessionStorage.setItem('userRole', "2"): sessionStorage.setItem('userRole', "3");}const userinfo = JSON.parse(sessionStorage.getItem('user'));const user = userinfo ? userinfo : {};Object.assign(user, {username: tokenInfo['preferred_username'],roleId: roleId,passwordFlag: false, //Don't use original method to change the admin user password.});// this.role = data.roles;const keycloakAuthInfo = {"accessToken": data.access_token,"refreshToken": data.refresh_token};//将信息保存到sessionStorage中。this.updateUser(keycloakAuthInfo);this.updateUser(user);//将access token, refresh token信息保存到cookie中,这样以后每次向后端发送http请求,都会自动带上access token信息。this.csfWidgets.setCookie("keycloakToken=" + data.access_token);//所以认证授权工作完成之后,跳转到主界面this.router.navigateByUrl('/home');
}
至此,所有的认证工作均已完成,系统可以在keycloak保护下正常工作了,前端发送的每个http请求,都会带上access token信息(cookie中设置了access token,所有http请求都会带上这个access token),后端Django中间件会检查这个access token是否有效,如果有效,则执行业务代码,正常工作;如果失效(例如过期),则返回401错误,让用户重新登录。
3.关于Nginx配置:
前端在发送登录请求的时候,nginx会通过反向代理将请求转发到keycloak server,从而重定向到keycloak登录页面,登录后再获取access token,但此时token中的issuer地址是nginx地址,后端使用这个access token访问keycloak server的时候,会要求issuer地址是keycloak server地址,而不是nginx地址,这就需要nginx的反向代理来解决,具体请参考:https://blog.csdn.net/wdquan19851029/article/details/111869846
后端Django集成Keycloak:
前面大体介绍了一下整个keycloak认证的整个过程,包括前端和后端的流程。下面详细介绍后端的实现。
主要是需要实现一个中间件,作用是拦截来自Angular前端的每个请求,进行认证检查。从request的Header获取keycloak access token,利用这个token去访问keycloak server,如果能够成功,说明用户登录了,中间件返回"None",继续执行View,进行业务处理;如果失败,说明用户没有登录,中间件直接返回HttpResponse,请求完毕,不再继续进行业务处理。
下图是中间件工作原理:
1.实现中间件:
在settings.py中配置Keycloak信息:
KEYCLOAK_CONFIG = {'KEYCLOAK_SERVER_URL': 'https://127.0.0.1:8443/auth',#跟前端保持一致,使用相同的Realm和client'KEYCLOAK_REALM': 'master','KEYCLOAK_CLIENT_ID': 'frontend-client', 'KEYCLOAK_CLIENT_SECRET_KEY': '8f28abe0-f4de-476d-bd8b-5354d78639de','KEYCLOAK_BEARER_AUTHENTICATION_EXEMPT_PATHS':[r'api/keycloak/token/*', r'api/keycloak/config/*',r'api/automation/token/*',r'api/keycloak/logout/'] #python Regular expression
}
其中配置在"KEYCLOAK_BEARER_AUTHENTICATION_EXEMPT_PATHS"中的url,中间件不会进行用户认证检查,例如使用code获取access token信息的"api/keycloak/token/", 因为是前端登录之后第一次访问后端,此时还未获得access token信息,所以不进行认证检查。
中间件的具体实现:具体细节看代码注释
class KeycloakMiddleware(MiddlewareMixin):def __init__(self, get_response):""":param get_response:"""self.config = settings.KEYCLOAK_CONFIG# Read configurationstry:self.server_url = self.config['KEYCLOAK_SERVER_URL']self.client_id = self.config['KEYCLOAK_CLIENT_ID']self.realm = self.config['KEYCLOAK_REALM']except KeyError as e:raise Exception("KEYCLOAK_SERVER_URL, KEYCLOAK_CLIENT_ID or KEYCLOAK_REALM not found.")self.client_secret_key = self.config.get('KEYCLOAK_CLIENT_SECRET_KEY', None)self.client_public_key = self.config.get('KEYCLOAK_CLIENT_PUBLIC_KEY', None)self.default_access = self.config.get('KEYCLOAK_DEFAULT_ACCESS', "DENY")self.method_validate_token = self.config.get('KEYCLOAK_METHOD_VALIDATE_TOKEN', "INTROSPECT")self.keycloak_authorization_config = self.config.get('KEYCLOAK_AUTHORIZATION_CONFIG', None)self.keycloak_bearer_authentication_exempts = self.config.get('KEYCLOAK_BEARER_AUTHENTICATION_EXEMPT_PATHS', None)# Djangoself.get_response = get_response#lockself.lock = threading.Lock().........................................................def process_view(self, request, view_func, view_args, view_kwargs):"""Validate only the token introspect.:param request: django request:param view_func::param view_args: view args:param view_kwargs: view kwargs:return:"""#Check if this request path is no authentication required, if yes, go to views.if len(self.keycloak_bearer_authentication_exempts) > 0:path = request.path_info.lstrip('/')print("Debug: the url path is " + path)if any(re.match(m, path) for m inself.keycloak_bearer_authentication_exempts):logger.debug('** exclude path found, skipping')return NoneaccessToken = "";#如果Header中没有token信息'HTTP_AUTHORIZATION',则判断'HTTP_COOKIE'中有没有if 'HTTP_AUTHORIZATION' not in request.META:if not request.META.get('HTTP_COOKIE'):print("Debug: can't get the cookie keycloak token");return JsonResponse({"detail": NotAuthenticated.default_detail},status=NotAuthenticated.status_code)else:#得到token信息accessToken =request.COOKIES["keycloakToken"];print("Debug: the request cookie token is: " + accessToken);#如果Header中有token信息'HTTP_AUTHORIZATION',则从'HTTP_AUTHORIZATION'中获取token。if not accessToken.strip():auth_header = request.META.get('HTTP_AUTHORIZATION').split()accessToken = auth_header[1] if len(auth_header) == 2 else auth_header[0]print("Debug: the request token is " + accessToken);try:#使用keycloak API工具类KeycloakHttpRequest,访问keycloak server获取用户信息keycloakHttpRequest = KeycloakHttpRequest(self.server_url,self.client_secret_key,self.realm,self.client_id)#访问keycloak server,得到登录用户信息keycloakUserInfo = keycloakHttpRequest.get_userinfo(accessToken)print("Debug: the keycloakUserInfo is: " + json.dumps(keycloakUserInfo))keycloakUserRoles=''#print("Debug: the userInfoData username is %s, user ID is %s " % (userinfo['preferred_username'],userinfo['sub']))if keycloakUserInfo is not None: if "res_status" in keycloakUserInfo:return JsonResponse({"detail": keycloakUserInfo['detail']},status=keycloakUserInfo['res_status'])if 'user_roles' in keycloakUserInfo:# 从用户信息中获取role信息。keycloakUserRoles = keycloakUserInfo['user_roles']request.META['USER_ROLES'] = ','.join(keycloakUserRoles)else:#Get user roles(User must have the Client Roles 'view-users', otherwise there will be exception.)print("Debug: current user is: " + keycloakUserInfo['sub'])//如果用户信息keycloakUserInfo中没有role信息,则直接访问keycloak server获取roles = keycloakHttpRequest.get_user_roles(keycloakUserInfo['sub'],accessToken)if "res_status" in roles:return JsonResponse({"detail": roles['detail']},status=roles['res_status'])if roles is None or not len(roles):keycloakUserRoles = Nonerequest.META['USER_ROLES'] = 'VIEWE_ROLE'else:keycloakUserRoles = [user['name'] for user in roles]request.META['USER_ROLES'] = ','.join(keycloakUserRoles)
在keycloak中间件实现之后, 将其加入到settings.py中的MIDDLEWARE列表中.
2.实现Keycloak的API工具类:
工具类KeycloakHttpRequest.py调用各种API(带上access token)访问keycloak server,获取需要的信息,例如获取用户信息,得到用户role信息,使用refresh token刷新access token,keycloak登出等等。此工具类是供中间件(例如 获取用户信息)和View(例如 keycloak登出)使用的。
class KeycloakHttpRequest(object):def __init__(self,server_url,client_secret_key,realm='master',client_id='admin-cli'):if server_url.endswith('/'):self.server_url = server_url[:-1]else:self.server_url = server_urlself.realm = realmself.client_id = client_idself.client_secret_key = client_secret_keyself.proxies={'http':'http://cnproxy.int.nokia-sbell.com/proxy.pac','https':'http://cnproxy.int.nokia-sbell.com/proxy.pac'}def get_userinfo(self, accessToken):headers={'Authorization': 'Bearer ' + accessToken,'Content-Type': 'application/json'}#http://$KC_SERVER/$KC_CONTEXT/realms/$KC_REALM/protocol/openid-connect/userinfo"userInfoUrl = '%s/realms/%s/protocol/openid-connect/userinfo' % (self.server_url,self.realm)try:#userInfoResponse = requests.get(url = userInfoUrl, headers=self.headers,verify=False,proxies=self.proxies)userInfoResponse = requests.get(url = userInfoUrl, headers=headers,verify=False)userInfoData=''print("debug: the userinfo reponse info is : " + str(userInfoResponse))if userInfoResponse.headers.get('Content-Type') is not None and 'json' in userInfoResponse.headers.get('Content-Type'):userInfoData = userInfoResponse.json()else:if userInfoResponse.status_code == 403:userInfoData = {"res_status":403,"detail":"This user does not have permission to access the user info from keycloak."}elif userInfoResponse.status_code == 401:userInfoData = {"res_status":401,"detail": str(userInfoResponse)}else:userInfoData = {"res_status":userInfoResponse.status_code,"detail":"Can't get the user info from keycloak server."}return userInfoDataexcept Exception as e:print("Debug: the error message: " + str(e))print("Debug: the type of Exception : " + str(type(e)))if type(e) == requests.exceptions.ConnectionError :return {"res_status":500,"detail":"ConnectionError, can't connect the keycloak server."}return {"res_status":401,"detail":"Can't get the user info from keycloak server."}def get_user_roles(self,user_uuid, accessToken):headers={'Authorization': 'Bearer ' + accessToken,'Content-Type': 'application/json'}#/auth/admin/realms/{realm}/users/{user-uuid}/role-mappings/realmURL = '%s/admin/realms/%s/users/%s/role-mappings/realm' % (self.server_url,self.realm,user_uuid)# sending get request and saving the response as response object try:# print("Debug: try to get user roles from keycloak server " + URL)#reponse = requests.get(url = URL, headers=self.headers,verify=False,proxies=self.proxies)response = requests.get(url = URL, headers=headers,verify=False)print("Debug: user roles reponse string is:" + str(response.headers))print("Debug: user roles reponse string is:" + str(response.headers.get('Content-Type')))userRoleData=''if response.headers.get('Content-Type') is not None and 'json' in response.headers.get('Content-Type'):# extracting data in json format # print("Debug: user roles reponse string is:" + str(response))data = response.json()# print("Debug: the user roles info is " + str(data))return dataelse:if response.status_code == 403:userRoleData = {"res_status":403,"detail":"This user does not have permission to get the user role info from keycloak."}elif response.status_code == 401:userRoleData = {"res_status":401,"detail": str(response)}else:userRoleData = {"res_status":response.status_code,"detail":"Can't get the user role info from keycloak server."}return userRoleDataexcept Exception as e:print("Debug: the error message: " + str(e))print("Debug: the type of Exception : " + str(type(e)))if type(e) == requests.exceptions.ConnectionError :return {"res_status":500,"detail":"ConnectionError, can't connect the keycloak server."}return {"res_status":500,"detail":"Can't get the user role info from keycloak server."}
代码地址:
本文代码github地址:https://github.com/wdquan1985/Angular-Django-Keycloak
前端集成keycloak使用方式一,使用开源的keycloak-angular库。用户可以根据上面提供的第二种方式自己实现集成keycloak。前端提供的主界面及其简单,因为完全没必要加入其它任何业务,只是完成keycloak登录后,进入主界面,发送一个http请求,然后在主界面将response显示出来就好。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- angular和vue的对比学习之路
vue-ng打开vue的中文官网一段关于vue的描述 HTML 模板 JSON 数据,再创建一个 Vue 实例,就这么简单。 那我么再看下angular中文网 AngularJS是为了克服HTML在构建应用上的不足而设计的。HTML是一门很好的为静态文本展示设计的声明式语言,但要…...
2024/4/21 2:46:22 - 学习笔记Vue(三) —— 双向数据绑定机制(与angular对比)
一、Angular中的双向数据绑定(脏检查机制): AngularJs 为 scope 模型上设置了一个 监听队列,用来监听数据变化并更新 view 。每次绑定一个东西到 view(html) 上时 AngularJs 就会往 $watch 队列里插入一条 $watch,用来…...
2024/4/21 2:46:23 - angular react vue 浏览器兼容情况汇总
一、逻辑层 框架 (1)angular Angular早在1.3版本就抛弃了对ie8的支持。 (2)react React 早在0.14.x 版本就抛弃了对ie8的支持。 (3)vue Vue就没打算支持ie8 二、UI层 框架 (1)bootst…...
2024/4/21 2:46:21 - angular和vue的差别
vue仅仅是mvvm中的view层,只是一个如jquery般的工具库,而不是框架,而angular而是mvvm框架。vue的双向邦定是基于ES5 中的 getter/setter来实现的,而angular而是由自己实现一套模版编译规则,需要进行所谓的“脏”检查&a…...
2024/4/21 2:46:19 - 前端框架React,Angular和Vue详解
前端框架React,Angular和Vue详解1. 三种架构概述2. Vue概述2.1 Vue简介2.2 Vue起源2.3 Vue特点3. React简介3.1 React概述3.2 React起源3.3 React特点4. Angular概述4.1 Angular简介4.2 Angular起源4.3 Angular特点5. 三种框架对比分析5.1 开源性质5.2 核心发展5.3 …...
2024/4/21 2:46:18 - 快速入门Angular或Vue前端环境配置和项目运行
本文档仅介绍Angular和Vue项目的环境安装到项目运行,具体相关api请到相应官网进行学习 第一步:建议安装编译器:vscode(也可以使用idea等其他编译器) 安装地址:https://code.visualstudio.com/Download 设置中文语言环…...
2024/4/24 14:24:36 - 前端集成—Angular 1.0项目iframe嵌入Vue项目
文章目录angular代码修改 加入集成模块: app/app.jsiframe集成的样式: /vue-integration/_vue-integration.scssiframe集成的html代码 : /vue-integration/vue-integration.htmliframe集成的控制器代码 : /vue-integration/vue-in…...
2024/4/21 2:46:16 - Vue\React\Angular的区别
1. 基本概念 Angular 是一个应用设计框架与开发平台,用于创建高效、复杂、精致的单页面应用。 React 是一个用于构建用户界面的 JavaScript 库 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是ÿ…...
2024/5/1 0:33:30 - KgoUI(1) 之 技术选型angular 和 vue
框架源代码:码云 最近几年前端技术发生了很大的变化,新技术,新开发模式层出不穷。之前divcssjs 包打天下的时代已经不复存在了。说到前端技术目前最火的莫过于三大mvvm框架 vue (vue并不算是mvvm框架,应该说是个m…...
2024/4/21 2:46:14 - Angular vs React vs Vue
文章目录前言一、Introduce1. Start2. License3. Popularity4. Job market二、Community and development三、Library Size四、Learn curve五、Use1. Basic Use2. Debug3 Css 动画4 Create project5 Dependencies六、Performance1. DOM manipulation2. Startup time3. Memory a…...
2024/4/21 2:46:13 - Angular父子组件通信及和vue的对比
文章目录一、父向子组件传递父组件给子组件传值-Input1 传入数据2 子组件引入Input模块3 子组件获取父组件数据父组件向子组件传递方法父组件向子组件传递自身二、父组件获取子组件使用ViewChild获得子组件本身三、子组件通过output触发父组件的方法1. 子组件引入output和event…...
2024/4/20 5:17:30 - angular和vue还有jquery的区别
angularjs简单介绍和特点 首先angular是一个mvc框架, 使用mvc解耦, 采用model, controller以及view的方式去组织代码, 会将一个html页面分成若干个模块, 每个模块都有自己的scope, service, directive, 各个模块之间也可以进行通信, 但是整体结构上是比较清晰的, 就是说其代码组…...
2024/4/20 20:18:20 - 对vue与angular和react的对比
概念:vue是一个构建数据驱动的web界面的渐进式框架,它的目标是通过尽可能简单的API实现响应的数据绑定和组合的视图组件 vue对比angular 1、vue在设计之初参考了很多angularjs的思想 2、vue相对比与angular比较简单 3、 vue相对比与angular比较小巧&…...
2024/4/20 20:18:18 - 一份全面的React、Angular和Vue.js比较指南
对于开发人员而言,选择技术栈有时是一件相当棘手的任务。因为您需要综合考虑诸如:预算、时间、应用大小、最终用户、项目目标、以及可用资源等多方面因素。 无论您是初学者、开发人员、自由职业者还是项目架构师,只有详细了解了每种框架的优…...
2024/4/20 20:18:17 - 什么是Vue?Vue双向数据绑定原理以及生命周期详解
微信公众号:程序员W W来分享啦~ 今天W的分享 目前前端最流行的框架之一Vue.js 下面跟W一起探索吧~ 尤雨溪的Vue.js 对于Vue.js的理解 —— 什么是Vue.js —— Vue.js是一套构建用户界面的渐进式框架 Vue被设计为可以自底向上逐层应用。 Vue的核心库只关…...
2024/4/21 2:46:12 - vue响应式原理(数据双向绑定的原理)
先来了解一下几个相关概念 1、渐进式框架 下面是摘自知乎的一个解答(个人认为讲述比较好的回答): 在我看来,渐进式代表的含义是:主张最少。 每个框架都不可避免会有自己的一些特点,从而会对使用者有一定…...
2024/4/21 2:46:11 - vue数据双向绑定原理-observer
1)vue数据双向绑定原理-observer2)vue数据双向绑定原理-wather3)vue数据双向绑定原理-解析器Complie vue数据双向绑定原理, 和简单的实现 去他喵的底层原理,框架内核, 老夫写代码只用Jquery 。 个人觉得,不论是否 是长期与之交集, 还…...
2024/4/27 5:55:55 - 前端框架Vue、angular、React的优点和缺点
前端框架Vue、angular、React的优点和缺点 学习web前端开发中,会有很多的框架,那么目前流行的框架有哪些呢? 一、Vue.js 其实Vue.js不是一个框架,因为它只聚焦视图层,是一个构建数据驱动的Web界面的库。 Vue.js通过…...
2024/4/21 2:46:09 - Vue双向绑定原理,教你一步一步实现双向绑定
当今前端天下以 Angular、React、vue 三足鼎立的局面,你不选择一个阵营基本上无法立足于前端,甚至是两个或者三个阵营都要选择,大势所趋。 所以我们要时刻保持好奇心,拥抱变化,只有在不断的变化中你才能利于不败之地&…...
2024/4/20 8:26:25 - vue的双向绑定原理及一步一步实现MVVM
vue的双向绑定原理及简单实现MVVM几种实现双向绑定的做法MVVM实现思路整理MVVM是什么MVVM框架与MVC框架的主要区别有两点:MVVM实现1、实现数据监听器Observer2、实现指令解析器Compile3、实现订阅者Watcher4、实现MVVM本文主要围绕几种实现双向绑定的做法、“实现数…...
2024/4/21 2:46:07
最新文章
- TCP三次握手,四次挥手
TCP三次握手 TCP协议 : 1。源端口 :当前的进程端口,2字节 2。目的端口:对方的端口 ,2字节 3。序号:客户端或者服务器端生成的随机数 4.确认序号:确认上一次发送给数据对方有没有收到 5.标志…...
2024/5/2 22:47:35 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 算法四十天-删除排序链表中的重复元素
删除排序链表中的重复元素 题目要求 解题思路 一次遍历 由于给定的链表是排好序的,因此重复的元素在链表中的出现的位置是连续的,因此我们只需要对链表进行一次遍历,就可以删除重复的元素。 具体地,我们从指针cur指向链表的头节…...
2024/5/1 13:07:13 - #QT项目实战(天气预报)
1.IDE:QTCreator 2.实验: 3.记录: (1)调用API的Url a.调用API获取IP whois.pconline.com.cn/ipJson.jsp?iphttp://whois.pconline.com.cn/ipJson.jsp?ip if(window.IPCallBack) {IPCallBack({"ip":&quo…...
2024/5/1 13:42:00 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/1 17:30:59 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/2 16:16:39 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/29 2:29:43 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/2 9:28:15 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/30 9:43:09 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/2 15:04:34 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/29 20:46:55 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/30 22:21:04 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/1 4:32:01 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/28 5:48:52 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/30 9:42:22 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/2 9:07:46 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/30 9:42:49 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下: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