我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Kafka ACL使用实战(单机版)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Kafka ACL使用实战(单机版)

自0.9.0.0.版本引入Security之后,Kafka一直在完善security的功能。当前Kafka security主要包含3大功能:认证(authentication)、信道加密(encryption)和授权(authorization)。信道加密就是为client到broker、broker到broker以及工具脚本与broker之间的数据传输配置SSL;认证机制主要是指配置SASL,而授权是通过ACL接口命令来完成的。

生产环境中,用户若要使用SASL则必须配置Kerberos,但对于一些小公司而言,他们的用户系统并不复杂(特别是专门为Kafka集群服务的用户可能不是很多),显然使用Kerberos有些大材小用,而且由于运行在内网环境,SSL加密也不是很必要。因此一个SASL+PLAINTEXT的集群环境足以应付一般的使用场景。本文给出一个可运行的实例来演示一下如何在不使用Kerberos的情况下配置SASL + ACL来构建secured Kafka集群。

在开始之前,我们简单学习下Kafka ACL的格式。根据官网的介绍,Kafka中一条ACL的格式如下:“Principal P is [Allowed/Denied] Operation O From Host H On Resource R”。它们的含义描述如下:

  • principal:表示一个Kafka user

  • operation:表示一个具体的操作类型,如WRITE, READ, DESCRIBE等。完整的操作列表详见:http://docs.confluent.io/current/kafka/authorization.html#overview

  • Host:表示连向Kafka集群的client的IP地址,如果是‘*’则表示所有IP。注意:当前Kafka不支持主机名,只能指定IP地址

  • Resource:表示一种Kafka资源类型。当前共有4种类型:TOPIC、CLUSTER、GROUP、TRANSACTIONID

下面我使用Kafka 2.12-2.1.0版本来演示下如何构建支持SASL + PLAINTEXT + ACL的Kafka集群环境。

 

环境说明:

操作系统服务器地址Dockerd地址角色软件版本
ubuntu-16.04.5-server-amd64192.168.91.12810.0.128.2zookeeper3.4.13
ubuntu-16.04.5-server-amd64192.168.91.12910.0.129.2Kafka_server2.12-2.1.0
ubuntu-16.04.5-server-amd64192.168.91.13110.0.131.2Kafka_client2.12-2.1.0

 

 

 

 

 

 

这3台服务器的docker容器,务必要可以相互通信。关于3台服务器的docker如何通讯,请参考链接:

https://www.cnblogs.com/xiao987334176/p/10049844.html#autoid-4-5-2

里面有详细的过程,使用一键脚本即可。本文就是在这个环境上,操作的!

 

架构图:

 1.png

只需要在Kafka_server 设置ACL规则就可以了。主要针对topic 做权限验证!创建读写用户进行验证。

客户端可以随意创建topic,但是向topic里面读写内容,就需要做验证了!

 

登录到zookeeper服务器,创建空目录

mkdir /opt/zookeeper

创建以下文件

 

dockerfile

FROM ubuntu:16.04
# 修改更新源为阿里云
ADD sources.list /etc/apt/sources.list
ADD zookeeper-3.4.13.tar.gz /
ADD zoo.cfg / 
# 安装jdk
RUN apt-get update && apt-get install -y openjdk-8-jdk --allow-unauthenticated && apt-get clean all && \ 
    cd /zookeeper-3.4.13 && \
    mkdir data log && \
    mv /zoo.cfg conf

EXPOSE 2181
# 添加启动脚本
ADD run.sh .
RUN chmod 755 run.sh
ENTRYPOINT [ "/run.sh"]

 

run.sh

#!/bin/bash

cd /zookeeper-3.4.13/
bin/zkServer.sh start

tail -f NOTICE.txt

sources.list

deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial main

deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main

deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe

deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe

zoo.cfg

tickTime=2000dataDir=/zookeeper-3.4.13/data
dataLogDir=/zookeeper-3.4.13/log
clientPort=2181

目录结构如下:

./
├── dockerfile
├── run.sh
├── sources.list
├── zoo.cfg
└── zookeeper-3.4.13.tar.gz


创建镜像

docker build -t zookeeper /opt/zookeeper

 

运行zookeeper

docker run -d -it -p 2181:2181 zookeeper

 

登录到Kafka_server服务器,创建空目录

mkdir /opt/kafka_server

 

dockerfile

FROM ubuntu:16.04
# 修改更新源为阿里云
ADD sources.list /etc/apt/sources.list
ADD kafka_2.12-2.1.0.tgz /
ADD kafka_cluster_jaas.conf /
# 安装jdk
RUN apt-get update && apt-get install -y openjdk-8-jdk --allow-unauthenticated && apt-get clean all && \
    cd /kafka_2.12-2.1.0 && \
    mv /kafka_cluster_jaas.conf config/ && \
    sed -i '$ s/^/#&/g' bin/kafka-server-start.sh && \
    sed -i '$ a\exec $base_dir/kafka-run-class.sh $EXTRA_ARGS -Djava.security.auth.login.config=/kafka_2.12-2.1.0/config/kafka_cluster_jaas.conf kafka.Kafka "$@"' bin/kafka-server-start.sh

