国际物流小记

国外 -> 国内

包裹付款成功后,一周内会收到电子邮件,其会附上一个追踪单号,以便确认包裹到达配送地址途中的详细状况。因此一般来说最常见的流程是:
包裹发送完成→进入国外发送流程→到达当地海关检验→进行当地配送→成功送达

一般的寄送方式包括:
EMS、FedEx联邦、UPS、DHL、SF顺丰和海运

下列整理注明几个常见的物流状态:

Item number

此编号为您的包裹追踪单号,如果包裹出现任何状况都将以此单号向业者进行确认。

Class of goods

此栏为配送方式,日本邮政主要分为 EMS、SAL 和邮政航空可以选择。基本上 FedEx 联邦、UPS 、DHL、EMSSF 顺丰国际,是相对较快的,而 SAL 是最慢的。当然具体情况取决于实际收货地址等。

Posting/Collection

日语是引受,意思是(投递/收货),当包裹完成投递并由配送业者完成登录后,将会显示此状态(若包裹发送完成但尚未出现此状态,表示包裹仍在等待邮局人员收货中。请稍等业者完成包裹登记。)

Arrival at outward office of exchange

由于所有包裹都是使用空运发送,这时候您的包裹已经抵达相应的各地机场,正在准备发送目的国。

Dispatch from outward office of exchange

日语可能是国际邮便交换局から発送,或者国际邮便局で外国へ向けて発送准备完了。代表您的包裹已经完成国际发送的准备并从国际交换局的处理中心发出。

如图所示,如果更新了些信息,表面进入此状态表示您的包裹已经正式进入空运流程,目前正在前往目的地国家。
*由于某些国家并没有直航班机, 因此根据最终目的地,包裹有可能经过一个或多个中间国家,当到达中继国家时配送状态将不会更新,只会在到达目的地国家后进行更新。而且配送状态持续几天没有更新是正常的。一般来说,这是整个寄送流程中最重要的一环,而且花费时间最多。
*而且受 2020 新冠肺炎疫情影响,国际航班幅减少,寄送服务可能出现延误,敬请谅解。

Arrival at inward office of exchange

进入此阶段表示包裹已经顺利抵达目的地机场(根据当地邮政单位速度,包裹状态可能会在 1~7 天后更新)。

Item presented to import customs

这是包裹到达目的地国家后检验的第一步”进入当地入关程序”。 每个国家和地区在海关法律方面各有差异,出现此状态即表示正在进行海关检验,可能会通过您提供的电话号码与您联系,请留意是否有相关人员来电确认相关事项。
*海关检验过程可能会出现延迟,由于我们无法干涉海关的检验过程,只能稍等片刻。本网站并不会收取任何关税,但海关有可能依照包裹内商品与您收取关税。

Item returned from import customs

包裹已经成功离开海关检验,正前往离您最近的配送营业点并进行配送。如果包裹状态是 Departure from inward office of exchange,表示包裹已从当地的邮政总局发出去。如果包裹状态变更为 Retention(保管中),表示已尝试配送但收件人不在,请留意有没有收到领取单,或者与当地邮局联系再次发送。
日语的“国际交换局から発送”表示包裹已抵达邮政总局,并由邮政总局发出到您的住所附近的邮局。

Final delivery

日語是お届け済み,表明你已经成功收到包裹了。

若本人尚未签收包裹但已显示配送完成,请先不需要惊慌。
请先询问您的家人或是管理室是否有代为签收确定是不是联系电话填错,及时联系快递小哥或者最后配送的物流驿站。

JMeter在MacOS上安装

前言

Apache JMeter 是 Apache 组织开发的基于 Java 的压力测试工具。用于对软件做压力测试,它最初被设计用于 Web 应用测试,但后来扩展到其他测试领域。

下载

本文选用 JMeter 5.4.1 版本安装,注意需要 JDK 1.8 + 版本环境。
输入以下命令可用于检查本机是否准备就绪

1
2
java -version # 检查JDK版本
/usr/libexec/java_home -V # 列出所有JDK版本的JAVA_HOME

Jmeter 5.3 下载

配置环境变量

解压下载的文件,放在合适的目录,然后开始配置  bash_profile  文件。
如执行 open ~/.bash_profile 反馈 .bash_profile does not exist. 需考虑 vim .bash_profile 此文件。
添加如下:

1
2
3
4
export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home
export JAVA_HOME=$JAVA_8_HOME
export JMETER_HOME=/Users/user/Documents/apache-jmeter-5.4.1
export PATH=$PATH:$JMETER_HOME/bin:

