- R语言高效数据处理-自定义EXCEL数据排版
LEEBELOVED
r语言R语言高效处理数据excel批处理
注:以下代码均为实际数据处理中的笔记摘录,所以很零散1、自定义excel表数据输出格式、布局在实际数据处理中为了提升效率,将Excel报表交付给需求方时减少手动调整的环节很有必要#1.1设置表头格式header_style=0', style=sheet_style)#数据写入writeData(data_deal_main01,'data_deal_test1',data_de
- Spring Boot整合JWT 实现双Token机制
Cloud_.
springboot后端java
目录JWT核心概念解析SpringBoot整合步骤2.1基础环境搭建2.2Token生成与解析2.3拦截器实现企业级增强方案3.1双Token刷新机制3.2安全防护策略常见问题与解决方案1.JWT核心概念解析1.1Token的三重使命身份凭证:替代Session实现无状态认证信息载体:存储用户基础信息(如userid、roles)安全屏障:数字签名防止数据篡改1.2JWT结构示例Header{"a
- Angular 15 表单控制迁移指南
t0_54program
编程问题解决手册angular.js前端javascript个人开发
在升级Angular项目时,经常会遇到一些需要特别注意的问题。最近,我们在从Angular10迁移到Angular15时,遇到了一个关于表单控制的错误:ERRORError:Cannotfindcontrolwithpath:'mappedHeaders->0->value'。这篇博客将详细解释这个错误的原因,并提供解决方案。问题描述在Angular10中运行良好的代码,在迁移到Angular15
- JavaEE基础八之EL与JSTL相关知识(过时不谈)
ZHWVICDI
JavaEEJavaEEEL表达式JSTL
EL功能动态输出内容替代JSP中的表达式元素简化jsp主要就是取值一般格式${EL表达式}内置对象牢记!!因为其他也是差不多param/paramValues方便输出请求参数pageScope/requestScopre/sessionScope/applicationScope输出各范围的属性header/headerValues与请求头相关cookie/initParampageContext
- 前台实时获取数据
爱吃虾的五花肉
前端ajaxwebsocketjavascript前端
实现网站实时通信·四种方式,第二三四种方式需要服务器端做操作的写计时器进行Ajax轮询//每秒调用一次http请求setInterval(function(){varxhr=newXMLHttpRequest();xhr.open('POST','url',true);xhr.setRequestHeader('Content-Type','application/json');xhr.send(
- CORS解决跨域as been blocked by CORS policy: Response to preflight request doesn‘t pass access control ch
humannoid
pythonjava开发语言
CORS解决跨域asbeenblockedbyCORSpolicy:Responsetopreflightrequestdoesn’tpassaccesscontrolcheck:No‘Access-Control-Allow-Origin’headerispresentontherequestedresource.解决跨域的方法:1、JSONP通过script标签的src属性进行跨域请求,如果服
- 【vue2+elementui】记录el-upload文件上传时调接口传参的几种情况
湛海不过深蓝
elementUIvue2elementui前端javascript
文件上传的接口请求头headers:{"Content-Type":"multipart/form-data"},自动上传el-upload上传文件调接口的时候默认会带有一个入参file:原生的file对象无额外入参action属性指定了文件上传的接口地址auto-upload属性:是否在选取文件后立即上传,默认值true所以只要设置了这两属性,文件在选择后(或拖拽到上传区域后)会自动上传到act
- spring 的model repository service controller的功能
LCY133
web开发springjava后端
1.Controller层(控制层)•功能:负责接收和处理HTTP请求,协调客户端与业务逻辑之间的交互。•核心职责:•请求处理:解析HTTP请求参数(如URL参数、Body数据、Headers)。•路由分发:根据请求路径(@RequestMapping)调用对应的Service方法。•响应生成:返回格式化数据(如JSON、XML)或视图(如HTML页面)。•输入校验:验证请求参数的合法性(如使用@
- 雷池WAF中攻击日志中的域名不是我的网站
容器docker运维
攻击日志中显示的域名字段是取的HTTPHeader中的Host,如果这个字段不存在,则默认使用目的IP作为域名。如果客户端修改了HTTPHeader的Host,那么这里显示的就是修改之后的。放一张截图更容易理解,注意下面「请求报文」中的Host字段:
- vite+vue+ts+element-plus从零开发管理后台框架(14)-全屏切换
vue3
安装插件npminstall@vueuse/
[email protected]编辑src/views/Main.vue,template段header-right下最前面添加如下代码。script段引入并实例化FullScreenimport{onMounted,ref}from'vue'import{useRoute,useRouter}from'vue-router'import{useFullscre
- HTTP发送POST请求的两种方式
冰淇淋@
springboothttpjavaspringboot
1、jsonStringjson=HttpRequest.post(getUrl(method,"v1",url,userId,appKey)).header("Content-type","application/json")//设置请求头为JSON格式.body(JSONUtil.toJsonStr(params))//请求体为JSON字符串.execute().body();特点:请求头:C
- STM32 HAL库 CAN_1
泠君
stm32arm嵌入式硬件
"can.c"#include"stdio.h"CAN_TxHeaderTypeDefmycan_tx;CAN_RxHeaderTypeDefmycan_rx;voidCANFilter_Config(void)//滤波{CAN_FilterTypeDefsFilterConfig;sFilterConfig.FilterBank=0;//CAN过滤器编号,范围0-27sFilterConfig.
- java 406,基于SpringMvc实现Restful方式接口返回406的问题
cj728
java406
一、问题:二、问题排查:HTTPStatus406-typeStatusreportmessagedescriptionTheresourceidentifiedbythisrequestisonlycapableofgeneratingresponseswithcharacteristicsnotacceptableaccordingtotherequest"accept"headers.HTT
- 侯捷 C++ 课程学习笔记:C++ 新标准11/14
『六哥』
C++学习笔记c++
演进、环境与资源C++2.0(C++11/14)新特性语言(只谈新东西),需要具备,C++语法和语意的基础C++Standard之演化C++98(1.0)、C++03(TR1,TechnicalReport1)、C++11(2.0)、C++14。C++2.0新特性包括语言和标准库两个层面,后者以headerfiles形式呈现。C++标准库的headerfiles不带副档名(.h),如#includ
- Vue 中 axios 的封装详解
遇见~未来
Vue.jsvue.js前端javascript
一、创建Axios实例/***@fileOverview封装axios请求模块*/importaxiosfrom"axios";//创建axios实例constaxiosInstance=axios.create({//设置基础请求路径baseURL:"https://api.example.com",//设置请求超时时间timeout:5000,//设置默认请求头headers:{"Conten
- Django解析跨域问题
信阳农夫
djangopython后端
跨域问题解决CORS(跨域资源共享,Cross-OriginResourceSharing)是一种跨域访问的机制,可让Ajax实现跨域访问。其实,在服务器的responseheader中,加入“Access-Control-Allow-Origin:*”便可支持CORS,很是的简单,apache/nginx等怎么配置,见参考文档。在Django中,有人开发了CORS-header的middlewa
- Linux系统上快速上手SPI开发————新手入门指南
飘逸小卤蛋
Linux开发linux驱动开发iot嵌入式硬件物联网
LinuxSPI开发新手整理的详细入门指南,涵盖从环境搭建到实际操作的完整流程:一、环境准备确认硬件支持运行ls/dev/spidev*检查是否存在SPI设备节点(如/dev/spidev0.0),若无输出说明驱动未加载,需在内核配置中启用SPI支持:bash#安装内核头文件(以Debian为例)sudoapt-getinstalllinux-headers-$(uname-r)#检查SPI内核配
- Android 网络框架之okhttp源码解析
码中之牛
移动开发Android开源框架androidkotlin开发语言移动开发网络框架
okhttp使用okhttp则分为Request请求与response响应。request请求体:每一个HTTP请求中都应该包含一个URL,一个GET或POST方法以及Header或其他参数,当然还可以含特定内容类型的数据流。response响应码:响应则包含一个回复代码(200代表成功,404代表未找到),Header和定制可选的body。封装的okhttp库与okhttp使用:blog.csd
- Typecho 极致美化:打造与众不同的博客
6v6-博客
机器学习
Typecho极致美化:打造与众不同的博客Typecho是一款轻量级的博客系统,但通过一些高级美化技巧,你可以让它变得与众不同。本文将介绍如何通过自定义JS、自定义CSS、自定义侧边栏模块等功能,实现Typecho的极致美化。1.自定义JS:动态效果与交互通过自定义JS,你可以为Typecho添加动态效果和交互功能。示例1:页面滚动动画在header.php中添加以下代码:ScrollReveal
- flutter的HTTP headers用法介绍
云水-禅心
FlutterflutterHttpClient
flutter的HTTPheaders用法介绍在Flutter中,HTTPheaders是用于在发送HTTP请求时传递额外信息的关键部分。它们可以用于身份验证、缓存控制、内容类型声明等。以下是关于Flutter中HTTPheaders的详细说明和用法。1.什么是HTTPHeaders?HTTPheaders是键值对(key-valuepairs),用于在客户端和服务器之间传递附加信息。例如:Con
- 【报错】zipfile.BadZipFile: File is not a zip file
Jude_lennon
报错python
pythonpd.read_excel(excel_path,sheet_name='Sheet1',engine='openpyxl',header=None)出现报错zipfile.BadZipFile:Fileisnotazipfile原代码:data_list=[load_graph_data(file)forfileindata_directory.glob("*.xlsx")]经过de
- cpp-httplib 解析
耶耶耶耶耶~
C++networkhttpcpp
文章目录前言headerrequest-responsecpphttplib结构解析有意思的trick利用对象的生命周期判断fd是否健在阻塞式读写防止阻塞的方法listen,acceptcpp-httplib解析1.创建server_socket_fd2.监听事件循环3.处理单用户请求的函数process_and_close_socket4.获取clientsock的一些信息5.一些列令人窒息的c
- 【软件测试】接口自动化测试用例通常包含哪些要素
小马哥编程
自动化测试用例
接口自动化测试用例通常包含以下要素:用例ID:唯一标识符,便于追踪和管理。用例名称:简要描述测试目的。接口信息:URL:接口地址。请求方法:如GET、POST、PUT、DELETE等。请求参数:Headers:如Content-Type、Authorization等。QueryParameters:GET请求中的查询参数。Body:POST/PUT请求的请求体,通常为JSON或XML。预期结果:状
- Flutter中使用NetworkImage加载网络图片缓存问题学习实践
云水-禅心
flutter缓存
Flutter中默认的NetworkImage会有缓存机制,如果图片的url不变化,但是url的图片已经发生变化,NetworkImage不会下载新的图片deepseek是这么解决问题的,但是在鸿蒙上禁用缓存无效在Flutter中,NetworkImage默认会使用缓存机制来优化性能。如果你想禁用缓存,可以通过以下几种方式实现:1.使用NetworkImage的headers参数你可以通过设置he
- Rabbitmq从入门到精通
XJzz3
消息中间件rabbitmq
文章目录1.RabbitMQ简介1.2组件介绍1.1消息队列的选择1.2Docker安装rabbitmq1.4消息应答机制2.1交换机类型2.1direct2.2fanout2.3topic:2.4header3RabbitMQ集群搭建3.1docker搭建rabbitmq集群4死信队列4.1ttl消息过期:生产者添加延迟生产4.2队列最大长度4.35.延迟队列6.发布确认机制6.1发布确认原理1
- vite+vue+ts+element-plus从零开发管理后台框架(15)-暗黑模式
vue3
设置编辑src/main.ts,引入暗黑模式样式文件。import'element-plus/dist/index.css'import'element-plus/theme-chalk/dark/css-vars.css'编辑src/views/Main.vue,template段header-right下最前面添加如下代码。script段引入并实例化useDarkimport{useFulls
- vite+vue+ts+element-plus从零开发管理后台框架(12)-logo和标题
vue3
编辑src/views/Main.vue,template段header-left修改如下。logo和标题全部在router-link标签下,即点击的时候会跳转到/这个路由,展开状态下显示logo和标题,折叠状态下只显示logo。VEVueElementstyle段header-left修改如下,这里要注意route-link渲染之后就是a标签。.header-left{&a{height:60p
- vite+vue+ts+element-plus从零开发管理后台框架(08)-顶部整体布局
vue3
顶部整体使用左、中、右的布局。左侧宽度跟菜单宽度一样,如果菜单未折叠就显示后台logo和后台名称,如果折叠了就只显示后台logo。右侧内容自适应,主要是显示系统工具按钮和用户信息。中间使用剩余空间,主要是显示菜单折叠按钮和多页签。布局编辑src/views/Main.vue,template段el-header修改如下。leftcenterrightstyle段el-header类修改如下.el-
- java 自定义协议_Netty实现自定义协议
林John
java自定义协议
关于协议,使用最为广泛的是HTTP协议,但是在一些服务交互领域,其使用则相对较少,主要原因有三方面:HTTP协议会携带诸如header和cookie等信息,其本身对字节的利用率也较低,这使得HTTP协议比较臃肿,在承载相同信息的情况下,HTTP协议将需要发送更多的数据包;HTTP协议是基于TCP的短连接,其在每次请求和响应的时候都需要进行三次握手和四次挥手,由于服务的交互设计一般都要求能够承载高并
- 如何获取headers
EmoGP
爬虫爬虫
首先复制目标url这里以https://www.51job.com/为例关闭浏览器,重新打开,然后打开f12粘贴目标url并进入,找到第一个请求粘贴RequestHeaders使用正则进行替换:Find:(.*?):(.*)Replace:"$1":"$2",
- java工厂模式
3213213333332132
java抽象工厂
工厂模式有
1、工厂方法
2、抽象工厂方法。
下面我的实现是抽象工厂方法,
给所有具体的产品类定一个通用的接口。
package 工厂模式;
/**
* 航天飞行接口
*
* @Description
* @author FuJianyong
* 2015-7-14下午02:42:05
*/
public interface SpaceF
- nginx频率限制+python测试
ronin47
nginx 频率 python
部分内容参考:http://www.abc3210.com/2013/web_04/82.shtml
首先说一下遇到这个问题是因为网站被攻击,阿里云报警,想到要限制一下访问频率,而不是限制ip(限制ip的方案稍后给出)。nginx连接资源被吃空返回状态码是502,添加本方案限制后返回599,与正常状态码区别开。步骤如下:
- java线程和线程池的使用
dyy_gusi
ThreadPoolthreadRunnabletimer
java线程和线程池
一、创建多线程的方式
java多线程很常见,如何使用多线程,如何创建线程,java中有两种方式,第一种是让自己的类实现Runnable接口,第二种是让自己的类继承Thread类。其实Thread类自己也是实现了Runnable接口。具体使用实例如下:
1、通过实现Runnable接口方式 1 2
- Linux
171815164
linux
ubuntu kernel
http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.1.2-unstable/
安卓sdk代理
mirrors.neusoft.edu.cn 80
输入法和jdk
sudo apt-get install fcitx
su
- Tomcat JDBC Connection Pool
g21121
Connection
Tomcat7 抛弃了以往的DBCP 采用了新的Tomcat Jdbc Pool 作为数据库连接组件,事实上DBCP已经被Hibernate 所抛弃,因为他存在很多问题,诸如:更新缓慢,bug较多,编译问题,代码复杂等等。
Tomcat Jdbc P
- 敲代码的一点想法
永夜-极光
java随笔感想
入门学习java编程已经半年了,一路敲代码下来,现在也才1w+行代码量,也就菜鸟水准吧,但是在整个学习过程中,我一直在想,为什么很多培训老师,网上的文章都是要我们背一些代码?比如学习Arraylist的时候,教师就让我们先参考源代码写一遍,然
- jvm指令集
程序员是怎么炼成的
jvm 指令集
转自:http://blog.csdn.net/hudashi/article/details/7062675#comments
将值推送至栈顶时 const ldc push load指令
const系列
该系列命令主要负责把简单的数值类型送到栈顶。(从常量池或者局部变量push到栈顶时均使用)
0x02 &nbs
- Oracle字符集的查看查询和Oracle字符集的设置修改
aijuans
oracle
本文主要讨论以下几个部分:如何查看查询oracle字符集、 修改设置字符集以及常见的oracle utf8字符集和oracle exp 字符集问题。
一、什么是Oracle字符集
Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货
- png在Ie6下透明度处理方法
antonyup_2006
css浏览器FirebugIE
由于之前到深圳现场支撑上线,当时为了解决个控件下载,我机器上的IE8老报个错,不得以把ie8卸载掉,换个Ie6,问题解决了,今天出差回来,用ie6登入另一个正在开发的系统,遇到了Png图片的问题,当然升级到ie8(ie8自带的开发人员工具调试前端页面JS之类的还是比较方便的,和FireBug一样,呵呵),这个问题就解决了,但稍微做了下这个问题的处理。
我们知道PNG是图像文件存储格式,查询资
- 表查询常用命令高级查询方法(二)
百合不是茶
oracle分页查询分组查询联合查询
----------------------------------------------------分组查询 group by having --平均工资和最高工资 select avg(sal)平均工资,max(sal) from emp ; --每个部门的平均工资和最高工资
- uploadify3.1版本参数使用详解
bijian1013
JavaScriptuploadify3.1
使用:
绑定的界面元素<input id='gallery'type='file'/>$("#gallery").uploadify({设置参数,参数如下});
设置的属性:
id: jQuery(this).attr('id'),//绑定的input的ID
langFile: 'http://ww
- 精通Oracle10编程SQL(17)使用ORACLE系统包
bijian1013
oracle数据库plsql
/*
*使用ORACLE系统包
*/
--1.DBMS_OUTPUT
--ENABLE:用于激活过程PUT,PUT_LINE,NEW_LINE,GET_LINE和GET_LINES的调用
--语法:DBMS_OUTPUT.enable(buffer_size in integer default 20000);
--DISABLE:用于禁止对过程PUT,PUT_LINE,NEW
- 【JVM一】JVM垃圾回收日志
bit1129
垃圾回收
将JVM垃圾回收的日志记录下来,对于分析垃圾回收的运行状态,进而调整内存分配(年轻代,老年代,永久代的内存分配)等是很有意义的。JVM与垃圾回收日志相关的参数包括:
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-Xloggc
-XX:+PrintGC
通
- Toast使用
白糖_
toast
Android中的Toast是一种简易的消息提示框,toast提示框不能被用户点击,toast会根据用户设置的显示时间后自动消失。
创建Toast
两个方法创建Toast
makeText(Context context, int resId, int duration)
参数:context是toast显示在
- angular.identity
boyitech
AngularJSAngularJS API
angular.identiy 描述: 返回它第一参数的函数. 此函数多用于函数是编程. 使用方法: angular.identity(value); 参数详解: Param Type Details value
*
to be returned. 返回值: 传入的value 实例代码:
<!DOCTYPE HTML>
- java-两整数相除,求循环节
bylijinnan
java
import java.util.ArrayList;
import java.util.List;
public class CircleDigitsInDivision {
/**
* 题目:求循环节,若整除则返回NULL,否则返回char*指向循环节。先写思路。函数原型:char*get_circle_digits(unsigned k,unsigned j)
- Java 日期 周 年
Chen.H
javaC++cC#
/**
* java日期操作(月末、周末等的日期操作)
*
* @author
*
*/
public class DateUtil {
/** */
/**
* 取得某天相加(减)後的那一天
*
* @param date
* @param num
*
- [高考与专业]欢迎广大高中毕业生加入自动控制与计算机应用专业
comsci
计算机
不知道现在的高校还设置这个宽口径专业没有,自动控制与计算机应用专业,我就是这个专业毕业的,这个专业的课程非常多,既要学习自动控制方面的课程,也要学习计算机专业的课程,对数学也要求比较高.....如果有这个专业,欢迎大家报考...毕业出来之后,就业的途径非常广.....
以后
- 分层查询(Hierarchical Queries)
daizj
oracle递归查询层次查询
Hierarchical Queries
If a table contains hierarchical data, then you can select rows in a hierarchical order using the hierarchical query clause:
hierarchical_query_clause::=
start with condi
- 数据迁移
daysinsun
数据迁移
最近公司在重构一个医疗系统,原来的系统是两个.Net系统,现需要重构到java中。数据库分别为SQL Server和Mysql,现需要将数据库统一为Hana数据库,发现了几个问题,但最后通过努力都解决了。
1、原本通过Hana的数据迁移工具把数据是可以迁移过去的,在MySQl里面的字段为TEXT类型的到Hana里面就存储不了了,最后不得不更改为clob。
2、在数据插入的时候有些字段特别长
- C语言学习二进制的表示示例
dcj3sjt126com
cbasic
进制的表示示例
# include <stdio.h>
int main(void)
{
int i = 0x32C;
printf("i = %d\n", i);
/*
printf的用法
%d表示以十进制输出
%x或%X表示以十六进制的输出
%o表示以八进制输出
*/
return 0;
}
- NsTimer 和 UITableViewCell 之间的控制
dcj3sjt126com
ios
情况是这样的:
一个UITableView, 每个Cell的内容是我自定义的 viewA viewA上面有很多的动画, 我需要添加NSTimer来做动画, 由于TableView的复用机制, 我添加的动画会不断开启, 没有停止, 动画会执行越来越多.
解决办法:
在配置cell的时候开始动画, 然后在cell结束显示的时候停止动画
查找cell结束显示的代理
- MySql中case when then 的使用
fanxiaolong
casewhenthenend
select "主键", "项目编号", "项目名称","项目创建时间", "项目状态","部门名称","创建人"
union
(select
pp.id as "主键",
pp.project_number as &
- Ehcache(01)——简介、基本操作
234390216
cacheehcache简介CacheManagercrud
Ehcache简介
目录
1 CacheManager
1.1 构造方法构建
1.2 静态方法构建
2 Cache
2.1&
- 最容易懂的javascript闭包学习入门
jackyrong
JavaScript
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。
下面就是我的学习笔记,对于Javascript初学者应该是很有用的。
一、变量的作用域
要理解闭包,首先必须理解Javascript特殊
- 提升网站转化率的四步优化方案
php教程分享
数据结构PHP数据挖掘Google活动
网站开发完成后,我们在进行网站优化最关键的问题就是如何提高整体的转化率,这也是营销策略里最最重要的方面之一,并且也是网站综合运营实例的结果。文中分享了四大优化策略:调查、研究、优化、评估,这四大策略可以很好地帮助用户设计出高效的优化方案。
PHP开发的网站优化一个网站最关键和棘手的是,如何提高整体的转化率,这是任何营销策略里最重要的方面之一,而提升网站转化率是网站综合运营实力的结果。今天,我就分
- web开发里什么是HTML5的WebSocket?
naruto1990
Webhtml5浏览器socket
当前火起来的HTML5语言里面,很多学者们都还没有完全了解这语言的效果情况,我最喜欢的Web开发技术就是正迅速变得流行的 WebSocket API。WebSocket 提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术。这个新的API提供了一个方法,从客户端使用简单的语法有效地推动消息到服务器。让我们看一看6个HTML5教程介绍里 的 WebSocket API:它可用于客户端、服
- Socket初步编程——简单实现群聊
Everyday都不同
socket网络编程初步认识
初次接触到socket网络编程,也参考了网络上众前辈的文章。尝试自己也写了一下,记录下过程吧:
服务端:(接收客户端消息并把它们打印出来)
public class SocketServer {
private List<Socket> socketList = new ArrayList<Socket>();
public s
- 面试:Hashtable与HashMap的区别(结合线程)
toknowme
昨天去了某钱公司面试,面试过程中被问道
Hashtable与HashMap的区别?当时就是回答了一点,Hashtable是线程安全的,HashMap是线程不安全的,说白了,就是Hashtable是的同步的,HashMap不是同步的,需要额外的处理一下。
今天就动手写了一个例子,直接看代码吧
package com.learn.lesson001;
import java
- MVC设计模式的总结
xp9802
设计模式mvc框架IOC
随着Web应用的商业逻辑包含逐渐复杂的公式分析计算、决策支持等,使客户机越
来越不堪重负,因此将系统的商业分离出来。单独形成一部分,这样三层结构产生了。
其中‘层’是逻辑上的划分。
三层体系结构是将整个系统划分为如图2.1所示的结构[3]
(1)表现层(Presentation layer):包含表示代码、用户交互GUI、数据验证。
该层用于向客户端用户提供GUI交互,它允许用户