EXPOSE 9092
# 添加启动脚本
ADD run.sh .
RUN chmod 755 run.sh
ENTRYPOINT [ "/run.sh"]

说明:kafka依赖java环境,最后2行的sed命令表示,先把最后一行注释掉,添加一行新内容。指定一个配置文件,下面会说到。

 

kafka_cluster_jaas.conf

KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin"
user_admin="admin"
user_reader="reader"
user_writer="writer";
};

说明:

要配置SASL和ACL,我们需要在broker端进行两个方面的设置。首先是创建包含所有认证用户信息的JAAS文件。本例中,我们假设有3个用户:admin, reader和writer,其中admin是管理员,reader用户读取Kafka集群中topic数据,而writer用户则负责向Kafka集群写入消息。我们假设这3个用户的密码分别与用户名相同(在实际场景中,管理员需要单独把密码发给各自的用户),因此编写JAAS文件就是上面的内容

 

run.sh

#!/bin/bash

if [ -z $zookeeper ];then
    zookeeper=`cat /etc/hosts | tail -1 | awk '{print $1}'`
fi

if [ -z $kafka ];then
    kafka=`cat /etc/hosts | tail -1 | awk '{print $1}'`
fi


cd /kafka_2.12-2.1.0
sed -i "123s/localhost/$zookeeper/" /kafka_2.12-2.1.0/config/server.properties

echo "

authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
listeners=SASL_PLAINTEXT://$kafka:9092
security.inter.broker.protocol= SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN
super.users=User:admin

" >> /kafka_2.12-2.1.0/config/server.properties

# 启动kafka
bin/kafka-server-start.sh config/server.properties


# 设置访问权限
# 配置ACL来让writer用户有权限写入topic
#bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=$zookeeper:2181 --add --allow-principal User:writer --operation Write --topic test

# 为reader用户设置test topic的读权限
# bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=$zookeeper:2181 --add --allow-principal User:reader --operation Read --topic test
# 然后设置访问group的权限
# bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=$zookeeper:2181 --add --allow-principal User:reader --operation Read --group test-group

说明:

-z 用来判断变量是否存在,不存在时,使用docker的IP地址。读取/etc/hosts最后一行,就是docker ip地址。

要配置SASL和ACL,需要更改server.properties才行,至少需要配置(或修改)以下这些参数:

# 配置ACL入口类
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
# 本例使用SASL_PLAINTEXT
listeners=SASL_PLAINTEXT://:9092
# 指定SASL安全协议
security.inter.broker.protocol= SASL_PLAINTEXT
# 配置SASL机制
sasl.mechanism.inter.broker.protocol=PLAIN
# 启用SASL机制
sasl.enabled.mechanisms=PLAIN
# 设置本例中admin为超级用户
super.users=User:admin


run.sh中,下面有几个ACL规则。在下面内容中,就介绍到!

 

sources.list

deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial main

deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main

deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe

deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe

目录结构如下:

./
├── dockerfile
├── kafka_2.12-2.1.0.tgz
├── kafka_cluster_jaas.conf
├── run.sh
└── sources.list


创建镜像

docker build -t kafka_server /opt/kafka_server

 

启动kafka

docker run -it -p 9092:9092 -e zookeeper=10.0.128.2 -e kafka=10.0.129.2 kafka_server

 

注意:这里有一个 -e 参数。咦,这个参数是干啥的呢?我第一见它,也一脸懵逼。

ok,它就是用来指定环境变量的。

怎么使用呢?先来一个小例子,你就明白了!

再开一个窗口,启动 alpine 镜像,指定变量 爱好=美女

root@ubuntu:~# docker run -it -e hobby=beauty alpine/ # echo $hobbybeauty/ #

 

看到没,指定-e 之后,在docker里面,可以直接使用这个变量。在docker镜像里面,它就是一个全局变量。

那么在run.sh 这个shell脚本中,就可以直接调用了!

 

那为什么要用-e参数呢?在这篇文章,链接如下:

https://www.cnblogs.com/xiao987334176/p/10037395.html

启动kafka时,使用了 --net=host 参数,也就是直接使用真实主机的IP地址。这样才实现了kafka客户端和server端的通讯。

但是,在k8s里面发布kafka服务时,不允许这样。要使用docker自己的ip地址才行!因此,在kafka服务器容器启动之前,就给它传一个参数,使它能够正常启动!

 

本文直接使用kafka压缩包里面的shell脚本,作为客户端使用。在生产环境中,是用java代码,作为客户端使用的。或者还有其他语言,比如go,php等...

 

登录到Kafka_client服务器,创建空目录

mkdir /opt/kafka_client

 

consumer.config

security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
group.id=test-group

 

这个文件是 消费者 配置文件,表示使用SASL协议,用户组id为test-group

 

dockerfile

