首页 文章 精选 留言 我的

精选列表

搜索[模拟器开发],共10000篇文章
优秀的个人博客,低调大师

php开发常用函数总结

1 2 3 4 5 6 7 8 9 10 http_build_query() <?php $data=array( 'foo' => 'bar' , 'baz' => 'boom' , 'cow' => 'milk' , 'php' => 'hypertextprocessor' ); echo http_build_query($data); foo=bar&baz=boom&cow=milk&php=hypertext+processor ?> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 mktime() <?php // 输出:October3,1975wasonaFriday echo "Oct3,1975wasona" . date ( "l" ,mktime(0,0,0,10,3,1975)). "<br><br>" ; // 在进行日期计算和验证时会用到mktime()函数 // 它会对超出范围的输入值自动计算正确的值: echo date ( "M-d-Y" ,mktime(0,0,0,12,36,2001)). "<br>" ; echo date ( "M-d-Y" ,mktime(0,0,0,14,1,2001)). "<br>" ; echo date ( "M-d-Y" ,mktime(0,0,0,1,1,2001)). "<br>" ; echo date ( "M-d-Y" ,mktime(0,0,0,1,1,99)). "<br>" ; ?> Oct3,1975wasonaFriday Jan-05-2002 Feb-01-2002 Jan-01-2001 Jan-01-1999 $today=mktime(0,0,0, date ( 'm' ), date ( 'd' ), date ( 'Y' )); 1 2 3 4 5 6 7 8 9 10 mb_strlen <?php // 测试时文件的编码方式要是UTF8 $str= '中文a字1符' ; echo strlen($str). '<br>' ; //14 echo mb_strlen($str, 'utf8' ). '<br>' ; //6 echo mb_strlen($str, 'gbk' ). '<br>' ; //8 echo mb_strlen($str, 'gb2312' ). '<br>' ; //10 ?> 1 2 3 4 5 6 7 8 9 10 11 12 strip_tags() <?php $text= '<p>Testparagraph.</p><!--Comment--><ahref="#fragment">Othertext</a>' ; echo strip_tags($text); echo "" ; // 允许<p>和<a> echo strip_tags($text, '<p><a>' ); ?> Testparagraph.Othertext <p>Testparagraph.< /p ><ahref= "#fragment" >Othertext< /a > 1 2 3 4 5 6 7 8 9 10 11 array_push() <?php $a=array(); array_push($a, "blue" , "yellow" ); print_r($a); ?> Array ( [0]=>blue [1]=>yellow ) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 array_merge() <?php $a1=array( "red" , "green" ); $a2=array( "blue" , "yellow" ); print_r(array_merge($a1,$a2)); ?> Array ( [0]=>red [1]=>green [2]=>blue [3]=>yellow ) 1 2 3 4 5 mb_substr() <?php $aaa= "this这是中文字符串" ; echo mb_substr($aaa,0,6, 'UTF-8' ); // 输出值为:this这是 1 2 3 4 strtotime <?php echo strtotime( date ( "Y-m-d" , time ())); //1483632000 1 2 3 4 5 6 7 8 9 10 11 12 13 14 intval()floatval()strval() <?php $str= "123.9abc" ; $int=intval($str); var_dump($int); $float=floatval($str); var_dump($float); $str=strval($str); var_dump($str); ?> int(123) float(123.9) string(8) "123.9abc" 本文转自ning1022 51CTO博客,原文链接:http://blog.51cto.com/ning1022/1889697 ,如需转载请自行联系原作者

优秀的个人博客,低调大师

阿里JAVA 开发手册----整理

