使用goahead搭建https服务器的实例
webcomm与前端的通讯-goahead服务器流程图
#ifndef __CET_WEBCOMM_H__
#define __CET_WEBCOMM_H__// 0x0000FFFF
typedef enum eWebSubOptionType
{WSOT_DASHBOARD = 0X00000001,WSOT_INTERFACE = 0X00000002, WSOT_CONNECTION = 0X00000004, WSOT_NETWORK = 0X00000008,WSOT_WLAN = 0X00000010,WSOT_PARAMETERS = 0X00000020,WSOT_EXPORT = 0X00000040,WSOT_RESET = 0X00000080,WSOT_FW_UPDATE = 0X00000100,WSOT_DEBUG = 0X00000200,WSOT_LOGS = 0X00000400,WSOT_USERS = 0X00000800,WSOT_DATE_AND_TIME = 0X00001000,WSOT_LOAD_CERT = 0X00002000,WSOT_IPFILTER = 0X00004000,WSOT_ABOUT = 0X00008000,WSOT_MUST_SUPPORT = 0XFFFFFFFF,} WebSubOptionType_t;#ifndef WEBCOMM_ACCOUNT_PERMISSION_CHECK
#define WEBCOMM_ACCOUNT_PERMISSION_CHECK ( 1 )
#endif#ifndef WEBCOMM_ACCOUNT_MAX_NUM
#define WEBCOMM_ACCOUNT_MAX_NUM ( 16 )
#endiftypedef void * WEBHANDLE;typedef BYTE WebcommResult_t;
enum eWebcommResult
{ WEBERR_RSN_OK = 0, /**< 操作成功 */WEBERR_RSN_OK_NOTRSP = 1, /**< 操作成功但无回复 */WEBERR_RSN_ACCOUNT_PASSWORD_ERROR = 11, /**< 账号或密码错误 */WEBERR_RSN_ACCOUNT_LOGIN_TIMEOUT = 12, /**< 账号登入超时 */WEBERR_RSN_ACCOUNT_DISABLE = 13, /**< 账号被禁用 */WEBERR_RSN_ACCOUNT_OUT_NUMBER = 14, /**< 账号数量超出最大值(默认最大16个) */WEBERR_RSN_ACCOUNT_NOT_PERISSION = 15, /**< 账号没有访问权限 */WEBERR_RSN_ACCOUNT_ALREADY_EXIST = 16, /**< 账号已存在 */WEBERR_RSN_ACCOUNT_PASSWORD_SAME = 17, /**< 账号和密码一样 */WEBERR_RSN_FILES_NOT_EXIST = 18, /**< 文件不存在 */ WEBERR_RSN_FILES_CANNOT_OPEN = 19, /**< 文件不能被打开 */ WEBERR_RSN_FILES_FORMAT_ERROR = 20, /**< 文件格式错误 */WEBERR_RSN_FILES_CHECKSUM_FAIL = 21, /**< 文件校验失败 */WEBERR_RSN_DATABASE_OPERATE_FAIL = 22, /**< 数据库操作失败 */WEBERR_RSN_NOT_FLASH_SPACE = 23, /**< FLASH空间不足 */WEBERR_RSN_HUB_COMM_FAIL = 24, /**< HUB通信失败 */WEBERR_RSN_PARAMETER_MISSING = 25, /**< 请求的参数缺失 */WEBERR_RSN_PARAMETER_VALUE_OUTOFRANGE = 26, /**< 请求的参数值超出范围 */WEBERR_RSN_MEMORY_ALLOCATION_FAIL = 27, /**< 内存分配失败 */WEBERR_RSN_URL_NOT_SUPPORT = 28, /**< URL请求路径不支持 */WEBERR_RSN_REQUEST_NOT_METHOD = 29, /**< 请求不支持该方法 */WEBERR_RSN_PORT_ALREADY_OCCUPIED = 30, /**< 端口已被占用 */WEBERR_RSN_UNKNOWN = 60, /**< 未知错误 */
};typedef struct sReasonInfo
{WebcommResult_t code; /**< 错误的原因编号 */const char *message; /**< 编号的字符串形式 */} GCC_PACKED ReasonInfo_t;// Webcomm Result Response
#define WEBRES_CODE "code"
#define WEBRES_MESSAGE "message"
#define WEBRES_DATA "data"#define WEBCOMM_METHOD "method"
#define WEBCOMM_LOGIN_USER "username"
#define WEBCOMM_LOGIN_PASS "password"
#define WEBCOMM_LOGIN_LAST "last_time"
#define WEBCOMM_TOKEN_ACCESS "access_token"#define WEBMETHOD_POST "POST" // 创建(更新,删除)
#define WEBMETHOD_GET "GET" // 读取#define POSTMETHOD_CREATE "create" // 创建
#define POSTMETHOD_UPDATE "update" // 更新
#define POSTMETHOD_DELETE "delete" // 删除
#define POSTMETHOD_IMPORT "import" // 导入
#define POSTMETHOD_EXPORT "export" // 导出
#define POSTMETHOD_LOAD "load" // 加载
#define POSTMETHOD_EXECUTE "execute" // 执行typedef WebcommResult_t (*fHandler_t)(WEBHANDLE webHandle, const char *uriPath, Webs *wp);// create webcomm object
WEBHANDLE WebcommCreate(void);// destroy webcomm object
void WebcommDestroy(WEBHANDLE webHandle);// send result from webcomm data
int WebcommSendResult(WEBHANDLE webHandle, Webs *wp);// check User account and password
WebcommResult_t WebcommLoginCheck(WEBHANDLE webHandle, int alreaylogin, const char *cname, const char *cpasswd);// New Session
WebcommResult_t WebcommNewSession(WEBHANDLE webHandle, Webs *wp, const char *cname, const char *cvalue);WebcommResult_t WebcommGetSession(WEBHANDLE webHandle, Webs *wp, const char *cname);WebcommResult_t WebcommDeleteSession(WEBHANDLE webHandle, Webs *wp, const char *cname);WebcommResult_t WebcommExecuteHandler(WEBHANDLE webHandle, Webs *wp, const char *cname);const char *ReasonInfo(WebcommResult_t code);///////////////////////////////////////////////////////////////////////////////////////#endif /* __CET_WEBCOMM_H__ */
/** File name : webcommsdk.c** Created on : 2020年3月12日09:35:10* Author : Firmware of xiyuan255* Version : 1.0* Language : C* Copyright : Copyright (C) 2019, xiyuan255 Inc.**/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include <pthread.h>
#include "goahead.h"
#include "cetwebcomm.h"/////////////////////////////////////////////////////////////////////////typedef struct sWebHandler
{HANDLE dbHandle; /**< 数据库操作是句柄 */ReasonInfo_t rsi;cJSON *pData; /**< data数据块的指针 */} WebHandler_t;typedef struct sCallbackSet
{const char *wpMethod; // POST or GETunion {/* POST方法的函数映射 */struct{const char *method; // execute import ...WebcommResult_t (*callback)(WEBHANDLE, const char *, Webs *);} post;/* GET方法的函数映射 */WebcommResult_t (*callback)(WEBHANDLE, const char *, Webs *);} symbol;} CallbackSet_t;#define CALLBACKSET_END(METHOD, name) \{ METHOD, { .callback = name }, }#define CALLBACKSET_INIT(WMETHOD, name) \{ WEBMETHOD_##WMETHOD, { .callback = WEB##WMETHOD##_##name }, }#define CALLBACKSET_POSTINIT(PMETHOD, name) \{ WEBMETHOD_POST, { { .method = POSTMETHOD_##PMETHOD, .callback = WEB##PMETHOD##_##name } }, }#define CALLBACKSET_NAME(cstring) sg_callbackset_##cstring#define WEBCOMM_FRAME_WITH_SUB(OPTION, WSOT, cstring, csubstring) \{ OPTION, WSOT, #cstring"/"#csubstring, CALLBACKSET_NAME(cstring##_##csubstring) }#define WEBCOMM_FRAME(OPTION, WSOT, cstring) \{ OPTION, WSOT, #cstring, CALLBACKSET_NAME(cstring) }#define DEFINE_STATIC_GLBVAR(type, name) static type nametypedef struct sWebcommFrame
{const char *options; WebSubOptionType_t suboptions;const char *uriLabel; /**< url的路径 */CallbackSet_t *callbackSet; /**< 对应的回调集合 */} GCC_PACKED WebcommFrame_t;typedef struct sWebOptionMap
{const char *webOption; /**< web的主选项 */const char *webSubOption; /**< web的子选项 */WebSubOptionType_t subOption;} GCC_PACKED WebOptionMap_t;#define CHECK_WEBHANDLE_DATA_OBJECT(pWebHandler) \do { \if (NULL == (pWebHandler)->pData) { \(pWebHandler)->pData = cJSON_CreateObject(); \} \if (NULL == (pWebHandler)->pData) { \return WebErrReason(pWebHandler, WEBERR_RSN_MEMORY_ALLOCATION_FAIL); \} \} while (0)static const ReasonInfo_t sg_WebRsnInfo[] =
{{WEBERR_RSN_OK, "success"},{WEBERR_RSN_ACCOUNT_PASSWORD_ERROR, "account or password error"},{WEBERR_RSN_ACCOUNT_LOGIN_TIMEOUT, "account login timeout"},{WEBERR_RSN_ACCOUNT_DISABLE, "account is disabled"},{WEBERR_RSN_ACCOUNT_OUT_NUMBER, "number of accounts exceeds"},{WEBERR_RSN_ACCOUNT_NOT_PERISSION, "account has no access rights"},{WEBERR_RSN_ACCOUNT_ALREADY_EXIST, "account already exists"},{WEBERR_RSN_ACCOUNT_PASSWORD_SAME, "account is the same as the password"},{WEBERR_RSN_FILES_NOT_EXIST, "file does not exist"},{WEBERR_RSN_FILES_CANNOT_OPEN, "file cannot be opened"},{WEBERR_RSN_FILES_FORMAT_ERROR, "file format error"},{WEBERR_RSN_FILES_CHECKSUM_FAIL, "file validation failed"},{WEBERR_RSN_DATABASE_OPERATE_FAIL, "database operation failed"},{WEBERR_RSN_NOT_FLASH_SPACE, "not flash space"},{WEBERR_RSN_HUB_COMM_FAIL, "hub communication failure"},{WEBERR_RSN_PARAMETER_MISSING, "request parameter exception"},{WEBERR_RSN_PARAMETER_VALUE_OUTOFRANGE, "request parameter values are out of range"},{WEBERR_RSN_MEMORY_ALLOCATION_FAIL, "memory allocation failure"},{WEBERR_RSN_URL_NOT_SUPPORT, "url request path is not supported"},{WEBERR_RSN_REQUEST_NOT_METHOD, "request does not support the method"},{WEBERR_RSN_PORT_ALREADY_OCCUPIED, "the port is already occupied"},{WEBERR_RSN_UNKNOWN, "unknown error"},
};static WebOptionMap_t sg_WebOptionMap[] =
{{WEBOVERIVEW_OPTION, SUBOPTION_DASHBOARD, WSOT_DASHBOARD},{WEBOVERIVEW_OPTION, SUBOPTION_INTERFACE, WSOT_INTERFACE},{WEBCONNECTIVITY_OPTION, SUBOPTION_CONNECTION, WSOT_CONNECTION},{WEBCONNECTIVITY_OPTION, SUBOPTION_NETWORK, WSOT_NETWORK}, {WEBCONNECTIVITY_OPTION, SUBOPTION_WLAN, WSOT_WLAN},{WEBCONNECTIVITY_OPTION, SUBOPTION_PARAMETERS, WSOT_PARAMETERS},{WEBMAINTENANCE_OPTION, SUBOPTION_EXPORT, WSOT_EXPORT},{WEBMAINTENANCE_OPTION, SUBOPTION_RESET, WSOT_RESET},{WEBMAINTENANCE_OPTION, SUBOPTION_FIRMWARE_UPDATE, WSOT_FW_UPDATE},{WEBMAINTENANCE_OPTION, SUBOPTION_DEBUG, WSOT_DEBUG},{WEBMAINTENANCE_OPTION, SUBOPTION_LOGS, WSOT_LOGS},{WEBSYSTEM_OPTION, SUBOPTION_USERS, WSOT_USERS},{WEBSYSTEM_OPTION, SUBOPTION_DATE_AND_TIME, WSOT_DATE_AND_TIME},{WEBSYSTEM_OPTION, SUBOPTION_LOAD_CERTIFICATE, WSOT_LOAD_CERT}, {WEBSYSTEM_OPTION, SUBOPTION_IPFILTER, WSOT_IPFILTER},{WEBSYSTEM_OPTION, SUBOPTION_ABOUT, WSOT_ABOUT},{NULL, NULL, 0},
};const char *ReasonInfo(WebcommResult_t code)
{int idx = 0;int length = 0;length = sizeof(sg_WebRsnInfo)/sizeof(sg_WebRsnInfo[0]);for (idx = 0; idx < length; idx++){if (sg_WebRsnInfo[idx].code == code) { return sg_WebRsnInfo[idx].message;}}return NULL;
}static inline int WebErrReason(WebHandler_t *pWebHandler, WebcommResult_t code)
{pWebHandler->rsi.code = code;pWebHandler->rsi.message = ReasonInfo(code);return code;
}inline void *GetCallback(CallbackSet_t CallbackSet[], const char *wpMethod, const char *method)
{void *callback = NULL;CallbackSet_t *pCbSet = NULL;for (pCbSet = CallbackSet; (pCbSet && pCbSet->wpMethod); pCbSet++){ // 校验HTTP方法是否匹配if (0 != strcmp1(wpMethod, pCbSet->wpMethod)) {continue;}if (0 == strcmp1(WEBMETHOD_POST, pCbSet->wpMethod)){ // 校验POST方法的method字段是否匹配if (0 == strcmp1(method, pCbSet->symbol.post.method)) {callback = (void *)pCbSet->symbol.post.callback;break;}}else if (0 == strcmp1(WEBMETHOD_GET, pCbSet->wpMethod)){callback = (void *)pCbSet->symbol.callback;break;}}return callback;
}void WebsResponseHeadSafePolicy(Webs *wp)
{ websWriteHeader(wp, "Pragma", "no-cache");websWriteHeader(wp, "Cache-Control", "no-store");websWriteHeader(wp, "X-Content-Type-Options", "nosniff");websWriteHeader(wp, "X-XSS-Protection", "%d; mode=block", 1);websWriteHeader(wp, "Content-Security-Policy", "default-src 'self'; frame-ancestors 'self'");websWriteHeader(wp, "Content-Type", "application/json; charset=utf-8");websWriteHeader(wp, "Strict-Transport-Security", "max-age=%d; includeSubDomains", 31536000);
}static int WebSetParam(void *arg, cJSON *mJson, cJSON *childJson)
{ Webs *wp = NULL;cchar *prior = NULL;WebsKey *sp = NULL; char *keyword = NULL;char value[MAX_LEN_1024] = {0};assert(arg);assert(mJson);assert(childJson);keyword = childJson->string? childJson->string : mJson->string;if (cJSON_Number == childJson->type) {snprintf(value, MAX_LEN_1024, "%d", childJson->valueint);} else if (cJSON_String == childJson->type) { snprintf(value, MAX_LEN_1024, "%s", childJson->valuestring);}wp = (Webs *)arg;if (*keyword) {/*If keyword has already been set, append the new value to what has been stored.*/if ((prior = websGetVar(wp, keyword, NULL)) != 0) {sp = websSetVarFmt(wp, keyword, "%s,%s", prior, value);} else {sp = websSetVar(wp, keyword, value);}/* Flag as untrusted keyword by setting arg to 1. This is used by CGI to prefix this keyword */sp->arg = 0;return 0;}return -1;
}static int WebReplaceKey(void *arg, cJSON *mJson, cJSON *childJson)
{ char *temp = NULL;struct sKey {const char *oldkey;const char *newkey;};struct sKey *pKey = (struct sKey *)arg;assert(arg);assert(mJson);assert(childJson);if (mJson->string && 0 == strcmp(mJson->string, pKey->oldkey)) {temp = calloc(sizeof(char), strlen(pKey->newkey) + 1);if (NULL == temp)return -1;free(mJson->string);mJson->string = temp;strcpy(mJson->string, pKey->newkey);return 0;}return -1;
}/**递归遍历json串的数据
*/
static void RecursiveTraversal(int isBreak, void *arg, cJSON *mJson, cJSON *childJson, int (*callback)(void *arg, cJSON *mJson, cJSON *childJson))
{ int ret = -1;while (childJson){if ((cJSON_Number == childJson->type)||(cJSON_String == childJson->type)) { if (NULL != callback) {ret = callback(arg, mJson, childJson);if (0 == ret && isBreak)return;}} else if ((cJSON_Array == childJson->type)||(cJSON_Object == childJson->type)) {RecursiveTraversal(isBreak, arg, childJson, childJson->child, callback);}childJson = childJson->next;}
}/**KEY相同的VALUE会以空格间隔的形式被放在一起,也是因为这样,要避免出现的不同对象中定义相同的KEY的情况,造成VALUE存在到一起
*/
int WebcommAddJsonVars(Webs *wp, char *vars)
{ cJSON *cJson = NULL;char *strData = NULL;assert(wp);assert(vars);if (NULL != (cJson = cJSON_Parse(vars))){ strData = cJSON_Print(cJson);//cJSON_Minify(strData);PrintInfo("JsonVars=%s", strData);RecursiveTraversal(0, wp, cJson, cJson->child, WebSetParam);cJSON_Delete(cJson);free(strData);return 0;}return -1;
}/**使用新key替换json中的key=value形式的旧key
*/
int WebcommReplaceJsonKey(cJSON *cJson, const char *oldkey, const char *newkey)
{ struct sKey {const char *oldkey;const char *newkey;};char *strData = NULL;struct sKey Key;assert(cJson);assert(oldkey);assert(newkey);strData = cJSON_Print(cJson);cJSON_Minify(strData);PrintInfo("JsonVars=%s", strData);Key.oldkey = oldkey;Key.newkey = newkey;RecursiveTraversal(1, &Key, cJson, cJson->child, WebReplaceKey);free(strData);return 0;
}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////static WebcommResult_t WEBGET_DeviceUseSituation(WEBHANDLE webHandle, const char *uriPath, Webs *wp)
{WebHandler_t *pWebHandler = NULL;assert(webHandle);assert(uriPath);assert(wp);pWebHandler = (WebHandler_t *)webHandle;JsonGetDeviceUseSituation(pWebHandler->pData, pWebHandler->dbHandle, 0);return WebErrReason(pWebHandler, WEBERR_RSN_OK);
}DEFINE_STATIC_GLBVAR(CallbackSet_t, CALLBACKSET_NAME(use_situation))[] = {CALLBACKSET_INIT(GET, DeviceUseSituation),CALLBACKSET_END(NULL, NULL),
};DEFINE_STATIC_GLBVAR(WebcommFrame_t, sg_WebAssemble)[] =
{// 资源对象的回调函数 可在此添加WEBCOMM_FRAME(WEBOVERIVEW_OPTION, WSOT_DASHBOARD, use_situation),{NULL, 0, NULL, NULL},
};WEBHANDLE WebcommCreate(void)
{WebHandler_t *pWebHandler = NULL; pWebHandler = (WebHandler_t *)calloc(sizeof(char), sizeof(WebHandler_t));return (WEBHANDLE)pWebHandler;
}void WebcommDestroy(WEBHANDLE webHandle)
{ WebHandler_t *pWebHandler = NULL;pWebHandler = (WebHandler_t *)webHandle;if (NULL != pWebHandler) {if (NULL != pWebHandler->pData) {cJSON_Delete(pWebHandler->pData);}free(pWebHandler);}
}// send result from webcomm data
int WebcommSendResult(WEBHANDLE webHandle, Webs *wp)
{ int code = 0;int payloadLen = 0;char *payload = NULL;cJSON *resJson = NULL;WebHandler_t *pWebHandler = NULL;assert(webHandle);assert(wp);pWebHandler = (WebHandler_t *)webHandle;if (WEBERR_RSN_OK_NOTRSP == pWebHandler->rsi.code) {if (NULL != pWebHandler->pData) {cJSON_Delete(pWebHandler->pData);pWebHandler->pData = NULL;}WebErrReason(pWebHandler, WEBERR_RSN_UNKNOWN);return 0;}switch (pWebHandler->rsi.code){case WEBERR_RSN_OK:case WEBERR_RSN_PARAMETER_VALUE_OUTOFRANGE:code = HTTP_CODE_OK;break;case WEBERR_RSN_URL_NOT_SUPPORT:case WEBERR_RSN_PARAMETER_MISSING:code = HTTP_CODE_BAD_REQUEST;break;case WEBERR_RSN_ACCOUNT_PASSWORD_ERROR:code = HTTP_CODE_UNAUTHORIZED;break;case WEBERR_RSN_REQUEST_NOT_METHOD:code = HTTP_CODE_BAD_METHOD;break;default:code = HTTP_CODE_INTERNAL_SERVER_ERROR;break;}resJson = cJSON_CreateObject();cJSON_AddNumberToObject(resJson, WEBRES_CODE, pWebHandler->rsi.code);cJSON_AddStringToObject(resJson, WEBRES_MESSAGE, pWebHandler->rsi.message);cJSON_AddItemToObject(resJson, WEBRES_DATA, pWebHandler->pData);if (NULL == (payload = cJSON_Print(resJson))) {return -1;}payloadLen = strlen(payload);PrintInfo("[WebcommSendResult:%d] %s ", pWebHandler->rsi.code, payload);websSetStatus(wp, code);websWriteHeaders(wp, payloadLen, 0);WebsResponseHeadSafePolicy(wp);websWriteEndHeaders(wp);websWriteBlock(wp, payload, payloadLen);websWriteBlock(wp, "\r\n", 2);websDone(wp);cJSON_Delete(resJson);free(payload);pWebHandler->pData = NULL;WebErrReason(pWebHandler, WEBERR_RSN_UNKNOWN);return 0;
}WebcommResult_t WebcommLoginCheck(WEBHANDLE webHandle, int alreaylogin, const char *cname, const char *cpasswd)
{ WebPermitUser_t *pPermitUser = NULL;WebcommResult_t webResult = WEBERR_RSN_ACCOUNT_PASSWORD_ERROR;assert(webHandle);assert(cname);assert(cpasswd);if (NULL != (pPermitUser = WebsGetPermitUser(cname))) {if (0 == pPermitUser->state) { // 账户是否被禁用webResult = WEBERR_RSN_ACCOUNT_DISABLE;} else {webResult = (0 == strcmp1(pPermitUser->password, cpasswd)) ?WEBERR_RSN_OK : WEBERR_RSN_ACCOUNT_PASSWORD_ERROR;}} else if (alreaylogin) { // 登入过,获取不到,说明超时,已被删除webResult = WEBERR_RSN_ACCOUNT_LOGIN_TIMEOUT;}return WebErrReason((WebHandler_t *)webHandle, webResult);
}// New Session
WebcommResult_t WebcommNewSession(WEBHANDLE webHandle, Webs *wp, const char *cname, const char *cvalue)
{ WebHandler_t *pWebHandler = NULL; WebPermitUser_t *pPermitUser = NULL;char currenttime[MAX_LEN_256] = {0};assert(wp);assert(webHandle);wfree(wp->username);wp->username = sclone(cname);wfree(wp->password);wp->password = sclone(cvalue);pWebHandler = (WebHandler_t *)webHandle;CHECK_WEBHANDLE_DATA_OBJECT(pWebHandler);websCreateSession(wp);websSetSessionVar(wp, WEBCOMM_LOGIN_USER, wp->username);websSetSessionVar(wp, WEBCOMM_LOGIN_PASS, wp->password);websSetSessionVar(wp, WEBCOMM_LOGIN_LAST, GetCurrentTime(currenttime, MAX_LEN_256));if (NULL != (pPermitUser = WebsGetPermitUser(wp->username))) {/* 同一个账号新登入的session会将之前的会话替换掉 */if (wp->session && 0 != strcmp(pPermitUser->cookieId, wp->session->id)) {if (*pPermitUser->cookieId) {websDeleteSessionByCookie(pPermitUser->cookieId);}strcpy(pPermitUser->cookieId, wp->session->id);}}cJSON_AddStringToObject(pWebHandler->pData, WEBCOMM_TOKEN_ACCESS, pPermitUser->cookieId);return WebErrReason(pWebHandler, WEBERR_RSN_OK);
}WebcommResult_t WebcommGetSession(WEBHANDLE webHandle, Webs *wp, const char *cname)
{ const char *lasttime = NULL;WebHandler_t *pWebHandler = NULL;assert(webHandle);assert(wp);wfree(wp->username);wp->username = sclone(cname);pWebHandler = (WebHandler_t *)webHandle;CHECK_WEBHANDLE_DATA_OBJECT(pWebHandler);lasttime = websGetTokenSessionVar(wp, WEBCOMM_LOGIN_LAST, "");cJSON_AddStringToObject(pWebHandler->pData, WEBCOMM_LOGIN_USER, cname);cJSON_AddStringToObject(pWebHandler->pData, WEBCOMM_LOGIN_LAST, lasttime);return WebErrReason(pWebHandler, WEBERR_RSN_OK);
}WebcommResult_t WebcommDeleteSession(WEBHANDLE webHandle, Webs *wp, const char *cname)
{assert(webHandle);assert(wp);wfree(wp->username);wp->username = sclone(cname);OPLOGS_OPTION_PREFIX(webHandle, wp->username, NULL, "logout"); OPLOGS_OPTION_STRSAVE("", NULL, "", 1);websRemoveSessionVar(wp, WEBCOMM_LOGIN_USER);websRemoveSessionVar(wp, WEBCOMM_LOGIN_PASS);websRemoveSessionVar(wp, WEBCOMM_LOGIN_LAST);websDestroySession(wp);return WebErrReason((WebHandler_t *)webHandle, WEBERR_RSN_OK);
}WebcommResult_t WebcommExecuteHandler(WEBHANDLE webHandle, Webs *wp, const char *cname)
{void *callback = NULL;const char *method = NULL;char option[MAX_LEN_64] = {0};char uriPath[MAX_LEN_2048] = {0};WebHandler_t *pWebHandler = NULL;WebPermitUser_t *pPermitUser = NULL;WebcommFrame_t *pAssemble = NULL;assert(webHandle);assert(wp);wfree(wp->username);wp->username = sclone(cname);pWebHandler = (WebHandler_t *)webHandle;CHECK_WEBHANDLE_DATA_OBJECT(pWebHandler);#if (1 == WEBCOMM_ACCOUNT_PERMISSION_CHECK)/* 获取当前用户的权限mask */ if (NULL != (pPermitUser = WebsGetPermitUser(wp->username))) {// ....}
#endifsscanf(wp->url, "/web/app/%[^/]%*c%[^?]", option, uriPath);for (pAssemble = sg_WebAssemble; pAssemble->options; pAssemble++) {// 校验option的是否匹配if (0 != strcmp1(option, pAssemble->options)) {continue;}// 校验请求路径的是否匹配if (0 != strncmp(uriPath, pAssemble->uriLabel, strlen(pAssemble->uriLabel))) {continue;}#if (1 == WEBCOMM_ACCOUNT_PERMISSION_CHECK)// 检查当前用户是否具体该 suboptions 权限if (NULL == pPermitUser || !(pPermitUser->permitMask & pAssemble->suboptions)) {return WebErrReason(pWebHandler, WEBERR_RSN_ACCOUNT_NOT_PERISSION);}
#endif// 获取BODY中method的值 method = websGetVar(wp, WEBCOMM_METHOD, "");if (NULL != (callback = GetCallback(pAssemble->callbackSet, wp->method, method))) { return ((WebcommResult_t (*)(WEBHANDLE, cchar *, Webs *))callback)(webHandle, uriPath, wp);} else {return WebErrReason(pWebHandler, WEBERR_RSN_REQUEST_NOT_METHOD);}}return WebErrReason(pWebHandler, WEBERR_RSN_URL_NOT_SUPPORT);
}
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- python--regular expression
eg 1: import re PhoneNumRegex = re.compile(r\d\d\d\d-(\d\d\d-\d\d\d\d)) print(PhoneNumRegex) mo = PhoneNumRegex.search(my numble is 4154-333-3333) print(mo.group()) print(mo.group(1))运行结果:/home/zhaodan/pythonspider/venv/bin/python /home/zhaodan/python…...
2024/4/16 7:51:40 - windows10+Nvidia GeForce GTX 1070+安装 Cuda-10.1 + CuDNN-7.6 + Tensorflow-gpu-1.15.0
安装 Visual Studio 2019下载地址 下载完成后点击exe,勾选通用Windows平台开发和使用c++的桌面开发,直到安装完成。右键点击NVIDIA控制面板,进入帮助->系统信息,选择组件,查看NVCUDA.dll上写的CUDA版本号我的Nvdia控制面板上写的是CUDA10.1 我安装的是CUDA10.1和对应的…...
2024/4/16 7:52:00 - 一对一直播源码与二次开发
之前有一直在说的一对一直播源码到底是什么?这个问题也是许多刚入门的朋友一直在求的。一对一直播这个不难理解就是一位主播对一位用户,进行一对一视频直播、聊天、给主播送送小礼物以及在直播间进行游戏互动。源码,也就是原代码、原程序;程序员编写最原始的程序代码,它更…...
2024/4/17 22:58:13 - 使用libwebsocket搭建websocket服务器实例
webcomm与前端的通讯-websocket服务器操作流程#include <libwebsockets.h> #include <pthread.h> #include <string.h>#define MAX_PAYLOAD_SIZE (4096)/** 开启确认才有重发的机制 */ typedef struct comm_packet {void *content; /* is mallocd */si…...
2024/4/16 7:51:45 - ImportError: libcudnn.so.7: cannot open shared object file错误以及非root用户安装cudnn
关于ImportError: libcudnn.so.7: cannot open shared object file错误以及非root用户安装cudnn 使用 Tensorflow 的时候出现了错误Tensorflow:ImportError: libcudnn.so.7: cannot open shared object file: No such file or directory 从报错信息上来看,就是libcudnn.so.7文…...
2024/4/24 3:37:30 - java实现链表的增删改查
话不多说,直接上代码 package linkedLIst;class hero {private int no;private String name;private String nickName;hero next;public hero(int no,String name,String nickName){this.no=no;this.name=name;this.nickName=nickName;}public int getNo() {return no;}public…...
2024/4/16 7:51:55 - 如何快速上手tensorflow
如何快速上手tensorflow 其中的内容多来自GitHub上的内容https://github.com/apachecn/AiLearning/blob/master/docs/ml/2.k-%E8%BF%91%E9%82%BB%E7%AE%97%E6%B3%95.md, 感谢https://github.com/apachecn/AiLearning该团队的入门内容 首先是数据集的获取,我是使用的keras下载…...
2024/4/20 5:37:24 - mongodb手动切换主从节点(副本集模式)
mongodb安装了副本集模式后,比如2节点或者3节点,服务运行过程中会有1个节点状态是PRIMARY(主节点),其他的是SECONDARY(从节点)。 如果连接到从节点,那么很多操作都不允许,这个时候就需要手动切换了,操作如下: 2节点需要:到主节点执行 rs.stepDown(120) 3节点需要:…...
2024/4/16 7:51:40 - IDEA创建Java项目
文档网址: 链接:https://pan.baidu.com/s/1cne7ssVnkGj8QtQNXfiMUA 提取码:ljnq 选择:...
2024/4/16 21:03:20 - MYSQL 1290错误接解决方法
Mysql> flush privileges...
2024/4/16 7:52:42 - 使用inspector功能查看和管理契约
CSE从2.3.65版本(ServiceComb 1.2.0)开始,提供了inspector功能,该功能提供了用户查看、下载契约,生成文档和对API接口进行测试的功能。这个功能直接在微服务提供,用于弥补通过服务中心查看契约和对接口进行测试的不足。inspector功能后续会做进一步增强,除了管理契约,还…...
2024/4/20 14:17:52 - Spring security知识整理
1) Spring Security中进行身份验证的是AuthenticationManager接口,ProviderManager是它的一个默认实现,但它并不用来处理身份认证,而是委托给配置好的AuthenticationProvider,每个AuthenticationProvider会轮流检查身份认证。检查后或者返回Authentication对象或者抛出异常…...
2024/4/1 1:50:46 - 八十三、Python | Leetcode双指针系列
@Author:Runsen @Date:2020/7/7人生最重要的不是所站的位置,而是内心所朝的方向。只要我在每篇博文中写得自己体会,修炼身心;在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰难,奋勇前行,不忘初心,砥砺前行,人生定会有所收获,不留遗憾 (作者:Runsen )作者介绍…...
2024/4/19 18:01:20 - 文件的上传和下载
pom.xml 导入依赖的坐标 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.…...
2024/4/20 1:46:50 - 移动端布局方案二:rem+flexible.js
我们通过rem+媒体查询+less布局时,需要针对一些市面上常见的屏幕尺寸做媒体查询适配,比较麻烦,这里推荐一个淘宝移动团队出的插件,它会自动设置当前屏幕宽度除以10的值作为当前html的font-size.准备工作:使用vscode开发,安装插件cssrem,它可以自动帮我们计算css中px值对应的rem…...
2024/4/1 1:50:44 - Javascript内置对象
Javascript内置对象1.Number2.Math3.Date4.JSON对象介绍5.Set6.Map1.Number Number对象可以把字符串转化为数字,并对数字的精度做一些操作。 字符串转换为整数Number.parseInt(): var strNum = "15"; var num = Number.parseInt(strNum); //还可以写成 var num = pa…...
2024/4/16 7:52:56 - 算法 - 7大比较类排序算法程序设计
典型的7大排序算法典型的7大排序算法包括:(1)冒泡排序(2)选择排序(3)插入排序(4)希尔排序(5)归并排序(6)快速排序(7)堆排序7中排序算法中:快速排序、希尔排序、选择排序、堆排序是稳定的排序算法。7大排序算法程序如下:class Solution { public:vector<int…...
2024/4/1 1:50:41 - 【数据结构】-单链表-判断序列B是否是序列A的连续子序列
算法思路:用两个指针来遍历两个单链表,当节点值相同的时候,两个指针同时向后移动一个位置当节点值不相同的时候,A表的指针继续向后面遍历,B表的指针回到头部重新开始遍历例子如下:bool isSon(LinkList A, LinkList B) {LNode *p,*q;p = A->next;q = B->next;while …...
2024/4/16 7:51:45 - 【FinTech直播来了】第五期重装上线!看区块链如何赋能普惠金融!
关注神州信息官方微信公众号,及时报名!...
2024/4/16 7:53:22 - Graph Attention Networks (GAT) 图注意力模型
文章目录GAT模型的提出,可见ICLR 2018论文 GRAPH ATTENTION NETWORKS...
2024/4/16 7:52:41
最新文章
- 说说你对盒子模型的理解?
一、是什么 当对一个文档进行布局(layout)的时候,浏览器的渲染引擎会根据标准之一的 CSS 基础框盒模型(CSS basic box model),将所有元素表示为一个个矩形的盒子(box) 一个盒子由四…...
2024/5/6 21:23:25 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/6 9:38:23 - Redis -- 缓存雪崩问题
缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。 可能原因 : 同一时间大量的key到期 ; 解决方案: 给不同的Key的TTL添加随机值 利用Redis集群提高服务的可用性 给缓存业务添加降…...
2024/5/5 8:32:50 - JS实现双向数据绑定的三种方式
1、第一种是通过Proxy数据代理来达到双向绑定的,这是Vue3更新的双向绑定方式。 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Proxy双向绑定</title> <<...
2024/5/5 19:53:09 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/4 23:54:56 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/4 23:54:56 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/5/4 23:54:56 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/6 9:21:00 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/5/4 23:54:56 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/5/4 23:55:05 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/5/4 23:54:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/5/4 23:55:16 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/5/4 23:54:56 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/6 1:40:42 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/5/4 23:54:56 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/5/4 23:55:17 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/5/4 23:55:06 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/5/4 23:54:56 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/4 23:55:06 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/5 8:13:33 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/5/4 23:55:16 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/5/4 23:54:58 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/4 23:55:01 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/5/4 23:54:56 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下: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