成功后执行 source ~/.bash_profile 然后控制台直接执行 jmeter 即可启动

开始使用 Jmeter

一、本地化

使用前可以在 Jmeter 的根目录下的 bin 文件夹配置 jmeter.properties 文件进行切换中文,重启生效。
或者启动后,点击 Option - Chose Language - Chinese 切换中文即可

二、简单使用

创建线程组 - 设置线程组 - 创建 HTTP 请求 - 配置 HTTP 请求 - 添加运行结果分析监听器 - 聚合报告 - 汇出图形结果即可。

转载:https://blog.csdn.net/Liu_KH/article/details/88820334

CentOS8定时任务计划crontab

crontab 任务计划用于周期性执行程序。

查看 crontab 服务

1
systemctl status crond

任务计划格式

1
2
*(分)*(时)*(日)*(月)*(周)  周期执行的程序
#最长是每年,最短是每分

查看 cron 任务计划

1
crontab -l

编辑 cron 任务计划

1
crontab -e

删除所有 cron 任务计划

1
crontab -r

解析 CRON 表达式

crontab 执行时间计算

定时任务计划crontab

何为 crontab

crontab 是用来定期执行程序的命令,当安装完成操作系统后,默认便会启动此任务调度命令,crond 命令每分钟会定期检查是否要执行。

查看 crontab 服务

systemctl status crond

任务计划格式

(分)(时)(日)(月)*(周) 周期执行的程序 #最长是每年,最短是每分

查看 cron 任务计划

crontab -l

编辑 cron 任务计划

crontab -e

删除所有 cron 任务计划

crontab -r

解析 CRON 表达式

crontab 执行时间计算

使用Vue嵌Cordova开发总结

1. build 下无法调用 cordova

需要监听 deviceready 事件完成后再加载 vue 页面:

2. dev 下无法调用 cordova

注意 cordova 下各 plugin 是否完全加载,正常 cordova_plugins.json 应该为 404

1
2
'/cordova_plugins.json': { target: 'http://127.0.0.1:' + PORT + '/mock',
changeOrigin: true }

unofficial API for xiami

千言万语

晚安 xiami.fm

直接食用

  1. 获取专辑相关信息

https://xplaylist.leanapp.cn/album/:id
id: 专辑的 StringId

  1. 获取歌单相关信息

https://xplaylist.leanapp.cn/collect/:id?page=&pageSize=
id: 歌单的 StringId
page: 页码
pageSize: 每页条目数

  1. 获取艺人的热门歌曲信息

https://xplaylist.leanapp.cn/artist/:id?page=&pageSize=
id: 艺人的 StringId
page: 页码
pageSize: 每页条目数

  1. 获取歌曲相关信息

https://xplaylist.leanapp.cn/song/:id/info
id: 歌曲 id

  1. 获取歌曲相关信息

https://xplaylist.leanapp.cn/songs/:ids/info
ids: 歌曲 id 列表,支持多个逗号分隔

  1. 获取歌曲音乐文件相关信息

https://xplaylist.leanapp.cn/song/:id
id: 歌曲 id

  1. 获取歌曲音乐文件相关信息

https://xplaylist.leanapp.cn/songs/:ids
ids: 歌曲 id 列表,支持多个逗号分隔

  1. 搜索

https://xplaylist.leanapp.cn/search?key=
key: 关键词

备注:

请勿商业用途。

vue中修改props传进来的值浅析

众所周知,vue 是单向数据流,一般我们也不会在子组件里面修改父组件传进来的值,但总有需要修改的时候。不过值得注意的是,vue 官方不推荐直接在子组件中修改父组件传来的 props 的值。