1、命名严禁使用拼音与英文混合的方式。 2、领域模型命名规约 1) 数据对象: xxxDO, xxx 即为数据表名。 2) 数据传输对象: xxxDTO, xxx 为业务领域相关的名称。 3) 展示对象: xxxVO, xxx 一般为网页名称。 4) POJO 是 DO/DTO/BO/VO 的统称,禁止命名成 xxxPOJO。 3、long 或者 Long 初始赋值时,必须使用大写的 L,小写容易跟数字 1 混淆,造成误解。 4、避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成 本,直接用类名来访问即可。 5、说明: 可变参数必须放置在参数列表的最后。(提倡同学们尽量不用可变参数编程) 正例: public User getUsers(String type, Integer... ids);(可为null的参数放最后) 6、Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。 正例: "test".equals(object); 7、所有的相同类型的包装类对象之间值的比较,全部使用 equals 方法比较。 说明: 对于 Integer var=?在-128 至 127 之间的赋值, Integer 对象是在 IntegerCache.cache 产生,会复用已有对象,这个区间内的 Integer 值可以直接使用==进行判断,但是这个区间之 外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用 equals 方 法进行判断。 8、注意 serialVersionUID 不一致会抛出序列化运行时异常。 9、关于基本数据类型与包装数据类型的使用标准如下: 1) 所有的 POJO 类属性必须使用包装数据类型。 2) RPC 方法的返回值和参数必须使用包装数据类型。 3) 所有的局部变量推荐使用基本数据类型。 10、final 可提高程序响应效率,声明成 final 的情况: 1) 不需要重新赋值的变量,包括类属性、局部变量。 2) 对象参数前加 final,表示不允许修改引用的指向。 3) 类方法确定不允许被重写。 11、对象的 clone 方法默认是浅拷贝,若想实现深拷贝需要重写 clone 方法实现属性对象的 拷贝。 12、Map/Set 的 key 为自定义对象时,必须重写 hashCode 和 equals。 正例: String 重写了 hashCode 和 equals 方法,所以我们可以非常愉快地使用 String 对象作 为 key 来使用。 13、ArrayList 的 subList 结果不可强转成 ArrayList,否则会抛出 ClassCastException 异常: java.util.RandomAccessSubList cannot be cast to java.util.ArrayList ; 说明: subList 返回的是 ArrayList 的内部类 SubList,并不是 ArrayList ,而是 ArrayList 的一个视图,对于 SubList 子列表的所有操作最终会反映到原列表上。 14、List<String> list = new ArrayList<String>(2); list.add("guan"); list.add("bao"); String[] array = new String[list.size()]; array = list.toArray(array); 说明: 使用 toArray 带参方法,入参分配的数组空间不够大时, toArray 方法内部将重新分配 内存空间,并返回新数组地址;如果数组元素大于实际所需,下标为[ list.size() ]的数组 元素将被置为 null,其它数组元素保持原值。 15、使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法, 它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。 说明: asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。 Arrays.asList 体现的是适配器模式,只是转换接口,后台的数据仍是数组。 String[] str = new String[] { "a", "b" }; List list = Arrays.asList(str); 第一种情况: list.add("c"); 运行时异常。 第二种情况: str[0]= "gujin"; 那么 list.get(0)也会随之修改。 16、不要在 foreach 循环里进行元素的 remove/add 操作(会抛出ConcurrentModificationException)。 remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterator 对象加锁。 17、Map集合:values()返回的是 V 值集合,是一个 list 集合对象; keySet()返回的是 K 值集合,是 一个 Set 集合对象; entrySet()返回的是 K-V 值组合集合。 18、高并发时,同步调用应该去考量锁的性能损耗。能用无锁数据结构,就不要用锁;能 锁区块,就不要锁整个方法体;能用对象锁,就不要用类锁。 19、线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样 的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明: Executors 各个方法的弊端: 1) newFixedThreadPool 和 newSingleThreadExecutor: 主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至 OOM。 2) newCachedThreadPool 和 newScheduledThreadPool: 主要问题是线程数最大数是 Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至 OOM。 20、注意,子线程抛出异常堆栈,不能在主线程 try-catch 到。 21、注意 Math.random() 这个方法返回是 double 类型,注意取值范围 0≤x<1(能够取 到零值,注意除零异常)。 22、单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。 23、where a=? and b>? 多个查询条件,区分度高的在前,有=的在前。 24、禁止使用存储过程,存储过程难以调试和扩展,更没有移植性(隐藏在DB中,不直观难维护)。 25、删除和修改记录时,要先 select,避免出现误删除,确认无误才能 提交执行。 26、in 操作能避免则避免,若实在避免不了,需要仔细评估 in 后边的集合元素数量,控 制在 1000 个之内。 27、<isNotEmpty>表示不为空且不为 null 时执行; <isNotNull>表示不为 null 值时执行。 28、mysql类型DECIMAL 实际是以串存放的。尽量用DECIMAL取代float和double。 --分为Java语言部分、集合框架、Java线程与并发、数据库。 https://yq.aliyun.com/articles/240163?spm=5176.10695662.1996646101.searchclickresult.7b4515c54fNXir

