文档章节

一言不和就自己写了个编程语言

悠悠然然
 悠悠然然
发布于 2017/07/26 19:09
字数 3122
阅读 5038
收藏 47
点赞 18
评论 62

序言

摘要: 最近一直在写一个脚本语言,主要对标对象是润乾的集算器、Python等。感觉润乾的集算器有一定的应用场景,但是类似excel的方式严重影响编程可接受程度,另外其有些语法感觉与java习惯也非常不一致,因此就自己动手写了一个,目前正在紧张的验证中,验证完毕将完全开源。 欢迎感兴趣的同学mark,到时一起玩耍。 最终开源的git地址是:http://git.oschina.net/tinyframework/tinyscript 正常是完善好文档再开源,如果fork超过1000+,马上开源,开源协议是Apache V2。

运行

我们提供了Eclipse和Idea插件,可以直接右键运行扩展名为tinyscript的文件哦:

示例

99表

for(i=1;i<=9;i++){
	for(j=1;j<=i;j++){
		printf("%d*%d=%d\t",i,j,i*j);
	}
	println();
}

运行结果

1*1=1	
2*1=2	2*2=4	
3*1=3	3*2=6	3*3=9	
4*1=4	4*2=8	4*3=12	4*4=16	
5*1=5	5*2=10	5*3=15	5*4=20	5*5=25	
6*1=6	6*2=12	6*3=18	6*4=24	6*5=30	6*6=36	
7*1=7	7*2=14	7*3=21	7*4=28	7*5=35	7*6=42	7*7=49	
8*1=8	8*2=16	8*3=24	8*4=32	8*5=40	8*6=48	8*7=56	8*8=64	
9*1=9	9*2=18	9*3=27	9*4=36	9*5=45	9*6=54	9*7=63	9*8=72	9*9=81	

我们支持简化的println,其实你用java的写法也是可以的,比如:System.out.println。

数组

abc={1,2,4,9,6,3};
println(max(abc));
println(min(abc));
println(avg(abc));
println(median(abc));
println(varp(abc));
println(stdevp(abc));
def={"aa","bb","cc"};
println(max(def));

运行结果

9
1
4.166666666666667
3.5
7.138888888888889
2.6718699236468995
cc

列表

a=[1,2,3,4,5];
b=[2,3,4,6];
println(a-b);
println(a+b);
println(a&b);
println(a^b);
c=["abc","def","gg"];
d=["abc","def1","gg1"];
println(c+d);
println(c-d);
println(d-c);

运行结果

[1, 5]
[1, 2, 3, 4, 5, 6]
[2, 3, 4]
[1, 5, 6]
[abc, def, gg, def1, gg1]
[def, gg]
[def1, gg1]

当然也可以有更好玩的动作

a=[1,2,3];
println(a);
a++;
println(a);
a*=3;
println(a);
b=["abc","def","ghijk"];
println(b.length());
[1, 2, 3]
[2, 3, 4]
[6, 9, 12]
[3, 3, 5]

当然,来点lambda也是可以的:

add(a,b)->{	return a+b;};
System.out.println(add(2,4));

运行结果:

6

Java语法可以直接使用:

import java.util.*;
list=[1,2,3,9,8,7];
Collections.sort(list);
println(list);

运行结果:

[1, 2, 3, 7, 8, 9]

当然脚本语言中的结果也可以在Java里面完美使用,完全没有违和感。

java的所有属性和方法都可以直接被调用:

a=[1,2,3,4,5];
println(a.getClass().getName());
b=[];
for(i:a){b.add(i*i)};
println(b);

运行结果:

java.util.ArrayList
[1, 4, 9, 16, 25]

这里也再次证明它和java都是完全一致的,从这个意义上说,他可以是ava的扩展。

当然,做它不是为了玩玩,当然是期望有比较简单的处理,这里的“#”表示集合元素的一个具体元素