FROM ubuntu:16.04
# 修改更新源为阿里云
ADD sources.list /etc/apt/sources.list
# 添加tgz文件会自动解压,自动删除tgz文件
ADD kafka_2.12-2.1.0.tgz /
ADD consumer.config /kafka_2.12-2.1.0/config/
ADD producer.config /kafka_2.12-2.1.0/config/
ADD reader_jaas.conf /kafka_2.12-2.1.0/config/
ADD writer_jaas.conf /kafka_2.12-2.1.0/config/
# 安装jdk
RUN apt-get update && apt-get install -y openjdk-8-jdk vim --allow-unauthenticated && apt-get clean all
    
#EXPOSE 9092
# 添加启动脚本
ADD run.sh .
RUN chmod 755 run.sh
ENTRYPOINT [ "/run.sh"]

说明:客户端的配置,统一放在cnofig目录。使用时,指定一下配置文件,就可以了!

 

producer.config

security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN

 

这个是 生产者 配置文件,指定使用SASL协议

 

reader_jaas.conf

KafkaClient {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="reader"password="reader";
};

 

说明,这个是只读用户的配置文件,所有连接到broker和broker,都需要验证。参数为:用户名和密码

 

run.sh

#!/bin/bash

if [ -z $zookeeper ];then
    zookeeper=`cat /etc/hosts | tail -1 | awk '{print $1}'`
fi

if [ -z $kafka ];then
    kafka=`cat /etc/hosts | tail -1 | awk '{print $1}'`
fi

# 进入工作目录
cd /kafka_2.12-2.1.0

# 生产者
cp bin/kafka-console-producer.sh bin/writer-kafka-console-producer.sh
# 最后一行注释掉,添加#
sed -i '$ s/^/#&/g' bin/writer-kafka-console-producer.sh
# 最后一行添加内容
sed -i '$ a\exec $(dirname $0)/kafka-run-class.sh -Djava.security.auth.login.config=/kafka_2.12-2.1.0/config/writer_jaas.conf kafka.tools.ConsoleProducer "$@"' bin/writer-kafka-console-producer.sh

# 消费者
cp bin/kafka-console-consumer.sh bin/reader-kafka-console-consumer.sh
sed -i '$ s/^/#&/g' bin/reader-kafka-console-consumer.sh
sed -i '$ a\exec $(dirname $0)/kafka-run-class.sh -Djava.security.auth.login.config=/kafka_2.12-2.1.0/config/reader_jaas.conf kafka.tools.ConsoleConsumer "$@"' bin/reader-kafka-console-consumer.sh

# 创建一个测试topic,名为test,单分区,副本因子是1
#bin/kafka-topics.sh --create --zookeeper $zookeeper:2181 --topic test --partitions 1 --replication-factor 1

# 运行生产者
# bin/writer-kafka-console-producer.sh --broker-list $kafka_server:9092 --topic test --producer.config config/producer.config

# 运行消费者
# bin/reader-kafka-console-consumer.sh --bootstrap-server $kafka_server:9092 --topic test --from-beginning --consumer.config config/consumer.config


tail -f bin/writer-kafka-console-producer.sh

 说明:由于是测试,所以复制了启动脚本,然后做修改。最后一行,指定了配置文件。

 

sources.list

deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial main

deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main

deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe

deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb-class="lazy" data-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe

writer_jaas.conf

KafkaClient {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="writer"password="writer";
};

说明:这个是写入用户的配置

 

目录结构如下:

./
├── consumer.config
├── dockerfile
├── kafka_2.12-2.1.0.tgz
├── producer.config
├── reader_jaas.conf
├── run.sh
├── sources.list
└── writer_jaas.conf


创建镜像

docker build -t kafka_client /opt/kafka_client

 

启动kafka_client

docker run -it -e zookeeper=10.0.128.2 -e kafka=10.0.129.2 kafka_client

 

登录到kafka_client,查看容器进程

root@ubuntu:~# docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS        NAMES09853dfb8891        kafka_client        "/run.sh"           28 seconds ago      Up 27 seconds        elegant_wescoff

 

进入容器,创建一个测试topic,名为test,单分区,副本因子是1

root@ubuntu:~# docker exec -it 09853dfb8891 /bin/bashroot@09853dfb8891:/# cd /kafka_2.12-2.1.0/root@09853dfb8891:/kafka_2.12-2.1.0# bin/kafka-topics.sh --create --zookeeper 10.0.128.2:2181 --topic test --partitions 1 --replication-factor 1Created topic "test".

 

下面我们先来启动一个console-consumer和一个console-producer来看下当前是个什么状况:

输入haha

root@09853dfb8891:/kafka_2.12-2.1.0# bin/kafka-console-producer.sh --broker-list 10.0.129.2:9092 --topic test
>haha
[2018-12-02 13:47:46,194] WARN [Producer clientId=console-producer] Connection to node -1 (/10.0.129.2:9092) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
[2018-12-02 13:47:46,247] WARN [Producer clientId=console-producer] Connection to node -1 (/10.0.129.2:9092) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
...


发现报错了,producer无法工作,是因为kafka设置了security的缘故

 

kafka ACL配置

登录到kafka_server服务器,进入容器,执行命令

配置ACL来让writer用户有权限写入topic

cd /kafka_2.12-2.1.0/
bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=10.0.128.2:2181 --add --allow-principal User:writer --operation Write --topic test

