magento2 添加支付方式payment method

 更新时间:2016年11月25日 15:35  点击:1617
下面我们一直来看看magento2 添加支付方式payment method,有兴趣的可以和111cn小编一起来看看吧,希望例子对各位用。

一:启动文件 \app\code\Inchoo\Stripe\etc\module.xml

<?xml version="1.0"?>

<config xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance
" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">

<module name="More_Payment" schema_version="1.0.0.0" active="true">

<sequence>

<module name="Magento_Sales"/>

<module name="Magento_Payment"/>

</sequence>

<depends>

<module name="Magento_Sales"/>

<module name="Magento_Payment"/>

</depends>

</module>

</config>

二:配置文件config.xml \app\code\Inchoo\Stripe\etc\config.xml

<?xml version="1.0"?>

<config xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance
" xsi:noNamespaceSchemaLocation="../../../Magento/Core/etc/config.xsd">

<default>

<payment>

<more_payment>

<active>1</active>

<model>More\Payment\Model\Payment</model>

<payment_action>authorize_capture</payment_action>

<title>Payment</title>

<api_key backend_model="Magento\Backend\Model\Config\Backend\Encrypted" />

<cctypes>AE,VI,MC,DI,JCB</cctypes>

<allowspecific>1</allowspecific>

<min_order_total>0.50</min_order_total>

</more_payment>

</payment>

</default>

</config>


三:后台配置文件 app\code\Inchoo\Stripe\etc\adminhtml\system2.xml

<?xml version="1.0"?>

<config xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance
" xsi:noNamespaceSchemaLocation="../../../../Magento/Backend/etc/system_file.xsd">

<system>

<section id="payment" translate="label" type="text" sortOrder="400" showInDefault="1" showInWebsite="1" showInStore="1">

<group id="more_payment" translate="label" type="text" sortOrder="50" showInDefault="1" showInWebsite="1" showInStore="1">

<label>Payment</label>

 

<field id="active" translate="label" type="select" sortOrder="1" showInDefault="1" showInWebsite="1" showInStore="0">

<label>Enabled</label>

<source_model>Magento\Backend\Model\Config\Source\Yesno</source_model>

</field>

<field id="title" translate="label" type="text" sortOrder="2" showInDefault="1" showInWebsite="1" showInStore="1">

<label>Title</label>

</field>

<field id="api_key" translate="label" type="obscure" sortOrder="3" showInDefault="1" showInWebsite="1" showInStore="0">

<label>Api Key</label>

<backend_model>Magento\Backend\Model\Config\Backend\Encrypted</backend_model>

</field>

<field id="debug" translate="label" type="select" sortOrder="4" showInDefault="1" showInWebsite="1" showInStore="0">

<label>Debug</label>

<source_model>Magento\Backend\Model\Config\Source\Yesno</source_model>

</field>

<field id="cctypes" translate="label" type="multiselect" sortOrder="5" showInDefault="1" showInWebsite="1" showInStore="0">

<label>Credit Card Types</label>

<source_model>More\Payment\Model\Source\Cctype</source_model>

</field>

<field id="sort_order" translate="label" type="text" sortOrder="100" showInDefault="1" showInWebsite="1" showInStore="0">

<label>Sort Order</label>

</field>

<field id="allowspecific" translate="label" type="allowspecific" sortOrder="50" showInDefault="1" showInWebsite="1" showInStore="0">

<label>Payment from Applicable Countries</label>

<source_model>Magento\Payment\Model\Config\Source\Allspecificcountries</source_model>

</field>

<field id="specificcountry" translate="label" type="multiselect" sortOrder="51" showInDefault="1" showInWebsite="1" showInStore="0">

<label>Payment from Specific Countries</label>

<source_model>Magento\Directory\Model\Config\Source\Country</source_model>

</field>

<field id="min_order_total" translate="label" type="text" sortOrder="98" showInDefault="1" showInWebsite="1" showInStore="0">

<label>Minimum Order Total</label>

</field>

<field id="max_order_total" translate="label" type="text" sortOrder="99" showInDefault="1" showInWebsite="1" showInStore="0">

