月度归档:2020年12月

MYSQL避免重复插入记录的三种方法

方案一:使用ignore关键字

如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用:

insert ignore into table_name(email,phone,user_id) values('test9@163.com','99999','9999'),

这样当有重复记录就会忽略,执行后返回数字0,还有个应用就是复制表,避免重复记录:

insert ignore into table(name)  select  name from table2

方案二:使用Replace

replace的语法格式为:

  1. replace into table_name(col_name, …) values(…)
  2. replace into table_name(col_name, …) select …
  3. replace into table_name set col_name=value, …

算法说明:

REPLACE的运行与INSERT很相像,但是如果旧记录与新记录有相同的值,则在新记录被插入之前,旧记录被删除,即:

尝试把新行插入到表中 
当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时: 
从表中删除含有重复关键字值的冲突行 
再次尝试把新行插入到表中

旧记录与新记录有相同的值的判断标准就是:表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行。

返回值:

REPLACE语句会返回一个数,来指示受影响的行的数目。该数是被删除和被插入的行数的和。

受影响的行数可以容易地确定是否REPLACE只添加了一行,或者是否REPLACE也替换了其它行:检查该数是否为1(添加)或更大(替换)。

示例:

eg:(phone字段为唯一索引)

  1. replace into table_name(email,phone,user_id)
  2. values(‘test569′,’99999′,’123’)

另外:在 SQL Server 中可以这样处理:

  1. if not exists (select phone from t where phone= ‘1’)
  2. insert into t(phone, update_time) values(‘1’, getdate())
  3. else
  4. update t set update_time = getdate() where phone= ‘1’

更多信息请看:http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#replace

方案三:ON DUPLICATE KEY UPDATE

如‍上所写,你也可以在INSERT INTO.....后面加上 ON DUPLICATE KEY UPDATE方法来实现。

如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,

则执行旧行UPDATE。例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相

同的效果:

  1. mysql>INSERT INTO table (a,b,c) VALUES (1,2,3)
  2. ->ON DUPLICATE KEY UPDATE c=c+1;
  3. mysql>UPDATE table SET c=c+1 WHERE a=1;

如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2。

注释:如果列b也是唯一列,则INSERT与此UPDATE语句相当:

mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;

如果a=1 OR b=2与多个行向匹配,则只有一个行被更新。通常,您应该尽量避免对带有多个唯一关键字的表使用ON DUPLICATE KEY子句。

您可以在UPDATE子句中使用VALUES(col_name)函数从INSERT…UPDATE语句的INSERT部分引用列值。

换句话说,如果没有发生重复关键字冲突,则UPDATE子句中的VALUES(col_name)可以引用被插入的

col_name的值。本函数特别适用于多行插入。VALUES()函数只在INSERT…UPDATE语句中有意义,其它时候

会返回NULL。

  1. mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
  2.  
  3. -> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

本语句与以下两个语句作用相同:

  1. mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
  2. -> ON DUPLICATE KEY UPDATE c=3;
  3. mysql> INSERT INTO table (a,b,c) VALUES (4,5,6)
  4. -> ON DUPLICATE KEY UPDATE c=9;

当您使用ON DUPLICATE KEY UPDATE时,DELAYED选项被忽略。

示例: 这个例子是我在实际项目中用到的:是将一个表的数据导入到另外一个表中,数据的重复性就得考虑(如下)。 
唯一索引为:email

  1. INSERT INTO table_name1(title,first_name,last_name,email,phone,user_id,role_id,status,campaign_id)
  2.  
  3. SELECT ”,”,”,table_name2.email,table_name2.phone,
  4. NULL,NULL,’pending’,29
  5. FROM table_name2 WHERE table_name2.status = 1
  6. ON DUPLICATE KEY UPDATE table_name1.status = ‘pending’

语句的关键地方,都已高亮出来~

再贴一个例子:

  1. insert into class select * from class1
  2. ON DUPLICATE KEY UPDATE class.course = class1.course

