Forest


  • 首页

  • 分类

  • 关于

  • 归档

小程序插入使用html代码

发表于 2018-08-13 | 分类于 小程序

一、使用组件 web-view:(这种方法只能插入完整网页)

####

1
2
<web-view src="{{linkUrl}}"></web-view>

二、使用官方组件 rich-text:

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
官方链接:
https://developers.weixin.qq.com/miniprogram/dev/component/rich-text.html
<!-- rich-text.wxml -->
<rich-text nodes="{{nodes}}" bindtap="tap"></rich-text>
// rich-text.js
Page({
data: {
nodes: [{
name: 'div',
attrs: {
class: 'div_class',
style: 'line-height: 60px; color: red;'
},
children: [{
type: 'text',
text: 'Hello&nbsp;World!'
}]
}]
},
tap() {
console.log('tap')
}
})
使用太繁杂,建议使用方法三

三、使用 wxParse

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
wxParse使用详解链接:https://blog.csdn.net/zhuming3834/article/details/74280038/
wxParse下载链接: https://github.com/icindy/wxParse
使用这个方法,不管下文中的 article 是正常 html 代码,还是 html 转译字符串,都可直接使用。
建议使用该方法,最终解析出来的node为方法二
{
"node": "article",
"nodes": [
{
"node": "element",
"tag": "div",
"index": "0",
"tagType": "block",
"styleStr": "text-align:center;",
"attr": {
"style": "text-align:center;"
},
"nodes": [
{
"node": "text",
"text": "《静夜思》· 李白",
"textArray": [
{
"node": "text",
"text": "《静夜思》· 李白"
}
],
"index": "0.0"
},
{
"node": "element",
"tag": "br",
"index": "0.1",
"tagType": "block"
},
{
"node": "text",
"text": "床前明月光,",
"textArray": [
{
"node": "text",
"text": "床前明月光,"
}
],
"index": "0.2"
},
{
"node": "element",
"tag": "br",
"index": "0.3",
"tagType": "block"
},
{
"node": "text",
"text": "疑是地上霜。",
"textArray": [
{
"node": "text",
"text": "疑是地上霜。"
}
],
"index": "0.4"
},
{
"node": "element",
"tag": "br",
"index": "0.5",
"tagType": "block"
},
{
"node": "text",
"text": "举头望明月,",
"textArray": [
{
"node": "text",
"text": "举头望明月,"
}
],
"index": "0.6"
},
{
"node": "element",
"tag": "br",
"index": "0.7",
"tagType": "block"
},
{
"node": "text",
"text": "低头思故乡。",
"textArray": [
{
"node": "text",
"text": "低头思故乡。"
}
],
"index": "0.8"
},
{
"node": "element",
"tag": "br",
"index": "0.9",
"tagType": "block"
},
{
"node": "element",
"tag": "img",
"index": "0.10",
"tagType": "inline",
"attr": {
"src": "http://www.xiexingcun.com/Poetry/6/images/53e.jpg",
"alt": ""
},
"imgIndex": 0,
"from": "article"
},
{
"node": "element",
"tag": "br",
"index": "0.11",
"tagType": "block"
},
{
"node": "element",
"tag": "img",
"index": "0.12",
"tagType": "inline",
"attr": {
"src": "http://www.xiexingcun.com/Poetry/6/images/53.jpg",
"alt": ""
},
"imgIndex": 1,
"from": "article"
},
{
"node": "element",
"tag": "br",
"index": "0.13",
"tagType": "block"
},
{
"node": "element",
"tag": "br",
"index": "0.14",
"tagType": "block"
},
{
"node": "element",
"tag": "img",
"index": "0.15",
"tagType": "inline",
"attr": {
"src": "http://www.xiexingcun.com/Poetry/6/images/53b.jpg",
"alt": ""
},
"imgIndex": 2,
"from": "article"
},
{
"node": "element",
"tag": "br",
"index": "0.16",
"tagType": "block"
}
]
}
],
"images": [
{
"node": "element",
"tag": "img",
"index": "0.10",
"tagType": "inline",
"attr": {
"src": "http://www.xiexingcun.com/Poetry/6/images/53e.jpg",
"alt": ""
},
"imgIndex": 0,
"from": "article"
},
{
"node": "element",
"tag": "img",
"index": "0.12",
"tagType": "inline",
"attr": {
"src": "http://www.xiexingcun.com/Poetry/6/images/53.jpg",
"alt": ""
},
"imgIndex": 1,
"from": "article"
},
{
"node": "element",
"tag": "img",
"index": "0.15",
"tagType": "inline",
"attr": {
"src": "http://www.xiexingcun.com/Poetry/6/images/53b.jpg",
"alt": ""
},
"imgIndex": 2,
"from": "article"
}
],
"imageUrls": [
"http://www.xiexingcun.com/Poetry/6/images/53e.jpg",
"http://www.xiexingcun.com/Poetry/6/images/53.jpg",
"http://www.xiexingcun.com/Poetry/6/images/53b.jpg"
]
}