<label>Maximum Order Total</label>

<comment>Leave empty to disable limit</comment>

</field>

</group>

</section>

</system>

</config>


四:model类 因为我们在config.xml配置了model,所以前台点击保存支付方式的时候 触发

<?php

 

namespace More\Payment\Model;

 

class Payment extends \Magento\Payment\Model\Method\Cc

{

const CODE = 'more_payment';

 

protected $_code = self::CODE;

 

protected $_isGateway = true;

protected $_canCapture = true;

protected $_canCapturePartial = true;

protected $_canRefund = true;

protected $_canRefundInvoicePartial = true;

 

protected $_stripeApi = false;

 

protected $_minAmount = null;

protected $_maxAmount = null;

protected $_supportedCurrencyCodes = array('USD');

 

public function __construct(

\Magento\Framework\Event\ManagerInterface $eventManager,

\Magento\Payment\Helper\Data $paymentData,

\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,

\Magento\Framework\Logger\AdapterFactory $logAdapterFactory,

\Magento\Framework\Logger $logger,

\Magento\Framework\Module\ModuleListInterface $moduleList,

\Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,

\Magento\Centinel\Model\Service $centinelService,

\Stripe\Api $stripe,

array $data = array()

) {

parent::__construct($eventManager, $paymentData, $scopeConfig, $logAdapterFactory, $logger, $moduleList, $localeDate, $centinelService, $data);

 

$this->_stripeApi = $stripe;

// $this->_stripeApi->setApiKey(

// $this->getConfigData('api_key')

// );

 

$this->_minAmount = $this->getConfigData('min_order_total');

$this->_maxAmount = $this->getConfigData('max_order_total');

}

 

/**

* 支付捕获方法

* *

* @param \Magento\Framework\Object $payment

* @param float $amount

* @return $this

* @throws \Magento\Framework\Model\Exception

*/

public function capture(\Magento\Framework\Object $payment, $amount)

{

/** @var Magento\Sales\Model\Order $order */

$order = $payment->getOrder();

 

/** @var Magento\Sales\Model\Order\Address $billing */

$billing = $order->getBillingAddress();

 

try {

$charge = \Stripe_Charge::create(array(

'amount' => $amount * 100,

'currency' => strtolower($order->getBaseCurrencyCode()),

'description' => sprintf('#%s, %s', $order->getIncrementId(), $order->getCustomerEmail()),

'card' => array(

'number' => $payment->getCcNumber(),

'number' => $payment->getCcNumber(),

'exp_month' => sprintf('%02d',$payment->getCcExpMonth()),

'exp_year' => $payment->getCcExpYear(),

'cvc' => $payment->getCcCid(),

'name' => $billing->getName(),

'address_line1' => $billing->getStreet(1),

'address_line2' => $billing->getStreet(2),

'address_zip' => $billing->getPostcode(),

'address_state' => $billing->getRegion(),

'address_country' => $billing->getCountry(),

),

));

 

$payment

->setTransactionId($charge->id)

->setIsTransactionClosed(0);

} catch (\Exception $e) {

$this->debugData($e->getMessage());

$this->_logger->logException(__('Payment capturing error.'));

throw new \Magento\Framework\Model\Exception(__('Payment capturing error.'));

}

 

return $this;

}

 

/**

* Payment refund

*

* @param \Magento\Framework\Object $payment

* @param float $amount

* @return $this

* @throws \Magento\Framework\Model\Exception

*/

public function refund(\Magento\Framework\Object $payment, $amount)

{

$transactionId = $payment->getParentTransactionId();

 

try {

\Stripe_Charge::retrieve($transactionId)->refund();

} catch (\Exception $e) {

$this->debugData($e->getMessage());

$this->_logger->logException(__('Payment refunding error.'));

throw new \Magento\Framework\Model\Exception(__('Payment refunding error.'));

}

 

$payment

->setTransactionId($transactionId . '-' . \Magento\Sales\Model\Order\Payment\Transaction::TYPE_REFUND)

->setParentTransactionId($transactionId)

->setIsTransactionClosed(1)

->setShouldCloseParentTransaction(1);

 

return $this;

}

 

/**

* Determine method availability based on quote amount and config data

*

* @param null $quote

* @return bool

*/

public function isAvailable($quote = null)

{

if ($quote && (

$quote->getBaseGrandTotal() < $this->_minAmount

|| ($this->_maxAmount && $quote->getBaseGrandTotal() > $this->_maxAmount))

) {

return false;

}

 

// if (!$this->getConfigData('api_key')) {

// return false;

// }

 

return parent::isAvailable($quote);

}

 

/**

* Availability for currency

*

* @param string $currencyCode

* @return bool

*/

public function canUseForCurrency($currencyCode)

{

if (!in_array($currencyCode, $this->_supportedCurrencyCodes)) {

return false;

}

return true;

}

}

 