其它关键:DELAYED 做为快速插入,并不是很关心失效性,提高插入性能。 
IGNORE 只关注主键对应记录是不存在,无则添加,有则忽略。

更多信息请看: http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#insert

特别说明:在MYSQL中UNIQUE 索引将会对null字段失效,也就是说(a字段上建立唯一索引):

  1. insert into test(a) values(null)
  2. insert into test(a) values(null)

是可以重复插入的(联合唯一索引也一样)。

原文:https://www.cnblogs.com/zhuyeshen/p/11643079.html

php vs js中判断一个字符串包含另一个字符串的方法

PHP

第一种方法:用php的strpos() 函数判断字符串中是否包含某字符串的方法

if(strpos('www.jb51.net','jb51') !== false){
echo '包含jb51';
}else{
echo '不包含jb51';
}

第二种 使用了explode

用explode进行判断PHP判断字符串的包含代码如下:

<?php 
$name = "001x.gif"; 
$pan = "x"; 
$con = explode($pan,$name); 
if (count($con)>1): 
echo $name."中包含".$pan; 
else: 
echo $name."中没有包含".$pan; 
endif; 
?> 

第三种strstr

strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。
该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。

代码如下:

<?php
  /*如手册上的举例*/
  $email = 'user@example.com';
  $domain = strstr($email, '@');
  echo $domain;
  // prints @example.com
?>

第四种、stristr

stristr() 函数查找字符串在另一个字符串中第一次出现的位置。
如果成功,则返回字符串的其余部分(从匹配点)。如果没有找到该字符串,则返回 false。

它和strstr的使用方法完全一样.唯一的区别是stristr不区分大小写.

JS

String对象的方法

方法一: indexOf()   (推荐)

var str = "123";
console.log(str.indexOf("3") != -1 );  // true
//indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。如果要检索的字符串值没有出现,则该方法返回 -1。

方法二: search() 

var str = "123";
console.log(str.search("3") != -1 );  // true
//search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。如果没有找到任何匹配的子串,则返回 -1。

方法三:match()

var str = "123";
var reg = RegExp(/3/);
if(str.match(reg)){
    // 包含        
}
//match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。

RegExp 对象方法

方法四:test() 

var str = "123";
var reg = RegExp(/3/);
console.log(reg.test(str)); // true
//test() 方法用于检索字符串中指定的值。返回 true 或 false。

方法五:exec()

var str = "123";
var reg = RegExp(/3/);
if(reg.exec(str)){
    // 包含        
}
//exec() 方法用于检索字符串中的正则表达式的匹配。返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。

原文:php-https://www.jb51.net/article/8632.htm

JS-https://www.cnblogs.com/rxbook/p/11820720.html

微信小程序弹窗提示怎么写

第一种:弹出提示框,可以选择确定或者取消。

代码:

wx.showModal({
 title: '提示',
 content: '这是一个模态弹窗',
 success: function (res) {
   if (res.confirm) {//这里是点击了确定以后
     console.log('用户点击确定')
   } else {//这里是点击了取消以后
     console.log('用户点击取消')
   }
 }
})

第二种:不带确定和取消的,直接提示成功

代码:

wx.showToast({
 title: '成功',
 icon: 'success',
 duration: 2000//持续的时间
})

第三种:提示等待中…

代码:

wx.showToast({
 title: '等待...',
 icon: 'loading',
 duration: 2000//持续的时间
})

第四种:提示文字,没有任何图标效果,但是文字可以写的很多。

代码:

wx.showToast({
 title: '这里面可以写很多的文字,比其他的弹窗都要多!',
 icon: 'none',
 duration: 2000//持续的时间
})

第五种:弹窗提示选择,例如选择ABCD那种

代码:

wx.showActionSheet({
 itemList: ['A', 'B', 'C'],
 success: function (res) {
   if (!res.cancel) {
     console.log(res.tapIndex)//这里是点击了那个按钮的下标
   }
 }
})


第六种:多用于页面提示加载

代码:

<loading hidden="{{hidden}}">
       加载中...
</loading>

hidden有两个值:false和true

原文:https://jingyan.baidu.com/article/456c463b38ca900a5831449a.html

linux系统中的i386/i686和x86_64有什么区别

Linux的的版本众多,包括服务器版本、桌面版本等,在下载安装镜像时候总会有i386/i686和x86_64这样的区别,带着疑问查了一下相关资料:

(1)参考一:http://blog.csdn.net/yandaqijian/article/details/41748759?locationNum=14点击打开链接

(2)参考二:http://blog.csdn.net/yandaqijian/article/details/41748599点击打开链接

总结来说:i386对应的是32位系统、而i686是i386的一个子集,i686仅对应P6及以上级别的CPU,i386则广泛适用于80386以上的各种CPU;x86_64主要是64位系统。

微信小程序页面停留时间统计

近来在研究微信小程用户是否在使用小程序或者查看用户在小程序停留的时间,无意中在git上找到了相关的解决问题方法,希望正在开发这个功能的的你,能帮助你解决!

但是好像有

收到一个需求,要统计一个用户在我们小程序的每个页面的停留时间。

看了下现成的API,除了这个好像也没有别的可以用:https://mp.weixin.qq.com/debug/wxadoc/dev/api/analysis-visit.html#访问趋势

这个里面貌似有页面停留时间的数据,

参数说明ref_date时间,如:”20170306-20170312″session_cnt打开次数(自然周内汇总)visit_pv访问次数(自然周内汇总)visit_uv访问人数(自然周内去重)visit_uv_new新用户数(自然周内去重)stay_time_uv人均停留时长 (浮点型,单位:秒)stay_time_session次均停留时长 (浮点型,单位:秒)visit_depth平均访问深度 (浮点型)

但是好像有查询时间限制,只能查询一天的数据。毕竟小程序数据很大,估计也是怕数据量太大查询慢吧。

算了,自己写一个吧,

初步想法,在页面的onShow事件里面,打一个开始的时间戳,然后在onHide里面再弄一个时间戳,两个一减,然后把得出来的数据,一提交,齐活。

BUT~,尼玛,onShowonHide不仅在页面切换的时候会触发,小程序切换到后台和回到前台,也会触发,这就有干扰了。

但是在app.js里面的onShowonHide事件只在小程序前后台切换的时候才会触发,不会在页面切换的时候触发,利用这点,把前后台切换排除掉,只在页面切换的时候,上报页面停留时间就好了

app.js里面,初始化以下三个状态,

globalData: { 
    firstIn:1,
    onShow: 0, 
    onHide: 0
}

onShowonHide的值默认为0,当小程序进入后台或者返回前台的时候,给这两个值变为1,用来告诉页面,刚才的切换是前后台切换,不是页面切换,不用上报页面停留时间。代码如下:

依旧是在app.js里面

onShow(){ 
    if(this.globalData.firstIn){
        this.globalData.firstIn = 0; 
    } else{ 
        this.globalData.onShow = 1; 
    } 
}, 
onHide(){ 
    this.globalData.onHide = 1; 
}

里面的firstIn表示是不是第一次进入小程,因为第一次进入的时候也会触发onShow(相当于从后台切换到前台了),要把这个也排除在外。默认是第一次进入,进入之后就把这个值置为0

OK,app.js准备好了,然后看下具体页面的,

在页面里面,先声明两个变量,一个startTime,一个endTime分别来存储用户进入页面的时间和离开的时间

var startTime,
      endTime,
      app = getApp();