[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop’s value. Prop being mutated: “result” (found in component )

在子组件修改 props 的方法:

1.子组件 data 中拷贝一份,注意引用类型需要深拷贝,根据需求可以 watch 监听

1
2
data() { return { newList: this.list.slice() } }, watch: { list(newVal) {
this.newList = newVal } }

2.通过计算属性修改

1
2
computed: { nList() { return this.list.filter(item => { return item.isChecked })
} }

3.sync 修饰符

1
2
3
4
// 父组件
<todo-list :list.sync="list" />

// 子组件 methodName(index) { this.$emit('update:list', this.newList) }

npm start 持久化运行

  • 直接键入 which nohup

复制这个地址,默认是 /usr/bin/nohup

  • 编辑用户环境变量 vi ~/.bash_profile

于 PATH=$PATH:$HOME/bin
后面添加
PATH=$PATH:$HOME/bin:/usr/bin/nohup

  • 加载环境变量:source ~/.bash_profile

  • 执行启动命令:nohup npm start &

执行成功会看到进程 PID 提醒

[1] 17073
nohup: 忽略输入并把输出追加到”nohup.out”

原程序的的标准输出被自动改向到当前目录下的 nohup.out 文件,起到了 log 的作用

  • 停止进程:
1
2
3
ps -ef | grep npm
ps -ef | grep node
kill -9 17073

Discuz!报错问题汇总

1、解决 X3.2 全局 HTTPS 问题思路

购买 SSL 证书

购买适合自己论坛的 SSL 证书,证书大致上分为标准型 DV SSL 证书、企业型 OV SSL 证书以及增强型 EV SSL 证书。

在服务端 WEB 服务器配置

参考文档:点击具体查看各种 WEB 服务器配置

在后台配置全局 HTTPS

进入 admin.php 后台,点击全局 - 站点信息 - 网站 URL 填写 https://yourdomain.com/admin.php

修成 Discuz 适配 https

如果你的 Web 服务是 Apache,请忽略这一步,Nginx 请继续看
Discuz 判断网站是否启动 SSL 是采用 $_SERVER[‘HTTPS’] 的方式,此方法不支持 Nginx(nginx+php-fpm),需要先做一些修改,让 Discuz 使用 $_SERVER[‘SERVER_PORT’]来判断网站是否启用 SSL
进入安装 DIscuz 根目录右键修改 public_html/source/class/discuz/discuz_application.php

1
$_G['isHTTPS'] = ($_SERVER['HTTPS'] && strtolower($_SERVER['HTTPS']) != 'off') ? true : false;

修改为:

1
$_G['isHTTPS'] = ($_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTPS'] && strtolower($_SERVER['HTTPS']) != 'off') ? true : false;

进入安装 DIscuz 根目录继续修改 public_html/uc_server/avatar.php

1
define('UC_API', strtolower(($_SERVER['HTTPS'] == 'on' ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/'))));

修改为:

1
define('UC_API', strtolower(($_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTPS'] == 'on' ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/'))));

后台 Ucenter 通信使用 https 方式

若不更改亦可以,这一步可以忽略
进入 admin.php 后台,点击站长 - UCenter 设置 - UCenter 访问地址将 http 改为 https 其后将头像调用方式改为使用静态地址调用头像。

后台 Ucenter 无法通信

审查元素,观察 return error 然后去官方找到相应的解决方法。

修成 Discuz 文章 https

进入安装 DIscuz 根目录继续修改 public_html/source/function/function_core.php
$content = output_replace($content);代码下方处添加
$content = str_replace('http://www.xxx.com','https://www.xxx.com',$content);
如果你有二级目录请这样添加
$content = preg_replace('http://(.*?)xxx.com','https://\1xxx.com',$content);


2、X3.2 升级至最新 X3.4 总结

准备前置条件:

DiscuzX 程序版本:Discuz! X3.2 Release 20141225 DiscuzX
后台版本:UCenter 1.6.0 DiscuzX
最新版本下载地址:https://gitee.com/3dming/DiscuzL/attach_files

操作步骤:

1)备份数据库,导出转储 SQL 文件结构和数据;
2)备份服务端网站目录;
3)创建 old 新文件夹,除了 data , config , uc_client , uc_server 目录以外的文件夹均移动进入 old 新文件夹内,注意 old 文件夹为小写字母;
4)通过 ftp 上传最新的服务端文件,注意分清下载的最新版本编码对应服务器正在使用的编码;
5)关闭站点,关闭服务端 web 服务;
6)将上传完毕解压后的 upload 文件夹内所有文件复制并替换服务端网站目录。
7)上传 utility 目录中的 update.php 文件到 install 目录中,删除 install.php 文件,并确保 install/data 中的 sql 文件完整。
8)执行 https://yourwebsite/install/update.php 按步骤完成升级。
最后尝试访问网站是否有异常,使用管理员登录站点后台,更新缓存。步骤为:后台=>工具=>更新缓存,完成升级。

升级过程中遇到的问题:

1.如果选择“是”您的站点将恢复站点默认风格,则你原网站风格、SEO 和 logo 全部还原为原始模版风格,注意升级选择。