小程序swiper轮播图,自定义样式,两种方法:原生方法和bindchange方法

发表于 2018-08-13 | 分类于 小程序

一、通过原生方法

1、wxml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!-- 轮播图 -->
<view class='swiperBar'>
<swiper duration="1000" indicator-dots="{{true}}" indicator-color="" interval="2000" current="0" indicator-color="#999" indicator-active-color="#ff8a00" autoplay="{{true}}">
<block>
<swiper-item>
<image src="http://demo.sc.chinaz.com/Files/DownLoad/webjs1/201801/jiaoben5647/img/5.jpg" />
</swiper-item>
<swiper-item>
<image src="http://demo.sc.chinaz.com/Files/DownLoad/webjs1/201801/jiaoben5647/img/1.jpg" />
</swiper-item>
<swiper-item>
<image src="http://demo.sc.chinaz.com/Files/DownLoad/webjs1/201801/jiaoben5647/img/2.jpg" />
</swiper-item>
</block>
</swiper>
</view>

2、wxss

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/* 轮播图部分 */
.swiperBar {
width: 690rpx;
height: 337rpx;
margin: 0 auto;
position: relative;
}
.swiperBar swiper {
width: 100%;
height: 337rpx;
}
.swiperBar image {
width: 690rpx;
height: 310rpx;
-webkit-border-radius: 12rpx;
-moz-border-radius: 12rpx;
border-radius: 12rpx;
-webkit-box-shadow: 0 0 16rpx rgba(0, 0, 0, 0.25);
-moz-box-shadow: 0 0 16rpx rgba(0, 0, 0, 0.25);
box-shadow: 0 0 16rpx rgba(0, 0, 0, 0.25);
}
/* 设置点点的层级 */
.swiperBar .wx-swiper-dots.wx-swiper-dots-horizontal {
position: absolute;
top: 328rpx;
z-index: 999;
}
/* 设置点点的样式 */
.swiperBar .wx-swiper-dot {
width: 8rpx;
display: inline-flex;
height: 8rpx;
margin-left: 12rpx;
justify-content: space-between;
}
.swiperBar .wx-swiper-dot::before {
content: '';
flex-grow: 1;
background: #999;
border-radius: 8rpx;
-webkit-border-radius: 8rpx;
-moz-border-radius: 8rxp;
}
/* 当前点点的样式 */
.swiperBar .wx-swiper-dot-active::before {
background: #ff8a00;
}
.swiperBar .wx-swiper-dot.wx-swiper-dot-active {
width: 18rpx;
}

二、bindchange方法

1、wxml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<view class="banner">
<swiper class="bannerswipers" autoplay="{{autoplay}}" current="{{currentSwiper}}" bindchange="swiperChange">
<block wx:for="{{imgs}}">
<swiper-item>
<image src="{{item.url}}"></image>
</swiper-item>
</block>
</swiper>
<!--重置小圆点的样式 -->
<view class="bannerdots flex alignC flexC">
<block wx:for="{{imgs}}">
<view class="bannerdot{{index == currentSwiper ? ' banneractive' : ''}}"></view>
</block>
</view>
</view>