Page({
    onShow(){
        setTimeout(function () {
            if (app.globalData.onShow) {
                app.globalData.onShow = 0;
                console.log("demo前后台切换之切到前台")
            }
            else {
                console.log("demo页面被切换显示")
                startTime = +new Date();
            }
        }, 100)
    },
    onHide(){
        setTimeout(function () {
            if (app.globalData.onHide) {
                app.globalData.onHide = 0;
                console.log("还在当前页面活动")
            }
            else {
                endTime = +new Date();
                console.log("demo页面停留时间:" + (endTime - startTime))
                var stayTime = endTime - startTime;
               //这里获取到页面停留时间stayTime,然后了可以上报了
            }
        }, 100)
    }
})

有几个页面要统计的,就把这几个页面都加一下。

嫌麻烦的话,可以修改一下Page方法,默认自带onShowonHide,然后如果外面有传入的话,可以合并。页面在使用的时候,直接用这个心的Page,就不用每个页面都onHideonShow了,这里就不上具体的代码了。

关于setTimeout的说明:

页面的onShowonHide会在app.jsonShowonHide之前执行,加个延迟,放到后面执行,这样每次都可以先检测是页面切换还是前后台切换,然后再去做对应的逻辑,不然就反了。

原文:https://developers.weixin.qq.com/community/develop/article/doc/000ac4169107e8e1a12b4ff6256813

参考地址:https://github.com/ireeoome/reeoome/issues/3

MySQL – SELECT LAST_INSERT_ID() 使用总结

目录

函数介绍

举个例子

官方文档

LAST_INSERT_ID()

 LAST_INSERT_ID(expr)


函数介绍

SELECT LAST_INSERT_ID() 即为获取最后插入的ID值

总体解释:将插入数据的主键返回到 object 对象中。
具体解释: 

  • SELECT LAST_INSERT_ID():得到刚 insert 进去记录的主键值,只适用与自增主键;
  • keyProperty:将查询到主键值设置到 parameterType 指定的对象的那个属性;
  • order:SELECT LAST_INSERT_ID() 执行顺序,相对于 insert 语句来说它的执行顺序,所以说 这个 selectKey 标签,放在前后都是可以的;
  • resultType:指定 SELECTLAST_INSERT_ID() 的结果类型;

举个例子

使用之前:

返回 的result 只有1,表示 add成功,但是从 temp 对象获取时,并没有数据。

使用之后:

不仅有result 等于1,而且 返回对象的 Id 可以获取到 为 31。

官方文档

此函数分为两种

LAST_INSERT_ID()

如果没有参数,则 LAST_INSERT_ID()返回一个 BIGINT UNSIGNED(64位)值,表示AUTO_INCREMENT由于最近执行的INSERT语句而成功为列添加 的第一个自动生成的值。LAST_INSERT_ID()如果没有成功插入行,则值 保持不变。

使用参数, LAST_INSERT_ID()返回无符号整数。

例如,在插入生成AUTO_INCREMENT值的行之后 ,您可以获得如下值:

mysql> SELECT LAST_INSERT_ID();
        -> 195

当前正在执行的语句不会影响其值 LAST_INSERT_ID()。假设您AUTO_INCREMENT使用一个语句生成一个值,然后LAST_INSERT_ID()在多行INSERT语句中引用 ,该行将行插入到具有自己AUTO_INCREMENT列的表中 。LAST_INSERT_ID()第二个陈述中的价值 将保持稳定; 它的第二行和后一行的值不受先前行插入的影响。(但是,如果将参考混合到LAST_INSERT_ID()和 ,则效果未定义。) LAST_INSERT_ID(expr)

如果前一个语句返回错误,则值为 LAST_INSERT_ID()undefined。对于事务表,如果语句由于错误而回滚,则值为 LAST_INSERT_ID()undefined。对于手动 ROLLBACK,其值LAST_INSERT_ID() 不会恢复到事务之前的值; 它仍然保持原样 ROLLBACK

在MySQL 5.7.3之前,如果正在使用复制过滤规则,则无法正确复制此函数。

