cmock 简介

cmock 用于根据接口自动生成 mock 文件,并根据 mock 文件起 mock 服务。本篇着重讲解 cmock 原理,如果仅关注使用,可以查看 cmock 使用指导 。

cmock 原理

依然先看 cmock 原理图:

cmock原理图

npm install// 创建 mock 文件
npm run create// 起 mock 服务
npm run dev

目录介绍

本项目的目录如下:
目录

目录功能介绍
controllers用于存放 mock 文件的目录
util用于存放一些公共方法
controller.js主要用于 npm run dev 起 cmock 服务,自动读取 controllers 文件夹下的 mock 文件
global.js全局方法或变量存在,暂时无用
index.js起服务的入口文件
nodemon.json用于 nodemon 的配置
package.json项目描述及配置
README.md项目说明文档

util 下的目录:
util目录

目录功能介绍
objectToString.js将对象转换成字符串,例如 objectToString({ name: 'fxss', age: 28, location: 'shanghai' }, ['name', 'age']) = namefxssage20,用于生成 mock 文件中 body 的 key
onProxy.js代理配置
replaceAll.js使用正则实现全部替换
template.js用于生成 mock 文件的模板

环境区分

本项目通过 cross-env 设置环境变量,配置不同的命令行:

"scripts": {"dev": "nodemon","create": "cross-env create=true nodemon"
},

npm run dev 起 cmock 服务,并根据请求参数返回 mock 文件中对应的数据结构。
npm run create 起 cmock 服务,会代理请求并根据返回的数据结构生成 mock 文件。

在项目中使用 process.env.create 作为区分。

代理

本项目使用的 http-proxy-middleware 进行代理, http-proxy-middleware http-proxy events 支持配置 onProxyReqonProxyRes 事件,本项目主要核心使用的就是 onProxyReqonProxyRes 事件。

如下是 onProxy.js 文件的内容,主要地方已备注:

const fs = require("fs");
const chalk = require("chalk");
const qs = require("qs");
const dayjs = require("dayjs");
const replaceAll = require("./replaceAll.js");
const template = require("./template.js").template;
const { mockFolder, needParams } = require("../package.json");
const objectToString = require("./objectToString.js");// https://github.com/chimurai/http-proxy-middleware#http-proxy-events
function onProxyReqFn(fullpath) {return function (proxyReq, req, res) {// 生成特殊标识,并 setHeader ,保证同一请求多次触发时能正确匹配let headerFlag = `headerFlag${parseInt(Math.random() * 100000000000)}`;proxyReq.setHeader("headerFlag", headerFlag);// 接口请求链接转换为文件名const fileNameUrl = `${replaceAll("/", "_", req.url)}`;let fileName = fileNameUrl;let url = req.url;// get请求特殊处理if (req.method.toLowerCase() === "get") {fileName = fileNameUrl.split("?")[0];url = url.split("?")[0];}let fileText;// 直接 require 对应的 mock 文件,如果失败则同步创建再 requiretry {fileText = require(`${fullpath}/${fileName}.js`);} catch (error) {let fileTemplate = template;let updateTime = dayjs().format("YYYY-MM-DD HH:mm:ss");fileTemplate = fileTemplate.replace("$url", url);fileTemplate = fileTemplate.replace("$method", req.method);fileTemplate = fileTemplate.replace("$type", req.headers.accept);fileTemplate = fileTemplate.replace("$createTime", updateTime);fileTemplate = fileTemplate.replace("$updateTime", updateTime);// http://nodejs.cn/api/fs.html#fsappendfilesyncpath-data-optionsfs.appendFileSync(`./${mockFolder}/${fileName}.js`, fileTemplate);console.log(chalk.green(`onProxyReqFn: ${fileName}.js create success`));fileText = require(`${fullpath}/${fileName}.js`);}if (req.method.toLowerCase() !== "get") {// 非 get 请求时,请求参数获取let body = [];req.on("data", function (chunk) {body.push(chunk);});req.on("end", function () {// 获取到请求参数并转化为对应的参数 keybody = Buffer.concat(body).toString();const paramsBody = body && JSON.parse(body);let paramsKeyList = Object.keys(paramsBody);let needParamsKeys = [];let bodyKey = "";paramsKeyList.forEach((item) => {if (needParams.includes(item)) {needParamsKeys.push(item);}});if (needParamsKeys.length) {bodyKey = objectToString(paramsBody, needParamsKeys);}if (bodyKey.length) {fileText.body[bodyKey] = "";} else {fileText.body.default = "";}fileText.bodyKey[headerFlag] = bodyKey;// 将参数 key 一并写入 mock 文件fileText = `module.exports=${JSON.stringify(fileText)}`;fs.writeFile(`${fullpath}\\${fileName}.js`, fileText, (err) => {if (err)console.log(chalk.red(`onProxyReqFn: ${fileName}.js ${err}`));console.log(chalk.green(`onProxyReqFn: ${fileName}.js save success`));});});} else {// get 请求直接从 url 上获取参数,并使用 qs 将参数字符串转化为对象,之后得到 body 中的参数 keyconst paramsBody = qs.parse(fileNameUrl.split("?")[1]);let paramsKeyList = Object.keys(paramsBody);let needParamsKeys = [];let bodyKey = "";paramsKeyList.forEach((item) => {if (needParams.includes(item)) {needParamsKeys.push(item);}});if (needParamsKeys.length) {bodyKey = objectToString(paramsBody, needParamsKeys);}if (bodyKey.length) {fileText.body[bodyKey] = "";} else {fileText.body.default = "";}fileText.bodyKey[headerFlag] = bodyKey;// 将参数 key 一并写入 mock 文件fileText = `module.exports=${JSON.stringify(fileText)}`;fs.writeFile(`${fullpath}\\${fileName}.js`, fileText, (err) => {if (err) console.log(chalk.red(`onProxyReqFn: ${fileName}.js ${err}`));console.log(chalk.green(`onProxyReqFn: ${fileName}.js save success`));});}};
}function onProxyResFn(fullpath) {return function (proxyRes, req, res) {// 获取 onProxyReqFn 中设置的标识let headerFlag = proxyRes.req._header.match(/(?<=headerFlag: )(.*)\r\n/)[1];// 根据 url 获取 mock 文件名const fileNameUrl = `${replaceAll("/", "_", req.url)}`;let fileName = fileNameUrl;if (req.method.toLowerCase() === "get") {fileName = fileNameUrl.split("?")[0];}// 导入 mock 文件对象,并根据 headerFlag 拿到 body 中的参数 keylet fileText = require(`${fullpath}/${fileName}.js`);let key = fileText.bodyKey[headerFlag] || "default";delete fileText.bodyKey[headerFlag];// 获取后端接口返回的数据结构let body = [];proxyRes.on("data", function (chunk) {body.push(chunk);});proxyRes.on("end", function () {body = Buffer.concat(body).toString();// 将后端接口返回的数据结构添加到 mock 文件的导出对象中if (!fileText.body[key]) {fileText.body[key] = body ? JSON.parse(body) : "";}// 更新时间fileText.updateTime = dayjs().format("YYYY-MM-DD HH:mm:ss");// 重新写入 mock 完整文件fileText = `module.exports=${JSON.stringify(fileText)}`;fs.writeFile(`${fullpath}\\${fileName}.js`, fileText, (err) => {if (err) console.log(chalk.red(`onProxyResFn: ${fileName}.js ${err}`));console.log(chalk.green(`onProxyResFn: ${fileName}.js save success`));});res.end();});};
}module.exports = {onProxyReqFn,onProxyResFn,
};

接下来我们看一下上文中提到的 util 文件夹下其他的方法:

objectToString.js:

/*** 将对象转换成字符串* @param {object} object 需要被转换的对象* @param {array} keys 保留的key* @returns {string}* 例如 objectToString({ name: 'fxss', age: 28, location: 'shanghai' }, ['name', 'age']) = namefxssage20*/
module.exports = function (object, keys = []) {let res = "";Object.keys(object).forEach((item) => {if (keys.includes(item)) {res += `${item}${object[item]}`;}});return res;
};

replaceAll.js:

/*** 全部替换* @param {string} find 需要匹配替换的内容* @param {string} replace 替换后的内容* @param {string} str 需要处理的字符串* @returns {string} 处理后的字符串*/
module.exports = function (find, replace, str) {var find = find.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&");return str.replace(new RegExp(find, "g"), replace);
};

template.js:

/*** 用于生成 mock 文件的模板{name: "$name", // 接口名称url: "$url", // 接口的 urlmethod: "$method", // 接口方法type: "$type", // 接口对应的 response.typecreateTime: "$createTime", // mock 文件创建时间updateTime: "$updateTime", // mock 文件最后更新时间,如果手动更新 mock 文件,改时间可能不准确bodyKey: {}, // 内部使用,误删body: { // 用于存放接口数据结构,后续会添加 mockTemplate ,用于 mock.js 生成数据接口参数(仅包含 package.json needParams 中配置的参数): 接口数据结构},}*/
module.exports = {template: `module.exports = {name: "$name", // 接口描述url: "$url",method: "$method",type: "$type",createTime: "$createTime",updateTime: "$updateTime",bodyKey: {},body: {},}`,
};

看一个我真实生成的 mock 文件:

在这里插入图片描述

项目服务:

const Koa = require("koa");
const chalk = require("chalk");
const path = require("path");
const fs = require("fs");
const bodyParser = require("koa-bodyparser");
const cors = require("koa2-cors");const { port, proxy, mockFolder } = require("./package.json");
const global = require("./global.js").global;const app = new Koa();// 用于写入文件时拼接的文件地址
const fullpath = path.join(`${__dirname}\\${mockFolder}`);// 判断文件夹是否存在,不存在则创建
fs.stat(`./${mockFolder}`, (err, stat) => {if (err) {fs.mkdirSync(`./${mockFolder}`, (ierr, istat) => {if (ierr) {console.log(chalk.red(`./${mockFolder} 文件夹不存在,并创建失败`));}});}// 全局公共变量及方法app.context.global = global;app.use(cors());// 接口访问是打印app.use(async (ctx, next) => {console.log(chalk.blue(`Process ${ctx.request.method} ${ctx.request.url}...`));await next();});// cross-env 设置环境变量 create ,以此来区分是否用于创建 mock 文件if (process.env.create) {const { createProxyMiddleware } = require("http-proxy-middleware");const k2c = require("koa2-connect");const { onProxyReqFn, onProxyResFn } = require("./util/onProxy.js");// 配置多个代理proxy.forEach((item) => {app.use(async (ctx, next) => {if (ctx.url.startsWith(item.url)) {ctx.respond = false;await k2c(createProxyMiddleware({target: item.target,changeOrigin: true,onProxyReq: onProxyReqFn(fullpath),onProxyRes: onProxyResFn(fullpath),}))(ctx, next);}await next();});});// parse request body:app.use(bodyParser());} else {const controller = require("./controller");// parse request body:app.use(bodyParser());// add controllers:app.use(controller(mockFolder));}
});app.listen(port);
console.log(chalk.green(`app started at port ${port}...`));

可以看到在代码 40 行的位置,使用了环境变量 process.env.create 进行区分不同的功能,如果是 npm run create ,则会导入 代理,并在代理时间中生成 mock 文件,npm run dev 则直接根据 mock 文件起 mock 服务。

导入 mock 文件,起 mock 服务

controller.js

// https://github.com/michaelliao/learn-javascript/blob/master/samples/node/web/koa/url2-koa/controller.jsconst fs = require("fs");
const path = require("path");
const chalk = require("chalk");
const { needParams } = require("./package.json");
const objectToString = require("./util/objectToString.js");/*** addControllers* @param {Object} router require('koa-router')()* @param {String} dir path*/
function addControllers(router, dir) {const fullpath = path.join(__dirname + "/" + dir);listFile(router, fullpath);
}/*** 便利 mock 文件目录* @param {Object} router require('koa-router')()* @param {String} dirPath path*/
function listFile(router, dirPath) {const arr = fs.readdirSync(dirPath);arr.forEach(function (item) {const fullpath = path.join(dirPath, item);console.log(chalk.blue(`process controller: ${fullpath}...`));const mapping = require(fullpath);addMapping(router, mapping);});
}/*** add url-route in /controllers:* @param {Object} router require('koa-router')()* @param {Object} mapping require(__dirname + '/' + dir + '/' + f)*/
function addMapping(router, mapping) {if (mapping.method.toLowerCase() === "get") {router.get(mapping.url, createRouter(mapping));// 用于打印注册号接口的信息console.log(chalk.green(`register URL mapping: ${chalk.white(mapping.name)}${chalk.yellow("get")} ${mapping.url}`));} else if (mapping.method.toLowerCase() === "post") {router.post(mapping.url, createRouter(mapping));// 用于打印注册号接口的信息console.log(chalk.green(`register URL mapping: ${chalk.white(mapping.name)}${chalk.yellow("post")} ${mapping.url}`));} else if (mapping.method.toLowerCase() === "put") {router.put(mapping.url, createRouter(mapping));// 用于打印注册号接口的信息console.log(chalk.green(`register URL mapping: ${chalk.white(mapping.name)}${chalk.yellow("put")} ${mapping.url}`));} else if (mapping.method.toLowerCase() === "delete") {router.del(mapping.url, createRouter(mapping));// 用于打印注册号接口的信息console.log(chalk.green(`register URL mapping: ${chalk.white(mapping.name)}${chalk.yellow("delete")} ${mapping.url}`));} else {console.log(chalk.red(`invalid URL: ${mapping.url}`));}
}/*** 生成路由函数* @param {Object} mapping 对应 mock 文件导出的对象*/
function createRouter(mapping) {return async (ctx, next) => {// 收集请求参数,得出 body 中的参数 keylet paramsBody = Object.assign({}, ctx.params, ctx.query, ctx.request.body);let paramsKeyList = Object.keys(paramsBody);let needParamsKeys = [];let bodyKey = "default";paramsKeyList.forEach((item) => {if (needParams.includes(item)) {needParamsKeys.push(item);}});if (needParamsKeys.length) {bodyKey = objectToString(paramsBody, needParamsKeys);}// 判断 mock 文件的 body 中是否存在请求参数 key,如果不存在,则默认引用第一个const mappingBodyKeys = Object.keys(mapping.body);if (!mappingBodyKeys.includes(bodyKey) && mappingBodyKeys.length) {bodyKey = mappingBodyKeys[0];}ctx.response.type = mapping.type;ctx.response.body = mapping.body[bodyKey];next();};
}module.exports = function (dir) {const controllers_dir = dir || "controllers";const router = require("koa-router")();addControllers(router, controllers_dir);return router.routes();
};

至此 cmock 原理解读到此结束。

感谢

本次分享到这里就结束了,感谢您的阅读!如对您有帮助,帮忙点个赞,您的点赞是我继续创作的动力。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. pytorch 中的with torch.no_grad()

    pytorch 中的with torch.no_grad(): 在pytorch写的网络中&#xff0c;with torch.no_torch():非常常见。 首先&#xff0c;关于python中的with&#xff1a; with语句适用于对资源进行访问的场合&#xff0c;确保不管使用过程中是否发生异常都会执行必要的”清理“操作&#xf…...

    2024/3/7 4:31:39
  2. final和static使用场景

    final和static使用场景1. final 和 static 总结2. final &#xff08;修饰符&#xff09;2.1 final修饰类2.2 final修饰方法2.3 final修饰变量3. static &#xff08;关键字&#xff09;3.1 static修饰的方法&#xff0c;3.2 static变量3.3 static代码块1. final 和 static 总结…...

    2024/3/7 4:31:38
  3. 安全监测系统 06 Flask restful 定制返回的JSON格式

    Extending Flask-RESTful — Flask-RESTful 0.3.8 documentation 目标&#xff1a;我们希望将原先的响应信息 {"status_level_list": [{"id": 101,"name": "健康"},{"id": 111,"name": "轻度"},{&quo…...

    2024/3/7 4:31:37
  4. 寒假每日一题——反转链表

    题目链接&#xff1a;https://leetcode-cn.com/problems/reverse-linked-list/题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。示例 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]思路一 迭代 假设链表为 1→2…...

    2024/3/7 4:31:36
  5. XML初识

    XML初识XML概念XML用途XML是通用的数据交换形式——对比CSV和XMLXML特点————来自&#xff08;《计算机是怎样跑起来的》读书笔记&#xff09;问题引入&#xff1a;1.HTML与XML的区别&#xff1a; HTML 是用于编写网页的标记语言。XML 是用于定 义任意标记语言的元语言。 通…...

    2024/3/21 17:56:00
  6. 统计隐藏数组数目

    题目 解题思路 首先我们知道的是&#xff1a;这道题是让我们求数目&#xff0c;而不是求出来具体的数组所以说我们并不需要计算每一个数组是多少&#xff0c;只需要知道数组的上下限是多少从0执行一次传入数组differences[]&#xff0c;从而储存min和max&#xff0c;求出数组的…...

    2024/3/7 4:31:35
  7. 【RPA之家转载】实在智能RPA和OCR的协作,是自动化办公的新优势

    RPA之家&#xff08;RPA之家|RPA|RPA新闻|RPA案例|RPA应用|RPA咨询|RPA培训|RPA认证|RPA教程&#xff09;是中国具有影响力的RPA垂直交流社区&#xff0c;社区汇聚了RPA领域的各类从业人员。其中包括RPA开发工程师、售前工程师、业务分析师、架构师、运维工程师、项目管理、项目…...

    2024/3/7 4:31:33
  8. 无人机开发学习(2)

    遥控器校准 器材&#xff1a; 1.AT9S Pro遥控器 2.乐迪R9DS接收器 3.Nora飞控 我是用的是SBUS信号&#xff0c;注意下图的接线位置&#xff0c;SBUS的接口是在底部 接线的正负极一定要注意&#xff0c;不然会“放烟花”&#xff01;&#xff01;&#xff01; SUBS接口如下…...

    2024/3/23 15:17:23
  9. 多商户前端脑图

    ...

    2024/3/7 4:31:31
  10. Linux中php安装SCWS扩展

    进入源码目录的 phpext/ 目录 1 2 3 4 5 6 # cd /scws-1.2.3/phpext # /usr/local/php/bin/phpize #用phpize生成configure配置文件 # ./configure --with-php-config/usr/local/php5/bin/php-config --with-scws/usr/local/scwsphpext //configure操作 # make # make install…...

    2024/3/7 4:31:30
  11. 精尽 jasypt-spring-boot 源码分析 3.0.4

    1 依赖工具 MavenGitJDKIntelliJ IDEA 2 源码拉取 git clone git://github.com/ulisesbocchio/jasypt-spring-boot.git cd jasypt-spring-boot/ # 3.0.4是最新的版本 git checkout jasypt-spring-boot-parent-3.0.4 mvn clean install3 jasypt-spring-boot-demo System.set…...

    2024/3/7 4:31:29
  12. MYSQL InnoDB引擎

    1、逻辑存储结构 2、架构 1内存架构 2磁盘结构 3后台线程 3、事务原理 4、MVCC-基本概念...

    2024/3/7 4:31:27
  13. Unity(如何通过简单的运算判断该次攻击是否暴击)

    1、声明一个0-1之间的浮点数&#xff0c;用来充当暴击率 2、运用Random.value属性(返回一个介于 0.0 [包括] 和 1.0 [包括] 之间的随机数。) 3、并用声明的数跟随机的数作比较 3.1、随机的数大的话就暴击&#xff0c;反之则不暴击 实例&#xff1a;...

    2024/3/7 4:31:28
  14. 【Leetcode-哈希表】整数转罗马数字

    整数转罗马数字 难度&#xff1a;中等 贪心法则&#xff1a;我们每次尽量使用最大的数来表示。 比如对于 1994 这个数&#xff0c;如果我们每次尽量用最大的数来表示&#xff0c;依次选 1000&#xff0c;900&#xff0c;90&#xff0c;4&#xff0c;会得到正确结果 MCMXCIV。…...

    2024/3/7 4:31:26
  15. 类型 List 不是通用的;不能使用参数 <String> 将它参数化

    这个错误一般是import导入错了导致的。 Java.awt.List 是一个界面控件&#xff0c;是重量级系统列表控件&#xff1b; Java.util.List 是一种数据容器&#xff0c;是列表模式的数据容器。...

    2024/3/7 4:31:25
  16. 【SpringBoot+vue跨域问题,后端配置方法】

    springboot后端配置文件如下&#xff1a; package com.jidu.netty; import java.io.IOException; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Compone…...

    2024/3/4 13:06:54
  17. 基础05:类型转换

    类型转换 byte b(int)i;类型运算顺序顺序 byte、short、char–>int–>long–>float–>double 强制转换 &#xff08;类型&#xff09;变量名 适用于高到低 自动转换 变量名 适用于低到高 注意点&#xff1a; 1.不能对布尔值进行转换 2.不能把对象类型转化…...

    2024/3/4 13:06:53
  18. nodejs 公众号开发攻略(包括字典码排序sha1加密代码)

    目录前言公众号申请配置服务器信息编写服务端代码导包加密代码提交设置自动回复信息获取开发token结尾前言 最近想玩一玩微信的开发&#xff0c;就想着从公众号与小程序入手&#xff0c;租了个服务器&#xff0c;本文主要介绍如何使用nodejs开发公众号&#xff0c;包括字典码排…...

    2024/3/4 13:06:53
  19. EasyPlayer如何将视频快照嵌入demo里?

    TSINGSEE青犀视频EasyPlayer播放器系列属于非常开放的播放器项目&#xff0c;针对不同的协议衍生出了多个版本&#xff0c;如EasyPlayer.js、EasyPlayerPro等&#xff0c;而且用户还可以根据自己的需求&#xff0c;将其集成进流媒体平台&#xff0c;支持轻松调用接口或自主进行…...

    2024/3/4 13:06:51
  20. 运输层和网络层的关系

    在协议栈中&#xff0c;运输层刚好位于网络层之上。网络层提供了主机之间的逻辑通信&#xff0c;而运输层为运行在不同主机上的进程之间提供了逻辑通信。这种差别虽然细微但很重要。我们用一个家庭类比来帮助分析这种差别。 考虑有两个家庭&#xff0c;一家住在北京&#xff0…...

    2024/3/7 4:31:23

最新文章

  1. 实践笔记-harbor搭建(版本:2.9.0)

    harbor搭建 1.下载安装包&#xff08;版本&#xff1a;2.9.0&#xff09;2.修改配置文件3.安装4.访问harbor5.可能用得上的命令: 环境&#xff1a;centos7 1.下载安装包&#xff08;版本&#xff1a;2.9.0&#xff09; 网盘资源&#xff1a;https://pan.baidu.com/s/1fcoJIa4x…...

    2024/3/29 17:26:15
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. R语言microeco:一个用于微生物群落生态学数据挖掘的R包(构建microeco对象。

    我以前写过临床微生物组的文章&#xff0c;其中数据分析用过microeco包&#xff0c;在这里&#xff0c;将我学到的资源分享给大家。 R语言microeco:一个用于微生物群落生态学数据挖掘的R包。 主要功能R6类;分类群丰度图&#xff0c;维恩图&#xff0c;Alpha多样性&#xff0c…...

    2024/3/25 19:29:27
  4. C语言——简易版扫雷

    目录 前言 ​编辑 游戏规则 游戏结构的分析 游戏的设计 使用多文件的好处有以下几点&#xff1a; 游戏代码实现 框架&#xff08;test.c&#xff09; game函数&#xff08;test.c&#xff09; InitBoard初始化&#xff08;game.c&#xff09; Print打印棋盘&#xff08;g…...

    2024/3/25 18:26:22
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/3/27 10:21:24
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/3/24 20:11:25
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/3/29 2:45:46
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/3/29 16:26:39
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/3/29 5:19:52
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/3/28 17:01:12
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/3/29 11:11:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/3/29 1:13:26
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/3/29 8:28:16
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/3/29 7:41:19
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/3/24 20:11:18
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/3/29 9:57:23
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/3/29 0:49:46
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/3/24 20:11:15
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/3/27 7:12:50
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/3/24 20:11:13
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/3/26 11:21:23
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/3/28 18:26:34
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/3/28 12:42:28
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/3/28 20:09:10
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; 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
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在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