一聚教程小编为各位介绍一篇php 部分缓存数据库返回数据的例子,这个例子其实是非常的实用了,希望能够帮助到大家。

$cache = new FileCache();
$new_arr = $cache->get('gsmcache');//yourkey是你为每一个要缓存的数据定义的缓存名字
if ($new_arr===false) {
 
$new_arr="数据库返回的数据";
 
$cache->set('gsmcache',$new_arr,3600);//缓存3600秒
 
}
 

<?php
/**
* 文件缓存类
*
* @copyright blog.itiwin.cn
* @author  More
* @package cache
* @version v0.1
*/
class FileCache {
/**
* @var string $cachePath 缓存文件目录
* @access public
*/
public $cachePath = './';
 
/**
* 构造函数
* @param string $path 缓存文件目录
*/
function __construct($path = NULL) {
if ($path) {
$this->cachePath = $path;
}
}
 
/**
* 析构函数
*/
function __destruct() {
//nothing
}
 
/**
* 在cache中设置键为$key的项的值,如果该项不存在,则新建一个项
* @param string $key 键值
* @param mix $var 值
* @param int $expire 到期秒数
* @param int $flag 标志位
* @return bool 如果成功则返回 TRUE,失败则返回 FALSE。
* @access public
*/
public function set($key, $var, $expire = 36000, $flag = 0) {
$value = serialize($var);
$timeout = time() + $expire;
$result = safe_file_put_contents($this->cachePath . urlencode($key) .'.cache',
$timeout . '<<%-==-%>>' . $value);
return $result;
}
 
/**
* 在cache中获取键为$key的项的值
* @param string $key 键值
* @return string 如果该项不存在,则返回false
* @access public
*/
public function get($key) {
$file = $this->cachePath . urlencode($key) .'.cache';
if (file_exists($file)) {
$content = safe_file_get_contents($file);
if ($content===false) {
return false;
}
$tmp = explode('<<%-==-%>>', $content);
$timeout = $tmp[0];
$value = $tmp[1];
if (time()>$timeout) {
 
$this->delete($key) ;//删除文件过期的
$result = false;
} else {
$result = unserialize($value);
}
} else {
$result = false;
}
return $result;
}
 
/**
* 清空cache中所有项
* @return 如果成功则返回 TRUE,失败则返回 FALSE。
* @access public
*/
public function flush() {
$fileList = FileSystem::ls($this->cachePath,array(),'asc',true);
return FileSystem::rm($fileList);
}
 
/**
* 删除在cache中键为$key的项的值
* @param string $key 键值
* @return 如果成功则返回 TRUE,失败则返回 FALSE。
* @access public
*/
public function delete($key) {
return FileSystem::rm($this->cachePath . $key .'.cache');
}
}
 
if (!function_exists('safe_file_put_contents')) {
function safe_file_put_contents($filename, $content)
{
$fp = fopen($filename, 'wb');
if ($fp) {
flock($fp, LOCK_EX);
fwrite($fp, $content);
flock($fp, LOCK_UN);
fclose($fp);
return true;
} else {
return false;
}
}
}
 
