首页
时事
归档
壁纸
更多
留言
关于
邻里
Search
1
使用必应Bing每日图片做网站背景(自动)
2,987 阅读
2
vue的输入值校验规则整理
1,661 阅读
3
VUE `ERR_CONNECTION_TIMED_OUT`的解决办法
1,628 阅读
4
好站推荐-https://wangchujiang.com/linux-command/
1,598 阅读
5
微信支付开发前准备(小程序、公众号、App、H5)
1,582 阅读
文章
图说
代码
吐槽
登录
Search
标签搜索
Linux
laravel
windows
TYPO3
php
shell脚本
git
微信
好站
vue
第三方登录
centos
linxu
centos7
thinkPHP
微信支付
api
MySQL
桌面
必应首图
Beer
累计撰写
114
篇文章
累计收到
22
条评论
首页
栏目
文章
图说
代码
吐槽
页面
时事
归档
壁纸
留言
关于
邻里
搜索到
9
篇与
吐槽
的结果
2021-12-06
element-ui的el-form表单数据回显后输入框无法输入
解决办法this.form = JSON.parse(JSON.stringify(this.form));element-ui中的另一个解决办法this.form = deepClone(this.form);吐槽问题虽然解决了,但是我依然不知道个中缘由是什么,有同事说不能编辑的可能原因是当前对象未接触绑定(我的业务是动态增加表格行,行中有表单),虽然数据是正常的,但是它还绑定在前任身上,但是此时该对象已经有所改变,通俗点来说就是拿前朝的剑斩本朝的臣...所以这段代码可能的意思是我管你前朝还是本朝,全部抹掉重新赋值就OK了完...
2021年12月06日
1,311 阅读
0 评论
0 点赞
2021-06-04
VUE的input框赋值后无法进行编辑
问题情况data中有定义对应字段,input框也进行绑定对了v-model 但进行赋值后,input输入框无法进行操作(select下拉选框也有同样的问题),不晓得是不是我半路出家搞前端哪块出问题了,问了不少人都说是直接model赋值,但我就是不行。。。解决:使用vue的全局方法:this.$set(data, property, value) //data为要修改的对象,property为要添加的属性,value就是这个属性的值//例如: this.$set(this.addForm, "provider", '张三的店');结语这个问题说实话我不清楚是什么原因导致的,网上找说是没有绑定get,set方法,暂且就先相信这种方法吧
2021年06月04日
1,175 阅读
0 评论
0 点赞
2021-05-28
VUE `ERR_CONNECTION_TIMED_OUT`的解决办法
错误vue项目运行后出现如下错误GET http://192.168.1.13:9527/sockjs-node/info?t=1538257166715 net::ERR_CONNECTION_TIMED_OUT sockjs.js?9be2:1605运行系统: macOS解决在vue.config.js中添加如下配置module.exports = { devServer: { host: 'localhost' } };
2021年05月28日
1,628 阅读
0 评论
0 点赞
2019-03-25
在Ubuntu18.04LTS上安装typo3LTS
什么是TYPO3TYPO3是一个开源企业CMS(内容管理系统),拥有庞大的全球社区,并得到了许多公司和个人的大力支持。目前我所知道的国内的是我所在的公司 极益科技有限公司在做二次开发,开源项目地址:https://gitee.com/ngo/os我在本文中,分享下 在Ubuntu18.04上基于LAMP环境安装TYPO3的最新可用LTS版本 的详细步骤。环境准备系统:Ubuntu18.04LTS服务:Apache2.4PHP:PHP7.0+(如果是typo3 9版本 则至少 7.3)MySQL:MySQL5.5+TYPO3源码在安装TYPO3之前,需要找到TYPO3源码。获取方式并不唯一一、CURL下载源码登录服务器后,进入web服务目录,然后执行下载命令。下面的命令下载到的是最新的TYPO3 LTS版本。cd /var/www/html下载TYPO3源码sudo curl -L https://get.typo3.org/8 -o typo3_src.tar.gz解压typo3_src.tar.gz压缩包sudo tar xfz typo3_src.tar.gz源码下载成功。。。TYPO3安装进入 /var/www/html/typo3_src-8.7.24 目录中。二、安装依赖项在浏览器中访问网站IP或域名。如果看到如下TYPO3页面则证明源码下载没有问题根据提示得知,我们需要创建一个名为__FIRST_INSTALL__ 的 __文件__(是文件!!!)才能继续安装。(不明白为什么老外不把这个文件创建在源码包里)sudo touch FIRST_INSTALL文件创建成功后,重新加载浏览器,看到下面页面就可以继续往下进行了。注:如果看到很多红色和黄色的消息,请不要担心。这只是环境中有未安装的PHP模块或着PHP配置不符。继续往下看,后面有解决办法#使用apt一次安装所有需要的模块来解决这个问题。 sudo apt install php-gd php-xml php-zip php-soap php-apcu openssl安装完所有内容后,重启Apache服务以确保加载PHP模块。再次刷新页面,通常是执行完上面操作后应该只剩下黄色消息,黄色消息是PHP相关配置。配置PHP.ini在phpinfo中找到php.ini的目录,编辑它sudo editor /etc/php/7.2/apache2/php.ini sudo service apache2 restart如果以上所有步骤都正确执行了,再次刷新页面应该是这样的点击按钮 System looks good. Continue! 继续安装三、配置MYSQL连接在连接前,准备好链接参数1、root 权限sudo -s2、连接到MySQL服务mysql3、创建typo3用户create user typo3 identified by '123456';密码随意,但也不要太随意了。本文仅作为演示。4、为此用户创建数据库并授予权限。create database typo3; grant all privileges on typo3.* to 'typo3';5、更改字符集为utf8。alter database typo3 character set utf8 collate utf8_general_ci;然后把数据库的用户名和密码写入四、创建用户,网站命名执行完这一步安装就快完成了,现在为我们网站创建一个后端管理员用户。还可以命名你的网站名称。五、最后一步执行完上面所有步骤,网站就安装成功了。现在你可以使用第四步创建的用户登录并管理你的网站了吐槽下吧typo3的功能确实强大,强大到你只要有基础,两天就会用,四天就会改的地步,但是,如果你一旦改错地方,你可能需要大量时间去修改它。说是这么说,typo3是我见过代码最严谨的框架。。。 至于TYPO3的功能。简直丰富的不要不要的,毕竟它可以完全零代码就能搭建,如果不用定制开发的话,四千多个插件总有你喜欢的。如果你想了解更多或者开发遇到问题。请联系我
2019年03月25日
934 阅读
2 评论
0 点赞
2019-03-22
不会找资料吗?教你百度
QQ群盗图,教你百度
2019年03月22日
556 阅读
0 评论
0 点赞
2019-03-13
微信小程序之 PHP 发送模板消息
今天入坑小程序模板消息的推送,也是踩了不少的坑啊,在这儿 share 一下~,有任何疑问可以联系我!准备1: 官方文档https://developers.weixin.qq.com/miniprogram/dev/api/notice.html#发送模板消息总的来说,小程序发送模板消息和公众号发送模板消息区别不是很大2: 小程序发送模板消息:- 获取access_token并存储以备再次使用 - 小程序端获取发送必要的formID(submit提交事件)或 prepay_id(支付事件) - 拼装模板消息数据 - 调用接口发送模板消息 吐槽一下微信小程序的机制是这样的formid 只能通过移动端进行获取(手机,iPad);每获取到一个 formid **只能使用一次**(一个formid只能发送一条模板消息);发起form表单提交事件 ==> 获取 form_id 和 发起人openid ==> php后台处理拼装模板消息 ==> 发送给发起人;上边说的意思是:A获取的formid只能用来给自己发送模板消息,不能用来给B发送模板消息;解决方案在A触发表单提交事件时,将本次获取到的formid保存到A提交的表单内容中,反正就是与A本次提交的数据绑定死(死结,除了自己,谁都不给用),在B触发对A的某事件时,需要发送模板消息了,这时把A之前绑定的formid拿出来用,还是给A自己用for example:A提交了请假申请(通过表单提交申请内容),B审核,审核完成后,把审核结果通过模板消息发送给A终于到代码了我不是前端妹子,小程序的代码就不放了,自己找找吧<?php namespace Jykj\\Template\\Weixin; /** * 小程序模板消息发送 * 微信规定:不能直接在小程序调用,只能在后台发起 */ class WxSendTemplate { private $token =''''; private $appid = ''******************''; private $appsecret = ''********************************''; private $templateid = ''*******************************************''; private $SEND_TEMPLATE_URL = ''https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=##TOKEN##''; private $GET_ACCESSTOKEN_URL = ''https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=##APPID##&secret=##APPSECRET##''; /** * 构造函数,获取access_token * @Author wanghongbin * @Email wanghongbin@ngoos.org * @DateTime 2018-07-06 */ public function __construct() { $this->token = $this->getAccessToken(); } /** * 发送模板消息 * @Author wanghongbin * @Email wanghongbin@ngoos.org * @DateTime 2018-07-06 * @param array * @return [type] */ public function sendTemplateData($data = array()) { $options = array( ''http'' => array( ''method'' => ''POST'', ''header'' => ''Content-type:application/json'',//header 需要设置为 JSON ''content'' => $this->getTemplatePostData($data), ''timeout'' => 60//超时时间 ) ); $url = str_replace("##TOKEN##",$this->token,$this->SEND_TEMPLATE_URL); $context = stream_context_create($options); $result = file_get_contents($url, false, $context); return $result; } /** * 获取模板消息 * @Author wanghongbin * @Email wanghongbin@ngoos.org * @DateTime 2018-07-06 * @param array * @return [type] */ private function getTemplatePostData($data=array()){ $post_data = array ( "touser" => $data[''openid''],//用户的 openID,可用过 wx.getUserInfo 获取 "template_id" => $this->templateid,//小程序后台申请到的模板编号 "page" => $data[''pageuri''],//点击模板消息后跳转到的页面,可以传递参数 "form_id" => $data[''formid''],//第一步里获取到的 formID "data" => array( ''keyword1'' => array( "value" => $data[''status''],"color"=>"green"), ''keyword2'' => array( "value" => $data[''shopername'']), ''keyword3'' => array( "value" => $data[''telephone'']), ''keyword4'' => array( "value" => $data[''ordertime'']) ), "emphasis_keyword" => "keyword1.DATA" ); //将数组编码为 JSON return \\json_encode($post_data, true); } /** * 获取AccessToken * @Author wanghongbin * @Email wanghongbin@ngoos.org * @DateTime 2018-07-06 * @return [type] */ private function getAccessToken () { $url = str_replace("##APPID##",$this->appid,$this->GET_ACCESSTOKEN_URL); $url = str_replace("##APPSECRET##",$this->appsecret,$url); $html = file_get_contents($url); $output = json_decode($html, true); $access_token = $output[''access_token'']; return $access_token; } /** * 获取所有的模板 * @Author wanghongbin * @Email wanghongbin@ngoos.org * @DateTime 2018-07-06 * @return [type] */ public function get_all_private_template() { $url = "https://api.weixin.qq.com/cgi-bin/wxopen/template/list?access_token=".$this->token; $res = file_get_contents($url); return json_decode($res,true); } }效果图
2019年03月13日
838 阅读
0 评论
0 点赞
2019-03-13
微信支付——企业付款到银行卡,零钱,查询订单
最近,业务上有个需求,用到了微信的企业付款到银行卡这个接口。网上找了些资料,总之是坑比较多吧,但是这也算是微信文档的通病了。为此,我整理了一下企业付款到银行卡的使用类。商户可以将商户号余额付款至指定的收款银行账户。通过指定收款银行账户户名、卡号,以及收款银行信息即可实现付款。文档地址:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_1&index=1使用条件商户号(或同主体其他非服务商商户号)已入驻90日商户号(或同主体其他非服务商商户号)有30天连续正常交易登录微信支付商户平台-产品中心,开通企业付款。功能说明企业付款至银行卡只支持新资金流类型账户目前企业付款到银行卡支持17家银行,更多银行逐步开放中付款到账实效为1-3日,最快次日到账每笔按付款金额收取手续费,按金额0.1%收取,最低1元,最高25元,如果商户开通了运营账户,手续费和付款的金额都从运营账户出。如果没有开通,则都从基本户出。每个商户号每天可以出款100万,单商户给同一银行卡付款每天限额5万发票:在账户中心-发票信息页面申请开票的商户会按月收到发票(已申请的无需重复申请)。企业付款到银行卡发票与交易手续费发票为拆分单独开具。代码<?php namespace Jykj\\Balance\\Weixin; /*************************************************************** * 企业付款到零钱、企业付款到银行卡、查询企业付款;证书的加密,解密。有问题邮件联系我 * Copyright notice * * (c) Wang Hongbin <wanghongbin@ngoos.org>, 极益科技 * * @Author: Wang Hongbin * @Email: wanghongbin@ngoos.org * @Date: 2018-06-13 11:29:39 * @Last Modified by: Wang Hongbin * @Last Modified time: 2018-06-13 16:50:46 ***************************************************************/ class WxPubApi { private $params; private $paths = ""; // 证书存放路径 private $cpath = ""; // 公钥路径 private $kpath = ""; // 私钥路径 const KEY = ''1111111111111111111111111111qq''; // 32位 const MCHID = ''1111111111''; // 商户号 const APPID = ''wxdwdq1312312qweqw''; const SECRET = ''asdddddddddddddddddddddddddddd''; const PAYURL = ''https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers''; const SEPAYURL = "https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo"; const BANKPAY = "https://api.mch.weixin.qq.com/mmpaysptrans/pay_bank"; const PKURL = "https://fraud.mch.weixin.qq.com/risk/getpublickey"; public function __construct(){ $this->paths = dirname(__FILE__).''/cert/''; $this->cpath = dirname(__FILE__).''/cert/apiclient_cert.pem''; $this->kpath = dirname(__FILE__).''/cert/apiclient_key.pem''; } /** * 付款到零钱 * @param [type] $data [description] * @return [type] [description] */ public function createComPay($data){ //构建原始数据 $this->params = [ ''mch_appid'' => self::APPID,//APPid, ''mchid'' => self::MCHID,//商户号, ''nonce_str'' => strtoupper(md5(time())), //随机字符串 ''partner_trade_no'' => $data[''trade_no''], //商户订单号 ''openid'' => $data[''openid''], //用户openid ''check_name'' => ''NO_CHECK'',//校验用户姓名选项 NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名 //''re_user_name'' => '''',//收款用户姓名 如果check_name设置为FORCE_CHECK,则必填用户真实姓名 ''amount'' => $data[''price''],//金额 单位分 ''desc'' => $data[''desc''],//付款描述 ''spbill_create_ip'' => $_SERVER[''SERVER_ADDR''],//调用接口机器的ip地址 ]; //将数据发送到接口地址 return $this->SendData(self::PAYURL); } /** * 转账到银行卡 * @param [type] $data [description] * @return [type] [description] */ public function createBankPay($data){ $this->params = [ ''mch_id'' => self::MCHID,//商户号 ''partner_trade_no'' => date(''YmdHis''),//商户付款单号 ''nonce_str'' => strtoupper(md5(time())), //随机串 ''enc_bank_no'' => $data[''enc_bank_no''],//收款方银行卡号RSA加密 ''enc_true_name'' => $data[''enc_true_name''],//收款方姓名RSA加密 ''bank_code'' => $data[''bank_code''],//收款方开户行 ''amount'' => $data[''amount''],//付款金额 ]; //将数据发送到接口地址 return $this->SendData(self::BANKPAY); } /** * 查询订单 * @param [type] $oid [description] * @return [type] [description] */ public function searchPayByOrder($oid){ $this->params = [ ''nonce_str'' => md5(time()),//随机串 ''partner_trade_no'' => $oid, //商户订单号 ''mch_id'' => self::MCHID,//商户号 ''appid'' => self::APPID //APPID ]; //将数据发送到接口地址 return $this->SendData(self::SEPAYURL); } /** * 获取公钥 * @return [type] [description] */ public function getRsaPuyKey(){ $this->params = [ ''mch_id'' => self::MCHID,//商户ID ''nonce_str'' => strtoupper(MD5(time())), ''sign_type'' => ''MD5'' ]; //将数据发送到接口地址 $pubkey = $this->SendData(self::PKURL); file_put_contents($this->paths.''pubkey.pem'', $pubkey[''pub_key'']); return $pubkey; } public function getSign($params=array()){ //去除空值 $params = array_filter($params); if(isset($params[''sign''])) unset($params[''sign'']); //按照键名字典排序 ksort($params); //生成url格式的字符串 $str = $this->arrToUrl($params).''&key=''.self::KEY; $params[''sign''] = strtoupper(md5($str)); return $params; } public function arrToUrl($arr){ return urldecode(http_build_query($arr)); } /** * 获取随机数 * @param integer $length [description] * @return [type] [description] */ public function getRandomKeys($length=30) { $str = ''ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz''; $key = null; for ($i = 0; $i < $length; $i++) { $key .= $pattern{mt_rand(0, 30)}; //生成php随机数 } return $key; } //数组转xml public function ArrToXml($arr){ if(!is_array($arr) || count($arr) == 0) return ''''; $xml = "<xml>"; foreach ($arr as $key=>$val){ if (is_numeric($val)){ $xml.="<".$key.">".$val."</".$key.">"; }else{ $xml.="<".$key."><![CDATA[".$val."]]></".$key.">"; } } $xml.="</xml>"; return $xml; } //Xml转数组 public function XmlToArr($xml){ if($xml == '''') return ''''; libxml_disable_entity_loader(true); $arr = json_decode(json_encode(simplexml_load_string($xml, ''SimpleXMLElement'', LIBXML_NOCDATA)), true); return $arr; } /** * 下面是写死的东西不需要改变 //通用发送CURL接口 * @param [type] $data [description] * @param [type] $url [description] */ public function SendCurl($data,$url){ $ch = curl_init(); //接口地址 $MENU_URL = $url; curl_setopt($ch,CURLOPT_URL, $MENU_URL); curl_setopt($ch,CURLOPT_CUSTOMREQUEST,"POST"); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST, FALSE); //证书地址,微信支付下面 curl_setopt($ch,CURLOPT_SSLCERT,$this->cpath); curl_setopt($ch,CURLOPT_SSLKEY,$this->kpath); // curl_setopt($ch, CURLOPT_USERAGENT, ''Mozilla/5.0 (compatible; MSIE 5.01; // Windows NT 5.0)''); //curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, 1 ); curl_setopt($ch,CURLOPT_AUTOREFERER,1); curl_setopt($ch,CURLOPT_POSTFIELDS, $data); curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); $info = curl_exec($ch); if (curl_errno($ch)) { //echo ''Errno'' . curl_error ( $ch ); exit(''CURL执行失败''); } curl_close($ch); return $info; } /** * 发送数据包 * @param [type] $url [description] * @return [type] [description] */ public function SendData($url){ $params = $this->getSign($this->params); $xmldata = $this->ArrToXml($params); $returnData = $this->SendCurl($xmldata,$url); return $this->XmlToArr($returnData); } } /** * 公钥,秘钥的加密,解密 */ class WxRSA { private $public_key_resource = ''''; //公钥资源 private $private_key_resource = ''''; //私钥资源 /** * 构造函数 * @param [string] $public_key [公钥数据字符串] * @param [string] $private_key [私钥数据字符串] */ public function __construct($public_key,$private_key) { $this->public_key_resource = !empty($public_key) ? openssl_pkey_get_public($this->get_public_key($public_key)) : false; $this->private_key_resource = !empty($private_key) ? openssl_pkey_get_private($this->get_private_key($private_key)) : false; } /** * 获取私有key字符串 重新格式化 为保证任何key都可以识别 */ public function get_private_key($private_key){ $search = [ "-----BEGIN RSA PRIVATE KEY-----", "-----END RSA PRIVATE KEY-----", "\\n", "\\r", "\\r\\n" ]; $private_key=str_replace($search,"",$private_key); return $search[0] . PHP_EOL . wordwrap($private_key, 64, "\\n", true) . PHP_EOL . $search[1]; } /** * 获取公共key字符串 重新格式化 为保证任何key都可以识别 */ public function get_public_key($public_key){ $search = [ "-----BEGIN PUBLIC KEY-----", "-----END PUBLIC KEY-----", "\\n", "\\r", "\\r\\n" ]; $public_key=str_replace($search,"",$public_key); return $search[0] . PHP_EOL . wordwrap($public_key, 64, "\\n", true) . PHP_EOL . $search[1]; } /** * 生成一对公私钥 成功返回 公私钥数组 失败 返回 false */ public function create_key() { $res = openssl_pkey_new(); if($res == false) return false; openssl_pkey_export($res, $private_key); $public_key = openssl_pkey_get_details($res); return array(''public_key''=>$public_key["key"],''private_key''=>$private_key); } /** * 用私钥加密 */ public function private_encrypt($input) { openssl_private_encrypt($input,$output,$this->private_key_resource); return base64_encode($output); } /** * 解密 私钥加密后的密文 */ public function public_decrypt($input) { openssl_public_decrypt(base64_decode($input),$output,$this->public_key_resource); return $output; } /** * 用公钥加密 */ public function public_encrypt($input) { openssl_public_encrypt($input,$output,$this->public_key_resource,OPENSSL_PKCS1_OAEP_PADDING); return base64_encode($output); } /** * 解密 公钥加密后的密文 */ public function private_decrypt($input) { openssl_private_decrypt(base64_decode($input),$output,$this->private_key_resource,OPENSSL_PKCS1_OAEP_PADDING); return $output; } }
2019年03月13日
1,024 阅读
0 评论
0 点赞
2019-03-13
如何创建属于你自己的域名邮箱-腾讯云
首先,你要有一个域名 打开腾讯云->域名注册->注册域名网址点击腾讯域名邮箱创建域名邮箱(即输入您注册的域名网址)如下图到腾讯云控制台->域名管理->解析 添加一个CNAME记录 和MX记录(复制粘贴即可)配置完成后,登录域名邮箱至此,你的域名邮箱就开通完成了,相比较一贯使用的数字(QQ号)邮箱,这个域名邮箱简直就是高大上有木有。设置一个管理员邮箱后,你可以更换邮箱的标志图片。还可以建立多个相同后缀的帐号,分别送给朋友使用。
2019年03月13日
686 阅读
0 评论
0 点赞
2019-03-01
宝塔面板切换免费版/专业版方法(亲测可用)
安装宝塔面板:如果第一次使用宝塔面板,先安装免费版 如果已安装免费版 就可以跳过第一步了宝塔免费版安装命令(centos):yum install -y wget && wget -O install.sh http://download.bt.cn/install/install.sh && sh install.sh升级专业版命令:wget -O update.sh http://download.bt.cn/install/update_pro.sh && bash update.sh pro破解方法注意:修改前记得提前备份,养成良好习惯很重要!修改文件在服务器路径 /www/server/panel/class 找到 common.py 文件,使用编辑器打开 common.py 文件,找到 164行(5.9版本) 将data = panelAuth().get_order_status(None)替换成data = { 'status' : True, 'msg' : {'endtime' : 32503651199 } }重建用户登录信息修改完成后,进入路径 /wwwrver/panel/data 找到 userInfo.json 文件 删除重新建一个空的 userInfo.json 文件即可!(清空原本的登录信息)重启宝塔面板/etc/init.d/bt restart后记这种方法有个缺陷:一旦绑定了宝塔账号的话,那所有操作都白做了,还是免不了要老老实实缴费。。再者,这种方法只是一种投机取巧的办法,开发不易,还是尽量支持正版吧。
2019年03月01日
702 阅读
0 评论
0 点赞