输出:

Adding ACLs for resource `Topic:LITERAL:test`: 
     User:writer has Allow permission for operations: Write from hosts: * Current ACLs for resource `Topic:LITERAL:test`: 
     User:writer has Allow permission for operations: Write from hosts: *

 

为reader用户设置test topic的读权限

bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=10.0.128.2:2181 --add --allow-principal User:reader --operation Read --topic test

 

输出:

复制代码

Adding ACLs for resource `Topic:LITERAL:test`: 
     User:reader has Allow permission for operations: Read from hosts: * Current ACLs for resource `Topic:LITERAL:test`: 
     User:writer has Allow permission for operations: Write from hosts: *
    User:reader has Allow permission for operations: Read from hosts: *

复制代码

 

然后设置访问group的权限

bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=10.0.128.2:2181 --add --allow-principal User:reader --operation Read --group test-group

 

输出:

Adding ACLs for resource `Group:LITERAL:test-group`: 
     User:reader has Allow permission for operations: Read from hosts: * Current ACLs for resource `Group:LITERAL:test-group`: 
     User:reader has Allow permission for operations: Read from hosts: *

 

登录到kafka_client,再开一个窗口。

2个窗口,都进入到容器里面

第一个窗口进入生产者模式,输入342

bin/writer-kafka-console-producer.sh --broker-list 10.0.129.2:9092 --topic test --producer.config config/producer.config
>342

第二个窗口,运行消费者

cd /kafka_2.12-2.1.0/bin/reader-kafka-console-consumer.sh --bootstrap-server 10.0.129.2:9092 --topic test --from-beginning --consumer.config config/consumer.config

 

这个时候会接收到

342

 

 

大功告成!

上面的测试,只是针对topic为test设置ACL规则。假设kafka服务器有上百个topic,需要对所有topic设置ALC,可以使用--topic=*

比如允许写用户操作所有topic

bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=10.0.128.2:2181 --add --allow-principal User:writer --operation Write --topic=*

 

 

本文参考链接:

https://www.cnblogs.com/huxi2b/p/7382144.html


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Kafka ACL使用实战(单机版)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Kafka ACL使用实战(单机版)