if (!function_exists('safe_file_get_contents')) {
function safe_file_get_contents($filename)
{
$fp = fopen($filename, 'rb');
if ($fp) {
flock($fp, LOCK_SH);
clearstatcache();
$filesize = filesize($filename);
if ($filesize > 0) {
$data = fread($fp, $filesize);
}
flock($fp, LOCK_UN);
fclose($fp);
return $data;
} else {
return false;
}
}
}
 

本文章来为各位介绍php中Yaf框架集成zendframework2的例子,有兴趣的可以和一聚教程小编一起来看看,具体操作如下。


php框架 Yaf集成zendframework2, zf2的orm 可以作为独立模块用到yaf中,而且zf2 composer service manger  cacheStorage 都可以集成到yaf中。

一:public\index.php 加入composer

chdir(dirname(__DIR__));

 

// Decline static file requests back to the PHP built-in webserver

if (php_sapi_name() === 'cli-server' && is_file(__DIR__ . parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH))) {

return false;

}

 

// Setup autoloading

require 'init_autoloader.php';

 

// Define path to application directory

define("APP_PATH", dirname(__DIR__));

 

// Create application, bootstrap, and run

$app = new Yaf_Application(APP_PATH . "/conf/application.ini");

$app->bootstrap()->run();


根目录 存放 init_autoloader.php

二:导入ZF2 模块组件

vendor\ZF2  见页尾下载包

三:更改bootstrap配置文件

<?php

 

use Zend\ServiceManager\ServiceManager;

use Zend\Mvc\Service\ServiceManagerConfig;

use Zend\ModuleManager\Listener\ConfigListener;

use Zend\ModuleManager\Listener\ListenerOptions;

use Zend\ModuleManager\ModuleEvent;

 

class Bootstrap extends Yaf_Bootstrap_Abstract {

 

public function _initConfig() {

$config = Yaf_Application::app()->getConfig();

Yaf_Registry::set("config", $config);

}

 

public function _initServiceManager() {

$configuration = require APP_PATH . '/conf/application.config.php';

$smConfig = isset($configuration['service_manager']) ? $configuration['service_manager'] : array();

$serviceManager = new ServiceManager(new ServiceManagerConfig($smConfig));

$serviceManager->setService('ApplicationConfig', $configuration);

 

$configListener = new ConfigListener(new ListenerOptions($configuration['module_listener_options']));

 

// If not found cache, merge config

if (!$configListener->getMergedConfig(false)) $configListener->onMergeConfig(new ModuleEvent);

 

// If enabled, update the config cache

if ($configListener->getOptions()->getConfigCacheEnabled() &&

!file_exists($configListener->getOptions()->getConfigCacheFile())) {

//echo "debug";

$configFile = $configListener->getOptions()->getConfigCacheFile();

$content = "<?php\nreturn " . var_export($configListener->getMergedConfig(false), 1) . ';';

file_put_contents($configFile, $content);

}

 

$serviceManager->setService('config', $configListener->getMergedConfig(false));

 

Yaf_Registry::set('ServiceManager', $serviceManager);

}

 

public function _initSessionManager() {

Yaf_Registry::get('ServiceManager')->get('Zend\Session\SessionManager');

}

 

public function _initPlugin(Yaf_Dispatcher $dispatcher) {

$user = new UserPlugin();

$dispatcher->registerPlugin($user);

}

 

}

四:mvc测试

<?php

 

use Zend\Session\Container as SessionContainer;

use Zend\Db\TableGateway\TableGateway;

 

class IndexController extends Yaf_Controller_Abstract {

 

public function indexAction() {

 

$adapter = $this->getDbAdapter();

 

$table = new TableGateway('zt_user', $adapter);

 

$entities = $table->select();

foreach ($entities as $entity) {

var_dump($entity->username);

}

 

$cache = $this->getStorage();

$cache->setItem('cache', 'cachedata');

 

echo $cache->getItem('cache');

$this->getLogger()->alert('log');

 

$this->getView()->assign("content", "Hello World");

}

 

/**

* db adapter

* @return \Zend\Db\Adapter\Adapter

*/

public function getDbAdapter() {

return Yaf_Registry::get('ServiceManager')->get('Zend\Db\Adapter\Adapter');

}

 

/**

* storage

* @return \Zend\Cache\Storage\StorageInterface

*/

protected function getStorage() {

return Yaf_Registry::get('ServiceManager')->get('Zend\Cache\Storage\StorageInterface');

}

 

/**

* logger

* @return \Zend\Log\Zend\Log\Logger

*/

protected function getLogger() {

return Yaf_Registry::get('ServiceManager')->get('Zend\Log\Logger');

}

 

}


