simple1234 回答了问题 · 2018-05-25
引入文件
const {ReadCard} = CardReader;
自己编写js文件
import md5 from 'crypto-js/md5';
import {message} from 'antd';
try{const obj=new ActiveXObject("CardlanActiveX.CardReader.1");
}catch(e){message.error("读写器控件没有安装,请先下载安装。")
}
。。。。。。。。。。。。。。。。。。。。。。。
const CardReader={ReadCard,
}
export default CardReader;
自己编写js文件import md5 from 'crypto-js/md5';import {message} from 'antd';try{
关注 1回答 1
simple1234 收藏了问题 · 2018-03-26
产品要写一个类似检测的东西
有四块内容检测,要发四个AJAX。
我想到的$,when
但是用这个的话,后面三个done时间是立马执行的。
我就写了一个settimeout
但是里面有一个依次打对号的我就写了一个setInterval
但是这个时间老是对不上。
发现写法很有问题 有没有什么好点的写法 或者指出我的错误。$('.txturl button').click(function() {
var count = 0
$.when($.ajax({
type: "get",
url: "http://www.webossgoo3.com/google/CheckContent",
async: true,
success: function(data) {
var pardata = JSON.parse(data)
$('.gdt').addClass('layui-anim layui-anim-rotate layui-anim-loop');
$('.coun-jc').hide();
$('.txt-bet li').removeClass('active')
$('.txtnum section span.load-jc').css('display', 'table-cell');
if(pardata.title) {
$('.cont2 i').html('ဆ')
$('.cont2 i').css('color', 'red')
for(j in pardata.title) {
$('.contentul ul').eq(0).append(
"
" + j + ":" + pardata.title[j] + "")
}
};
for(k in pardata.keywords) {
$('.contentul ul').eq(1).append(
"
" + k + ":" + pardata.keywords[k] + "")
}
if(!pardata.original) {
$('.cont1 i').html('ဆ');
$('.cont1 i').css('color', 'red')
}
var i = 0;
setInterval(function() {
if(i <= $('.basetxt table i').size() - 1 ) {
$('.basetxt table i').eq(i).show()
i++
} else {
$('.txt-bet li').eq(0).addClass('active')
return false
}
}, 500)
},
error: function() {
layer.msg('检测失败1')
}
})).done(function() {
setTimeout(function () {
$.ajax({
type: "get",
url: "http://www.webossgoo3.com/google/checkSearch",
async: true,
success: function(data) {
var pardata = JSON.parse(data)
if (pardata.google) {
$('.cont3 i').html('ဆ')
$('.cont3 i').css('color', 'red')
}
if (pardata.bing) {
$('.cont4 i').html('ဆ')
$('.cont4 i').css('color', 'red')
}
if (pardata.yahoo) {
$('.cont5 i').html('ဆ')
$('.cont5 i').css('color', 'red')
}
if (pardata.title_top1) {
$('.cont6 i').html('ဆ')
$('.cont7 i').css('color', 'red')
}
var a = 0;
setInterval(function() {
if(a <= $('.seartxt table i').length - 1) {
$('.seartxt table i').eq(a).show()
a++
} else {
$('.txt-bet li').eq(1).addClass('active')
return false
}
}, 500)
},
error: function() {
layer.msg('检测失败2')
}
})
})
}).done(function() {
setTimeout(function () {
$.ajax({
type: "get",
url: "http://www.webossgoo3.com/google/CheckSearch",
async: true,
success: function(data) {
var pardata = JSON.parse(data)
var i = 0;
setInterval(function() {
if(i <= $('.seotxt table i').length - 1) {
$('.seotxt table i').eq(i).show()
i++
} else {
$('.txt-bet li').eq(2).addClass('active')
return false
}
}, 500)
},
error: function() {
layer.msg('检测失败3')
}
})
},500 * ($('.seartxt table i').length) )
}).done(function() {
setTimeout(function () {
$.ajax({
type: "get",
url: "http://www.webossgoo3.com/google/CheckContent",
async: true,
success: function(data) {
var pardata = JSON.parse(data)
var i = 0;
setInterval(function() {
if(i <= $('.basetxt table i').length - 1) {
$('.opttxt table i').eq(i).show()
i++
} else {
$('.txt-bet li').eq(3).addClass('active')
$('.gdt').removeClass('layui-anim layui-anim-rotate layui-anim-loop');
$('.coun-jc').show()
$('.coun-jc').text('88')
$('.txtnum section span.load-jc').css('display', 'none');
return false
}
}, 500)
},
error: function() {
layer.msg('检测失败4')
}
})
},500 * ($('.seotxt table i').length) + 500 * ($('.seartxt table i').length) )
})
})
产品要写一个类似检测的东西有四块内容检测,要发四个AJAX。我想到的$,when但是用这个的话,后面三个done时间是立马执行的。我就写了一个settimeout
simple1234 关注了问题 · 2018-03-26
产品要写一个类似检测的东西
有四块内容检测,要发四个AJAX。
我想到的$,when
但是用这个的话,后面三个done时间是立马执行的。
我就写了一个settimeout
但是里面有一个依次打对号的我就写了一个setInterval
但是这个时间老是对不上。
发现写法很有问题 有没有什么好点的写法 或者指出我的错误。$('.txturl button').click(function() {
var count = 0
$.when($.ajax({
type: "get",
url: "http://www.webossgoo3.com/google/CheckContent",
async: true,
success: function(data) {
var pardata = JSON.parse(data)
$('.gdt').addClass('layui-anim layui-anim-rotate layui-anim-loop');
$('.coun-jc').hide();
$('.txt-bet li').removeClass('active')
$('.txtnum section span.load-jc').css('display', 'table-cell');
if(pardata.title) {
$('.cont2 i').html('ဆ')
$('.cont2 i').css('color', 'red')
for(j in pardata.title) {
$('.contentul ul').eq(0).append(
"
" + j + ":" + pardata.title[j] + "")
}
};
for(k in pardata.keywords) {
$('.contentul ul').eq(1).append(
"
" + k + ":" + pardata.keywords[k] + "")
}
if(!pardata.original) {
$('.cont1 i').html('ဆ');
$('.cont1 i').css('color', 'red')
}
var i = 0;
setInterval(function() {
if(i <= $('.basetxt table i').size() - 1 ) {
$('.basetxt table i').eq(i).show()
i++
} else {
$('.txt-bet li').eq(0).addClass('active')
return false
}
}, 500)
},
error: function() {
layer.msg('检测失败1')
}
})).done(function() {
setTimeout(function () {
$.ajax({
type: "get",
url: "http://www.webossgoo3.com/google/checkSearch",
async: true,
success: function(data) {
var pardata = JSON.parse(data)
if (pardata.google) {
$('.cont3 i').html('ဆ')
$('.cont3 i').css('color', 'red')
}
if (pardata.bing) {
$('.cont4 i').html('ဆ')
$('.cont4 i').css('color', 'red')
}
if (pardata.yahoo) {
$('.cont5 i').html('ဆ')
$('.cont5 i').css('color', 'red')
}
if (pardata.title_top1) {
$('.cont6 i').html('ဆ')
$('.cont7 i').css('color', 'red')
}
var a = 0;
setInterval(function() {
if(a <= $('.seartxt table i').length - 1) {
$('.seartxt table i').eq(a).show()
a++
} else {
$('.txt-bet li').eq(1).addClass('active')
return false
}
}, 500)
},
error: function() {
layer.msg('检测失败2')
}
})
})
}).done(function() {
setTimeout(function () {
$.ajax({
type: "get",
url: "http://www.webossgoo3.com/google/CheckSearch",
async: true,
success: function(data) {
var pardata = JSON.parse(data)
var i = 0;
setInterval(function() {
if(i <= $('.seotxt table i').length - 1) {
$('.seotxt table i').eq(i).show()
i++
} else {
$('.txt-bet li').eq(2).addClass('active')
return false
}
}, 500)
},
error: function() {
layer.msg('检测失败3')
}
})
},500 * ($('.seartxt table i').length) )
}).done(function() {
setTimeout(function () {
$.ajax({
type: "get",
url: "http://www.webossgoo3.com/google/CheckContent",
async: true,
success: function(data) {
var pardata = JSON.parse(data)
var i = 0;
setInterval(function() {
if(i <= $('.basetxt table i').length - 1) {
$('.opttxt table i').eq(i).show()
i++
} else {
$('.txt-bet li').eq(3).addClass('active')
$('.gdt').removeClass('layui-anim layui-anim-rotate layui-anim-loop');
$('.coun-jc').show()
$('.coun-jc').text('88')
$('.txtnum section span.load-jc').css('display', 'none');
return false
}
}, 500)
},
error: function() {
layer.msg('检测失败4')
}
})
},500 * ($('.seotxt table i').length) + 500 * ($('.seartxt table i').length) )
})
})
关注 9回答 7
simple1234 赞了文章 · 2017-10-11
php项目下的缓存控制客户端向服务端请求php页面的过程中,服务端是可控的。
可控的才可优化,优化的重点,即是缓存优化。
试想?数据存储在DB中,访问DB就要读取硬盘数据,但如果需要数据的速度>>硬盘最大的读写速度,
就会产生IO瓶颈。
那么,使用内存缓存数据结果集,让用户首先读取缓存,未果则从DB中读取。
如此,就能提高数据响应的速度,也保护了数据源。
php虽开启shmop扩展可管理内存,但所能管理的内存大小是有限的。
才有大为流行的NOSQL:
memcache 高性能的分布式内存缓存服务器
(分布式配置:1.有多个memcache服务端;2.开启php相应扩展,通过addServer()即可实现。底层通过对key的hash取余来标识服务器,因此代码实现上,不要改变存取前的服务器的顺序,否则可能出现获取不到值的情况)
redis 高性能的内存缓存服务器
(主从配置:master主服务器执行修改操作,多个slave(只读)连接master,在首次全量复制后,增量更新数据到自身。如果slave断了,重新连接master时,会自动全量复制)
MEMCACHE以key-value的方式存储
key可达250B,value可达1M
value是以字符串的形式保存的:php标量数据类型,保存时会隐式转换为字符串;
php其他数据类型, 保存时自动序列化,取出时自动反序列化. //该过程是php的memcache扩展开启后,底层实现的
item过期时间是时间戳时,无限制;以s为单位时,不能超过30天的秒数
不能持久化,要的就是速度
注意事项
∧memcache与redis,最大区别在于持久化(即数据能否保存在硬盘上).
redis因其多样的数据结构,而满足更多的业务需求,但memcache的读取速度更快些.
∨
REDIS支持丰富的数据结构(在此先不展开该方面的讨论)常用项:string,hash,list,set,sortedset //redis本身就实现了双向列表,list还可模拟出队列,堆栈的数据结构
value值可达512M
可持久化:快照持久化(SNAPSHOTTING)
一定时间内一定数量的key值的改变,就会全量复制redis内存管理的数据到硬盘.
精细持久化(AOF)
用来保存每次执行的命令.开启后,每秒保存一次。见下图的英文注释
注意事项
查看原文
php项目下的缓存控制 {代码...} MEMCACHE 以key-value的方式存储 key可达250B,value可达1M value是以字符串的形式保存的: {代码...} item过期时间是时间戳时,无限制;以s为单位时,不能超过30天的秒数 不能持久化,要的就是速度 注意事项 ∧ memcache与redis,最大区...
赞 4收藏 9评论 0
simple1234 回答了问题 · 2017-03-30
$arr1 = [['day'=>'2017-03-28','reg_count'=>14],['day'=>'2017-03-27','reg_count'=>53]];
$arr2 = [['day'=>'2017-03-29','pay_count'=>2],['day'=>'2017-03-28','pay_count'=>12]];$arr1_1 = array_column($arr1,'reg_count','day');
$arr2_1 = array_column($arr2,'pay_count','day');
$return_arr = array();
foreach (array_unique(array_merge(array_keys($arr1_1),array_keys($arr2_1))) as $key =>$val){
$return_arr[$key]['day'] = $val;
$return_arr[$key]['reg_count'] = 0;
$return_arr[$key]['pay_count'] = 0;
if(key_exists($val, $arr1_1)){
$return_arr[$key]['reg_count'] = $arr1_1[$val];
}
if(key_exists($val, $arr2_1)){
$return_arr[$key]['pay_count'] = $arr2_1[$val];
}
}
print_r($return_arr);
$arr1 = [['day'=>'2017-03-28','reg_count'=>14],['day'=>'2017-03-27','reg_count'=>53]];$arr2 = [['day'=>'2017-03-29','pay_count'=>2],['day'=>'2017-03-28','pay_count'=>12]];
关注 5回答 4
simple1234 关注了标签 · 2017-03-29
PHP,是英文超文本预处理语言 Hypertext Preprocessor 的缩写。PHP 是一种开源的通用计算机脚本语言,尤其适用于网络开发并可嵌入HTML 中使用。PHP 的语法借鉴吸收 C语言、Java 和 Perl 等流行计算机语言的特点,易于一般程序员学习。(目前是 Web 开发性价比最高的语言)
PHP,是英文超文本预处理语言 Hypertext Preprocessor 的缩写。PHP 是一种开源的通用计算机脚本语言,尤其适用于网络开发并可嵌入HTML 中使用。PHP 的语法借鉴吸收 C语言、Java 和 Perl 等流行计算机语言的特点,易于一般程序员学习。(目前是 Web 开发性价比最高的...
关注 89115
simple1234 关注了问题 · 2015-04-23
跟人合作搞个Android App,我负责服务器端 用的是PHP,
手机端和服务器端之间的数据传输有加密,
他手机端用的是这个JAVA的数据加密类,
求相对应的PHP版本 数据加密类。package com.ssh.util;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
/**
* DESede对称加密算法演示
*
* @author zolly
* */
public class DESedeCoder {
/**
* 密钥算法
* */
public static final String KEY_ALGORITHM = "DESede";
/**
* 加密/解密算法/工作模式/填充方式
* */
public static final String CIPHER_ALGORITHM = "DESede/ECB/PKCS5Padding";
/**
*
* 生成密钥
*
* @return byte[] 二进制密钥
* */
public static byte[] initkey() throws Exception {
// 实例化密钥生成器
KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);
// 初始化密钥生成器
kg.init(168);
// 生成密钥
SecretKey secretKey = kg.generateKey();
// 获取二进制密钥编码形式
byte[] key = secretKey.getEncoded();
BufferedOutputStream keystream =
new BufferedOutputStream(new FileOutputStream("DESedeKey.dat"));
keystream.write(key, 0, key.length);
keystream.flush();
keystream.close();
return key;
}
/**
* 转换密钥
*
* @param key
* 二进制密钥
* @return Key 密钥
* */
public static Key toKey(byte[] key) throws Exception {
// 实例化Des密钥
DESedeKeySpec dks = new DESedeKeySpec(key);
// 实例化密钥工厂
SecretKeyFactory keyFactory = SecretKeyFactory
.getInstance(KEY_ALGORITHM);
// 生成密钥
SecretKey secretKey = keyFactory.generateSecret(dks);
return secretKey;
}
/**
* 加密数据
*
* @param data
* 待加密数据
* @param key
* 密钥
* @return byte[] 加密后的数据
* */
public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
// 还原密钥
Key k = toKey(key);
// 实例化
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
// 初始化,设置为加密模式
cipher.init(Cipher.ENCRYPT_MODE, k);
// 执行操作
return cipher.doFinal(data);
}
/**
* 解密数据
*
* @param data
* 待解密数据
* @param key
* 密钥
* @return byte[] 解密后的数据
* */
public static byte[] decrypt(byte[] data, byte[] key) throws Exception {
// 欢迎密钥
Key k = toKey(key);
// 实例化
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
// 初始化,设置为解密模式
cipher.init(Cipher.DECRYPT_MODE, k);
// 执行操作
return cipher.doFinal(data);
}
/**
* 加密字符串
* @param data
* @return
*/
public static String encode(String str,String screatKey){
String result = "";
byte[] data = DESedeCoder.encrypt(str.getBytes(), screatKey.getBytes());
result = Base64.encode(data);
return result;
}
/**
* 解密字符串
* @param str
* @return
*/
public static String decode(String str,String screatKey){
String result = "";
try {
byte[] data = Base64.decode(str);
data = DESedeCoder.decrypt(data, screatKey.getBytes());
result = new String(data);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 进行加解密的测试
*
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String key = "2C7dDYBy20mmKy3391xivikz";
String str = "hello world~";
System.out.println("Key:"+key);
System.out.println("原文:" + str);
//加密
String value = encode(str,key);
System.out.println("加密后:" + value);
System.out.println("解密后:" + decode(value,key));
}
}
关注 3回答 3
simple1234 关注了问题 · 2015-04-23
安全机制
对报文进行MAC,以实现防篡改
发起方先对标签数据进行Base64编码,根据编码后的数据,然后进行循环异或(将数据分成若干个8个字节的数据段,最后不足8位后加0x00补齐8位)。得到标签数据。然后将新的报文发送给对方。
为原始报文的Base64编码结果xml<?xml version="1.0" encoding="UTF-8"?>
ccb_pos
pos_service
20111121094051
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48ZGF0YT48cHJvZHVjdD4wMzI2PC9wcm9kdWN0PjxwcmVtaXVtPjExMDAuMDwvcHJlbWl1bT48ZHJpdmVycz48ZHJpdmVyPkphbWVzPC9kcml2ZXI+PGRyaXZlcj5UZWRkeTwvZHJpdmVyPjwvZHJpdmVycz48L2RhdGE+
8U42KXyd76FSCmRT //char 16
处理方式
接收方在接收到报文后,将标签数据分成若干个8个字节的数据段,最后不足8位后加0x00补齐8位,循环异或一次。然后和标签数据进行比对。如果比对一致表示通过验证,最后将标签数据按照Base64解码,得到交易明文数据。
参考文档
网上找了一段PHP代码
这代码有问题,大概方式。php<?php
/** 防止乱码 */
header("Content-type:text/html;charset=utf-8");
//MCRYPT 密码配置
$MCRYPT_key = "key:232"; //密钥
$MCRYPT_cipher = MCRYPT_DES; //密码类型
$MCRYPT_modes = MCRYPT_MODE_ECB; //密码模式
function MCRYPT_str($str,$type=1){
global $MCRYPT_key,$MCRYPT_cipher,$MCRYPT_modes;
$iv = mcrypt_create_iv(mcrypt_get_iv_size($MCRYPT_cipher,$MCRYPT_modes),MCRYPT_RAND);//初始化向量
if($type==1){
$str = mcrypt_encrypt($MCRYPT_cipher,$MCRYPT_key,$str,$MCRYPT_modes,$iv); //加密函数
}else{
$str = mcrypt_decrypt($MCRYPT_cipher,$MCRYPT_key,$str,$MCRYPT_modes,$iv);
}
return $str;
}
$str="PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48ZGF0YT48cHJvZHVjdD4wMzI2PC9wcm9kdWN0PjxwcmVtaXVtPjExMDAuMDwvcHJlbWl1bT48ZHJpdmVycz48ZHJpdmVyPkphbWVzPC9kcml2ZXI+PGRyaXZlcj5UZWRkeTwvZHJpdmVyPjwvZHJpdmVycz48L2RhdGE+";
var_dump($str);
echo '
';
var_dump(base64_decode($str));
echo '
';
var_dump(mac_($str));
echo '
';
//说明:MAC算法,将字符串$data分为八字节为单位的数据块,标号为D1,D2,D3..,如果最后的数据块不足
//8字节,则在后面加上\x00直到长度达到8字节为止,最后按照下面流程产生MAC,
//8字节的初始值:\x00\x00\x00\x00\x00\x00\x00\x00
//流程:初始值 异或 D1 —>异或的结果进行des 异或 D2 —>异或的结果进行des 异或 D2 —>异或的结果进行des
function mac_($data)
{
//设初始值
$init="\x00\x00\x00\x00\x00\x00\x00\x00";
//对$data进行8字节分割,获得数组
$tmp_data=strtoarray($data,8);
$tmp_init=$init;
foreach($tmp_data as $value)
{
//进行异或运算
$tmp_init=myEncrypt($tmp_init,$value);
var_dump($tmp_init);
//进行加密
//$tmp_init=MCRYPT_str($tmp_init);
}
var_dump($tmp_init);
return bin2hex($tmp_init);
}
//函数名:strtoarray
//说明:将字符串按8字节切割,最后不足8字节的用\x00填补
function strtoarray($str,$limit)
{
$len=strlen($str);
$tmp_arr=array();
$count=floor($len/$limit);
$left_num=$len-$count*$limit;
for($i=0;$i
{
$str.="\x00";
}
for($i=0;$i
{
$tmp_arr[]=substr($str,0,$limit);
if(strlen($str)>$limit+1)
{
$str=substr($str,$limit,strlen($str));
}
}
return $tmp_arr;
}
//函数名:myEncrypt
//说明:异或运算函数
function myEncrypt($string, $key)
{
for($i=0;$i
{
for($j=0;$j
{
$string[$i] = $string[$i]^$key[$j];
}
}
return $string;
}
?>
不知道哪位研究过没有,怎么做的,没有头绪。
关注 3回答 1