• 2020年Jumpserver1.5.8企业生产部署指南


    1、 jumpserver 简介
    Jumpserver 采用了分布式架构设计, 支持多云环境 并可灵活扩展。 资产管理方面,
    Jumpserver 无并发和资产数量限制, 支持水平扩容。 Jumpserver 采用了业界领先的容器化
    部署方式, 并且提供体验极佳的 Web Terminal 。 Jumpserver 还可实现基于 Web 的文件
    传输, 并且支持用户将运维审计录像保存在云端( 例如 AWS S3 、 阿里云 OSS 、 ElasticSearch
    等) 。 Jumpserver 是全球首款完全开源、 符合 4A 规范( 包含认证 Authentication 、 授权
    Authorization、 账号 Accounting 和审计 Auditing ) 的运维安全审计系统, Jumpserver 通过
    软件订阅服务或者软硬件一体机的方式, 向企业级用户交付多云环境下更好用的堡垒机

    2、 为何要学习 jumpserver
    企业应用当中, 监控系统 (zabbix,prometheus),日志分析系统(filebeat+kafka+elk) 几乎是每个
    公司必不可少的, 同样 jumpserver 也是非常重要的统一登录入口堡垒机,对运维审计及安全 起到非常重要的作用,完全有必要应用到你的公司,接下来我将按照企业生产标准带领大家一步一步部署jumpserver

    3.本次实验环境相关软件版本 如下
    [root@jumpserver ~]# cat /etc/redhat-release
    CentOS Linux release 7.7.1908 (Core)
    mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz
    nginx-1.16.0.tar.gz
    Python-3.6.7.tar.xz
    redis-5.0.8.tar.gz
    jumpserver1.5.8

    相关软件包已提前下载好

    4、NGINX编译部署

    [root@jumpserver src]# yum install pcre pcre-devel openssl-devel -y ##安装依赖
    [root@jumpserver nginx-1.16.0]# useradd -s /sbin/nologin -M nginx
    [root@jumpserver src]# wget http://nginx.org/download/nginx-1.16.0.tar.gz
    [root@jumpserver src]# tar xf nginx-1.16.0.tar.gz
    [root@jumpserver src]# cd nginx-1.16.0
    [root@jumpserver nginx-1.16.0]# ./configure --prefix=/usr/local/nginx-1.16.0 --user=nginx
    --group=nginx --with-http_stub_status_module --with-http_ssl_module --with-stream
    [root@jumpserver nginx-1.16.0]# make && make install
    [root@jumpserver nginx-1.16.0]# ln -s /usr/local/nginx-1.16.0/ /usr/local/nginx
    
    nginx启动
    /usr/local/nginx/sbin/nginx 

    5、redis编译部署
    1、 Redis 简介
    Redis 是完全开源免费的, 遵守 BSD 协议, 是一个高性能的 key-value 数据库。
    Redis 支持数据的持久化, 可以将内存中的数据保存在磁盘中, 重启的时候可以再次加载进
    行使用。
    Redis 不仅仅支持简单的 key-value 类型的数据, 同时还提供 list, set, zset, hash 等数据结
    构的存储

    redis部署

    tar xf redis-5.0.8.tar.gz
    cd redis-5.0.8
    make PREFIX=/usr/local/redis5.0.8 install
    ln -s /usr/local/redis5.0.8/ /usr/local/redis
    echo "export PATH=$PATH:/usr/local/redis/bin/" >> /etc/profile
    source /etc/profile
    创建配置文件及数据持久化目录
    [root@jumpserver redis-5.0.8]# mkdir /usr/local/redis/{etc,data}
    
    redis 简单配置
    cat /usr/local/redis/etc/redis.conf
    ### 以守护进程模式启动
    daemonize yes
    ### 绑定的主机地址
    bind 0.0.0.0
    ### 监听端口
    port 6379
    ### pid 文件和 log 文件的保存地址
    pidfile "/var/run/redis_6379.pid"
    logfile "/var/log/redis_6379.log"
    ### 指定本地持久化文件的文件名,默认是 dump.rdb
    dbfilename redis_6379.rdb
    ### 本地数据库的目录
    dir /usr/local/redis/data/
    
    redis启动
    [root@jumpserver redis-5.0.8]# redis-server /usr/local/redis/etc/redis.conf

    检查结果

     3、Python3编译部署

    1、 先安装相关依赖包
    yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel
    tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel
    2、 Python 源码部署
    [root@jumpserver src]# wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz
    [root@jumpserver src]# tar xf Python-3.6.6.tgz
    [root@jumpserver src]# cd Python-3.6.6
    [root@jumpserver Python-3.6.6]# ./configure --prefix=/usr/local/python3
    [root@jumpserver Python-3.6.6]# make && make install
    3、 设定环境变量
    [root@jumpserver Python-3.6.6]# echo "export PATH=$PATH:/usr/local/python3/bin/" >>
    /etc/profile
    [root@jumpserver Python-3.6.6]# source /etc/profile

     4、MySQL5.7.28 二进制版本规范化部署
    去 mysql 官网下载 mysql5.7.28 二进制版本
    https://downloads.mysql.com/archives/community/

    MySQL部署

    [root@jumpserver software]# useradd -s /sbin/nologin -M mysql #创建数据库运行账户
    [root@jumpserver software]# tar xf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz #解压软件包
    [root@jumpserver software]# mv mysql-5.7.28-linux-glibc2.12-x86_64 /usr/local/mysql-5.7.28
    [root@jumpserver software]# ln -s /usr/local/mysql-5.7.28/ /usr/local/mysql
    [root@jumpserver software]# mkdir /data/mysql/mysql3306/{data,logs,tmp} -p #建立目录
    [root@jumpserver software]# chown -R mysql.mysql /usr/local/mysql/ /data/mysql/ ##授权
    mysql 账户
    [root@jumpserver software]# echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
    [root@jumpserver software]# source /etc/profile #配置环境变量
    ###注意如果之前有 mariadb 请先卸载干净
    
    这里提供一份生产配置文件
    [root@jumpserver software]# cat /data/mysql/mysql3306/my3306.cnf
    #my.cnf
    [client]
    port = 3306
    #socket = /tmp/mysql3306.sock
    [mysql]
    prompt="\u@\h:\p [\d]>"
    no-auto-rehash
    [mysqld]
    user = mysql
    basedir = /usr/local/mysql
    datadir = /data/mysql/mysql3306/data
    server_id = 23306
    port = 3306
    socket = /tmp/mysql3306.sock
    event_scheduler = 0
    interactive_timeout = 300
    wait_timeout = 300
    #character set
    character-set-server = utf8
    open_files_limit = 65535
    max_connections = 100
    max_connect_errors = 100000
    lower_case_table_names =1explicit_defaults_for_timestamp=1
    #logs
    log-output=file
    slow_query_log = 1
    slow_query_log_file = slow.log
    log-error = /data/mysql/mysql3306/logs/error.log
    pid-file = mysql.pid
    long_query_time = 1
    log-slow-slave-statements = 1
    #binlog
    binlog_format = row
    log-bin = /data/mysql/mysql3306/logs/mysql-bin
    binlog_cache_size = 1M
    max_binlog_size = 256M
    sync_binlog = 0
    expire_logs_days = 10
    #procedure
    log_bin_trust_function_creators=1
    # gt
    id-mode = on
    enforce-gtid-consistency=1
    #relay log
    skip_slave_start = 1
    max_relay_log_size = 128M
    relay_log_purge = 1
    relay_log_recovery = 1
    relay-log=relay-bin
    relay-log-index=relay-bin.index
    log_slave_updates
    #slave-skip-errors=1000,1001,1002
    #skip-grant-tables
    #buffers & cache
    table_open_cache = 2048
    table_definition_cache = 2048
    table_open_cache = 2048
    max_heap_table_size = 96M
    sort_buffer_size = 128Kjoin_buffer_size = 128K
    thread_cache_size = 200
    query_cache_size = 0
    query_cache_type = 0
    query_cache_limit = 256K
    query_cache_min_res_unit = 512
    thread_stack = 192K
    tmp_table_size = 96M
    key_buffer_size = 8M
    read_buffer_size = 2M
    read_rnd_buffer_size = 16M
    bulk_insert_buffer_size = 32M
    #myisam
    myisam_sort_buffer_size = 128M
    myisam_max_sort_file_size = 10G
    myisam_repair_threads = 1
    #innodb
    innodb_buffer_pool_size = 100M ##这里跟进生产实际情况调整, 因为虚拟机, 这里设置的
    比较小
    innodb_buffer_pool_instances = 1
    innodb_data_file_path = ibdata1:100M:autoextend
    innodb_flush_log_at_trx_commit = 2
    innodb_log_buffer_size = 8M
    innodb_log_file_size = 100M
    innodb_log_files_in_group = 3
    innodb_max_dirty_pages_pct = 50
    innodb_file_per_table = 1
    innodb_rollback_on_timeout
    innodb_status_file = 1
    innodb_io_capacity = 2000
    transaction_isolation = READ-COMMITTED
    innodb_flush_method = O_DIRECT
    loose_tokudb_cache_size=100M
    loose_tokudb_directio=ON
    loose_tokudb_fsync_log_period=1000
    loose_tokudb_commit_sync=0

    初始化MySQL

    [root@jumpserver software]# /usr/local/mysql/bin/mysqld
    --defaults-file=/data/mysql/mysql3306/my3306.cnf --initialize
    [root@jumpserver local]# grep password /data/mysql/mysql3306/data/error.log
    2020-04-21T13:52:57.356296Z 1 [Note] A temporary password is generated for root@localhost: 2loA_aBNk0?I   ##这个代表初始随机密码

    检查结果

    [root@jumpserver software]# ll /data/mysql/mysql3306/data/
    总用量 409676
    -rw-r----- 1 mysql mysql 56 421 14:17 auto.cnf
    -rw------- 1 mysql mysql 1676 421 14:17 ca-key.pem
    -rw-r--r-- 1 mysql mysql 1112 421 14:17 ca.pem
    -rw-r--r-- 1 mysql mysql 1112 421 14:17 client-cert.pem
    -rw------- 1 mysql mysql 1676 421 14:17 client-key.pem
    -rw-r----- 1 mysql mysql 1062 421 14:17 error.log
    -rw-r----- 1 mysql mysql 425 421 14:17 ib_buffer_pool
    -rw-r----- 1 mysql mysql 104857600 421 14:17 ibdata1
    -rw-r----- 1 mysql mysql 104857600 421 14:17 ib_logfile0
    -rw-r----- 1 mysql mysql 104857600 421 14:17 ib_logfile1
    -rw-r----- 1 mysql mysql 104857600 421 14:17 ib_logfile2
    drwxr-x--- 2 mysql mysql 4096 421 14:17 mysql
    drwxr-x--- 2 mysql mysql 8192 421 14:17 performance_schema
    -rw------- 1 mysql mysql 1680 421 14:17 private_key.pem
    -rw-r--r-- 1 mysql mysql 452 421 14:17 public_key.pem
    -rw-r--r-- 1 mysql mysql 1112 421 14:17 server-cert.pem
    -rw------- 1 mysql mysql 1680 421 14:17 server-key.pem-rw-r----- 1 mysql mysql 184 421 14:17 slow.log
    drwxr-x--- 2 mysql mysql 8192 421 14:17 sys
    
    MySQL启动
    [root@jumpserver software]# /usr/local/mysql/bin/mysqld 
    --defaults-file=/data/mysql/mysql3306/my3306.cnf &

     登陆和修改初始密码

    [root@jumpserver software]# mysql -uroot -p -S /tmp/mysql3306.sock
    Enter password:
    mysql> alter user user() identified by '123456';

    5.docker部署
    1、 docker 简介
    docker 通过内核虚拟化技术(namespace 及 cgroups 等) 来提供容器的资源隔离与安全保障
    等, 由于 docker 通过操作系统层的虚拟化实现隔离, 所以 docker 容器在运行时, 不需要类
    似虚拟机额外的操作系统开销, 提供资源利用率

    2、 docker vs kvm

     3.docker部署

    https://docs.docker.com/engine/install/centos/
    如之前有安装就先卸载
    yum remove docker 
    docker-client 
    docker-client-latest 
    docker-common 
    docker-latest 
    docker-latest-logrotate 
    docker-logrotate 
    docker-engine
    yum install -y yum-utils
    yum-config-manager 
    --add-repo 
    https://download.docker.com/linux/centos/docker-ce.repo
    yum install docker-ce docker-ce-cli containerd.io -y

    4.docker基础操作

    配置 docker 镜像加速
    [root@jumpserver ~]# cat /etc/docker/daemon.json
    {
    "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
    } s
    ystemctl enable docker
    systemctl start docker
    Docker info 查看版本及加速情况
    [root@jumpserver ~]# docker pull centos ##拉取 centos 镜像
    [root@jumpserver ~]# docker save -o centos.tar centos ##导出镜像
    [root@jumpserver ~]# docker load -i cnetos.tar ##导入镜像
    [root@jumpserver ~]# docker run --name docker-demo -itd centos /bin/bash ##生成容器
    [root@jumpserver ~]# docker container ls #查看容器

    6.jumpserver部署

    组件说明
    JumpServer 为管理后台, 管理员可以通过 Web 页面进行资产管理、用户管理、资产授权等操作, 用户可以通过 Web 页面进行资产登录, 文件管理等操作
    koko 为 SSH Server 和 Web Terminal Server 。用户可以使用自己的账户通过 SSH 或者 Web Terminal 访问 SSH 协议和 Telnet 协议资产
    Luna 为 Web Terminal Server 前端页面, 用户使用 Web Terminal 方式登录所需要的组件
    Guacamole 为 RDP 协议和 VNC 协议资产组件, 用户可以通过 Web Terminal 来连接 RDP 协议和 VNC 协议资产 (暂时只能通过 Web Terminal 来访问)

    端口说明
    JumpServer 默认 Web 端口为 8080/tcp, 默认 WS 端口为 8070/tcp, 配置文件 jumpserver/config.yml
    koko 默认 SSH 端口为 2222/tcp, 默认 Web Terminal 端口为 5000/tcp 配置文件在 koko/config.yml
    Guacamole 默认端口为 8081/tcp, 配置文件 /config/tomcat9/conf/server.xml
    Nginx 默认端口为 80/tcp
    Redis 默认端口为 6379/tcp
    Mysql 默认端口为 3306/tcp

    jumpserver部署

    # 创建数据库 JumpServer 并授权
    $ DB_PASSWORD=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 24`  # 生成随机数据库密码
    $ echo -e "33[31m 你的数据库密码是 $DB_PASSWORD 33[0m"
    
    你的数据库密码是 2vWNIylwdxyHjYKLVkpBMtUz
    
    $ mysql -uroot -p -S /tmp/mysql3306.sock -e "create database jumpserver default charset 'utf8' collate 'utf8_bin'; grant all on jumpserver.* to 'jumpserver'@'127.0.0.1' identified by '$DB_PASSWORD'; flush privileges;"
    
    [root@jumpserver data]# python3 -m venv py3
    source /data/py3/bin/activate  # 退出虚拟环境可以使用 deactivate 命令
    
    (py3) [root@localhost py3]
    
    # 下载 JumpServer
    $ cd /data/
    $ git clone --depth=1 https://github.com/jumpserver/jumpserver.git
    
    # 安装依赖 RPM 包
    $ yum -y install $(cat /data/jumpserver/requirements/rpm_requirements.txt)
    
    # 安装 Python 库依赖
    $ pip install wheel
    $ pip install --upgrade pip setuptools
    $ pip install -r /data/jumpserver/requirements/requirements.txt   -i  https://mirrors.aliyun.com/pypi/simple/

    修改配置文件

    # 修改 JumpServer 配置文件
    $ cd /data/jumpserver
    $ cp config_example.yml config.yml
    
    $ SECRET_KEY=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 50`  # 生成随机SECRET_KEY
    $ echo "SECRET_KEY=$SECRET_KEY" >> ~/.bashrc
    $ BOOTSTRAP_TOKEN=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 16`  # 生成随机BOOTSTRAP_TOKEN
    $ echo "BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN" >> ~/.bashrc
    
    $ sed -i "s/SECRET_KEY:/SECRET_KEY: $SECRET_KEY/g" /data/jumpserver/config.yml
    $ sed -i "s/BOOTSTRAP_TOKEN:/BOOTSTRAP_TOKEN: $BOOTSTRAP_TOKEN/g" /data/jumpserver/config.yml
    $ sed -i "s/# DEBUG: true/DEBUG: false/g" /data/jumpserver/config.yml
    $ sed -i "s/# LOG_LEVEL: DEBUG/LOG_LEVEL: ERROR/g" /data/jumpserver/config.yml
    $ sed -i "s/# SESSION_EXPIRE_AT_BROWSER_CLOSE: false/SESSION_EXPIRE_AT_BROWSER_CLOSE: true/g" /data/jumpserver/config.yml
    $ sed -i "s/DB_PASSWORD: /DB_PASSWORD: $DB_PASSWORD/g" /data/jumpserver/config.yml

    查看最终的文件

    [root@jumpserver ~]# cat /data/jumpserver/config.yml 
    # SECURITY WARNING: keep the secret key used in production secret!
    # 加密秘钥 生产环境中请修改为随机字符串,请勿外泄, 可使用命令生成 
    # $ cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 49;echo
    SECRET_KEY: ESgqBEs6umFh0wBnyJpiewTS06XQJavc5YhEUCB1iHGLsxQY5i
    
    # SECURITY WARNING: keep the bootstrap token used in production secret!
    # 预共享Token coco和guacamole用来注册服务账号,不在使用原来的注册接受机制
    BOOTSTRAP_TOKEN: erIRjdkdbSaWUCvT
    
    # Development env open this, when error occur display the full process track, Production disable it
    # DEBUG 模式 开启DEBUG后遇到错误时可以看到更多日志
    DEBUG: false
    
    # DEBUG, INFO, WARNING, ERROR, CRITICAL can set. See https://docs.djangoproject.com/en/1.10/topics/logging/
    # 日志级别
    LOG_LEVEL: ERROR
    # LOG_DIR: 
    
    # Session expiration setting, Default 24 hour, Also set expired on on browser close
    # 浏览器Session过期时间,默认24小时, 也可以设置浏览器关闭则过期
    # SESSION_COOKIE_AGE: 86400
    SESSION_EXPIRE_AT_BROWSER_CLOSE: true
    
    # Database setting, Support sqlite3, mysql, postgres ....
    # 数据库设置
    # See https://docs.djangoproject.com/en/1.10/ref/settings/#databases
    
    # SQLite setting:
    # 使用单文件sqlite数据库
    # DB_ENGINE: sqlite3
    # DB_NAME: 
    
    # MySQL or postgres setting like:
    # 使用Mysql作为数据库
    DB_ENGINE: mysql
    DB_HOST: 127.0.0.1
    DB_PORT: 3306
    DB_USER: jumpserver
    DB_PASSWORD: 2vWNIylwdxyHjYKLVkpBMtUz
    DB_NAME: jumpserver
    
    # When Django start it will bind this host and port
    # ./manage.py runserver 127.0.0.1:8080
    # 运行时绑定端口
    HTTP_BIND_HOST: 0.0.0.0
    HTTP_LISTEN_PORT: 8080
    WS_LISTEN_PORT: 8070
    
    # Use Redis as broker for celery and web socket
    # Redis配置
    REDIS_HOST: 127.0.0.1
    REDIS_PORT: 6379
    # REDIS_PASSWORD: 
    # REDIS_DB_CELERY: 3
    # REDIS_DB_CACHE: 4
    
    # Use OpenID authorization
    # 使用OpenID 来进行认证设置
    # BASE_SITE_URL: http://localhost:8080
    # AUTH_OPENID: false  # True or False
    # AUTH_OPENID_SERVER_URL: https://openid-auth-server.com/
    # AUTH_OPENID_REALM_NAME: realm-name
    # AUTH_OPENID_CLIENT_ID: client-id
    # AUTH_OPENID_CLIENT_SECRET: client-secret
    # AUTH_OPENID_IGNORE_SSL_VERIFICATION: True
    # AUTH_OPENID_SHARE_SESSION: True
    
    # Use Radius authorization
    # 使用Radius来认证
    # AUTH_RADIUS: false
    # RADIUS_SERVER: localhost
    # RADIUS_PORT: 1812
    # RADIUS_SECRET: 
    
    # CAS 配置
    # AUTH_CAS': False,
    # CAS_SERVER_URL': "http://host/cas/",
    # CAS_ROOT_PROXIED_AS': 'http://jumpserver-host:port',  
    # CAS_LOGOUT_COMPLETELY': True,
    # CAS_VERSION': 3,
    
    # LDAP/AD settings
    # LDAP 搜索分页数量
    # AUTH_LDAP_SEARCH_PAGED_SIZE: 1000
    #
    # 定时同步用户
    # 启用 / 禁用
    # AUTH_LDAP_SYNC_IS_PERIODIC: True
    # 同步间隔 (单位: 时) (优先)
    # AUTH_LDAP_SYNC_INTERVAL: 12
    # Crontab 表达式
    # AUTH_LDAP_SYNC_CRONTAB: * 6 * * *
    #
    # LDAP 用户登录时仅允许在用户列表中的用户执行 LDAP Server 认证
    # AUTH_LDAP_USER_LOGIN_ONLY_IN_USERS: False
    #
    # LDAP 认证时如果日志中出现以下信息将参数设置为 0 (详情参见:https://www.python-ldap.org/en/latest/faq.html)
    # In order to perform this operation a successful bind must be completed on the connection
    # AUTH_LDAP_OPTIONS_OPT_REFERRALS: -1
    
    # OTP settings
    # OTP/MFA 配置
    # OTP_VALID_WINDOW: 0
    # OTP_ISSUER_NAME: Jumpserver
    
    # Perm show single asset to ungrouped node
    # 是否把未授权节点资产放入到 未分组 节点中
    # PERM_SINGLE_ASSET_TO_UNGROUP_NODE: false
    #
    # 启用定时任务
    # PERIOD_TASK_ENABLE: True
    #
    # 启用二次复合认证配置
    # LOGIN_CONFIRM_ENABLE: False
    #
    # Windows 登录跳过手动输入密码
    # WINDOWS_SKIP_ALL_MANUAL_PASSWORD: False

    启动jumpserver

    $ cd /data/jumpserver
    $ ./jms start -d  # 后台运行使用 -d 参数./jms start -d
    # 新版本更新了运行脚本, 使用方式./jms start|stop|status all  后台运行请添加 -d 参数

    # 获取当前服务器 IP
    $ Server_IP=`ip addr | grep 'state UP' -A2 | grep inet | egrep -v '(127.0.0.1|inet6|docker)' | awk '{print $2}' | tr -d "addr:" | head -n 1 | cut -d / -f1`
    $ echo -e "33[31m 你的服务器IP是 $Server_IP 33[0m"
    
    # http://<Jumpserver_url> 指向 jumpserver 的服务端口, 如 http://192.168.244.144:8080
    # BOOTSTRAP_TOKEN 为 Jumpserver/config.yml 里面的 BOOTSTRAP_TOKEN
    
    $ docker run --name jms_koko -d -p 2222:2222 -p 127.0.0.1:5000:5000 -e CORE_HOST=http://$Server_IP:8080 -e BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN -e LOG_LEVEL=ERROR --restart=always jumpserver/jms_koko:1.5.8
    
    $ cd /opt
    $ wget https://github.com/jumpserver/luna/releases/download/1.5.8/luna.tar.gz
    $ tar xf luna.tar.gz
    $ chown -R root:root luna

    配置nginx 代理到 jumpserver 访问即可

    http://ip
    默认用户名密码 admin/admin

     

    至此整个生产应用部署完毕

    现已录制了一套按照企业生产标准的jumpserver落地到企业应用视频,如有兴趣请前往
    https://edu.51cto.com/sd/84158

    部分效果图

     

     

  • 相关阅读:
    阿里图标库引用简介---20200608更新
    2.10排序算法
    2.9Node节点的学习
    2.8DOM节点的学习
    2.5数组
    2.6对象和函数
    2.7变量、内存、Math和Date的初级认识
    css优先级问题
    事件委托(事件代理)初认识
    静态页面学习随笔(1)-如何正确布局大体结构
  • 原文地址:https://www.cnblogs.com/hellojackyleon/p/12867419.html
Copyright © 2020-2023  润新知