2、wxss

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
.banner{
height: auto;
position: relative;
}
.bannerswipers{
width: 100%;
height: 350rpx;
}
.bannerswipers image{
width: 100%;
height: 100%;
display: block
}
/*用来包裹所有的小圆点 */
.bannerdots{
width: 750rpx;
height: 36rpx;
display: flex;
flex-direction: row;
position: absolute;
left:0;
bottom: 20rpx;
}
/*未选中时的小圆点样式 */
.bannerdot{
width: 16rpx;
height: 16rpx;
margin-right: 26rpx;
background-color: yellow;
border-radius: 16rpx;
}
/*选中以后的小圆点样式 */
.banneractive{
width: 32rpx;
height: 16rpx;
background-color: coral;
}
.flex {
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
display: box;
flex-wrap: wrap;
}
.alignC {
/*元素居中*/
align-items: center;
-webkit-box-align: center;
-webkit-align-items: center;
-moz-align-items: center;
-ms-align-items: center;
-o-align-items: center;
}
.flexC {
-webkit-box-pack: center;
justify-content: center;
-webkit-justify-content: center;
-moz-justify-content: center;
-ms-justify-content: center;
-o-justify-content: center;
}

3、js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Page({
data: {
imgs: [
{ url: 'http://demo.sc.chinaz.com/Files/DownLoad/webjs1/201801/jiaoben5647/img/5.jpg' },
{ url: 'http://demo.sc.chinaz.com/Files/DownLoad/webjs1/201801/jiaoben5647/img/1.jpg' },
{ url: 'http://demo.sc.chinaz.com/Files/DownLoad/webjs1/201801/jiaoben5647/img/2.jpg' }
],
currentSwiper: 0,
autoplay: true
},
swiperChange: function (e) {
this.setData({
currentSwiper: e.detail.current
})
}
})

微信小程序数据列表的收藏与取消收藏操作

发表于 2018-08-10 | 分类于 小程序

一、wxml

1
用户收藏商品的状态改变与否

二、wxml

1
2
3
4
<view class="everyli" wx:for="{{hotProjectList}}" wx:key="*this">
<i data-id='{{item.id}}' data-kky='{{index}}' data-is_collect='{{item.is_collect}}'
class="iconfont {{item.is_collect == 1?'icon-shoucang_tianchong':'icon-shoucang'}} " bindtap='pcollect'></i>
</view>

js代码

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
35
36
37
38
39
data: {
hotProjectList: [],
},
pcollect: function(e) {
var kky = e.target.dataset.kky
var that = this
var isCollect = e.target.dataset.is_collect
var isCollect = (isCollect == 1) ? 0 : 1
wx.request({
url: 'xxxxxx',
data: {
id: e.target.dataset.id,
is_collect: isCollect,
}
success: function(res) {
if (res.data.code == 1) {
that.setData({
['hotProjectList[' + kky + '].is_collect']: isCollect,
})
var text = '收藏成功';
if (isCollect == 0) {
text = '取消收藏成功';
}
wx.showToast({
title: text,
icon: 'success',
duration: 2000
});
} else {
console.log('接口报错', res)
}
}
})
},

三、分析

1
2
3
核心点:class="iconfont {{item.is_collect == 1?'icon-shoucang_tianchong':'icon-shoucang'}} "
模板文件中使用三元运算符,通过下标主键指定当前item的key

php如何获取ip地址

发表于 2018-08-10 | 分类于 Php

一、如果没有使用代理服务器

1
2
3
4
5
6
REMOTE_ADDR = 客户端IP HTTP_X_FORWARDED_FOR = 没数值或不显示
<?php
$ip = $_SERVER['REMOTE_ADDR'];
echo $ip;

二、使用透明代理