优秀的个人博客,低调大师

intellij 开发调试elasticsearch插件

elasticsearch之所以功能比较强大,更多的是因为其插件机制比较灵活,可以直接不需要改动源码的情况下,被es的节点扫描加载。本篇文章就简单的讲一下如何进行调试插件,其实无论是river、analysis或者是其他的plugin,都是差不多的写法,所以我们用其中一个river的插件来演示下如何进行调试。 首先,在github上git clone对应的elasticsearch的源码,然后在intellij中将其import进来作为project。 然后,在github上git cloneelasticsearch-rabbitmq-river的源码,然后在intellij中作为elasticsearch项目的一个module进行import。 效果如图, 接下来进行运行,这步是最重要的,也是如何让plugin可以在elasticsearch加载的关键。 1、点击run菜单选择-》configure 2、新建一个application,Main class 选择 org.elasticsearch.bootstrap.Bootstrap 3、Vm options 中填-Des.foreground=true 保证可以让es在前台运行,并输出日志 4、最重要的,将Use classpath of module选择为插件的项目,即elasticsearch-river-rabbitmq 最后、Debug as 就OK了。

优秀的个人博客,低调大师

iOS开发-UITableView常用方法

UITableView常用来展示数据,类似于Android中的ListView,相对于Android中的ListView而言,UITableView的实现是非常简单,继承UITableViewDataSource,UITableViewDelegate然后根据需要是实现对应的方法即可。UITableView有两个默认的内置风格,Plain和Grouped,Plain表明表格视图自身没有真正地在你自己实际地提供任何外观之前提供很多的外观,大部分情况下,它会做的唯一的事情是它会给你这些header和footer。Grouped表格视图是UIKit提供的分组风格。风格的话如果有特别的需求,还可以自定义分组的风格。 页面布局 页面比较简单,一个简单UITableView: 头文件中的不需要声明,需要实现一下协议: 1 2 3 @interface ViewController : UIViewController <UITableViewDataSource,UITableViewDelegate> @end Demo实现 声明三个数据用来展示数据: 1 2 3 4 5 6 7 @interface ViewController () { NSArray *channelArr; NSMutableArray *filmArr; NSMutableArray *tvArr; } @end 初始化数据: 1 2 3 4 5 6 7 - ( void )viewDidLoad { [ super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. channelArr=[[ NSArray alloc] initWithObjects:@ "电影" ,@ "电视剧" , nil ]; filmArr=[[ NSMutableArray alloc] initWithObjects:@ "智取威虎山" ,@ "一步之遥" ,@ "匆匆那年" ,@ "北京爱情故事" , nil ]; tvArr=[[ NSMutableArray alloc] initWithObjects:@ "何以笙箫默" ,@ "锋刃" ,@ "陆小凤与花满楼" ,@ "武媚娘传奇" , nil ]; } 设置分组的组数: 1 2 3 4 - ( NSInteger )numberOfSectionsInTableView:(UITableView *)tableView{ NSLog (@ "%lu" ,(unsigned long )channelArr.count); return [channelArr count]; } 设置分组的标题: 1 2 3 - ( NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:( NSInteger )section{ return [channelArr objectAtIndex:section]; } 设置每个分组下内容的个数: 1 2 3 4 5 6 7 8 9 10 11 12 - ( NSInteger )tableView:(UITableView *)tableView numberOfRowsInSection:( NSInteger )section{ NSInteger count=0; switch (section) { case 0: count=[filmArr count]; break ; case 1: count=[tvArr count]; break ; } return count; } 设置每个分组下的具体内容: 1 2 3 4 5 6 7 8 9 10 11 12 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:( NSIndexPath *)indexPath{ UITableViewCell *cell =[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: nil ]; switch (indexPath.section) { case 0: [cell.textLabel setText:[filmArr objectAtIndex:indexPath.row]]; break ; case 1: [cell.textLabel setText:[tvArr objectAtIndex:indexPath.row]]; break ; } return cell; } 设置分组标题和底部的高度: 1 2 3 4 5 6 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:( NSInteger )section{ return 40; } - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:( NSInteger )section{ return 0; } 设置点击事件: 1 2 3 4 5 6 7 8 9 10 11 12 13 - ( void )tableView:(UITableView *)tableView didSelectRowAtIndexPath:( NSIndexPath *)indexPath{ NSString *content; switch (indexPath.section) { case 0: content=[ NSString stringWithFormat:@ "%@-%@" ,channelArr[0],[filmArr objectAtIndex:indexPath.row]]; break ; case 1: content=[ NSString stringWithFormat:@ "%@-%@" ,channelArr[1],[tvArr objectAtIndex:indexPath.row]]; break ; } UIAlertView *alterView=[[UIAlertView alloc] initWithTitle:@ "当前位置:" message:content delegate: self cancelButtonTitle:@ "确定" otherButtonTitles: nil ]; [alterView show]; } 最终效果: 源代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 // // ViewController.m // TableView //http://www.cnblogs.com/xiaofeixiang/ // Created by keso on 15/1/24. // Copyright (c) 2015年 keso. All rights reserved. // #import "ViewController.h" @interface ViewController () { NSArray *channelArr; NSMutableArray *filmArr; NSMutableArray *tvArr; } @end @implementation ViewController - ( void )viewDidLoad { [ super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. channelArr=[[ NSArray alloc] initWithObjects:@ "电影" ,@ "电视剧" , nil ]; filmArr=[[ NSMutableArray alloc] initWithObjects:@ "智取威虎山" ,@ "一步之遥" ,@ "匆匆那年" ,@ "北京爱情故事" , nil ]; tvArr=[[ NSMutableArray alloc] initWithObjects:@ "何以笙箫默" ,@ "锋刃" ,@ "陆小凤与花满楼" ,@ "武媚娘传奇" , nil ]; } //设置分组的组数 - ( NSInteger )numberOfSectionsInTableView:(UITableView *)tableView{ NSLog (@ "%lu" ,(unsigned long )channelArr.count); return [channelArr count]; } //设置分组的标题 - ( NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:( NSInteger )section{ return [channelArr objectAtIndex:section]; } //- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{ // return @"我是底部"; //} //设置每个分组的个数 - ( NSInteger )tableView:(UITableView *)tableView numberOfRowsInSection:( NSInteger )section{ NSInteger count=0; switch (section) { case 0: count=[filmArr count]; break ; case 1: count=[tvArr count]; break ; } return count; } //设置分组中具体的内容 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:( NSIndexPath *)indexPath{ UITableViewCell *cell =[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: nil ]; switch (indexPath.section) { case 0: [cell.textLabel setText:[filmArr objectAtIndex:indexPath.row]]; break ; case 1: [cell.textLabel setText:[tvArr objectAtIndex:indexPath.row]]; break ; } return cell; } //分组标题的行高 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:( NSInteger )section{ return 40; } - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:( NSInteger )section{ return 0; } //选中点击事件 - ( void )tableView:(UITableView *)tableView didSelectRowAtIndexPath:( NSIndexPath *)indexPath{ NSString *content; switch (indexPath.section) { case 0: content=[ NSString stringWithFormat:@ "%@-%@" ,channelArr[0],[filmArr objectAtIndex:indexPath.row]]; break ; case 1: content=[ NSString stringWithFormat:@ "%@-%@" ,channelArr[1],[tvArr objectAtIndex:indexPath.row]]; break ; } UIAlertView *alterView=[[UIAlertView alloc] initWithTitle:@ "当前位置:" message:content delegate: self cancelButtonTitle:@ "确定" otherButtonTitles: nil ]; [alterView show]; } - ( void )didReceiveMemoryWarning { [ super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end 本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4246563.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

IOS开发——Protocol使用协议

protocol ['prəutəkɔl](样例:http://blog.sina.com.cn/s/blog_6aafe9c90100yozz.html)一、说明 两个类进行通讯,用协议就比較方便。 1.协议声明了能够被不论什么类实现的方法 2.协议不是类,它是定义了一个其它对象能够实现的接口 3.假设在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议。 4.协议经经常使用来实现托付对象。一个托付对象是一种用来协同或者代表其它对象的特殊对象。 5:托付,就是调用自定义方法,别的类来实现。 6.新特性说明 @optional预编译指令:表示能够选择实现的方法 @required预编译指令:表示必须强制实现的方法 二、定义 .h @protocol ContactCtrlDelegate -(void)DismissContactsCtrl; @end @interface ContactsCtrl : UIViewController { id <ContactCtrlDelegate> delegate; } @property (nonatomic, assign) id <ContactCtrlDelegate> delegate; .m @synthesize delegate; 三、样例 比如:UITextView @protocol UITextViewDelegate <NSObject> @optional - (BOOL)textViewShouldBeginEditing:(UITextView *)textView; - (BOOL)textViewShouldEndEditing:(UITextView *)textView; - (void)textViewDidBeginEditing:(UITextView *)textView; - (void)textViewDidEndEditing:(UITextView *)textView; - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text; - (void)textViewDidChange:(UITextView *)textView; - (void)textViewDidChangeSelection:(UITextView *)textView; @end 假设要调用以上这些方法。就必须设置UITextView的托付:TextView.delegate = self; 四、Demo 1、ContactsCtrl.h #import <UIKit/UIKit.h> //定义协议 @protocol ContactCtrlDelegate -(void)DismissContactsCtrl; @end @interface ContactsCtrl : UIViewController { IBOutlet UINavigationBar *ContactNavBar; id <ContactCtrlDelegate> delegate; } @property (nonatomic, assign) id <ContactCtrlDelegate> delegate; -(IBAction)canCelBtn:(id)sender; @end 2、ContactsCtrl.m @implementation ContactsCtrl @synthesize delegate; // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; ContactNavBar.topItem.prompt = @"选取联系人发送短信"; } //调用协议中的方法 -(IBAction)canCelBtn:(id)sender{ [delegate DismissContactsCtrl]; } 3、ProtocolDemoCtrl.h #import <UIKit/UIKit.h> #import "ContactsCtrl.h" @interface ProtocolDemoCtrl : UIViewController <ContactCtrlDelegate>{//加入托付 ContactsCtrl *contactsView; } 4、ProtocolDemoCtrl.m #import "ProtocolDemoCtrl.h" #define BARBUTTONADD(SELECTOR) [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:SELECTOR] autorelease]; @implementation ProtocolDemoCtrl @synthesize contactsView; // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; self.navigationItem.rightBarButtonItem = BARBUTTONADD(@selector(addContactAction:)); } - (void)addContactAction:(id)sender{ ContactsCtrl *contactView = [[ContactsCtrl alloc] initWithNibName:@"ContactsCtrl" bundle:nil]; self.contactsView = contactView; contactsView.delegate = self;//设置托付 [self presentModalViewController:contactsView animated:YES]; [contactView release]; } //实现ContactCtrlDelegate协议中的方法 -(void)DismissContactsCtrl{ [contactsView dismissModalViewControllerAnimated:YES]; } 综上,假设A类.h文件定义了一个协议,在A类里面我们还须要定义一个托付delegate,协议里面有个必须实现的methodA方法(@required,这种方法在实现了协议的类里面实现),在A类的.m文件里须要调用这个methodA方法,我们使用托付调用这个methodA方法 [delegate DismissContactsCtrl]; 类B实现了这个协议,在.h文件里定义类A的对象a,在.m文件里须要实现methodA方法。而且须要设置托付 a.delegate = self;//设置托付 假设MethodA返回的是B类的对象,那么在A类中就能够调用B类属性和方法国,B这个类可以调用A的属性和方法。 版权声明:本文博客原创文章。博客,未经同意,不得转载。 本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4657138.html,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册