2.在升级后无法登录后台
先确定你的账号在数据库内是否为管理员或者被清空,如无问题再找到根目录下的 uc_server/model 目录里的 admin.php 文件,并搜索代码 $this->cookie_status = 0; 修改为 $this->cookie_status = isset($_COOKIE['sid']) ? 1 : 0; 即可。

3.在升级时候遇到错误 【SELECT skey FROM common_setting WHERE skey=’strongpw’ LIMIT 1】
遇到 SQL 问题可以尝试 SQL 语句执行一下,很明显可以确定到 1146 问题,没有该表。尝试 creat common_setting 表即可,遇到这个问题的,后续也可能会遇到 common_syscache 表缺少 和 common_member 缺失 realname 字段,这里建议核对一下。这里我创建字段时候,选择 varchar(25)

4.在升级的时候遇到错误【请手工执行以下升级语句 XXX】
遇到又是 SQL 问题,先确定是否 SQL 语句执行正常。然后判断逻辑,这里 update.php 其实是官方升级程序,通过改表的方式升级的一个 bug.多年未改,只干了改表的事和新建表的事,改完表后,原来不存在了,但程序里却在对该表进行查询操作,所以会报“表不存在”的错误,导致升级程序终止,不能继续升级。
解决方法,即注释 if(!empty($oldcols[$key]))... ADO PRIMARY KEY ... 代码,刷新页面重新升级即可。

5.第一个步骤提示验证失败,无法进行升级
跳过第一个升级步骤,直接访问 https://yourwebsite/install/update.php?step=prepare 即可。 6.升级后发现许多地方乱码了
请核对字符编码为 UTF-8 简繁 还是 GBK


3、Discuz 开启 Redis

Windows 系统操作

参考 CentOS 操作步骤

CentOS 系统操作

1.查看 php 版本

1
2
3
[root@VM_0_2_centos ~]# php -v
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/redis.so' - /usr/lib64/php/modules/redis.so: undefined symbol: igbinary_unserialize in Unknown on line 0 PHP 5.6.40 (cli) (built: Jan 12 2019 09:19:57) Copyright (c) 1997-2016 The PHP Group Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
[root@VM_0_2_centos ~]#

2. 查看 php-redis 扩展包全名

yum list | grep php56w*
如果是其它版本就将修改“56”修改为其正确本版

3. 通过 yum 安装 redis 扩展

yum -y install php56w-pecl-redis.x86_64

4. 重启 httpd 服务

service httpd restart

5. Discuz 需要编译 Config/config_global.php 配置才可以开启,默认是不打开的。

$_config['memory']['redis']['server'] = '127.0.0.1';


4、Discuz 迁移数据至 Flarum

参考以下方法
https://github.com/KeKe12030/DiscuzToFlarum > https://github.com/branchzero/discuz-flarum-adapter > https://github.com/samyex6/discuz-flarum-migration


5、Discuz 迁移数据至 XenForo

DZ 和 XF 均是 BB 代码,存在可迁移可能性

于Nuxt中使用Vuex

1、何为 Vuex

Vuex  是一个专为  Vue.js  应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
但是在 Nuxt.js  内置引用了  vuex  模块,所以不需要额外安装。
Nuxt.js  会尝试找到应用根目录下的  store  目录,无需配置 nuxt.config.js,如果该目录存在,它将做以下的事情:
引用  vuex  模块 将  vuex  模块 加到  vendors  构建配置中去 设置  Vue  根实例的  store  配置项

2、引用 Vuex

Nuxt.js  支持两种使用  store  的方式,你可以择一使用:
普通方式: store/index.js  返回一个  Vuex.Store  实例 模块方式: store  目录下的每个  .js  文件会被转换成为状态树指定命名的子模块 (当然,index  是根模块)

2.1 普通方式

使用普通方式的状态树,需要添加  store/index.js  文件,并对外暴露一个  Vuex.Store  实例:

1
2
3
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = ()
=> new Vuex.Store({ state: { count: 1 }, mutations: { add(state) { state.count
++; } } }) export default store;