1
2
3
4
5
6
7
8
9
10
11
REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_X_FORWARDED_FOR = 客户端真实 IP (经过多个代理服务器时,这个值类似:221.5.252.160, 203.98.182.13, 203.129.72.25)
这类代理还会将客户真实ip发送到请求对象,无法隐藏真实ip。
<?php
 $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
echo $ip;

三、使用普通匿名代理服务器

1
2
3
4
5
REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_X_FORWARDED_FOR = 代理服务器 IP (经过多个代理服务器时,这个值类似:203.98.182.163, 203.98.182.13, 203.129.72.25)
这样就隐藏了客户端的真实ip,但服务器会知道客户端是通过代理服务器去访问的。

四、使用欺骗性代理服务器

1
2
3
4
5
EMOTE_ADDR = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 随机的 IP(经过多个代理服务器时,这个值类似:220.4.251.159, 203.98.182.13, 203.129.72.25)
服务器可以识别到时通过代理服务器访问的,但发送给目标服务器的是虚假ip。

五、使用高匿名代理

1
2
3
REMOTE_ADDR = 代理服务器 IP HTTP_X_FORWARDED_FOR = 没数值或不显示
使用这种代理时,不同浏览器不同设备会返回不同的ip头信息,因此PHP使用$_SERVER["REMOTE_ADDR"] 、$_SERVER["HTTP_X_FORWARDED_FOR"] 获取的值可能是空值也可能是“unknown”值。

六、PHP获取ip代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 获取客户端IP地址
* @return mixed
*/
function getClientIp()
{
$ip = "";
if (getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
$ip = getenv('HTTP_CLIENT_IP');
} elseif (getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
$ip = getenv('HTTP_X_FORWARDED_FOR');
} elseif (getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
$ip = getenv('REMOTE_ADDR');
} elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}

获取地理位置信息的接口

发表于 2018-08-10 | 分类于 Php

一、通过ip获取地理位置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
淘宝接口 -- http://ip.taobao.com/service/getIpInfo.php?ip=$ip (8-17已无法访问)
新浪接口 -- http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=$ip (已无法访问)
qq接口 -- http://ip.qq.com/cgi-bin/searchip?searchip1=$ip (已无法访问)
百度地图ip定位 -- https://api.map.baidu.com/location/ip?ak=yourkey&ip='.$ip 每天调用上限100w
高德地图ip定位 -- https://restapi.amap.com/v3/ip?parameters (详细文档:https://lbs.amap.com/api/webservice/guide/api/ipconfig/) 每天调用上限10w
收费接口 -- ip138.cn
php如何获取ip地址,见下一篇文章《php如何获取ip地址》

二、通过经纬度获取地理位置信息

1
2
3
4
5
6
1、google -- http://maps.google.cn/maps/api/geocode/json?latlng=22.6545715201,108.4130859375&sensor=true
2、baidu -- http://api.map.baidu.com/geocoder?output=json&location=39.913542,116.379763&ak=esNPFDwwsXWtsQfw4NMNmur1
3、微信小程序版百度 -- http://lbsyun.baidu.com/index.php?title=wxjsapi/guide/getlocation

三、总结

1
2
3
一、获取地理位置信息有时耗时比较大,最好不要用在主进程,如果时效性要求不高,建议异步获取。
二、这些接口并不稳定,指不定什么时候就不能访问了,建议规划好备用方案

修改mysql数据库的密码

发表于 2018-06-25 | 分类于 Sql

一、用SET PASSWORD命令

1
2
3
4
5
首先登录MySQL
格式:mysql> set password for 用户名@localhost = password('新密码');
例子:mysql> set password for root@localhost = password('123');

二、用mysqladmin

1
2
3
格式:mysqladmin -u用户名 -p旧密码 password 新密码
例子:mysqladmin -uroot -p123456 password 123

三、用UPDATE直接编辑user表

1
2
3
4
5
6
7
8
首先登录MySQL。
mysql> use mysql;
mysql> update user set password=password('123') where user='root' and host='localhost';
mysql> flush privileges;