a=[1,2,3,4,5];
println(a.filter(#%2==1));
println(a.filter(#%2==0));
println(a.filter(#>3&&#%2==0));

运行结果:

[1, 3, 5]
[2, 4]
[4]

上面的意思就是,对这个列表进行过滤,分别是取奇数、偶数和大于3的偶数。

由于后面的表达式可以任意编写,这样就有了非常好的适用场景了:

class User{
	age,name;
}

userList=[];
for(i=1;i<9;i++){
	user=new User();
	user.name="user"+i;
	user.age=i;
	userList.add(user);
}

filterList=userList.filter(#.age>3&&#.age%2==1);
println(filterList);

运行结果:

[User[name=user5,age=5], User[name=user7,age=7]]

上面的逻辑是,取出年龄大于3且年龄是单数的用户列表。

Map

map={"abc":1,"aaa":2,"ddd":4};
map1={"abc":1,"aaa":2,"bbb":3};
println(map);
println(map.get("abc"));
println(map+map1);
println(map^map1);
println(map&map1);
println(map1-map);

运行结果:

{aaa=2, abc=1, ddd=4}
1
{aaa=2, abc=1, bbb=3, ddd=4}
{bbb=3, ddd=4}
{aaa=2, abc=1}
{bbb=3}

全排列

ele=[1,2,3];
for(i:ele){
    ele.permute(i,(e) -> {
        println(e);
    });
    println("==============");
}

运行结果

[1]
[2]
[3]
==============
[1, 1]
[1, 2]
[1, 3]
[2, 1]
[2, 2]
[2, 3]
[3, 1]
[3, 2]
[3, 3]
==============
[1, 1, 1]
[1, 1, 2]
[1, 1, 3]
[1, 2, 1]
[1, 2, 2]
[1, 2, 3]
[1, 3, 1]
[1, 3, 2]
[1, 3, 3]
[2, 1, 1]
[2, 1, 2]
[2, 1, 3]
[2, 2, 1]
[2, 2, 2]
[2, 2, 3]
[2, 3, 1]
[2, 3, 2]
[2, 3, 3]
[3, 1, 1]
[3, 1, 2]
[3, 1, 3]
[3, 2, 1]
[3, 2, 2]
[3, 2, 3]
[3, 3, 1]
[3, 3, 2]
[3, 3, 3]
==============

当然你也可以对各种排列进行相关的处理

水仙花数

class Narcissus{
   compute(num){
   		for(i=100;i<num;i++){
   			a=i/100;
   			b=(i-a*100)/10;
   			c=i-a*100-b*10;
   			if(pow(a,3)+pow(b,3)+pow(c,3)==i){
   				System.out.println(i);
   			}
   		}
   }
}

narcissus=new Narcissus();
narcissus.compute(999);

运行结果:

153
370
371
407

可以看到普通的算法是上面这个样子的。

采用全排列的算法是如下的:

elements = [0,1,2,3,4,5,6,7,8,9];
elements.permute(3,(e) -> {
	value=e[1]*100+e[2]*10+e[3];
	if(pow(e[1],3)+pow(e[2],3)+pow(e[3],3)==value){
		System.out.println(value);
	}
});

运行结果:

0
1
153
370
371
407

可以看到比普通的算法多了两个0,1,原因是这里没有对000和001进行处理,直接转为0和1了,如果000=0、001=1,那么0、1也可以算作是符合条件的。

石头剪刀布游戏

info=["石头","剪刀","布"];

for(i=0;i<10;i++){
    mine=randInt()%3;
    your=randInt()%3;
    if(mine==your){
        printf("平了,都是%s\n",info[mine+1]);
    }else{
        if(mine==your-1||mine==2&&your==0){
            printf("我赢了,我是%s你是%s\n",info[mine+1],info[your+1]);
        }else{
            printf("我输了,我是%s你是%s\n",info[mine+1],info[your+1]);
        }
    }
}

运行结果:

我输了,我是布你是剪刀
我输了,我是剪刀你是石头
平了,都是石头
我赢了,我是剪刀你是布
平了,都是剪刀
我输了,我是布你是剪刀
平了,都是布
平了,都是石头
我输了,我是布你是剪刀
我赢了,我是石头你是剪刀

看起来玩起普通的算法也是没有任何问题的。

类支持

class User {
    
    name,age;
    User(name,age){
      this.name = name;
      this.age =age;
    }
    User(name){
      this.name = name;
    }
    
}

user = new User("红薯",18);
user2 = new User("tom");
user3 = new User();  //无参构造函数
println(user);
println(user2);
println(user3);

运行结果:

User[name=红薯,age=18]
User[name=tom,age=null]
User[name=null,age=null]

计算连续3天涨停的股票

下面是某证券交易所一个月内的日收盘价记录,其中CODE列为股票代码,DT为日期,CL为收盘价。试找出这个月内曾连续三天涨停的股票。为避免四舍五入产生的误差,涨停的比率定为9.5%。

部分数据请见下图(完整记录请见附件stockRecords.txt,之后示例也遵守此规范)

QQ截图20170525112834.png

class Example1 {
    
 /* 统计一个月内连续三天涨停的股票 */
    countStock(path) {
       ratio = 0.095d;
       ds = readTxt(path);
       groupds =ds.insertColumn(3,"UP").convert(CL,"double").group(CODE).sortGroup("DT ASC");
       groupds.subGroup(1,1).update(UP,0d);  //每月的第一天涨停率为0
       groupds.update(UP,(CL[0]-CL[-1])/CL[-1]);  //之后的每天统计当天的涨停率。
       resultds = groupds.filterGroup(UP[0]>ratio && UP[1]>ratio && UP[2]>ratio);
       return resultds;
    }
}
m = new Example1(); 
groupDs= m.countStock(\"src/test/resources/StockRecords.txt\");
for(int i=0;i<groupDs.getRows();i++){
     println("code="+groupDs.getData(i+1,1));
}

这次的代码有点复杂,因此这里解释一下:

设定涨停增长率为0.095及以上。

从文本文件读取数据,当然从数据库读取也是一样的,只要改成如下即可:

ds=[[select * from stockRecords]];

然后增加一个列,并把CL列转成double,然后按CODE分组,然后按DT排序。

然后每支股票的第一天的增长率设置为0,然后,计算后面的增长率。

然后过滤连续3天增长率都大于涨停的股票。

运行结果:

code=201745
code=550766
code=600045
code=700071

计算订单邮费

 某B2C网站需要计算订单的邮寄费用,大部分情况下,邮费有包裹的总重量决定,但是,当订单的价格超过300美元时,提供免费付运。详细规则如下面的mailCharge表所示:

FIELD MINVAL MAXVAL CHARGE
COST 300 1000000 0
WEIGHT 0 1 10
WEIGHT 1 5 20
WEIGHT 5 10 25
WEIGHT 10 1000000 40

该表记录了各个字段在各种取值范围内时的邮费。例如,第一条记录表示,cost字段取值在300与1000000之间的时候,邮费为0(免费付运);第二条记录表示,weight字段取值在0到1(kg)之间时,邮费为10(美元)。

  某B2C网站需要计算订单的邮寄费用,大部分情况下,邮费有包裹的总重量决定,但是,当订单的价格超过300美元时,提供免费付运。详细规则如下面的mailCharge表所示:

FIELD MINVAL MAXVAL CHARGE
COST 300 1000000 0
WEIGHT 0 1 10
WEIGHT 1 5 20
WEIGHT 5 10 25
WEIGHT 10 1000000 40

该表记录了各个字段在各种取值范围内时的邮费。例如,第一条记录表示,cost字段取值在300与1000000之间的时候,邮费为0(免费付运);第二条记录表示,weight字段取值在0到1(kg)之间时,邮费为10(美元)。

下面是该网站的一些订单:

ID COST WEIGHT(KG)

JOSH1

150 6
    DRAKE 100 3
    MEGAN 100 1
    JOSH2 200 3
    JOSH3 500 1

请计算这些订单的详细邮费。

class Example2 {
    /* 根据规则统计不同订单的邮费 */
    countMailCharge(path1,path2){
       ruleDs = readTxt(path1).convert(MINVAL,"int").convert(MAXVAL,"int").convert(CHARGE,"int");
       orderDs = readTxt(path2).convert(COST,"int").convert(WEIGHT,"int").insertColumn(4,"POSTAGE");
       costRuleDs = ruleDs.filter(FIELD=="COST").sort("MINVAL");   //cost维度规则集
       weightRuleDs = ruleDs.filter(FIELD=="WEIGHT").sort("MINVAL");  //weight维度规则集
       orderDs.match(costRuleDs,COST > MINVAL).update(POSTAGE,CHARGE);   //通过match函数匹配COST规则
       orderDs.match(weightRuleDs,POSTAGE ==null && WEIGHT > MINVAL && WEIGHT <=MAXVAL).update(POSTAGE,CHARGE);  //通过match函数匹配WEIGHT规则   
       return orderDs;
    }
}
m = new Example2();
resultDs=m.countMailCharge(\"src/test/resources/mailCharge.txt\",\"src/test/resources/testOrder.txt\");
for(int i=0;i<resultDs.getRows();i++){
     resultDs.absolute(i+1);
     println("POSTAGE="+resultDs.getData("POSTAGE"));
}

运行结果:

POSTAGE=25
POSTAGE=20
POSTAGE=10
POSTAGE=20
POSTAGE=0

统计销售大户

下面是某企业的历史销售合同记录:

QQ截图20170505151929.png

下面是某企业的客户信息表:

QQ截图20170505152154.png

      某年内按销售额排名的客户,达到一半销售额的前n个客户称为该年的“大客户”,请列出1998年该企业的大客户名单。

class Example3 {   
 /* 统计某年的大客户  */
    countVip(){
       contractDs = readTxt("src/test/resources/Contract.txt").convert(Amount,"double");
       clientDs = readTxt("src/test/resources/Client.txt");
       firstDs  = contractDs.filter(SellDate.startsWith("1998")).join(clientDs,Client = ID); //过滤1998年的数据,并关联client表
       groupDs  = firstDs.select("Name","Amount").group(Name);  //保留计算字段,并按用户分组
       groupDs.sumGroup(Amount); //统计每个用户的金额
       halfAmount = groupDs.sort("sumGroup_Amount desc").sum(sumGroup_Amount)/2;
       list = new java.util.ArrayList();  //建立空序列
       groupDs.forEach( (i) -> {
           halfAmount -= sumGroup_Amount;
           if(halfAmount>0){
              list.add(Name);
           }
             } );
       return list;
    }
}
m = new Example3(); 
obj=return m.countVip();
for(Object obj:list){
   println("name="+obj);
}

运行结果:

name=QUICK-Stop
name=Save-a-lot Markets
name=Ernst Handel
name=Mère Paillarde
name=Hungry Owl All-Night Grocers
name=Rattlesnake Canyon Grocery
name=Simons bistro
name=Berglunds snabbk?p
name=Lehmanns Marktstand
name=HILARION-Abastos
name=Folk och f? HB

统计客户账户余额

一共涉及四张表,首先是Customers表,记录了客户ID和客户的账户余额:

QQ截图20170507154413.png

第二张表是Orders表记录了每个订单以及它的客户:

QQ截图20170507154645.png

第三张表OrderDetails表记录了每个订单的详细信息,包括订购的产品ID以及数量:

QQ截图20170507154824.png

最后一张表Products表记录了企业所有的产品信息:

QQ截图20170507154935.png

问题是为每一个订购了公司所有产品的顾客求出平均acct_balance(账户余额),并为每一个没有订购所有产品的顾客求出平均账户余额。

class Example4 {
 /* 统计订购产品的客户账户余额  */
    countBalance(){
       customerDs = readTxt("src/test/resources/Customers.txt").convert(acct_balance,"double");
       orderDs = readTxt("src/test/resources/Orders.txt");
       orderDetailDs = readTxt("src/test/resources/OrderDetails.txt");
       productDs = readTxt("src/test/resources/Products2.txt");
       tempDs =  orderDetailDs.join(orderDs,order_id=order_id).join(customerDs ,customer_id=customer_id).copy().select("customer_id","order_id","item_id","acct_balance");   
       //关联前三张表
       groupDs = tempDs.group(customer_id); //按客户分组
       groupDs.distinctGroup(item_id); //统计分组客户消费的产品
       num = productDs.getRows(); //统计全部产品数目
       allProductDs = groupDs.filterGroup(distinctGroup_item_id.size()==num);  //购买全部产品的客户分组集
       otherDs =  groupDs.filterGroup(distinctGroup_item_id.size() < num); //购买部分产品的客户分组集
       balance1 =  allProductDs.avg(acct_balance);
       balance2 =  otherDs.avg(acct_balance);
       System.out.println("balance1="+balance1+" balance2="+balance2);
    }
}
m = new Example4(); 
m.countBalance();

运行结果:

balance1=4990.5 balance2=7363.875

 

© 著作权归作者所有

共有 人打赏支持
悠悠然然

悠悠然然

粉丝 2373
博文 184
码字总数 360373
作品 14
杭州
架构师
加载中

评论(62)

悠悠然然
悠悠然然

引用来自“lblin”的评论

好的语法糖的目的是降低使用者的操作步骤
赞同
l
lblin
好的语法糖的目的是降低使用者的操作步骤
悠悠然然
悠悠然然

引用来自“木木小胖”的评论

a=[1,2,3];
println(a);
a++;
println(a);
a*=3;
println(a);
b=["abc","def","ghijk"];
println(b.length());

请问这段代码的实现是针对每一种类型的列表都进行运算符重载还是遇到列表不认识的运算符就自动应用到每一项然后收集返回值
如果是前者的话,允不允许自己定义一个类型并且重载对应列表的运算符
【我认为任何一个面向程序员的工具可拓展性都是第一位的【可能太偏激
如果是后者,对于一般的函数会不会也有同样的性质
比如,可不可以实现

a=[1,2,3,4]
add(a,b)->{  return a+b;};
System.out.println(add(a,1));

回复@木木小胖 : 遇到列表不支持的,会自动检测列表中的对象是不是支持。
木木小胖
木木小胖
a=[1,2,3];
println(a);
a++;
println(a);
a*=3;
println(a);
b=["abc","def","ghijk"];
println(b.length());

请问这段代码的实现是针对每一种类型的列表都进行运算符重载还是遇到列表不认识的运算符就自动应用到每一项然后收集返回值
如果是前者的话,允不允许自己定义一个类型并且重载对应列表的运算符
【我认为任何一个面向程序员的工具可拓展性都是第一位的【可能太偏激
如果是后者,对于一般的函数会不会也有同样的性质
比如,可不可以实现

a=[1,2,3,4]
add(a,b)->{  return a+b;};
System.out.println(add(a,1));
中山华子
中山华子

引用来自“中山华子”的评论

然而并没有什么卵用。

引用来自“儒雅的中国宅男”的评论

你是你真的恶心。
你要证明我的评论不对,你应该拿出论据,而不是以一句脏话带过。
做人最起码的道德底线都没有的人,有什么资格骂别人。
中山华子
中山华子

引用来自“中山华子”的评论

然而并没有什么卵用。

引用来自“儒雅的中国宅男”的评论

你是你真的恶心。
你更恶心,评论自由,请不要讲脏话。
儒雅的中国宅男
儒雅的中国宅男

引用来自“中山华子”的评论

然而并没有什么卵用。
你是你真的恶心。
风云决
风云决
厉害了
关关学Java
关关学Java
楼主厉害了
悠悠然然
悠悠然然

引用来自“徐阳_0902”的评论

为什么不用scala?

回复@徐阳_0902 : 为什么不用Java?
程序员的成熟度

其实很早就有这种感觉了,只是这两天感觉更甚,那就是在程序员群体中普遍性存在的两种缺陷性格。也许各行各业也都普遍存在吧? 一种就是一言不合就骂人,或用阴损言语攻击人——这种人往往自...

2gua
2017/09/09
0
0
你还在为选择哪种语言而犹豫不前吗?

  相信有许多的人在纠结,到底是选择C/C++,还是JAVA,还是C#,或者是PHP还是ASP呢?有人说底层语言被比较好,可是我们发现,其实底层语言的从业人民不怎么多,万一我选择了找不到工作怎么办...

淡淡的幽情
2014/05/29
5.7K
43
FreeCodeCamp/freecodecamp.cn

freecodecamp.cn 欢迎来到freecodecamp中文社区(https://freecodecamp.cn) freecodecamp是什么? freecodecamp 是一个自由的开源编程社区,它致力于抹平教育差距, 让像你我一样的平凡人也能...

FreeCodeCamp
2016/09/02
0
0
你是否因为怕尴尬,就拼命找话题?

有位网友说,她最怕的就是尬聊。 最怕空气突然安静,好像自己需要做点什么。 于是拼命找话题,结果却是东一言西一语,问的尴尬,回的迷乱,气氛变得莫名其妙。 她说自己是个怕孤独的人,很容...

塑如意生活
2017/11/24
0
0
码农提高工作效率

俗话说,天下武功,唯快不破。也就是说要练成天下高手的话,出招速度一定要快,这样才能在江湖上立足,不至于掉了脑袋。而程序员要在IT界混出个名堂,也要有高效的工作效率才行。IT行业时时刻...

北天_
2016/12/03
16
0
码农提高工作效率

俗话说,天下武功,唯快不破。也就是说要练成天下高手的话,出招速度一定要快,这样才能在江湖上立足,不至于掉了脑袋。而程序员要在IT界混出个名堂,也要有高效的工作效率才行。IT行业时时刻...

北天_
2016/12/03
29
0
怎么成为一个优秀的程序员,而不是一个优秀的码农?

啥是优秀程序员? 记者和很多网民说熊猫烧香作者是高手 公司里你出什么bug他都能告诉你原因用什么软件有问题他都能回答你的你就觉得是高手 有人说徒手做产品的全栈才是高手 各语言的作者都是...

苏宁公有云
2015/09/02
353
3
写给程序员:当自己的上帝

作为长年混迹于IT圈的二把刀程序员,我今天想谈谈编程的本质,也许多少能够帮助有志于加入程序圈的有为青年。 程序员每天干的最多的事情就是和电脑打交道,很多程序员说自己和电脑的二人世界...

最牛傻蛋
2014/04/01
0
0
你最深爱的编程语言其实很烂

我最近写了几篇比较严肃的博客,是关于一些沮丧的事情,结果我开始有些忧郁。很严重。所以,我想应该说些比较轻松的事情。我要做的就是数落大家最喜欢的编程语言。你会问我为什么,为什么要搞...

oschina
2014/04/21
15.8K
131
Java学习笔记---字符串操作(人民币大写转换的实现)

向开始学习语言的的同学们推荐下,如果你想学习语言的某个特性,比方说数据库编程,或者网络编程,最好找一个实用的例子,然后不懂的去翻书,去查资料,这样目的性就很强了,个人感觉比对着语...

晨曦之光
2012/05/23
176
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

桌面虚拟化VDI(Virtual Desktop Infrastructure)

为了保证员工(客户)不把公司的资料复制、传输给别人。可以把员工平时办公放在服务器上做。所以使用桌面虚拟化。就是把一个服务器虚拟出很多桌面系统(如:windows)。 桌面虚拟化最大的优势...

王坤charlie
9分钟前
2
0
自我审视及职业规划

啊哈,不知不觉已经工作了3年了。程序员作为一门技术工作,如果分级的话我的能力如何呢?该怎么提升呢? 话说,我现在的能力属于中低级的层次吧,努力在向高级努力。为什么这么说呢: 因为我觉...

一口今心
11分钟前
1
0
《PHP和MySQL Web 开发》 第12章 MySQL高级管理

我决定好好写学习笔记了,对应上书上的目录和重要信息。不瞎jb写了。从这章开始吧,然后之前写的会编辑后重发。嗯,就酱。 12.1 深入理解权限系统 妈蛋 开头就卡住了。。。我先回去修改之前的...

十万猛虎下画山
12分钟前
1
0
Python 3.6:多态的实现

多态的作用不用多说,C++用如下条件来实现多态: 要有继承 要有虚函数函数重写 要有父类指针(父类引用)指向子类对象 实际上C++使用VPTR指针来完成这个事情,其是设计模式的基础,软件分层的基...

全部原谅
12分钟前
0
0
纯Python实现鸢尾属植物数据集神经网络模型[图]

纯Python实现鸢尾属植物数据集神经网络模型[图]: 尝试使用过各大公司推出的植物识别APP吗?比如微软识花、花伴侣等这些APP。当你看到一朵不知道学名的花时,只需要打开植物识别APP,拍摄一张...

原创小博客
14分钟前
0
0
2018安卓巴士开发者大会打造Android技术盛宴

2018安卓巴士开发者大会打造Android技术盛宴2018安卓巴士开发者大会将于8月25日在上海举行,作为中国最具前沿性、专业性的安卓技术会议,将邀请来自爱奇艺、阿里、饿了么等知名企业的一线工程...

逆鳞龙
16分钟前
0
0
Spring框架中的设计模式(二)

Spring框架中的设计模式(二) 原创: 瑞查德-Jack 在 上一篇 中我们在Spring中所谈到的设计模式涉及到了创建模式三剑客和1个行为模式(解释器模式)。这次我们会将眼光更多地关注在具有结构性和...

瑞查德-Jack
16分钟前
1
0
JS基础-DOM Event对象

简介 Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。 事件通常与函数结合使用,函数不会在事件发生前被执行! ==注:详表见《JS基础-...

ZHAO_JH
18分钟前
0
0
tomcat 8.5 远程登录管理页面

1、访问的来源受限注释掉 <?xml version="1.0" encoding="UTF-8"?><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. S......

xixingzhe
25分钟前
0
0
JSON Web Token - 在Web应用间安全地传递信息

JSON Web Token - 在Web应用间安全地传递信息 Sep 06, 2015 in Engineering JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。 ...

祖冲之
31分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部