这样你访问public下的index.php 会输出hello word字样

现在移动端兴起,很多地方都要运用接口为它们传输数据,那么是用xml好还是用json好呢?个人觉得用json是不错的选择。我从以下几点分析一下:

1. xml标签要成对的书写,比如

<list><name>XXX</name><name>XXX</name></list>,而json写法是{"name":"XXX","name":"XXX"},

所以很明显json更节约传输的容量。

2. json生成和解析数据都比较简单,以php为例,只需用一个json_encode函数就可以将一个数组转为json数据了,而xml生成过程相对会麻烦一点。

3. json扩展比较方便,解析速度也较快一点。

所以项目中没有特别的规定,还是用json比较好。
 

文件异步上传通常是通过ajax实现了,也有朋友说使用iframe来实现这个虽然说可以达到目的但不是真正的a异步上传了并且如果浏览器不支持irame那么iframe模仿上传就无效了,下面我们来看一段真正的文件异步上传例子。

PHP 代码:

$fileName = $_FILES['afile']['name'];
$fileType = $_FILES['afile']['type'];
$fileContent = file_get_contents($_FILES['afile']['tmp_name']);
$dataUrl = 'data:' . $fileType . ';base64,' . base64_encode($fileContent);

$json = json_encode(array(
  'name' => $fileName,
  'type' => $fileType,
  'dataUrl' => $dataUrl,
  'username' => $_REQUEST['username'],
  'accountnum' => $_REQUEST['accountnum']
));

echo $json;


Html 及 JS 代码

<!DOCTYPE html>
<!--
Copyright 2012 Google Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Author: Eric Bidelman (ericbidelman@chromium.org)
-->
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />
<title>xhr.send(FormData) Example</title>
</head>
<body>
 
<input type="file" name="afile" id="afile" accept="image/*"/>
 
<script>
document.querySelector('#afile').addEventListener('change', function(e) {
  var file = this.files[0];

  var fd = new FormData();
  fd.append("afile", file);
  // These extra params aren't necessary but show that you can include other data.
  fd.append("username", "Groucho");
  fd.append("accountnum", 123456);

  var xhr = new XMLHttpRequest();
  xhr.open('POST', 'handle_file_upload.php', true);
 
  xhr.upload.onprogress = function(e) {
    if (e.lengthComputable) {
      var percentComplete = (e.loaded / e.total) * 100;
      console.log(percentComplete + '% uploaded');
    }
  };

  xhr.onload = function() {
    if (this.status == 200) {
      var resp = JSON.parse(this.response);

      console.log('Server got:', resp);

      var image = document.createElement('img');
      image.src = resp.dataUrl;
      document.body.appendChild(image);
    };
  };

  xhr.send(fd);
}, false);
</script>
<!--[if IE]>
<script src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js"></script>
<script>CFInstall.check({mode: 'overlay'});</script>
<![endif]-->
</body>
</html>

[!--infotagslink--]