五、忘记root密码

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
1.修改MySQL的登录设置:
在[mysqld]的段中加上一句:skip-grant-tables
vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
skip-grant-tables
2. 重启服务
service mysql restart
3. 修改 root 密码
mysql -u root -p
mysql> USE mysql;
mysql> UPDATE user SET Password = password('123456') WHERE User = 'root';
mysql> flush privileges;
mysql> quit;
4. 删除刚刚新增加的 skip-grant-tables
vi /etc/my.cnf
5. 重启服务
service mysql restart
mysql -u root -p
SET PASSWORD = PASSWORD('whatyoulike');

php通过SoapClient调用webservice接口以及注意项

发表于 2018-06-21 | 分类于 Php

一、安装soap扩展

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1、Linux下安装soap模块
查看soap模块是否安装的办法:在php的安装目录下运行php -m来查看
$phppath/bin/php -m | grep soap
如果没有安装,则进入php的安装源文件夹
cd php-$version/ext/soap
// 进入文件夹后执行
$phppath/bin/phpize
然后安装编译
make & make install
安装好之后会提示soap.so文件的保存路径
接着修改php.ini文件
;extension=soap.so
去掉前面的;
重启apache或者php-fpm
service httpd restart 或者 /etc/init.d/php-fpm restart

二、客户端调用示例代码

1、无SoapHeader认证的情况

1
2
3
4
5
6
7
8
try{
$client = new SoapClient('http://www.whatever.com/WebService.asmx?wsdl');
$result = $client->toDo($paramArr);
$result = simplexml_load_string($result->toDoResult);
$state = $result->smsstate;
}catch (SoapFault $fault){}
echo $state;