在存储例程(过程或函数)或触发器LAST_INSERT_ID()的主体内,更改的值与在这些对象的主体外执行的语句的 更改方式相同。LAST_INSERT_ID()以下语句可以看出存储的例程或触发器对其值的影响 取决于例程的类型:

  • 如果存储过程执行更改值的语句,则更改的值LAST_INSERT_ID()将由过程调用之后的语句看到。
  • 对于更改值的存储函数和触发器,当函数或触发器结束时,将恢复该值,因此后续语句将不会看到更改的值。

生成的ID在每个连接的基础上在服务器中维护 。这意味着函数返回给定客户端的AUTO_INCREMENT是为该客户端影响AUTO_INCREMENT最新语句生成的第一个 值 。此值不受其他客户端的影响,即使它们生成 AUTO_INCREMENT自己的值。此行为可确保每个客户端都可以检索自己的ID,而无需关心其他客户端的活动,也无需锁定或事务。

LAST_INSERT_ID() 如果将AUTO_INCREMENT行的列设置为非“ 魔术 ”值(即,不是NULL和不是 的值),则不会更改 值 0

如果您将使用一个多行 INSERT的语句, LAST_INSERT_ID()返回所产生的价值第一次插入的行。这样做的原因是可以轻松地重现INSERT与其他服务器相同的 语句。

mysql> USE test;
 
mysql> CREATE TABLE t (
       id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
       name VARCHAR(10) NOT NULL
       );
 
mysql> INSERT INTO t VALUES (NULL, 'Bob');
 
mysql> SELECT * FROM t;
+----+------+
| id | name |
+----+------+
|  1 | Bob  |
+----+------+
 
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                1 |
+------------------+
 