在组件中就可以直接调用:<span>{{$store.state.count}}</span><button ``[@click](https://github.com/click)``="$store.commit('add')">+1</button>

2.2 模块方式

状态树还可以拆分成为模块,store  目录下的每个  .js  文件会被转换成为状态树指定命名的子模块
使用状态树模块化的方式,store/index.js  不需要返回  Vuex.Store  实例,而应该直接将  state、mutations  和  actions  暴露出来:

1
2
export const state = () => ({ scount: 0 }) export const mutations = {
addScount(state) { state.scount += 2 } } // 模块模式状态树

在页面组件调用:
<span>{{$store.state.index2.scount}}</span> <button @click="$store.commit('index2/addScount')">+2</button>

3、规范案例

在 Nuxt 项目的 store 目录下新建一个 index.js 文件作为主入口,这样项目就启用了 vuex

1
2
3
4
import Vue from 'vue'; import Vuex from 'vuex'; import counter_add from
'./counter_add'; import filter from './filter'; Vue.use(Vuex); const store = ()
=> new Vuex.Store({ state: {}, mutations: {}, modules: { counter_add, filter }
}) export default store

其他的业务代码分模块来写,在 store 文件夹里再新建一个 filter.js 文件,在 index.js 中引入一下。

1
2
3
4
5
const state = ({ value: 'Hello World', list: [1, 2, 3, 4, 5] }); const getters =
{ include: (state) => (val) => { return state.list.indexOf(val) > -1; } } ;
const mutations = { SET_VALUE(state, value) { state.value = value; } }; const
actions = { async getInfo({state, commit}, val) { commit('SET_VALUE', val); } };
export default { namespaced: true, state, getters, actions, mutations };

这个文件中输出时候的 namespaced 属性,如果为 true 时,使用这个文件的方法时,需要标注 namespace,不写或为 false 时,则可以直接使用,这里建议使用 namespaced,因为大型项目可能有很多复杂的业务,可能命名冲突,使用 namespaced 可以把方法区分开,避免很多问题

现在,我们在 vue 文件中使用 vuex

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<template>
<section class="p-10">
<h1>{{ value }}</h1>
<h1>{{ result }}</h1>
<el-button type="danger" @click="change">点击</el-button>
</section>
</template>
<script>
import { mapState, mapMutations, mapActions, mapGetters } from "vuex";
export default {
data() {
return {
result: false,
};
},
computed: {
...mapGetters("filter", ["include"]),
...mapState({
value: (state) => state.filter.value,
}),
},
methods: {
...mapMutations("filter", ["SET_VALUE"]),
...mapActions("filter", ["getInfo"]),
change() {
this.result = this.include(1);
this.getInfo("你好");
this.SET_VALUE("HELLO");
},
},
mounted() {},
beforeDestroy() {},
};
</script>

在 vue 文件中,首先通过 import { mapState, mapMutations, mapActions, mapGetters } from ‘vuex’ 来引入我们需要的模块,按需引用,只需要引入本页面用到的模块即可
mapGetters 和 mapState 需要在页面的计算属性 computed 中引入, mapMutations 和 mapActions 需要在 methods 中引入,此时要注意模块的命名空间,如果 vuex 文件导出时标注了 namespaced,我们使用时也需要写出才可以找到,反之则不需要
首先是 mapState,使用 mapState 时,我有两种方法来取,两种方式都可以,这个方法是从 store 中取出这个变量,然后显示在此页面上,store 变动的话,此页面也会跟着动态改变
1.1 实例

1
...mapState({ value: state => state.filter.value })

1.2 实例

1
...mapState('filter', { value: state => state.value })

MapMutation 是更改 store 中状态的唯一方法,Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数
mapAction 类似于 mutation, 但是 Action 提交的是 mutation,而不是直接变更状态,Action 可以包含任意异步操作,我们一般把异步获取数据的方法都放在这里,然后在回调函数里使用 mutation 里的方法把异步获取的数据保存在 store 里,然后把 store 里的数据传到页面

4、使用 QS 库

axios 默认的 content-type 是 application/json  也就是 java 后端经常让你把参数放在 body 中的那种格式 传输的样式是  requestbody

1
{ name:xxx, age:xxx }

如果使用的 qs 进行序列化
那么 content-type 就是 application/x-www-form-urlencoded
也就是常说的表单提交
传输的样式是  formdata

1
name:xxx, age:xxx

总结,实际上 urlencoding 后是  name=xxx&age=xxx
ajax 请求的 get 请求是通过 URL 传参的(以?和&符连接),而 post 大多是通过 json 传参的。 qs 是一个库。里面的 stringify 方法可以将一个 json 对象直接转为(以?和&符连接的形式)。

5、FAQ

Q:Cannot assign to read only property ‘exports’ of object

请检查您的项目是否存在  module.exports = xyz  表达,因为 webpack 2 中不允许混用 import 和 module.exports