相关文章

  • php中网页添加到桌面快捷方式方法

    我们经常会在网站中看到可以直接把网站以快捷方式保存到自己的电脑中,然后只要点击就可以实现进入网了,那么php中怎么把网页添加到桌面快捷方式呢。 功能简单,直接上...2016-11-25
  • PHP用DOM方式处理HTML之《Simple HTML DOM》

    近经常需要采集一些网上的数据,发现一个PHP处理HTML的利器 simple html dom,看了一下文档,使用非常方便,关键是能够用CSS选择器来访问DOM树,和jquery相似,实在是难得的利器...2016-11-25
  • PHP开发微信支付的代码分享

    微信支付,即便交了保证金,你还是处理测试阶段,不能正式发布。必须到你通过程序测试提交订单、发货通知等数据到微信的系统中,才能申请发布。然后,因为在微信中是通过JS方式调用API,必须在微信后台设置支付授权目录,而且要到...2014-05-31
  • ps中怎么设置垂直罗马对齐方式?垂直罗马对齐方式设置方法

    photoshop的直排文字工具,打出的字特别是英文字母,默认排列侧向的,如何调整为正向排列呢?下面我们就来看看标准的罗马对齐方式应该怎么设置。 1、在PS中点击“工具面...2017-01-22
  • 基于C#实现微信支付宝扫码支付功能

    为公司系统业务需要,这几天了解了一下微信和支付宝扫码支付的接口,并用c#实现了微信和支付宝扫码支付的功能。需要的朋友跟随小编一起看看吧...2020-06-25
  • C#中添加窗口的步骤详解

    下面小编就为大家带来一篇C#中添加窗口的步骤详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • 关于python pygame游戏进行声音添加的技巧

    这篇文章主要给大家分享的是pygame游戏进行声音添加的方法,这文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!...2021-10-23
  • javascript 判断页面访问方式电脑或者移动端

    这篇文章主要介绍了 判断页面访问方式电脑或者移动端的相关资料,这里提供了三种方法,需要的朋友可以参考下...2016-10-03
  • JQuery EasyUI学习教程之datagrid 添加、修改、删除操作

    这篇文章主要介绍了JQuery EasyUI datagrid 添加、修改、删除操作的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2016-07-25
  • 美图秀秀怎么给照片添加电影字幕

    美图秀秀是一款不错的图片处理软件了,最近看到很多的朋友喜欢把自己的照片处理成电影字幕效果了,下面我们来看看美图秀秀怎么给照片添加电影字幕吧,希望文章对各位有帮助...2016-09-14
  • PHP在引号前面添加反斜杠(PHP去除反斜杠)

    一般空间商提供的服务器空间默认PHP 指令 magic_quotes_gpc是on的,也就是打开的。这时候就可以用stripslashes() 函数删除自动添加的反斜杠。用法就是:比如包含字符串的变量是$str,那么就用stripslashes() 函数处理一下...2013-10-04
  • iOS APP实现微信H5支付示例总结

    这篇文章主要介绍了iOS APP实现微信H5支付示例总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-30
  • 如何在.Net版本UEditor中添加一个普通按钮

    这篇文章主要介绍了如何在.Net版本UEditor中添加一个普通按钮,需要的朋友可以参考下...2021-09-22
  • JS动态的把左边列表添加到右边的实现代码(可上下移动)

    在javascript前端开发过程中经常见到动态的把左边列表添加到右边,基于js代码怎么实现的呢?今天小编通过本文给大家介绍下js 左边列表添加到右边的实现方法,感兴趣的朋友一起看看吧...2016-11-22
  • PS给绿色树林人物照片添加金色逆光效果

    PS给绿色树林人物照片添加金色逆光效果文章中,将会教大家如何添加逆光效果,想要学习该技能的同学请看下文介绍。 素材图片有点逆光,只是背景比较杂乱,效果不是很好...2016-12-15
  • js动态添加带圆圈序号列表的实例代码

    这篇文章主要介绍了js动态添加带圆圈序号列表的实例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-18
  • 微信小程序支付C#后端源码

    这篇文章主要为大家详细介绍了微信小程序支付C#后端源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • javaScript实现支付10秒倒计时

    这篇文章主要为大家详细介绍了javaScript实现支付10秒倒计时,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-10-28
  • 在idea 中添加和删除模块Module操作

    这篇文章主要介绍了在idea 中添加和删除模块Module操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-18
  • tableView 上添加Tableview 实现左右滑动功能

    本文章来为各位介绍一个关于tableView 上添加Tableview 实现左右滑动功能例子,希望这个例子可以帮助到各位android开发者吧。 有时候我们在使用tableView 的时候不...2016-09-20