mysql> INSERT INTO t VALUES
       (NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa');
 
mysql> SELECT * FROM t;
+----+------+
| id | name |
+----+------+
|  1 | Bob  |
|  2 | Mary |
|  3 | Jane |
|  4 | Lisa |
+----+------+
 
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                2 |
+------------------+

虽然第二个INSERT 语句插入了三个新行t,但是为这些行中的第一行生成的ID是 2,并且这个值是由LAST_INSERT_ID()以下SELECT语句返回的 。

如果使用INSERT IGNORE并且忽略该行,则 LAST_INSERT_ID()保持与当前值保持不变(如果连接尚未成功INSERT,则返回0 ),对于非事务表,AUTO_INCREMENT计数器不会递增。对于InnoDB表,AUTO_INCREMENT如果innodb_autoinc_lock_mode设置为1或,则 计数器会递增 2,如以下示例所示:

mysql> USE test;
 
mysql> SELECT @@innodb_autoinc_lock_mode;
+----------------------------+
| @@innodb_autoinc_lock_mode |
+----------------------------+
|                          1 |
+----------------------------+
 
mysql> CREATE TABLE `t` (
       `id` INT(11) NOT NULL AUTO_INCREMENT,
       `val` INT(11) DEFAULT NULL,
       PRIMARY KEY (`id`),
       UNIQUE KEY `i1` (`val`)
       ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
# Insert two rows
 
mysql> INSERT INTO t (val) VALUES (1),(2);
 
# With auto_increment_offset=1, the inserted rows
# result in an AUTO_INCREMENT value of 3
 
mysql> SHOW CREATE TABLE t\G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `val` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `i1` (`val`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
 
# LAST_INSERT_ID() returns the first automatically generated
# value that is successfully inserted for the AUTO_INCREMENT column
 
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                1 |
+------------------+
 
# The attempted insertion of duplicate rows fail but errors are ignored   
 
mysql> INSERT IGNORE INTO t (val) VALUES (1),(2);
Query OK, 0 rows affected (0.00 sec)
Records: 2  Duplicates: 2  Warnings: 0
 
# With innodb_autoinc_lock_mode=1, the AUTO_INCREMENT counter
# is incremented for the ignored rows
 
mysql> SHOW CREATE TABLE t\G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `val` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `i1` (`val`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
 
# The LAST_INSERT_ID is unchanged because the previous insert was unsuccessful
 
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                1 |
+------------------+

 LAST_INSERT_ID(expr)

如果expr作为参数给出,则参数 LAST_INSERT_ID()的值由函数返回,并记住作为要返回的下一个值 LAST_INSERT_ID()。这可以用来模拟序列:

创建一个表来保存序列计数器并初始化它:

mysql>
CREATE TABLE  sequence  ( id  INT NOT NULL );
mysql>
INSERT INTO sequence VALUES ( 0 );

使用该表生成如下序列号:

mysql>
UPDATE sequence SET id=LAST_INSERT_ID(+1);
mysql>
SELECT LAST_INSERT_ID();

UPDATE语句递增序列计数器并使下一次调用LAST_INSERT_ID()返回更新的值。该 SELECT语句检索该值。

您可以在不调用的情况下生成序列 LAST_INSERT_ID(),但以这种方式使用函数的实用程序是ID值在服务器中作为最后自动生成的值进行维护。它是多用户安全的,因为多个客户端可以发出UPDATE语句并使用SELECT语句(或 mysql_insert_id())获取自己的序列值 ,而不会影响或受到生成其自己的序列值的其他客户端的影响。

请注意,mysql_insert_id()只有更新后INSERT和 UPDATE语句,所以你不能使用C API函数来检索值 执行像其他SQL语句后 或 。 LAST_INSERT_ID(expr)SELECTSET

参考文档:

MySQL :: MySQL 5.7参考手册:https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id

原文:https://blog.csdn.net/soinice/article/details/88845898

php使用curl获取文本出现中文乱码的解决办法

在使用php的curl获取远程html文本时出现了中文乱码。

解决办法的代码如下:

$url = "www.ecjson.com";
//获取页面内容
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT,20);
$res = curl_exec($ch);
curl_close($ch);
$res=mb_convert_encoding($res, 'UTF-8', 'UTF-8,GBK,GB2312,BIG5');//使用该函数对结果进行转码

Java HttpURLConnection POST方式调用接口并携带参数

package testi;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.net.URL;
import java.net.URLEncoder;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;

public class HttpsHelper {
	public static void main(String args[]) throws Exception {
		//System.out.println(args[0]); // 打印 Hello World 
		if(args.length != 3) {
			System.out.println("参数错误,0-postStr,1-url,2-方式:post或get");
			return;
		}
		else {
			if(args[2] == "post")
				new HttpsHelper().SendPostHttp(args[0], args[1]);
			else
				new HttpsHelper().SendGetHttp(args[0], args[1]);
		}
		
	  }

	  public void SendPostHttp(String postJsonStr, String url) throws Exception {
	    
	    String postData = postJsonStr;//getJson();
	    HttpsURLConnection conn = null;
	    //String param="name="+URLEncoder.encode("丁丁","UTF-8");
	    OutputStream out = null;
	    String rsp = null;
	    byte[] byteArray = postData.getBytes("utf-8");
	    try {
	      URL uri = new URL(url);
	      conn = (HttpsURLConnection) uri.openConnection();
	      //忽略证书验证--Begin
	      conn.setHostnameVerifier(new My_TrustAnyHostnameVerifier());
	      //忽略证书验证--End
	      conn.setRequestMethod("POST");
	      conn.setDoInput(true);
	      conn.setDoOutput(true);
	      conn.setRequestProperty("Host", uri.getHost());
	      conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
	      out = conn.getOutputStream();
	      out.write(byteArray);
	      out.close();
	      if(conn.getResponseCode()==200) {
	        rsp = getStreamAsString(conn.getInputStream(), "utf-8");
	      }else {
	        rsp = getStreamAsString(conn.getErrorStream(), "utf-8");
	      }
	      
	      System.out.println(rsp);

	    } catch (Exception e) {
	      if(null!=out)
	        out.close();
	      e.printStackTrace();
	      
	    }
	    
	  }
	  
	  public void SendGetHttp(String postJsonStr, String url) throws Exception {
		  	String postData = postJsonStr;//getJson();
		    HttpsURLConnection conn = null;
		    url = url + "?" + postData;
		    //OutputStream out = null;
		    String rsp = null;
		    //byte[] byteArray = postData.getBytes("utf-8");
		    try {
		      URL uri = new URL(url);
		      conn = (HttpsURLConnection) uri.openConnection();
		      //忽略证书验证--Begin
		      conn.setHostnameVerifier(new My_TrustAnyHostnameVerifier());
		      //忽略证书验证--End
		      conn.setRequestMethod("GET");
		      conn.setDoInput(true);
		      conn.setDoOutput(true);
		      conn.setRequestProperty("Host", uri.getHost());
		      conn.setRequestProperty("Content-Type", "text/html; charset=UTF-8");
		      //out = conn.getOutputStream();
		      ///out.write(byteArray);
		      //out.close();
		      if(conn.getResponseCode()==200) {
		        rsp = getStreamAsString(conn.getInputStream(), "utf-8");
		      }else {
		        rsp = getStreamAsString(conn.getErrorStream(), "utf-8");
		      }
		      
		      System.out.println(rsp);

		    } catch (Exception e) {
		      //if(null!=out)
		        //out.close();
		      e.printStackTrace();
		      
		    }
		}
	  
	  /**
	   * getJson
	   * 
	   */
	  private static String getJson() {
	    return "{" + "\"name\"" + ":" + "\"hello\"" + "}";
	  }
	 

	  private static String getStreamAsString(InputStream stream, String charset) throws IOException {
	    try {
	      Reader reader = new InputStreamReader(stream, charset);
	      StringBuilder response = new StringBuilder();

	      final char[] buff = new char[1024];
	      int read = 0;
	      while ((read = reader.read(buff)) > 0) {
	        response.append(buff, 0, read);
	      }

	      return response.toString();
	    } finally {
	      if (stream != null) {
	        stream.close();
	      }
	    }
	  }

	}

	//定制Verifier
	class My_TrustAnyHostnameVerifier implements HostnameVerifier {
	  public boolean verify(String hostname, SSLSession session) {
	    return true;
	  }

}

参考:

http://www.manongjc.com/detail/18-hgdiiupleyulnbu.html

https://www.jb51.net/article/73621.htm
https://blog.csdn.net/u011400521/article/details/78251857
https://www.jb51.net/article/168581.htm

CSS div水平垂直居中和div置于底部

一、水平居中

.hor_center {
        margin: 0 auto;
}

二、水平垂直居中

.content {
      width: 360px;
      height: 240px;
}
.ver_hor_center {
      position: absolute;
      top: 50%;
      left: 50%;
      margin-left: -180px; /*要居中的div的宽度的一半*/
      margin-top: -120px; /*要居中的div的高度的一半*/
}

三、div置于底部(footer)

.bottom_footer {
       position: fixed; /*or前面的是absolute就可以用*/
       bottom: 0px;
}

HTML+CSS+JS dTree 树形目录的使用

example 压缩包:https://pan.baidu.com/s/1DI2mM3iSnKtpkV45-gUzAA 提取码: m1pi

使用注意事项:

1)dtree.js里可以修改点击项目的操作

原js文件里的nodeSel和node的样式切换不生效,可以在点击方法里添加

var cur_sel_id = -1;
function setDetail(api_id, name){
    console.log(api_id);
    if(cur_sel_id >= 0){
        var old = document.getElementById("sd"+ cur_sel_id);
        old.className = "node";
    }
    eNew = document.getElementById("sd"+ api_id);
    eNew.className = "nodeSel";
    …………
}

也可在dTree官网查看学习dTree api使用