自0.9.0.0.版本引入Security之后,Kafka一直在完善security的功能。当前Kafka security主要包含3大功能:认证(authentication)、信道加密(encryption)和授权(authorizat
2023-01-31

Kubernetes 部署kafka ACL(单机版)

在Kafka0.9版本之前,Kafka集群时没有安全机制的。Kafka Client应用可以通过连接Zookeeper地址,例如zk1:2181:zk2:2181,zk3:2181等。来获取存储在Zookeeper中的Kafka元数据信息。
2023-01-31

kafka基本版与kafka acl版性能对比(单机版)

线上已经有kafka集群,服务运行稳定。但是因为产品升级,需要对kakfa做安全测试,也就是权限验证。但是增加权限验证,会不会对性能有影响呢?影响大吗?不知道呀!因此,本文就此来做一下对比!测试环境本文使用的是单机kafka测试,仅在一台服
2023-01-31

win10手机版单手式键盘使用视频教程

微软在win10手机预览版10051中增加了专为大屏手机而生的单手拇指键盘。今天小编为大家分享win10手机版单手编程客栈式键盘使用视频教程给大家,一起来看看吧!编程客栈很明显,微软正在为用户提供更多键盘尺寸,包括完整尺寸的键盘与更小的,符
2023-06-13

Spring Cloud实战技巧之使用随机端口

前言在Spring Cloud构建微服务架构中,我们经常会需要启动多个实例的情况来测试注册中心、配置中心等基础设施的高可用,也会用来测试客户端负载均衡的调用等。但是,我们一个应用只能有一个端口号,这就使得在本机测试的时候,不得不为同一个服务
2023-05-31

linux环境不使用hadoop安装单机版spark的方法

大数据持续升温, 不熟悉几个大数据组件, 连装逼的口头禅都没有。 最起码, 你要会说个hadoop, hdfs, mapreduce, yarn, kafka, spark, zookeeper, neo4j吧, 这些都是装逼的必备技能。
2022-06-04

使用c++怎么实现简单随机数

使用c++怎么实现简单随机数?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。c++简单随机数#include#include#i
2023-06-15

c++使用Easyx图形库是怎么实现飞机大战

这期内容当中小编将会给大家带来有关c++使用Easyx图形库是怎么实现飞机大战,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。公共的头文件 common.h#pragma once#inclu
2023-06-22

如何使用原生JS实现飞机大战小游戏

小编给大家分享一下如何使用原生JS实现飞机大战小游戏,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!本文实例为大家分享了JS实现飞机大战小游戏的具体代码,供大家参考,具体内容如下 </div></div><div class="articleBottom"><span class="date" style="float: right;">2023-06-15</span></div><div class="clearboth"></div></div><div class="articleList clearfix"><div class="intro"><a title="如何使用PHP实现一个简单的博客2.0版本" href="/article/d5798cdac8.html"><h4>如何使用PHP实现一个简单的博客2.0版本</h4></a><div class="des">概述:在互联网时代,博客已经成为一种非常流行的表达方式和记录生活的工具。在开发一个博客应用程序时,PHP是一种常用的服务器端脚本语言,它可以用来处理用户请求、生成动态页面以及与数据库交互等。本文将介绍如何使用PHP来实现一个简单的博客2.0</div></div><div class="articleBottom"><span class="date" style="float: right;">2023-10-21</span></div><div class="clearboth"></div></div><div class="articleList clearfix"><div class="intro"><a title="实战指南:使用XShell通过堡垒机(跳板)连接服务器、数据库(完整版详解教程)" href="/article/5bb7d30232.html"><h4>实战指南:使用XShell通过堡垒机(跳板)连接服务器、数据库(完整版详解教程)</h4></a><div class="des">最近公司配置了堡垒机,因此在此处记录一下堡垒机连接服务器的方法。 文章目录 1:连接堡垒机2:通过堡垒机连接数据库3:通过堡垒机连接服务器 1:连接堡垒机 打开XShell 填写堡垒机的信息 填写登录用户、密码 如果你是密码</div></div><div class="articleBottom"><span class="date" style="float: right;">2023-08-19</span></div><div class="clearboth"></div></div><div class="articleList clearfix"><div class="intro"><a title="PHP使用Redis实战实录4:单例模式和面向过程操作redis的语法" href="/article/56454f3651.html"><h4>PHP使用Redis实战实录4:单例模式和面向过程操作redis的语法</h4></a><div class="des"></div></div><div class="articleBottom"><span class="date" style="float: right;">2023-08-31</span></div><div class="clearboth"></div></div><div class="articleList clearfix"><div class="intro"><a title="2022新版Git教程 从入门到实战(四)Git远程仓库Gitee的使用" href="/article/f24955a301.html"><h4>2022新版Git教程 从入门到实战(四)Git远程仓库Gitee的使用</h4></a><div class="des"></div></div><div class="articleBottom"><span class="date" style="float: right;">2023-10-02</span></div><div class="clearboth"></div></div><div class="articleList clearfix"><div class="intro"><a title="如何使用Java实现一个简易版的多级菜单功能" href="/article/cdd1086696.html"><h4>如何使用Java实现一个简易版的多级菜单功能</h4></a><div class="des">小编给大家分享一下如何使用Java实现一个简易版的多级菜单功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!正文1,首先是数据库的设计DROP TABLE IF </div></div><div class="articleBottom"><span class="date" style="float: right;">2023-06-26</span></div><div class="clearboth"></div></div><div class="articleList clearfix"><div class="intro"><a title="第一次使用webstrom简单创建vue项目的一些报错实战记录" href="/article/64ee240d83.html"><h4>第一次使用webstrom简单创建vue项目的一些报错实战记录</h4></a><div class="des">在使用webstorm新建vue项目时常会遇到一些报错,特别是新手第一次运行项目,这篇文章主要给大家介绍了关于第一次使用webstrom简单创建vue项目的一些报错实战记录,需要的朋友可以参考下</div></div><div class="articleBottom"><span class="date" style="float: right;">2023-02-13</span></div><div class="clearboth"></div></div><div class="articleList clearfix"><div class="intro"><a title="使用C++实现机器学习算法:常见挑战及解决方案" href="/article/2e983cc0e8.html"><h4>使用C++实现机器学习算法:常见挑战及解决方案</h4></a><div class="des">c++++ 中机器学习算法面临的常见挑战包括内存管理、多线程、性能优化和可维护性。解决方案包括使用智能指针、现代线程库、simd 指令和第三方库,并遵循代码风格指南和使用自动化工具。实践案例展示了如何利用 eigen 库实现线性回归算法,有</div></div><div class="imgBox"><img class="lazy" data-type="0" data-src="https://static.528045.com/imgs/32.jpg?imageMogr2/format/webp/blur/1x0/quality/35" alt="使用C++实现机器学习算法:常见挑战及解决方案" /></div><div class="articleBottom"><span class="date" style="float: right;">2024-05-12</span></div><div class="clearboth"></div></div><div class="articleList clearfix"><div class="intro"><a title="【腾讯云 Cloud Studio 实战训练营】使用python-flask搭建自助售卖机实操" href="/article/2daebdbcb1.html"><h4>【腾讯云 Cloud Studio 实战训练营】使用python-flask搭建自助售卖机实操</h4></a><div class="des"></div></div><div class="articleBottom"><span class="date" style="float: right;">2023-09-03</span></div><div class="clearboth"></div></div><div class="articleList clearfix"><div class="intro"><a title="怎么使用html+css+js实现简易版ChatGPT聊天机器人" href="/article/6fbb866b4a.html"><h4>怎么使用html+css+js实现简易版ChatGPT聊天机器人</h4></a><div class="des">本篇内容介绍了“怎么使用html+css+js实现简易版ChatGPT聊天机器人”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!代码如下:<!</div></div><div class="articleBottom"><span class="date" style="float: right;">2023-07-05</span></div><div class="clearboth"></div></div></div></div><div class="hotFlag"><h4>热门标签</h4><div class="flagBox"><a title="Linux" href="/tag/Linux/">Linux(148)</a><a title="PHP" href="/tag/PHP/">PHP(127)</a><a title="Java" href="/tag/Java/">Java(102)</a><a title="正则表达式" href="/tag/正则表达式/">正则表达式(101)</a><a title="JavaScript" href="/tag/JavaScript/">JavaScript(69)</a><a title="最佳实践" href="/tag/最佳实践/">最佳实践(67)</a><a title="jQuery" href="/tag/jQuery/">jQuery(44)</a><a title="MySQL" href="/tag/MySQL/">MySQL(39)</a><a title="Docker" href="/tag/Docker/">Docker(37)</a><a title="C语言" href="/tag/C语言/">C语言(36)</a><a title="性能优化" href="/tag/性能优化/">性能优化(34)</a><a title="Python" href="/tag/Python/">Python(34)</a><a title="XML" href="/tag/XML/">XML(28)</a><a title="string" href="/tag/string/">string(27)</a><a title="第三方库" href="/tag/第三方库/">第三方库(23)</a><a title="回调函数" href="/tag/回调函数/">回调函数(23)</a><a title="ZIP" href="/tag/ZIP/">ZIP(22)</a><a title="数组" href="/tag/数组/">数组(22)</a><a title="可扩展性" href="/tag/可扩展性/">可扩展性(22)</a><a title="字符串比较" href="/tag/字符串比较/">字符串比较(21)</a><a title="find" href="/tag/find/">find(20)</a><a title="RPM" href="/tag/RPM/">RPM(20)</a><a title="Go" href="/tag/Go/">Go(20)</a><a title="grep" href="/tag/grep/">grep(19)</a><a title="ASP.NETCore" href="/tag/ASP.NETCore/">ASP.NETCore(19)</a><a title="XML解析器" href="/tag/XML解析器/">XML解析器(19)</a><a title="事件" href="/tag/事件/">事件(19)</a><a title="事件处理程序" href="/tag/事件处理程序/">事件处理程序(19)</a><a title="StringBuilder" href="/tag/StringBuilder/">StringBuilder(18)</a><a title="Nginx" href="/tag/Nginx/">Nginx(18)</a></div></div></div><div class="main_right fr"><div class="artHotSearch"><h4 class="title"><div class="fl"><span class="icon bg_content bg_icon_rs"></span><span class="name">编程热搜</span></div><a href="" class="fr bg_content bg_txt_rsb"></a><div class="clearboth"></div></h4><ul><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="Python 学习之路 - Python" href="https://www.528045.com/article/52df4d95aa.html">Python 学习之路 - Python</a></span></h5><div class="clearboth"></div><div class="des">一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-</div></div><img class="lazy" data-type="0" data-src="/file/imgs/upload/202301/31/qglhspth11k.jpg" alt="Python 学习之路 - Python" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="chatgpt的中文全称是什么" href="https://www.528045.com/article/6d32547808.html">chatgpt的中文全称是什么</a></span></h5><div class="clearboth"></div><div class="des">chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列</div></div><img class="lazy" data-type="0" data-src="https://static.528045.com/imgs/2.jpg?imageMogr2/format/webp/blur/1x0/quality/35" alt="chatgpt的中文全称是什么" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="C/C++中extern函数使用详解" href="https://www.528045.com/article/9733fb00d0.html">C/C++中extern函数使用详解</a></span></h5><div class="clearboth"></div><div class="des"></div></div><img class="lazy" data-type="0" data-src="/file/upload/202211/13/d3kqhimmpgl.jpg" alt="C/C++中extern函数使用详解" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="C/C++可变参数的使用" href="https://www.528045.com/article/773997944a.html">C/C++可变参数的使用</a></span></h5><div class="clearboth"></div><div class="des">可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃</div></div><img class="lazy" data-type="0" data-src="https://static.528045.com/imgs/28.jpg?imageMogr2/format/webp/blur/1x0/quality/35" alt="C/C++可变参数的使用" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="css样式文件该放在哪里" href="https://www.528045.com/article/617e4312cb.html">css样式文件该放在哪里</a></span></h5><div class="clearboth"></div><div class="des"></div></div><img class="lazy" data-type="0" data-src="https://static.528045.com/imgs/4.jpg?imageMogr2/format/webp/blur/1x0/quality/35" alt="css样式文件该放在哪里" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="php中数组下标必须是连续的吗" href="https://www.528045.com/article/21ee165f7c.html">php中数组下标必须是连续的吗</a></span></h5><div class="clearboth"></div><div class="des"></div></div><img class="lazy" data-type="0" data-src="/upload/jz5euwde0tq.jpg" alt="php中数组下标必须是连续的吗" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="Python 3 教程" href="https://www.528045.com/article/01a1d65257.html">Python 3 教程</a></span></h5><div class="clearboth"></div><div class="des">Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python</div></div><img class="lazy" data-type="0" data-src="/upload/202205/01/jneowzxxjtt.jpg" alt="Python 3 教程" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="Python pip包管理" href="https://www.528045.com/article/ab7f357e04.html">Python pip包管理</a></span></h5><div class="clearboth"></div><div class="des">一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    </div></div><img class="lazy" data-type="0" data-src="/file/imgs/upload/202301/31/qn4pmgvm0lq.jpg" alt="Python pip包管理" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="ubuntu如何重新编译内核" href="https://www.528045.com/article/a65a3a171f.html">ubuntu如何重新编译内核</a></span></h5><div class="clearboth"></div><div class="des"></div></div><img class="lazy" data-type="0" data-src="/file/uploads/202210/26/1sph0pw5wqc.jpg" alt="ubuntu如何重新编译内核" /><div class="clearboth"></div></li><li class="rslist clearfix"><div class="rslist_left fl"><h5><span class="fl name"><a title="改善Java代码之慎用java动态编译" href="https://www.528045.com/article/d085d3bcbe.html">改善Java代码之慎用java动态编译</a></span></h5><div class="clearboth"></div><div class="des"></div></div><img class="lazy" data-type="0" data-src="https://static.528045.com/imgs/32.jpg?imageMogr2/format/webp/blur/1x0/quality/35" alt="改善Java代码之慎用java动态编译" /><div class="clearboth"></div></li></ul><div class="seeMore"><a href="https://www.528045.com/article/program-c4-1.html">查看更多</a></div></div><div class="artSubmit"><h4 class="title"><div class="fl"><span class="icon bg_content bg_icon_yktg"></span><span class="name">编程资源站</span></div><div class="clearboth"></div></h4><ul class="submitNav clearfix"><li class="active first">资料下载</li><li>历年试题</li></ul><div class="submitBox active"><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021年下半年软考高级信息系统项目管理师高频考点" href="https://www.528045.com/down/89bb6.html">2021年下半年软考高级信息系统项目管理师高频考点</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021下半年软考高级信息系统技术知识点记忆口诀" href="https://www.528045.com/down/7d690.html">2021下半年软考高级信息系统技术知识点记忆口诀</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021下半年软考《信息系统项目管理师》考试真题及答案" href="https://www.528045.com/down/4277a.html">2021下半年软考《信息系统项目管理师》考试真题及答案</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021下半年软考高级考试备考攻略" href="https://www.528045.com/down/9248a.html">2021下半年软考高级考试备考攻略</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021年软考高级《信息系统项目管理师》巩固练习题汇总" href="https://www.528045.com/down/fcca0.html">2021年软考高级《信息系统项目管理师》巩固练习题汇总</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021下半年软考高级信息系统项目管理师30个易考知识点汇总" href="https://www.528045.com/down/7636b.html">2021下半年软考高级信息系统项目管理师30个易考知识点汇总</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021下半年软考高级知识点这样记,还担心记不住吗" href="https://www.528045.com/down/76382.html">2021下半年软考高级知识点这样记,还担心记不住吗</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021年下半年软考高级考试重点汇总" href="https://www.528045.com/down/15f44.html">2021年下半年软考高级考试重点汇总</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021下半年软考高级信息系统项目管理师计算公式汇总" href="https://www.528045.com/down/2d560.html">2021下半年软考高级信息系统项目管理师计算公式汇总</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2021年下半年软考高级《信息系统项目管理师》模拟试题" href="https://www.528045.com/down/c0085.html">2021年下半年软考高级《信息系统项目管理师》模拟试题</a><span class="hot"><a href="https://www.528045.com/down/ziliao-c69-1.html">精选资料</a></span></h5></div><div class="seeMore"><a href="/down/">查看更多</a></div></div><div class="submitBox"><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="信息系统项目管理师选择题每日一练(2024)" href="https://www.528045.com/article/6d5f303202.html">信息系统项目管理师选择题每日一练(2024)</a><span class="hot"><a href="https://www.528045.com/article/lnst-c57-1.html">历年试题</a></span></h5></div><div class="submitItem"><span class="turn"></span><h5 class="title"><a title="2023年下半年信息系统项目管理师综合知识真题演练" href="https://www.528045.com/article/f2da969d4f.html">2023年下半年信息系统项目管理师综合知识真题演练</a><span class="hot"><a href="https://www.528045.com/article/lnst-c57-1.html">历年试题</a></span></h5></div><div class="seeMore"><a href="https://www.528045.com/article/lnst-c57-1.html">查看更多</a></div></div></div><div class="meumfie"><h4 class="title"><div class="fl"><span class="icon bg_content bg_icon_ykzl"></span><span class="name">目录</span></div><div class="clearboth"></div></h4><div class="toc"></div></div></div><div class="clearboth"></div></div><script type="text/javascript" src="/skin/static/js/toc.js"></script><div class="popUp popDelay"><div class="maskBg"></div><div class="popCon"><span class="btn btn_close"></span><div class="tip"> 本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页 </div><div class="delayMain"><div class="delaymain_left"><a href="https://www.528045.com"><img src="https://static.528045.com/skin/content_left.png?imageMogr2/format/webp/blur/1x0/quality/35"></a></div><div class="delaymain_right"><div class="news_title"><span class="fl">最新资讯</span ><a href="/" class="fr">更多</a><div class="clearboth"></div></div><ul></ul></div><div class="clearboth"></div></div><div class="bigshow"><a href="https://www.528045.com"><img src="https://static.528045.com/skin/content_bottom.png?imageMogr2/format/webp/blur/1x0/quality/35"></a></div></div></div><div class="footer"><div class="friendLink"><span class="friendTitle">友情链接</span><a href="https://www.lsjlt.com">编程网</a></div><script type="text/javascript" src="/skin/static/js/footermain.js"></script></div><div class="popCommon"><span class="mask"></span><div class="popCon"></div></div><div class="ajaxrightbtn"><div class="funBtnbox"><div class="rb_fk rb_ty br_bom"><div class="wx_mo1 _mo1"><i class="dtmuban-iconfont icon-fankui2"></i><p>反馈</p></div><a href="javascript:void(0);" onclick="Dsb('urs-form-modalfk');"><div class="_mo2 rb_gradient br_bom"><p>我要<br>反馈</p></div></a></div></div><div class="fbs fbs-gotp back2top" style="display: none;"><div class="rb_top rb_ty br_all"><div class="top_mo1 _mo1 "><i class="dtmuban-iconfont icon-zhiding"></i></div><a href="javascript:void(0);" title="返回顶部"><div class="_mo2 rb_gradient br_all"><p>返回<br>顶部</p></div></a></div></div></div><div id="urs-form-modalfk-bg" class="urs-form-modal-bg" style="display: none;"></div><div id="urs-form-modalfk" class="urs-form-modal" style="display: none;"><div class="urs-form-component plan-get-form-mini js-apply-form clearfix"><div class="urs-component-head"><div class="icon-close" onclick="Dhb('urs-form-modalfk');"><img id="close-btn" src="https://static.528045.com/skin/ic_delete_normal_24px.png"></div><p class="form-title">留言反馈</p><p></p><p class="form-line"></p></div><div class="urs-component-tab"><h5>感谢您的提交,我们服务专员将在<span>30分钟内</span>给您回复</h5><div class="get-plan-form-item"><i class="u-item-icon dtmuban-iconfont icon-fanganguihua"></i><input class="u-input js-apply-phone" type="text" id="titleb" name="titleb" value="我要反馈留言,看到请回复" placeholder="留言标题"><span id="dtitlea"></span></div><div class="get-plan-form-item"><select name="typeidb" id="typeidb" class="u-select"><option value="">请选择类型</option><option value="0">问题反馈</option><option value="1">意见建议</option><option value="2">倒卖举报</option><option value="3">不良信息</option><option value="4">其他</option></select></div><div class="get-plan-form-item"><i class="u-item-icon dtmuban-iconfont icon-yonghu"></i><input class="u-input js-apply-name" type="text" id="truenameb" name="truenameb" placeholder="您的姓名" value=""><span id="dtruenameb"></span></div><div class="get-plan-form-item"><i class="u-item-icon dtmuban-iconfont icon-liuyan"></i><input class="u-input js-apply-phone" type="text" id="emailb" name="emailb" placeholder="您的邮箱" value=""><span id="demailb"></span></div><div class="get-plan-form-item"><i class="u-item-icon dtmuban-iconfont icon-shouji"></i><input class="u-input js-apply-phone" type="text" id="telephoneb" name="telephoneb" placeholder="您的手机" value=""><span id="dtelephoneb"></span></div><div class="get-plan-form-item"><i class="u-item-icon dtmuban-iconfont icon-liuyan2"></i><textarea class="u-textarea js-apply-content" id="contentb" name="contentb" placeholder="留言说明,文字为2-100字" value=""></textarea><span id="dcontentb"></span></div><button type="submit" name="submit" class="btn btn-red" onclick="checkaguestbook();">立即提交</button></div></div></div><style> .drop_more li{ list-style: none;} </style><script type="text/javascript" src="/file/script/config.js"></script><script type="text/javascript" src="/file/script/common.js"></script><script type="text/javascript" src="/skin/static/js/commonpop.js"></script><script type="text/javascript" src="/skin/static/js/header.js"></script><script type="text/javascript" src="/skin/static/js/footer.js"></script><script type="text/javascript" src="/skin/static/js/listconcommon.js"></script><script src="/skin/static/layui/layui.js" type="text/javascript"></script><script src="/skin/static/js/custom-script.js" type="text/javascript"></script><script src="/skin/static/js/indexsms.js?v=20240108.1443"></script><script type="text/javascript"> $(function(){ var destoon_userid = 0,destoon_username = '',destoon_member = destoon_guest = ''; destoon_guest = '<div class="login-li"><a href="javascript:void(0);" lay-on="showLoginPopup" class="a_on_dl" id="dn-login">请登录</a></div><div class="login-li"><a href="javascript:void(0);" lay-on="showLoginPopup" class="a_to">免费注册</a></div>'; destoon_member += destoon_guest; $('#m52_member').html(destoon_member); }); </script></body></html><script type="text/javascript" src="/skin/static/js/contentie.js"></script>