2、有SoapHeader验证的情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$soap = new \SoapClient('http://www.whatever.com/WebService.asmx?wsdl');
/*
*SoapHeader参数说明如下所示:
*'http://tempuri.org/' namespace(命名空间可省略 根据服务端定)
*'MySoapHeader' SoapHeader头的类名
*'array(...)' 存放标识身份的字符串参数
*'true' 是否必须处理该header
*/
$head = new \SoapHeader(http://tempuri.org/', 'MySoapHeader', array('uname'=>'admin','pwd'=>'123456'), true);
//添加soapheader
$soap->__setSoapHeaders($head);
//调取需要的webservice方法
$res = $s->toDo(array('param'=>'val'));
echo $res->toDoResult;

三、参数值传输接收不到的情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
第一次传递的参数,在服务端接收参数正常,修改参数名后,给参数赋值,在服务端出现接收不到参数值的现象
调试1:安装soapui,发起调用 -> 调用正常 判断:排除服务器端问题
调试2:将参数值修改为固定字符串值,再发起调用 -> 依然接收不到 判断:排除参数赋值失效
调试3:改变参数位置,再发起调用 -> 依然接收不到 判断:排除参数位置影响
调试4:删除runtime缓存文件,再发起调用 -> 依然接收不到 判断:排除程序缓存文件影响
调试5:重启apache或php-fpm,再发起调用 -> 依然接收不到 判断:排除web服务器环境问题
调试6:本地wamp环境,发起调用 -> 接收正常 判断:soap环境差异问题导致,查找到是soap缓存的问题
修改代码
$soap = new \SoapClient('http://www.whatever.com/WebService.asmx?wsdl');
为
$soap = new \SoapClient('http://www.whatever.com/WebService.asmx?wsdl', array('cache_wsdl' => 0));
发起调用 -> 接收正常

五、总结

1
2
参数名接收到,但参数值接收不到,这很怪异,一开始没有怀疑缓存原因,归根到底是对soap的基础理解得不够深刻。使用排除法定位问题的
速度还是比较局限。透过现象去了解程序的本质,设计思想,对于分析、解决问题有很大的帮助

母亲

发表于 2018-06-13 | 分类于 随笔

在路上

        6月6日早上父亲的一通电话,平静的生活像打翻了调味瓶,震惊、慌乱、悲伤、惋惜、愤怒、不甘,一系列的情绪变化。
父亲的电话告知母亲确诊患宫颈癌,整个人都不好了,先去百度相关知识,不幸中的万幸宫颈癌还可以治。然后问朋友同学,景爷、阿东、震哥、韦大哥推荐的朱医生、妇幼的腾医生,感谢这些好心人的帮助。
        6月8日下午,和哥哥约好一起回家,下雨天气视野不好,不坐同一辆车,广州大雨堵城,汽车出广州城区花了4个小时,回到岑溪已经9点,在岑溪住一晚,明早等爸妈后一起去梧州。9号早上到梧州工人医院,将近12点轮到,得知工人医院没有放疗、化疗设备,桂东也是。建议去红会,去到红会12点多,红会已经进入下班时间。打电话给村里同患人介绍的医生,问能不能住院,她说周末不上班,顿时心里拔凉,感觉医院条件不好。6月11日再到红会,找到介绍的医生,在放疗科,医生说现在没有床位,要我们现在外面住,边做检查边等。幸亏当时没有答应,放疗的环境太差,人也不好。去挂门诊看,门诊说红会只有开刀,没有微创,建议去南宁、广州。如果决定在红会做,需要先做检查,然后预约床位,不一定什么时候有,在门诊做的检查不能报销医保(这就是社会)。
        母亲怕痛,上世纪80年代的计划生育,妈妈被迫人流,没有麻醉,做完手术后坐单车走几十公里山里回家,一路上颠簸和疼痛是她的噩梦。中午吃饭的时候讨论去哪治疗,广州南宁的花费一期承担得起,但现在房子压力以及后期化疗费用却承担不了,离家更近,综合考虑还是选择在红会。去网上查了资料,看了江布英医生的履历和论文事迹,想要请她帮忙,于是从下午1点20开始在13楼等她,她今天在上手术,不知道什么时候能下手术,但是确信一定能等到她。到下午4点多,终于等到她,没有寒暄,直入主题,最终还是收了入院,感谢江医生。
        入院前的检查需要量体温、量血压,因为刚刚从13楼走下1楼,第一次测量的血压有点高,护士让我们到旁边休息10分钟后,再过来测。休息期间,我感觉到母亲脚在颤动,她在担心焦虑,她害怕痛,她已经好几个晚上没有休息好了。看到她这个样子,我心里很不是滋味,愤怒过,问老天爷为什么要让如此善良的人患病,一辈子问心无愧如她,却患此病。不甘过,想去更好条件的医院,南宁、广州,低头看看自己,是如此的不自量力,给不了最好的,选择最合适的。母亲很年轻,在18岁的时候就生下了我,她这么年轻患病,惋惜,然而却无能为力。

        泰戈尔说,“你的负担将变成礼物,你受的苦将照亮你的路。”,悲观的人,只会让自己深陷于苦难的泥潭;乐观的人,会为自己照亮走出黑暗的方向。希望母亲快快好起来。

        这段期间,家里天空似乎有一朵乌云笼罩,压得喘不过气来,无能为力、焦虑、等待、语言上的无助让我难受。现在回到公司工作,睡觉偶然惊醒,梦里全是母亲的事情,想来首先想到的是这个事实,有些压抑。看《滚蛋吧,肿瘤君》,希望能学到一些道理和鸡汤帮助和宽慰妈妈,也宽慰自己。让自己不要过于担心,直面自己和生活。

        做最坏的准备,想最好的事情。感觉亏欠家里太多,儿子太自私,有些愧疚。想母亲康复后,带她去哪里玩,带她看看外面的世界,这也是我目前最想做的事情。愿顺

redis安全设置

发表于 2018-05-28 | 分类于 Linux

背景

Redis的安全设计是在”Redis运行在可信环境”这个前提下做出的,在生产环境运行时不能允许外界直接连接到Redis服务器上,而应该通过应用程序进行中转,运行在可信的环境中是保证Redis安全的最重要方法。

在洞悉漏洞官网中,有一个漏洞叫“Redis 未授权访问缺陷可轻易导致系统被黑”,链接https://www.seebug.org/vuldb/ssvid-89715。可见redis安全的重要性

1.为redis设置密码

在redis.conf中进行配置:

1
requirepass redispwd # redispwd即为redis的启动密码,在设置时,一定要选择复杂性高的密码

2.危险命令重命名或禁用

在redis.conf中进行配置:

1
2
rename-command CONFIG rename_config # 重命名CONFIG命令
rename-command SAVE "" # 禁用SAVE命令

3.配置bind选项, 限定可以连接Redis服务器的IP

在redis.conf中进行配置:

1
bind 127.0.0.1 # 限定只能本地访问

4.使用低权限用户启动redis

先停止redis,然后切换至低权限用户身份,su lowuser,执行启动

1
/path/redis/bin/redis-server /path/redis/etc/redis.conf

会出现 cannot create: Permission denied 报错,解决办法为赋予权限

1
chown -R lowgroup.lowuser /path/redis

5.修改redis默认端口号

redis默认端口号为6379,在redis.conf配置文件修改为其它端口号

1
port 63791

如果是云服务器,可以要在云服务器管理后台开启关闭对应redis的出网端口

使用redis实现呼叫中心消息队列

发表于 2017-11-06 | 分类于 Php

一、业务需求背景

1
2
3
4
5
6
7
一个房产项目有多个团队跟进,一个团队有多个销售。
当有客户进入的时候,程序自动分配由哪个团队中的哪个销售跟进次客户
团队在项目中可以设置不同的分配权重
销售在团队中可以设置不同的分配权重

二、队列生成机制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
建立数据库表
1、项目表 -- 项目信息管理
2、团队表 -- 团队信息管理
3、销售表 -- 销售信息管理
4、团队销售表 -- 团队销售关联关系表
5、项目团队表 -- 项目团队关联关系表
6、项目销售表 -- 项目销售关联关系表
项目关联团队时,生成项目团队队列。命名projectTeam_{$pid},
项目关联指定团队的销售时,生成项目团队队列。命名projectSeller_{$teamId}_{$pid}
使用redis的list数据类型,lpush存储队列数据
A权重为1,B权重为2,C权重为2。生成队列内容则为[A,B,B,C,C];

三、消费队列机制

1
2
3
4
5
6
7
8
9
当客户来访时,调用分配程序,首先找到当前分配序列的团队(右进左出规则)projectTeam_{$pid},使用redis的LPOP key ,
移出并获取列表的第一个元素,尔后使用RPUSH key value1 在列表最后添加刚刚移出的元素
找到当前序列团队后,找当前序列团队的序列销售projectSeller_{$teamId}_{$pid},同样使用redis的LPOP key ,
移出并获取列表的第一个元素,尔后使用RPUSH key value1 在列表最后添加刚刚移出的元素
消费消息队列业务结束

四、队列状态查询以及队列消费日志监控

1
2
3
4
5
6
7
在linux下查看redis数据,可以使用phpRedisAdmin,但是监控消息记录,则需要自行添加日志表,结合自身业务,记录程序执行日志
-- 消费队列程序流程日志表
-- 生成队列程序日志表
-- 当前消息队列 phpRedisAdmin

五、MySQL和Redis 数据同步

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
由于redis数据存在内存中,虽然缓存数据可以持久化,没有缓存时间限制。但是万一断电关机,数据将很难恢复,以此需要将redis中的数据实时备份,网上百度,可以得到很多方案
由于数据量不大,更新不频繁的数据,所以我们采取
方案一
读: 读redis->没有,读mysql->把mysql数据写回redis
写: 写mysql->成功,写redis
就是读的话,先读Redis,Redis没有再读数据库,将数据库中的数据放入Redis
写(增删改),先写数据库,然后写Redis
方案二
使用linux的定时任务crontab,每分钟执行一次同步脚本
123
sir051223

sir051223

28 日志
7 分类
© 2019 sir051223