前端技术
HTML
CSS
Javascript
前端框架和UI库
VUE
ReactJS
AngularJS
JQuery
NodeJS
JSON
Element-UI
Bootstrap
Material UI
服务端和客户端
Java
Python
PHP
Golang
Scala
Kotlin
Groovy
Ruby
Lua
.net
c#
c++
后端WEB和工程框架
SpringBoot
SpringCloud
Struts2
MyBatis
Hibernate
Tornado
Beego
Go-Spring
Go Gin
Go Iris
Dubbo
HessianRPC
Maven
Gradle
数据库
MySQL
Oracle
Mongo
中间件与web容器
Redis
MemCache
Etcd
Cassandra
Kafka
RabbitMQ
RocketMQ
ActiveMQ
Nacos
Consul
Tomcat
Nginx
Netty
大数据技术
Hive
Impala
ClickHouse
DorisDB
Greenplum
PostgreSQL
HBase
Kylin
Hadoop
Apache Pig
ZooKeeper
SeaTunnel
Sqoop
Datax
Flink
Spark
Mahout
数据搜索与日志
ElasticSearch
Apache Lucene
Apache Solr
Kibana
Logstash
数据可视化与OLAP
Apache Atlas
Superset
Saiku
Tesseract
系统与容器
Linux
Shell
Docker
Kubernetes
[持续集成中JSON格式的数据验证]的搜索结果
这里是文章列表。热门标签的颜色随机变换,标签颜色没有特殊含义。
点击某个标签可搜索标签相关的文章。
点击某个标签可搜索标签相关的文章。
转载文章
...TVM源码 1.4 验证安装是否成功 2. 配置vscode 3. 安装FFI Navigator 结束语 前言 本篇文章介绍一下 tvm 在linux环境下的安装与编译,以及如何使用vscode来配置tvm的远程连接调试环境。 所需软硬件环境: 环境 版本 local system windows 10 service system ubuntu 18.04 tvm latest(0.9.dev0) python(conda) python 3.8.13 local IDE vscode 1. 安装TVM 1.1 下载源码 从github上拉取源码git clone --recursive https://github.com/apache/tvm tvm --recursive指令:由于tvm依赖了很多第三方的开源库(子模块) 加入该参数之后也将相应的子模块一起进行clone 或者直接下载源码https://tvm.apache.org/download 1.2 创建虚拟环境及安装依赖库 使用conda创建tvm的虚拟python环境,python版本为3.8,虚拟环境名为tvmenv: conda create -n tvmenv python=3.8 编辑tvm目录下的conda/build-environment.yaml文件: conda/build-environment.yaml Build environment that can be used to build tvm.name: tvmenv The conda channels to lookup the dependencieschannels:- anaconda- conda-forge 将name的值改为刚刚创建的虚拟环境名tvmenv 执行下面的指令,将构建tvm所需的环境依赖更新到当前虚拟环境中: conda env update -f conda/build-environment.yaml conda env update -n tvmenv -f conda/build-environment.yaml 设置完之后需要重新deactivate/activate对环境进行激活 如果上述命令执行较慢,可以将conda换成国内源(建议使用北京外国语大学的开源镜像站):参考连接 然后修改conda/build-environment.yaml文件: channels:- defaults - anaconda - conda-forge 安装python依赖库: pip install decorator tornado psutil 'xgboost<1.6.0' cloudpickle -i https://pypi.tuna.tsinghua.edu.cn/simple 如果使用onnx或者pytorch作为原始模型,则还需要安装相应的依赖库pip install onnx onnxruntime -i https://pypi.tuna.tsinghua.edu.cn/simplepip install torch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 -i https://pypi.tuna.tsinghua.edu.cn/simple 在当前虚拟环境中添加用于tvm debug的环境变量: conda env config vars set TVM_LOG_DEBUG="ir/transform.cc=1,relay/ir/transform.cc=1" conda env config vars set TVM_LOG_DEBUG="ir/transform.cc=1,relay/ir/transform.cc=1" -n tvmenv 设置完之后需要重新deactivate/activate对环境进行激活是环境变量生效 使用这种方式设置环境变量的好处是:只有当前环境被激活(conda activate)时,自定义设置的环境变量才起作用,当conda deactivate后自定义的环境变量会自动清除。 当然,也可以更简单粗暴一些: export TVM_LOG_DEBUG="ir/transform.cc=1,relay/ir/transform.cc=1" 在当前虚拟环境中添加用于tvm python的环境变量: export TVM_HOME=your tvm pathexport PYTHONPATH=$TVM_HOME/python:${PYTHONPATH} 1.3 编译TVM源码 如果linux上没有安装C/C++的编译环境,需要进行安装: 更新软件apt-get update 安装apt-get install build-essential 安装cmakeapt-get install cmake 在tvm目录下创建build文件夹,并将cmake/config.cmake文件复制到此文件夹中: mkdir buildcp cmake/config.cmake build/ 编辑build/config.cmake进行相关配置: 本次是在cpu上进行测试,因此没有配置cudaset(USE_LLVM ON) line 136set(USE_RELAY_DEBUG ON) line 285(建议先 OFF) 在末尾添加一个cmake的编译宏,确保编译出来的是debug版本set(CMAKE_BUILD_TYPE Debug) 编译tvm,这里开启了16个线程: cd buildcmake ..make -j 16 建议开多个线程,否则编译速度很慢哦 大约5分钟,即可生成我们需要的两个共享链接库:libtvm.so 和 libtvm_runtime.so 1.4 验证安装是否成功 tvm版本验证: import tvmprint(tvm.__version__) pytorch模型验证: from_pytorch.py https://tvm.apache.org/docs/how_to/compile_models/from_pytorch.html ps: TVM supports PyTorch 1.7 and 1.4. Other versions may be unstable.import tvmfrom tvm import relayfrom tvm.contrib.download import download_testdataimport numpy as np PyTorch importsimport torchimport torchvision Load a pretrained PyTorch model -------------------------------model_name = "resnet18"model = getattr(torchvision.models, model_name)(pretrained=True) or model = torchvision.models.resnet18(pretrained=True) or pth_file = 'resnet18-f37072fd.pth' model = torchvision.models.resnet18() ckpt = torch.load(pth_file) model.load_state_dict(ckpt)model = model.eval() We grab the TorchScripted model via tracinginput_shape = [1, 3, 224, 224]input_data = torch.randn(input_shape)scripted_model = torch.jit.trace(model, input_data).eval() Load a test image ----------------- Classic cat example!from PIL import Image img_url = "https://github.com/dmlc/mxnet.js/blob/main/data/cat.png?raw=true" img_path = download_testdata(img_url, "cat.png", module="data")img_path = 'cat.png'img = Image.open(img_path).resize((224, 224)) Preprocess the image and convert to tensorfrom torchvision import transformsmy_preprocess = transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),])img = my_preprocess(img)img = np.expand_dims(img, 0) Import the graph to Relay ------------------------- Convert PyTorch graph to Relay graph. The input name can be arbitrary.input_name = "input0"shape_list = [(input_name, img.shape)]mod, params = relay.frontend.from_pytorch(scripted_model, shape_list) Relay Build ----------- Compile the graph to llvm target with given input specification.target = tvm.target.Target("llvm", host="llvm")dev = tvm.cpu(0)with tvm.transform.PassContext(opt_level=3):lib = relay.build(mod, target=target, params=params) Execute the portable graph on TVM --------------------------------- Now we can try deploying the compiled model on target.from tvm.contrib import graph_executordtype = "float32"m = graph_executor.GraphModule(lib["default"](dev)) Set inputsm.set_input(input_name, tvm.nd.array(img.astype(dtype))) Executem.run() Get outputstvm_output = m.get_output(0) Look up synset name ------------------- Look up prediction top 1 index in 1000 class synset. synset_url = "".join( [ "https://raw.githubusercontent.com/Cadene/", "pretrained-models.pytorch/master/data/", "imagenet_synsets.txt", ] ) synset_name = "imagenet_synsets.txt" synset_path = download_testdata(synset_url, synset_name, module="data") https://raw.githubusercontent.com/Cadene/pretrained-models.pytorch/master/data/imagenet_synsets.txtsynset_path = 'imagenet_synsets.txt'with open(synset_path) as f:synsets = f.readlines()synsets = [x.strip() for x in synsets]splits = [line.split(" ") for line in synsets]key_to_classname = {spl[0]: " ".join(spl[1:]) for spl in splits} class_url = "".join( [ "https://raw.githubusercontent.com/Cadene/", "pretrained-models.pytorch/master/data/", "imagenet_classes.txt", ] ) class_name = "imagenet_classes.txt" class_path = download_testdata(class_url, class_name, module="data") https://raw.githubusercontent.com/Cadene/pretrained-models.pytorch/master/data/imagenet_classes.txtclass_path = 'imagenet_classes.txt'with open(class_path) as f:class_id_to_key = f.readlines()class_id_to_key = [x.strip() for x in class_id_to_key] Get top-1 result for TVMtop1_tvm = np.argmax(tvm_output.numpy()[0])tvm_class_key = class_id_to_key[top1_tvm] Convert input to PyTorch variable and get PyTorch result for comparisonwith torch.no_grad():torch_img = torch.from_numpy(img)output = model(torch_img) Get top-1 result for PyTorchtop1_torch = np.argmax(output.numpy())torch_class_key = class_id_to_key[top1_torch]print("Relay top-1 id: {}, class name: {}".format(top1_tvm, key_to_classname[tvm_class_key]))print("Torch top-1 id: {}, class name: {}".format(top1_torch, key_to_classname[torch_class_key])) 2. 配置vscode 安装两个vscode远程连接所需的两个插件,具体如下图所示: 安装完成之后,在左侧工具栏会出现一个图标,点击图标进行ssh配置: ssh yourname@yourip -A 然后右键选择在当前窗口进行连接: 除此之外,还可以设置免费登录,具体可参考这篇文章。 当然,也可以使用windows本地的WSL2,vscode连接WSL还需要安装WSL和Dev Containers这两个插件。 在服务器端执行code .会自动安装vscode server,安装位置在用户的根目录下: 3. 安装FFI Navigator 由于TVM是由Python和C++混合开发,且大多数的IDE仅支持在同一种语言中查找函数定义,因此对于跨语言的FFI 调用,即Python跳转到C++或者C++跳转到Python,vscode是做不到的。虽然解决这个问题在技术上可能非常具有挑战性,但我们可以通过构建一个与FFI注册码模式匹配并恢复必要信息的项目特定分析器来解决这个问题,FFI Navigator就这样诞生了,作者仍然是陈天奇博士。 安装方式如下: 建议使用源码安装git clone https://github.com/tqchen/ffi-navigator.git 安装python依赖cd ffi-navigator/pythonpython setyp.py install vscode需要安装FFI Navigator插件,直接搜索安装即可(安装到服务器端)。 最后需要在.vscode/setting.json进行配置,内容如下: {"python.analysis.extraPaths": ["${workspaceFolder}/python"], // 添加额外导入路径, 告诉pylance自定义的python库在哪里"ffi_navigator.pythonpath": "/home/liyanpeng/anaconda3/envs/tvmenv/bin/python", // 配置FFI Navigator"python.defaultInterpreterPath": "/home/liyanpeng/anaconda3/envs/tvmenv/bin/python","files.associations": {"type_traits": "cpp","fstream": "cpp","thread": "cpp",".tcc": "cpp"} } 更详细内容可以参考项目链接。 结束语 对于vscode的使用技巧及C/C++相关的配置,这里不再详细的介绍了,感兴趣的小伙伴们可以了解下。 本篇文章为转载内容。原文链接:https://blog.csdn.net/qq_42730750/article/details/126723224。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-12-12 20:04:26
88
转载
转载文章
...宝和余额宝使用不同的数据库 如图: 2、分布式事务解决方案 1、基于数据库XA协议的两段提交 XA协议是数据库支持的一种协议,其核心是一个事务管理器用来统一管理两个分布式数据库,如图 事务管理器负责跟支付宝数据库和余额宝数据库打交道,一旦有一个数据库连接失败,另一个数据库的操作就不会进行,一个数据库操作失败就会导致另一个数据库回滚,只有他们全部成功两个数据库的事务才会提交。 基于XA协议的两段和三段提交是一种严格的安全确认机制,其安全性是非常高的,但是保证安全性的前提是牺牲了性能,这个就是分布式系统里面的CAP理论,做任何架构的前提需要有取舍。所以基于XA协议的分布式事务并发性不高,不适合高并发场景。 2、基于activemq的解决方案 如图: 1、支付宝扣款成功时往message表插入消息 2、message表有message_id(流水id,标识夸系统的一次转账操作),status(confirm,unconfirm) 3、timer扫描message表的unconfirm状态记录往activemq插入消息 4、余额宝收到消息消费消息时先查询message表如果有记录就不处理如果没记录就进行数据库增款操作 5、如果余额宝数据库操作成功往余额宝message表插入消息,表字段跟支付宝message一致 6、如果5操作成功,回调支付宝接口修改message表状态,把unconfirm状态转换成confirm状态 问题描述: 1、支付宝设计message表的目的 如果支付宝往activemq插入消息而余额宝消费消息异常,有可能是消费消息成功而事务操作异常,有可能是网络异常等等不确定因素。如果出现异常而activemq收到了确认消息的信号,这时候activemq中的消息是删除了的,消息丢失了。设置message表就是有一个消息存根,activemq中消息丢失了message表中的消息还在。解决了activemq消息丢失问题 2、余额宝设计message表的目的 当余额宝消费成功并且数据库操作成功时,回调支付宝的消息确认接口,如果回调接口时出现异常导致支付宝状态修改失败还是unconfirm状态,这时候还会被timer扫描到,又会往activemq插入消息,又会被余额宝消费一边,但是这条消息已经消费成功了的只是回调失败而已,所以就需要有一个这样的message表,当余额宝消费时先插入message表,如果message根据message_id能查询到记录就说明之前这条消息被消费过就不再消费只需要回调成功即可,如果查询不到消息就消费这条消息继续数据库操作,数据库操作成功就往message表插入消息。 这样就解决了消息重复消费问题,这也是消费端的幂等操作。 基于消息中间件的分布式事务是最理想的分布式事务解决方案,兼顾了安全性和并发性! 接下来贴代码: 支付宝代码: @Controller@RequestMapping("/order")public class OrderController {/ @Description TODO @param @return 参数 @return String 返回类型 @throws userID:转账的用户ID amount:转多少钱/@Autowired@Qualifier("activemq")OrderService orderService;@RequestMapping("/transfer")public @ResponseBody String transferAmount(String userId,String messageId, int amount) {try {orderService.updateAmount(amount,messageId, userId);}catch (Exception e) {e.printStackTrace();return "===============================transferAmount failed===================";}return "===============================transferAmount successfull===================";}@RequestMapping("/callback")public String callback(String param) {JSONObject parse = JSONObject.parseObject(param);String respCode = parse.getString("respCode");if(!"OK".equalsIgnoreCase(respCode)) {return null;}try {orderService.updateMessage(param);}catch (Exception e) {e.printStackTrace();return "fail";}return "ok";} } public interface OrderService {public void updateAmount(int amount, String userId,String messageId);public void updateMessage(String param);} @Service("activemq")@Transactional(rollbackFor = Exception.class)public class OrderServiceActivemqImpl implements OrderService {Logger logger = LoggerFactory.getLogger(getClass());@AutowiredJdbcTemplate jdbcTemplate;@AutowiredJmsTemplate jmsTemplate;@Overridepublic void updateAmount(final int amount, final String messageId, final String userId) {String sql = "update account set amount = amount - ?,update_time=now() where user_id = ?";int count = jdbcTemplate.update(sql, new Object[]{amount, userId});if (count == 1) {//插入到消息记录表sql = "insert into message(user_id,message_id,amount,status) values (?,?,?,?)";int row = jdbcTemplate.update(sql,new Object[]{userId,messageId,amount,"unconfirm"});if(row == 1) {//往activemq中插入消息jmsTemplate.send("zg.jack.queue", new MessageCreator() {@Overridepublic Message createMessage(Session session) throws JMSException {com.zhuguang.jack.bean.Message message = new com.zhuguang.jack.bean.Message();message.setAmount(Integer.valueOf(amount));message.setStatus("unconfirm");message.setUserId(userId);message.setMessageId(messageId);return session.createObjectMessage(message);} });} }}@Overridepublic void updateMessage(String param) {JSONObject parse = JSONObject.parseObject(param);String messageId = parse.getString("messageId");String sql = "update message set status = ? where message_id = ?";int count = jdbcTemplate.update(sql,new Object[]{"confirm",messageId});if(count == 1) {logger.info(messageId + " callback successfull");} }} activemq.xml <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:amq="http://activemq.apache.org/schema/core"xmlns:jms="http://www.springframework.org/schema/jms"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.1.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.1.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-4.1.xsdhttp://www.springframework.org/schema/jmshttp://www.springframework.org/schema/jms/spring-jms-4.1.xsdhttp://activemq.apache.org/schema/corehttp://activemq.apache.org/schema/core/activemq-core-5.12.1.xsd"><context:component-scan base-package="com.zhuguang.jack" /><mvc:annotation-driven /><amq:connectionFactory id="amqConnectionFactory"brokerURL="tcp://192.168.88.131:61616"userName="system"password="manager" /><!-- 配置JMS连接工长 --><bean id="connectionFactory"class="org.springframework.jms.connection.CachingConnectionFactory"><constructor-arg ref="amqConnectionFactory" /><property name="sessionCacheSize" value="100" /></bean><!-- 定义消息队列(Queue) --><bean id="demoQueueDestination" class="org.apache.activemq.command.ActiveMQQueue"><!-- 设置消息队列的名字 --><constructor-arg><value>zg.jack.queue</value></constructor-arg></bean><!-- 配置JMS模板(Queue),Spring提供的JMS工具类,它发送、接收消息。 --><bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"><property name="connectionFactory" ref="connectionFactory" /><property name="defaultDestination" ref="demoQueueDestination" /><property name="receiveTimeout" value="10000" /><!-- true是topic,false是queue,默认是false,此处显示写出false --><property name="pubSubDomain" value="false" /></bean></beans> spring-dispatcher.xml <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:task="http://www.springframework.org/schema/task" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util-3.2.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.2.xsdhttp://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"><!-- 引入同文件夹下的redis属性配置文件 --><!-- 解决springMVC响应数据乱码 text/plain就是响应的时候原样返回数据--><import resource="../activemq/activemq.xml"/><!--<context:property-placeholder ignore-unresolvable="true" location="classpath:config/core/core.properties,classpath:config/redis/redis-config.properties" />--><bean id="propertyConfigurerForProject1" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="order" value="1" /><property name="ignoreUnresolvablePlaceholders" value="true" /><property name="location"><value>classpath:config/core/core.properties</value></property></bean><mvc:annotation-driven><mvc:message-converters register-defaults="true"><bean class="org.springframework.http.converter.StringHttpMessageConverter"><property name="supportedMediaTypes" value = "text/plain;charset=UTF-8" /></bean></mvc:message-converters></mvc:annotation-driven><!-- 避免IE执行AJAX时,返回JSON出现下载文件 --><bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"><property name="supportedMediaTypes"><list><value>text/html;charset=UTF-8</value></list></property></bean><!-- 开启controller注解支持 --><!-- 注:如果base-package=com.avicit 则注解事务不起作用 TODO 读源码 --><context:component-scan base-package="com.zhuguang"></context:component-scan><mvc:view-controller path="/" view-name="redirect:/index" /><beanclass="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /><bean id="handlerAdapter"class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"></bean><beanclass="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"><property name="mediaTypes"><map><entry key="json" value="application/json" /><entry key="xml" value="application/xml" /><entry key="html" value="text/html" /></map></property><property name="viewResolvers"><list><bean class="org.springframework.web.servlet.view.BeanNameViewResolver" /><bean class="org.springframework.web.servlet.view.UrlBasedViewResolver"><property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /><property name="prefix" value="/" /><property name="suffix" value=".jsp" /></bean></list></property></bean><!-- 支持上传文件 --> <!-- 控制器异常处理 --><bean id="exceptionResolver"class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="exceptionMappings"><props><prop key="java.lang.Exception">error</prop></props></property></bean><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"><property name="driverClass"><value>${jdbc.driverClassName}</value></property><property name="jdbcUrl"><value>${jdbc.url}</value></property><property name="user"><value>${jdbc.username}</value></property><property name="password"><value>${jdbc.password}</value></property><property name="minPoolSize" value="10" /><property name="maxPoolSize" value="100" /><property name="maxIdleTime" value="1800" /><property name="acquireIncrement" value="3" /><property name="maxStatements" value="1000" /><property name="initialPoolSize" value="10" /><property name="idleConnectionTestPeriod" value="60" /><property name="acquireRetryAttempts" value="30" /><property name="breakAfterAcquireFailure" value="false" /><property name="testConnectionOnCheckout" value="false" /><property name="acquireRetryDelay"><value>100</value></property></bean><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" /><aop:aspectj-autoproxy expose-proxy="true"/></beans> logback.xml <?xml version="1.0" encoding="UTF-8"?><!--scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。默认的时间间隔为1分钟。debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。--><configuration scan="false" scanPeriod="60 seconds" debug="false"><!-- 定义日志的根目录 --><!-- <property name="LOG_HOME" value="/app/log" /> --><!-- 定义日志文件名称 --><property name="appName" value="netty"></property><!-- ch.qos.logback.core.ConsoleAppender 表示控制台输出 --><appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"><Encoding>UTF-8</Encoding><!--日志输出格式:%d表示日期时间,%thread表示线程名,%-5level:级别从左显示5个字符宽度%logger{50} 表示logger名字最长50个字符,否则按照句点分割。 %msg:日志消息,%n是换行符--><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender><!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 --> <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"><Encoding>UTF-8</Encoding><!-- 指定日志文件的名称 --> <file>${appName}.log</file><!--当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。--><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--滚动时产生的文件的存放位置及文件名称 %d{yyyy-MM-dd}:按天进行日志滚动 %i:当文件大小超过maxFileSize时,按照i进行文件滚动--><fileNamePattern>${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern><!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每天滚动,且maxHistory是365,则只保存最近365天的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。--><MaxHistory>365</MaxHistory><!-- 当日志文件超过maxFileSize指定的大小是,根据上面提到的%i进行日志文件滚动 注意此处配置SizeBasedTriggeringPolicy是无法实现按文件大小进行滚动的,必须配置timeBasedFileNamingAndTriggeringPolicy--><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><!--日志输出格式:%d表示日期时间,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %logger{50} 表示logger名字最长50个字符,否则按照句点分割。 %msg:日志消息,%n是换行符--> <encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern></encoder></appender><!-- logger主要用于存放日志对象,也可以定义日志类型、级别name:表示匹配的logger类型前缀,也就是包的前半部分level:要记录的日志级别,包括 TRACE < DEBUG < INFO < WARN < ERRORadditivity:作用在于children-logger是否使用 rootLogger配置的appender进行输出,false:表示只用当前logger的appender-ref,true:表示当前logger的appender-ref和rootLogger的appender-ref都有效--><!-- <logger name="edu.hyh" level="info" additivity="true"><appender-ref ref="appLogAppender" /></logger> --><!-- root与logger是父子关系,没有特别定义则默认为root,任何一个类只会和一个logger对应,要么是定义的logger,要么是root,判断的关键在于找到这个logger,然后判断这个logger的appender和level。 --><root level="debug"><appender-ref ref="stdout" /><appender-ref ref="appLogAppender" /></root></configuration> 2、余额宝代码 package com.zhuguang.jack.controller;import com.alibaba.fastjson.JSONObject;import com.zhuguang.jack.service.OrderService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;@Controller@RequestMapping("/order")public class OrderController {/ @Description TODO @param @return 参数 @return String 返回类型 @throws 模拟银行转账 userID:转账的用户ID amount:转多少钱/@AutowiredOrderService orderService;@RequestMapping("/transfer")public @ResponseBody String transferAmount(String userId, String amount) {try {orderService.updateAmount(Integer.valueOf(amount), userId);}catch (Exception e) {e.printStackTrace();return "===============================transferAmount failed===================";}return "===============================transferAmount successfull===================";} } 消息监听器 package com.zhuguang.jack.listener;import com.alibaba.fastjson.JSONObject;import com.zhuguang.jack.service.OrderService;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.client.SimpleClientHttpRequestFactory;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import org.springframework.web.client.RestTemplate;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageListener;import javax.jms.ObjectMessage;@Service("queueMessageListener")public class QueueMessageListener implements MessageListener {private Logger logger = LoggerFactory.getLogger(getClass());@AutowiredOrderService orderService;@Transactional(rollbackFor = Exception.class)@Overridepublic void onMessage(Message message) {if (message instanceof ObjectMessage) {ObjectMessage objectMessage = (ObjectMessage) message;try {com.zhuguang.jack.bean.Message message1 = (com.zhuguang.jack.bean.Message) objectMessage.getObject();String userId = message1.getUserId();int count = orderService.queryMessageCountByUserId(userId);if (count == 0) {orderService.updateAmount(message1.getAmount(), message1.getUserId());orderService.insertMessage(message1.getUserId(), message1.getMessageId(), message1.getAmount(), "ok");} else {logger.info("异常转账");}RestTemplate restTemplate = createRestTemplate();JSONObject jo = new JSONObject();jo.put("messageId", message1.getMessageId());jo.put("respCode", "OK");String url = "http://jack.bank_a.com:8080/alipay/order/callback?param="+ jo.toJSONString();restTemplate.getForObject(url,null);} catch (JMSException e) {e.printStackTrace();throw new RuntimeException("异常");} }}public RestTemplate createRestTemplate() {SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();simpleClientHttpRequestFactory.setConnectTimeout(3000);simpleClientHttpRequestFactory.setReadTimeout(2000);return new RestTemplate(simpleClientHttpRequestFactory);} } package com.zhuguang.jack.service;public interface OrderService {public void updateAmount(int amount, String userId);public int queryMessageCountByUserId(String userId);public int insertMessage(String userId,String messageId,int amount,String status);} package com.zhuguang.jack.service;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.client.SimpleClientHttpRequestFactory;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import org.springframework.web.client.RestTemplate;@Service@Transactional(rollbackFor = Exception.class)public class OrderServiceImpl implements OrderService {private Logger logger = LoggerFactory.getLogger(getClass());@AutowiredJdbcTemplate jdbcTemplate;/ 更新数据库表,把账户余额减去amountd/@Overridepublic void updateAmount(int amount, String userId) {//1、农业银行转账3000,也就说农业银行jack账户要减3000String sql = "update account set amount = amount + ?,update_time=now() where user_id = ?";int count = jdbcTemplate.update(sql, new Object[] {amount, userId});if (count != 1) {throw new RuntimeException("订单创建失败,农业银行转账失败!");} }public RestTemplate createRestTemplate() {SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();simpleClientHttpRequestFactory.setConnectTimeout(3000);simpleClientHttpRequestFactory.setReadTimeout(2000);return new RestTemplate(simpleClientHttpRequestFactory);}@Overridepublic int queryMessageCountByUserId(String messageId) {String sql = "select count() from message where message_id = ?";int count = jdbcTemplate.queryForInt(sql, new Object[]{messageId});return count;}@Overridepublic int insertMessage(String userId, String message_id,int amount, String status) {String sql = "insert into message(user_id,message_id,amount,status) values(?,?,?)";int count = jdbcTemplate.update(sql, new Object[]{userId, message_id,amount, status});if(count == 1) {logger.info("Ok");}return count;} } activemq.xml <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:amq="http://activemq.apache.org/schema/core"xmlns:jms="http://www.springframework.org/schema/jms"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.1.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.1.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-4.1.xsdhttp://www.springframework.org/schema/jmshttp://www.springframework.org/schema/jms/spring-jms-4.1.xsdhttp://activemq.apache.org/schema/corehttp://activemq.apache.org/schema/core/activemq-core-5.12.1.xsd"><context:component-scan base-package="com.zhuguang.jack" /><mvc:annotation-driven /><amq:connectionFactory id="amqConnectionFactory"brokerURL="tcp://192.168.88.131:61616"userName="system"password="manager" /><!-- 配置JMS连接工长 --><bean id="connectionFactory"class="org.springframework.jms.connection.CachingConnectionFactory"><constructor-arg ref="amqConnectionFactory" /><property name="sessionCacheSize" value="100" /></bean><!-- 定义消息队列(Queue) --><bean id="demoQueueDestination" class="org.apache.activemq.command.ActiveMQQueue"><!-- 设置消息队列的名字 --><constructor-arg><value>zg.jack.queue</value></constructor-arg></bean><!-- 显示注入消息监听容器(Queue),配置连接工厂,监听的目标是demoQueueDestination,监听器是上面定义的监听器 --><bean id="queueListenerContainer"class="org.springframework.jms.listener.DefaultMessageListenerContainer"><property name="connectionFactory" ref="connectionFactory" /><property name="destination" ref="demoQueueDestination" /><property name="messageListener" ref="queueMessageListener" /></bean><!-- 配置JMS模板(Queue),Spring提供的JMS工具类,它发送、接收消息。 --><bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"><property name="connectionFactory" ref="connectionFactory" /><property name="defaultDestination" ref="demoQueueDestination" /><property name="receiveTimeout" value="10000" /><!-- true是topic,false是queue,默认是false,此处显示写出false --><property name="pubSubDomain" value="false" /></bean></beans> OK~~~~~~~~~~~~大功告成!!!, 如果大家觉得满意并且对技术感兴趣请加群:171239762, 纯技术交流群,非诚勿扰。 本篇文章为转载内容。原文链接:https://blog.csdn.net/luoyang_java/article/details/84953241。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-04-16 22:34:52
500
转载
JQuery插件下载
...上普通HTML表格的数据内容便捷地导出为多种常见格式。通过集成此插件,开发者能够赋予用户将表格数据一键转换成CSV、XLS(Excel)、TXT或SQL文件的功能。该插件基于jQuery库构建,易于集成到现有项目中,并且提供了高度的灵活性和可定制性。使用者无需复杂的编程操作,只需简单调用API,即可实现对表格数据的灵活导出配置,如设置分隔符、忽略特定列等。这一特性使得jQuery-tableExport成为报表生成、数据分析及数据迁移场景下不可或缺的工具,极大地提升了用户体验和数据处理效率。 点我下载 文件大小:47.78 KB 您将下载一个JQuery插件资源包,该资源包内部文件的目录结构如下: 本网站提供JQuery插件下载功能,旨在帮助广大用户在工作学习中提升效率、节约时间。 本网站的下载内容来自于互联网。如您发现任何侵犯您权益的内容,请立即告知我们,我们将迅速响应并删除相关内容。 免责声明:站内所有资源仅供个人学习研究及参考之用,严禁将这些资源应用于商业场景。 若擅自商用导致的一切后果,由使用者承担责任。
2024-01-01 20:21:15
133
本站
JQuery插件下载
...著称。该插件通过利用JSON数组的强大功能来存储和展示数据,使得开发者可以轻松创建出直观的时间轴效果。用户不仅能够便捷地组织和记录一系列事件,还能以时间顺序将这些事件可视化呈现。其高度可定制性和易用性使其成为众多应用场景的理想选择,例如构建社交平台上的个人时间线、博客文章按时间排序的发布历史,以及企业内部用于展示关键里程碑和事务的时间表等。此外,jqtimeline.js还拥有良好的扩展性,能够无缝集成到其他jQuery插件中,进一步丰富网页功能及用户体验。这款插件凭借其实现简单、代码结构清晰的特点,深受开发者喜爱,让时间和事件的管理与展示变得既专业又灵活。 点我下载 文件大小:331.96 KB 您将下载一个JQuery插件资源包,该资源包内部文件的目录结构如下: 本网站提供JQuery插件下载功能,旨在帮助广大用户在工作学习中提升效率、节约时间。 本网站的下载内容来自于互联网。如您发现任何侵犯您权益的内容,请立即告知我们,我们将迅速响应并删除相关内容。 免责声明:站内所有资源仅供个人学习研究及参考之用,严禁将这些资源应用于商业场景。 若擅自商用导致的一切后果,由使用者承担责任。
2023-06-04 11:36:32
122
本站
JQuery插件下载
...入流程。此外,插件还集成了基本的验证机制,确保用户输入的标签符合预期规范,有效避免无效或重复数据的录入。其响应式设计使得该插件能够在不同尺寸的屏幕和设备上完美展现,无论是桌面端还是移动端,都能提供一致且流畅的操作体验。总之,这个插件凭借其实用、智能化的特点以及对现代Web开发需求的良好适应性,成为开发者优化网站表单元素,实现用户友好型标签管理系统的理想工具。 点我下载 文件大小:49.08 KB 您将下载一个JQuery插件资源包,该资源包内部文件的目录结构如下: 本网站提供JQuery插件下载功能,旨在帮助广大用户在工作学习中提升效率、节约时间。 本网站的下载内容来自于互联网。如您发现任何侵犯您权益的内容,请立即告知我们,我们将迅速响应并删除相关内容。 免责声明:站内所有资源仅供个人学习研究及参考之用,严禁将这些资源应用于商业场景。 若擅自商用导致的一切后果,由使用者承担责任。
2024-02-20 10:35:27
84
本站
JQuery插件下载
...直接导出为PNG图片格式,以适应不同的项目需求和浏览器兼容性要求。无论是需要一个独特的网页背景增强用户体验,还是用于数据可视化项目的美化装饰,Trianglify都能提供一种快速、简便且高度定制化的解决方案。只需简单的集成与调用,即可让网页背景焕发出新颖而富有创意的渐变多边形网格风格。 点我下载 文件大小:21.00 KB 您将下载一个JQuery插件资源包,该资源包内部文件的目录结构如下: 本网站提供JQuery插件下载功能,旨在帮助广大用户在工作学习中提升效率、节约时间。 本网站的下载内容来自于互联网。如您发现任何侵犯您权益的内容,请立即告知我们,我们将迅速响应并删除相关内容。 免责声明:站内所有资源仅供个人学习研究及参考之用,严禁将这些资源应用于商业场景。 若擅自商用导致的一切后果,由使用者承担责任。
2023-08-18 13:03:10
293
本站
JQuery插件下载
...款jQuery滑块式验证码插件专为提升网站安全性而设计,尤其优化了在移动端的用户体验。它适用于PC端和手机、平板等各类移动设备,用户只需通过直观的拖动滑块操作即可完成验证过程。该插件以创新的方式将传统的图片验证码升级为互动式的滑块拼图验证,增强了对机器自动识别的抵抗力。在实际使用中,用户需要拖动滑块至预设位置,完成一张被分割图像的拼接。这一过程中,插件会记录用户的拖动时间、动作精度以及滑动轨迹等详细行为数据,并将其发送到服务器进行复杂的后台算法验证。这种验证机制有效防止了恶意的自动化脚本攻击,提高了网站的安全性和用户账号的安全保护级别。此外,该插件具有良好的兼容性和易用性,开发者可以根据需求快速集成到项目中,实现平滑的跨平台适配效果,确保无论用户处于何种设备环境下,都能获得流畅且安全的验证体验。 点我下载 文件大小:86.92 KB 您将下载一个JQuery插件资源包,该资源包内部文件的目录结构如下: 本网站提供JQuery插件下载功能,旨在帮助广大用户在工作学习中提升效率、节约时间。 本网站的下载内容来自于互联网。如您发现任何侵犯您权益的内容,请立即告知我们,我们将迅速响应并删除相关内容。 免责声明:站内所有资源仅供个人学习研究及参考之用,严禁将这些资源应用于商业场景。 若擅自商用导致的一切后果,由使用者承担责任。
2023-12-27 08:30:10
42
本站
JQuery插件下载
...的核心特性包括对文件格式的智能校验,确保上传的内容符合预期,这在保障数据安全的同时也提升了用户体验。此外,它还具备生成文件缩略图的功能,用户可以在上传前预览文件内容,增加了交互性和反馈。jQuery.filer的界面设计灵活,开发者可以根据项目需求自定义样式,使其与网站整体风格无缝融合。这款插件不仅实用,而且易于集成到任何使用jQuery的网页中,节省了开发者的时间和精力。无论是对于个人项目还是商业应用,它都能提供一个高效、美观的文件上传解决方案。无论是前端开发者还是设计师,都能在使用jQuery.filer时享受到简化开发流程和提升用户体验的双重益处。 点我下载 文件大小:184.58 KB 您将下载一个JQuery插件资源包,该资源包内部文件的目录结构如下: 本网站提供JQuery插件下载功能,旨在帮助广大用户在工作学习中提升效率、节约时间。 本网站的下载内容来自于互联网。如您发现任何侵犯您权益的内容,请立即告知我们,我们将迅速响应并删除相关内容。 免责声明:站内所有资源仅供个人学习研究及参考之用,严禁将这些资源应用于商业场景。 若擅自商用导致的一切后果,由使用者承担责任。
2023-04-23 12:04:30
107
本站
JQuery插件下载
...需要展示复杂层级结构数据的场景。这款插件不仅具有强大的功能,而且非常易于使用和扩展。它能够轻松地与各种不同的主题配合使用,让您的网站或应用界面更加美观。jstree支持从HTML和JSON格式的数据源加载内容,使得数据管理变得更加便捷。此外,它还具备异步回调数据的功能,这意味着您可以动态地加载大量数据而不会影响页面性能。jstree的一个显著优势在于其对旧版浏览器的支持,比如IE8,这使得更多的用户群体能够无障碍地访问您的网站或应用。无论您是在构建文件管理系统,还是在开发复杂的组织架构图,jstree都能提供必要的工具来实现这一目标。它支持多级树结构,可以轻松处理从简单到复杂的各种层级关系,满足了不同项目的需求。总之,jstree凭借其易用性、可扩展性和广泛的功能集,成为了一款不可多得的jQuery目录树插件。无论是前端开发者还是设计师,都可以借助jstree快速创建出美观且功能丰富的目录树界面。 点我下载 文件大小:887.95 KB 您将下载一个JQuery插件资源包,该资源包内部文件的目录结构如下: 本网站提供JQuery插件下载功能,旨在帮助广大用户在工作学习中提升效率、节约时间。 本网站的下载内容来自于互联网。如您发现任何侵犯您权益的内容,请立即告知我们,我们将迅速响应并删除相关内容。 免责声明:站内所有资源仅供个人学习研究及参考之用,严禁将这些资源应用于商业场景。 若擅自商用导致的一切后果,由使用者承担责任。
2025-02-19 11:29:37
68
本站
JQuery插件下载
...计用于将HTML表格数据方便快捷地转换并导出到微软Excel格式的电子表格中。此插件具备高度灵活性和易用性,开发者可以轻松集成到项目中以满足不同用户对数据导出的需求。它不仅支持现代浏览器如Firefox和GoogleChrome,还特别兼容至IE8版本,确保了在多种浏览器环境下都能稳定工作。通过简单配置,使用者能够精准控制要导出的表格内容,比如排除特定CSSclass类标记的行、图片、超链接或输入框中的内容等。同时,还可以自定义导出的Excel文档名称及文件名,如“myExcelTable.xls”,尤其注意在IE11和Firefox浏览器下需要明确指定xls后缀,否则可能导出无扩展名的文件。得益于其小巧的体积和直观的API接口,开发者可以高效地整合table2excel到各种项目中,无论是数据报告生成、报表下载还是交互式网页应用的数据导出功能实现,都能提供出色的用户体验与跨浏览器兼容性保障。 点我下载 文件大小:44.84 KB 您将下载一个JQuery插件资源包,该资源包内部文件的目录结构如下: 本网站提供JQuery插件下载功能,旨在帮助广大用户在工作学习中提升效率、节约时间。 本网站的下载内容来自于互联网。如您发现任何侵犯您权益的内容,请立即告知我们,我们将迅速响应并删除相关内容。 免责声明:站内所有资源仅供个人学习研究及参考之用,严禁将这些资源应用于商业场景。 若擅自商用导致的一切后果,由使用者承担责任。
2023-08-26 20:48:50
84
本站
JQuery插件下载
...人物幻灯片效果。通过集成Bootstrap网格系统,该插件能够实现灵活布局,确保在不同屏幕尺寸下都能呈现出最佳的视觉体验。此特效包含了两个演示DEMO,分别展示了如何通过简洁的HTML结构与自定义CSS样式来配置和呈现人物卡片。每个卡片可以包含丰富的多媒体内容,如图片、文字介绍以及其他相关人物资料,以吸引用户关注并提高页面互动性。借助于OwlCarousel的核心特性,该插件不仅支持触屏设备上的滑动交互,还实现了CSS3平滑过渡动画,并兼容所有主流浏览器。此外,它还具备无限循环滚动、自定义JSON数据源以及可选的进度条等功能,为开发者提供了高度定制化的人物信息展示解决方案,既满足了美观需求,又保证了代码的轻量化和高效运行。 点我下载 文件大小:67.30 KB 您将下载一个JQuery插件资源包,该资源包内部文件的目录结构如下: 本网站提供JQuery插件下载功能,旨在帮助广大用户在工作学习中提升效率、节约时间。 本网站的下载内容来自于互联网。如您发现任何侵犯您权益的内容,请立即告知我们,我们将迅速响应并删除相关内容。 免责声明:站内所有资源仅供个人学习研究及参考之用,严禁将这些资源应用于商业场景。 若擅自商用导致的一切后果,由使用者承担责任。
2023-11-27 12:20:46
125
本站
JQuery插件下载
...、CSS3过渡动画、JSON数据集成以及图片随机排列等功能。这意味着你可以根据自己的需求调整插件的行为和外观,创造出独一无二的视觉效果。此外,OwlCarousel内置了多种预设样式和过渡效果,使得即使是编程新手也能快速搭建出专业级的轮播图。而对高级用户而言,通过深入配置,还可以解锁更多创意可能性,让网站内容更加生动有趣。无论你是需要简单的图片轮播还是复杂的多媒体展示,OwlCarousel都能满足你的要求。它不仅提升了用户体验,还增强了网站的互动性和吸引力,是构建现代化网站不可或缺的强大工具。 点我下载 文件大小:1.30 MB 您将下载一个JQuery插件资源包,该资源包内部文件的目录结构如下: 本网站提供JQuery插件下载功能,旨在帮助广大用户在工作学习中提升效率、节约时间。 本网站的下载内容来自于互联网。如您发现任何侵犯您权益的内容,请立即告知我们,我们将迅速响应并删除相关内容。 免责声明:站内所有资源仅供个人学习研究及参考之用,严禁将这些资源应用于商业场景。 若擅自商用导致的一切后果,由使用者承担责任。
2024-12-16 11:10:24
107
本站
JQuery插件下载
...时日志的情况下。通过集成Screenlog.js到项目中,开发人员可以方便地监控和跟踪网页应用内部的工作流程,所有原本流向控制台的日志内容会被自动捕获并以可配置样式呈现在页面前端。这一特性使得排查问题、演示动态数据变化以及与用户交互时的反馈变得更加直观且易于理解。这款插件无需依赖其他库(如jQuery),它简单易用,只需加载脚本并调用初始化方法即可启用。此外,Screenlog.js还提供了灵活的API,允许用户自定义日志显示的位置、格式及行为,并支持在不需要时销毁插件以恢复原始console.log()功能,确保了对原有开发流程的最小干扰。 点我下载 文件大小:11.26 KB 您将下载一个JQuery插件资源包,该资源包内部文件的目录结构如下: 本网站提供JQuery插件下载功能,旨在帮助广大用户在工作学习中提升效率、节约时间。 本网站的下载内容来自于互联网。如您发现任何侵犯您权益的内容,请立即告知我们,我们将迅速响应并删除相关内容。 免责声明:站内所有资源仅供个人学习研究及参考之用,严禁将这些资源应用于商业场景。 若擅自商用导致的一切后果,由使用者承担责任。
2023-11-08 10:57:41
71
本站
JQuery插件下载
...专为简化网页开发者的数据展示而设计。它以轻量级的特性吸引用户,即使在处理大量数据时也能保持高效性能。该插件的核心优势在于其直观易用性,允许开发者仅通过简洁的JSON数据结构就能快速构建出专业级别的表格。无需额外的CSS样式或图片资源,这意味着集成Tabulator到项目中更为便捷,节省了设计师的工作量。它的灵活性使得它能够适应各种场景,无论是需要动态加载的数据还是静态配置,都能轻松应对。对于开发者而言,Tabulator提供了丰富的配置选项,允许定制列宽、排序、过滤以及交互式功能,从而实现高度可定制化的用户体验。此外,作为jQueryUI的一部分,Tabulator无缝集成到了常见的UI组件库中,提供了良好的交互性和一致性。这使得开发者能够利用jQueryUI的其他功能,如拖放排序或日期选择器,与表格功能相结合,构建出功能完善且美观的应用界面。总结来说,Tabulator是一款强大的工具,帮助开发者快速创建专业级的表格,并以直观的方式管理数据,提升了网站或应用的视觉呈现和功能性。无论你是前端新手还是经验丰富的开发人员,这款插件都能简化你的工作流程并提升项目的整体质量。 点我下载 文件大小:285.05 KB 您将下载一个JQuery插件资源包,该资源包内部文件的目录结构如下: 本网站提供JQuery插件下载功能,旨在帮助广大用户在工作学习中提升效率、节约时间。 本网站的下载内容来自于互联网。如您发现任何侵犯您权益的内容,请立即告知我们,我们将迅速响应并删除相关内容。 免责声明:站内所有资源仅供个人学习研究及参考之用,严禁将这些资源应用于商业场景。 若擅自商用导致的一切后果,由使用者承担责任。
2023-04-14 08:17:07
315
本站
JQuery插件下载
...用于将标准的日期时间格式转换为用户友好的模糊时间描述。这款插件非常适合需要在网页上显示相对时间的应用场景,比如社交媒体、新闻网站或是任何需要实时更新时间信息的地方。通过使用timeago.js,开发者可以轻松地将复杂的日期时间数据转化为更加直观易懂的表述,如“3小时前”、“1天前”或“几分钟前”。这种人性化的时间表示方式不仅提升了用户体验,还简化了前端开发工作,无需编写繁琐的时间计算逻辑。timeago.js的设计目标是简洁与高效,它采用纯JavaScript实现,无需依赖任何其他库,这使得它可以无缝集成到现有的项目中,无论是大型企业应用还是小型个人网站。此外,该插件提供了丰富的配置选项,允许开发者根据具体需求自定义时间格式和样式,从而满足多样化的应用场景。总之,timeago.js是一个强大且灵活的时间转换工具,能够显著提升网页内容的时间表现形式,使信息展示更加生动、易读。对于追求高效开发流程和优化用户体验的开发者来说,这是一个不可多得的好帮手。 点我下载 文件大小:32.35 KB 您将下载一个JQuery插件资源包,该资源包内部文件的目录结构如下: 本网站提供JQuery插件下载功能,旨在帮助广大用户在工作学习中提升效率、节约时间。 本网站的下载内容来自于互联网。如您发现任何侵犯您权益的内容,请立即告知我们,我们将迅速响应并删除相关内容。 免责声明:站内所有资源仅供个人学习研究及参考之用,严禁将这些资源应用于商业场景。 若擅自商用导致的一切后果,由使用者承担责任。
2024-12-30 10:57:09
50
本站
JQuery插件下载
...otstrap3表单验证jQuery插件。这款插件巧妙地利用了HTML5的data属性来设定验证规则,使得开发者无需编写复杂的JavaScript代码即可实现强大的表单验证功能。它支持各种常见的验证需求,包括但不限于非空检查、邮箱格式验证、URL格式验证、数字范围限制以及自定义正则表达式验证等。通过使用bootstrap-validator,开发者能够轻松地对输入字段进行即时反馈,从而提升用户体验。当用户填写表单时,插件会实时检查输入内容是否符合预设的规则,并通过视觉提示(如颜色变化或图标)来告知用户哪些字段需要修正。这种即时反馈机制有助于减少提交无效数据的情况,确保数据的一致性和准确性。此外,bootstrap-validator还提供了丰富的定制选项,允许开发者根据项目需求调整验证行为和样式。无论是改变错误消息的颜色、位置,还是添加额外的验证条件,都可以通过简单的配置来实现。这使得插件不仅易于上手,而且高度灵活,能够适应不同场景下的开发需求。总之,bootstrap-validator凭借其简洁的API、强大的功能以及良好的兼容性,成为Bootstrap框架下处理表单验证的理想选择。对于希望快速构建高效、美观表单的应用来说,它无疑是一个值得尝试的优秀工具。_ 点我下载 文件大小:43.62 KB 您将下载一个JQuery插件资源包,该资源包内部文件的目录结构如下: 本网站提供JQuery插件下载功能,旨在帮助广大用户在工作学习中提升效率、节约时间。 本网站的下载内容来自于互联网。如您发现任何侵犯您权益的内容,请立即告知我们,我们将迅速响应并删除相关内容。 免责声明:站内所有资源仅供个人学习研究及参考之用,严禁将这些资源应用于商业场景。 若擅自商用导致的一切后果,由使用者承担责任。
2025-02-05 10:46:18
39
本站
JQuery插件下载
...,专为提升列表与表格数据的搜索和过滤功能而设计。这款插件能够极大地增强用户在处理大量数据时的效率和体验,尤其适用于需要频繁筛选、查找特定信息的场景。功能亮点1.快速搜索:通过简单的API调用,用户可以在输入框中直接输入关键词,快速筛选出符合条件的数据行。这不仅节省了时间,还提高了数据查找的精确度。2.灵活的过滤选项:jQuery-easySearch支持多种过滤条件,包括但不限于文本匹配、数值比较、日期筛选等,允许开发者根据具体需求定制过滤逻辑,满足不同场景下的应用需求。3.直观的用户界面:插件提供了简洁明了的用户界面,使得即使非技术背景的用户也能轻松上手使用,无需深入理解复杂的前端开发知识。4.高性能表现:针对大数据量场景进行了优化,确保在处理大规模数据时也能保持流畅的操作体验,不会出现明显的卡顿或延迟。5.兼容性与可扩展性:jQuery-easySearch与其他jQuery库兼容,易于集成到现有的Web项目中。同时,其模块化设计方便开发者根据需要添加自定义功能或修改现有行为。6.文档与社区支持:提供详细的API文档和丰富的示例代码,帮助开发者快速理解并应用插件。活跃的开发者社区也能够提供技术支持和交流平台,促进插件的持续改进和更新。应用场景-电商网站产品搜索:用户可以通过关键词搜索找到特定的产品,提高购物体验。-数据报告与分析:在数据分析工具中,快速筛选出关键指标或趋势,辅助决策制定。-人力资源管理:在员工信息管理系统中,快速定位特定员工或职位信息,提高管理效率。总之,jQuery-easySearch为开发者提供了一个高效、灵活的工具,以提升列表和表格数据的搜索和过滤功能,显著改善用户体验,适用于各种需要高效数据处理的Web应用。 点我下载 文件大小:91.70 KB 您将下载一个JQuery插件资源包,该资源包内部文件的目录结构如下: 本网站提供JQuery插件下载功能,旨在帮助广大用户在工作学习中提升效率、节约时间。 本网站的下载内容来自于互联网。如您发现任何侵犯您权益的内容,请立即告知我们,我们将迅速响应并删除相关内容。 免责声明:站内所有资源仅供个人学习研究及参考之用,严禁将这些资源应用于商业场景。 若擅自商用导致的一切后果,由使用者承担责任。
2024-08-24 21:15:00
68
本站
MySQL
...何在MySQL中新建数据库之后,进一步的探索可以聚焦于数据库优化、安全性管理以及最新的MySQL版本特性。近日,MySQL 8.0版本的发布带来了许多重要更新,如窗口函数的增强、JSON支持的改进以及默认事务隔离级别的变更(从REPEATABLE READ变为READ COMMITTED),这些都为开发者提供了更高效、灵活的数据管理工具。 针对数据库性能优化,了解索引原理与实践策略至关重要。例如,选择合适的索引类型(B树、哈希、全文等),合理设计表结构以减少JOIN操作的复杂度,以及定期分析并优化执行计划,都是提升MySQL数据库性能的关键手段。 此外,随着数据安全问题日益凸显,MySQL的安全配置和权限管理同样值得深入研究。学习如何设置复杂的密码策略、实现用户访问审计、利用SSL加密传输数据,以及对备份与恢复策略进行定制化设计,是确保数据库系统稳定运行和数据安全的重要步骤。 综上所述,在掌握了MySQL数据库的基础创建操作后,持续关注MySQL最新动态,深入了解数据库性能调优和安全管理领域,将极大地助力您在实际项目中构建更加健壮、高效的数据库架构。
2023-08-12 18:53:34
139
码农
JSON
JSON是一种简洁的数据交换格式,在不同的编程语言中都有着广泛的应用。对于PHP开发者而言,对JSON的处理及其关键。本文将介绍如何在PHP中查找JSON对应的代码。 //从JSON中获取数据 $jsonData = '{"name":"John", "age":30, "city":"New York"}'; $data = json_decode($jsonData); //访问JSON中的数据 echo $data->name; //显示 John echo $data->age; //显示 30 echo $data->city; //显示 New York //将PHP数组变为JSON $myArray = array("name" =>"John", "age" =>30, "city" =>"New York"); $jsonData = json_encode($myArray); echo $jsonData; //显示 {"name":"John","age":30,"city":"New York"} //将JSON变为PHP数组 $jsonData = '{"name":"John", "age":30, "city":"New York"}'; $myArray = json_decode($jsonData, true); echo $myArray["name"]; //显示 John echo $myArray["age"]; //显示 30 echo $myArray["city"]; //显示 New York 以上代码示例展示了如何在PHP中对JSON进行解析和建立。通过json_decode函数,可以将JSON数据变为PHP对象或数组,然后通过对象或数组的方式即可访问相应的数据。而通过json_encode函数,可以将PHP数组变为JSON格式的字符串。 总的来说,对于PHP开发者而言,在处理前后端数据交互时,必须了解JSON这种数据格式及其相关的处理方式,以确保数据的正常传输和解析。
2023-01-18 13:53:09
462
算法侠
Docker
...改进的存储驱动层确保数据持久化,并且引入了更精细的资源限制控制以实现多容器环境下的高效运维。 与此同时,Kubernetes作为目前主流的容器编排工具,已广泛集成Docker以实现更大规模的应用部署与管理。近期,CNCF社区围绕Kubernetes和Docker的合作生态展开了诸多讨论,包括如何借助Helm charts简化Docker镜像在Kubernetes集群上的部署流程,以及如何利用Operator模式提升复杂有状态应用的生命周期管理能力。 此外,随着云服务提供商如AWS、Azure等不断加大对容器服务的支持力度,用户可以更加便捷地将基于Docker的本地应用程序无缝迁移至云端运行,同时享受到弹性伸缩、负载均衡等一系列高级特性。最近一篇来自TechCrunch的文章报道了AWS Fargate如何让开发者无需管理底层基础设施即可运行Docker容器,从而专注于业务逻辑开发与迭代。 总之,Docker作为容器化技术的基石,在持续演进中不断推动云计算领域的创新与发展。了解并掌握Docker与相关生态系统的发展动态,将有助于我们紧跟技术潮流,优化应用架构设计,提高软件交付效率与质量。
2023-02-25 10:58:36
491
数据库专家
VUE
...范式,并以其响应式的数据绑定和可组合的视图组件而著称,使得开发者能够更高效地创建交互式的单页应用程序。 .vue文件 , 在Vue.js开发环境中,.vue文件是一种特殊格式的文件,它将一个Vue组件的模板(HTML)、逻辑(JavaScript)和样式(CSS)整合在一个单独的文件中。Vue Loader是webpack的一个加载器,它可以解析这种单文件组件(SFC, Single File Component),并将其转换为可在浏览器中运行的代码。 Webpack , Webpack是一个流行的前端资源模块打包工具,它能处理项目中的各种静态资源(如JavaScript、CSS、图片等),并通过loader和plugins机制进行编译、转换、打包等工作。在Vue开发中,通过配置webpack及vue-loader插件,可以实现对.vue文件的解析和打包,最终生成可在浏览器环境下运行的JavaScript代码,方便Vue组件的复用和管理。
2023-01-09 09:32:33
95
逻辑鬼才
MySQL
...和操作后,进一步探索数据库与文件系统的交互实践以及最新的安全策略显得尤为重要。近日,随着数据隐私保护法规的不断强化,如欧盟的GDPR,企业在进行大量数据导入导出时必须更加注重数据的安全性和合规性。MySQL 8.0版本对LOAD DATA INFILE和SELECT INTO OUTFILE命令的安全选项进行了增强,用户可精细控制文件访问权限并支持SSL加密传输,有效防止数据在传输过程中的泄露风险。 此外,针对大数据场景下的批量数据处理效率问题,MySQL也提供了优化策略。例如,通过合理设置FIELDS TERMINATED BY、LINES TERMINATED BY等参数,可以显著提升大规模CSV或TXT文件的导入速度。同时,结合使用索引、预处理脚本等方式,能在保证数据完整性的前提下,大大缩短数据加载时间。 深入研究MySQL文档,会发现其对文件格式的支持也在不断拓展。除了传统的文本文件外,还支持JSON、XML等多种数据格式的读写功能,为复杂的数据交换和存储需求提供了更多可能。因此,在实际应用中,掌握MySQL与文件系统交互的最新技术和最佳实践,对于提高网站运营效能、保障数据安全具有深远意义。
2023-01-09 12:22:04
140
逻辑鬼才
站内搜索
用于搜索本网站内部文章,支持栏目切换。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
pstree -p $$
- 以树状结构展示当前shell进程及其子进程。
推荐内容
推荐本栏目内的其它文章,看看还有哪些文章让你感兴趣。
2023-04-28
2023-08-09
2023-06-18
2023-04-14
2023-02-18
2023-04-17
2024-01-11
2023-10-03
2023-09-09
2023-06-13
2023-08-07
2023-03-11
历史内容
快速导航到对应月份的历史文章列表。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"