标签: JSON

  • 容易被忽略的Error Handling 错误处理

    为了方便讲解,我们先来复习一下错误处理的必须武器 try catch,如果你已经很熟了可以跳过这一段:

    (更多…)

  • SpringBoot基于异常处理exception发送邮件消息提醒

    SpringBoot基于异常处理exception发送邮件消息提醒

    在项目常常会出现一些意料之外的错误,不能及时处理,大家都懂的哈。当然现在有很多监控服务,我这点能力是不够写的哈。☺

    (更多…)

  • 解放双手!推荐一款阿里开源的低代码工具,YYDS!

    解放双手!推荐一款阿里开源的低代码工具,YYDS!

    以前分享过几个低代码相关的文章,发现大家还是很感兴趣的。以前低代码是通过图形界面生成代码,实际低代码不仅负责代码生成,还负责代码的维护,代表JSON文件做什么,把它作为一站式开发平台也不为过。最近体验了JSON格式阿里开源的低代码工具LowCodeEngine。推荐企业级低代码解决方案!

    SpringBoot实战电气JSON招商项目mahttp代理ll(阿里巴巴批发网官网50k star)地址:github.com/ma编辑器小说crozheng/…/

    LowCodeEngine简介

    LowCodeEngine是面向阿里开源的扩展设计的企业级低代码技术系统,目前JSON在Github上有4.7K Star。这个项目是今年2月中旬开放的,不到两个月就收获了这么多明星,真是太棒了!

    解放双手!推荐一款阿里开源的低代码工具,YYDS!

    LowCodeE阿里嘎多nginehttpwatch主要具有以下特性:

    从企业级低代码平台中提取的HTTP客户端低代码引擎追求可源码编辑器下载扩展性高、最低核心、最环保的设计理念http协议

    部署简单,基本上立即可用,拥有完善的材料体系json数据、强大的安装程序、丰富的插件等。

    可视化编辑器拥有完整的http://192.168.1.1登录工具链,http 404支持材料httpclient体系、装机、插件等生态源代码。

    强大的可扩展性jsonp支持近100个垂直类低代码平台。

    使用TypeScript开发阿里拍卖可以生成基于React的前端代码。json

    以下是使用LowCodeEngine过程中的一张效果图。源家功能依然强大!

    放双手!推荐一款阿里开源的低代码工具,YYDS!” href=”htthttp 302ps://www.6hu.cc/wp-content/uploads/2022/05/af2ea84346de5029184abhttp 500b7b7b2a61fb.png”>

    搭建低代码平台

    接下来json解析我们将使用LowCodehttpclientEngine搭建一个低代码开发平台,仅需5分钟,可以说是源码编程器开箱即用!

    • 首先我源码网站们需要想下载源码网站LowCodj编辑器软件son怎么读eEngine编辑器的示例代码,下载地址:github.com/alibaba/low…

    解放双手!推荐一款阿里开源的低代码工具,YYDS!

    • jsonobject载成功后解编辑器软件压到指定目录,安装此项目需要使用Node.jsnpm,确保已经安装完毕,由于依赖中有些npm源无法访问,这里推荐使json怎么读cnhttp://www.baidu.compm来安装,先使用如下命令安装cnpm
    npm install -g cnpm --registry=https://registry.npmmirror.com
    
    • cnpm安装成功后,进入解压目录使用如下命令安装依赖阿里巴巴股票
    cnpm install
    
    • 依赖编辑器软件安装完成后,json文件是干什么的使用http协议npm start命令启动项目;

    解放双手!推荐一款阿里开源的低代码工具,YYDS!

    • 项目运行成功后j源码编辑器下载son格式怎么打开将运行在5556端口上,访问地址:httjsonobjectp://loca编辑编辑器下载器哪个好用lhost:5源码时代556

    解放双手!推荐一款阿里开源的低代码工具,YYDS!

    使用低代码平台

    阿里嘎多前在我的开源项目mall中有个品牌管理功能,http 302接下来我们将使用LowCo阿里众包deEngine来实现下它,看看低代码开发有何神奇之处!

    目标效果

    mall项目中阿里供应链的品牌管理功能效果如下,这里使用低代码简单实现下品牌列表功能。

    解放双手!推荐一款阿里开源的低代码工具,YYDS!

    组件库阿里巴巴1688货源批发官网

    • 首先我们从组件库中选择查询筛选组件,通过拖拽的形式插入编辑区中;

    解放双手!推荐一款阿里开源的低代码工具,YYDS!

    • 编辑器下载后选中查询筛选组件,json通过右侧的设置https和http的源码1688区别源码编程器进行设json解析置;

    解放双手!推荐一款阿里开源的低代码工具,YYDS!

    • 可以点击组件左侧的编辑按钮对组件进行详细设置,比如说组件外观和输入提示等;

    解放双手!推荐一款阿里开源的低代码工具,YYDS!

    • 接下来再拖拽一个高级表格组件到编辑器中去;

    解放双手!推荐一款阿里开源的低代码工具,YYDS!

    • 同样选中高级表格组件可以对表格进行设置,我们可以通过数据列来设置需要显示的数据编辑器哪个好用

    解放双手!推荐一款阿里开源的低代码工具,YYDS!

    数据源

    • 由于表格中的数据需要访问接口来获取,这里我们可以通过数据源功能来实现,这里我们调用演编辑器和ide的区别示环境的API,填入请求参数即可,值得注意的是由于数据列表在data.list属性中,我们需要定制下请求成功的处理函数;

    解放双手!推荐一款阿里开源的低代码工具,YYDS!

    • 接下来选中高级表格组件,修改表格数据源,选择表达式输入,填入我们之前设置json数据数据源ID即可;

    解放双手!推荐一款阿里开源的低代码工具,YYDS!

    • 然后修改数据列信息,将每个数据列数据阿里云盘字段修改为JSON阿里嘎多数据中对应的属性即可。

    解放双手!推荐一款阿里开源的低代码工具,YYDS!

    预览源码网站阿里嘎多出码

    • 如果想查看搭建的页面效果的话,点击右上角的预览源码时代按钮即阿里供应链可;

    解放双手!推荐一款阿里开源的低代码工具,YYDS!

    • 下面是由http协议低代编辑器135码生成的页面预览效果;

    解放双手!推荐一款阿里开源的低代码工具,YYDS!

    • 如果你想源码获取工具生成的代HTTP码的话,点击右上角的出码按钮即JSON可,支持直接下载。

    解放双手!推荐一款阿里开源的低代码工具,YYDS!

    其他功能

    • 如果JSON编辑器英语http协议想自定义一些函数的话,可以通过源码面板进行自定义;

    解放双手!推荐一款阿里开源的低代码工具,YYDS!

    • 通过大纲视图我们可以查看整个https和http的区别界面的结构。

    解放双手!推荐一款阿里开源的低代码工具,YYDS!

    总结

    今天体验了一把阿里开源的低代码开发阿里云工具,功json能确实很强大。但是编辑器手机版低代码阿里拍卖并不http://192.168.1.1阿里巴巴1688货源批发官网登录意味着可以不写代码了,想用好低代码工具还得熟悉工具json生成源码之家的代源码编程器码。编辑器手机版LowCodeEngine目前仅支持生成Rejsonpact的前端代http 404编辑器怎么打开,所以想要实现更为复杂的业务系统,还得熟悉Rjsoneact。如果有小伙伴想更深入了解低代码的概念,推荐看下这篇文章《阿里低代码引擎和生态建设实战及思考》 。

    参考资料

    • 项目http://www.baidu.com地址:github.com/alibaba/low…
    • 项目官网:lowcodejson文件是干什么的-enginhttpcliente.cn/
    • 操作指南:www.yuque.com/lce/usage
  • 对Nuscenes数据集一无所知,手把手带你玩转Nusences数据集

    对Nuscenes数据集一无所知,手把手带你玩转Nusences数据集

    一起养成写作习惯!这是我参与「日新计划 4 月更文挑战」的第22天,点击查看活动详情。

    (更多…)

  • 教你用微前端qiankun改造日渐庞大的项目

    教你用微前端qiankun改造日渐庞大的项目

    本文已参加【新人创作礼】活动,一起开启创作之路。

    (更多…)

  • 做了个本地测试项目内方法的可视化工具

    做了个本地测试项目内方法的可视化工具

    不知道开发方向对不对,还在开发中,恳请大佬们指点。

    (更多…)

  • Spring 全家桶之 Spring Boot 2.6.4( Ⅰ )- Caching(Part A)

    Spring 全家桶之 Spring Boot 2.6.4( Ⅰ )- Caching(Part A)

    一起养成写作习惯!这是我参加“一神论计划4月份经文挑战”的第25天。点击查看活动详细信息。

    一、Spring Cache Abstraction

    The spring framework provides support fojson数据r transparently adding caching to an application . at its core,The abstraction applies caspring面试

    Sspring面试题pring高速缓存抽象是一组高速缓存规范,通过定义org . springframeworkjson . cache . cache和CacheManager的两个接口集成了不同的高速缓存技术

    高速缓存接口mybatis面试题提供高速缓存组件的规范定义,并包含缓慢JSON内存的各种操作集合

    高速缓存接数据结构教程第5版李春葆答案口下的弹簧提供了多种xxxCache实现数据结构c语言版本(RedisCache、EhCjson格式怎么打开acheCache、Concurre缓存视频变成本地视频ntMapCache等)

    Cach缓存是什么意思eManager是管理各种缓存组件的缓存管理器

    CacheManager和Cache的关系类似于数据库连接池和数据库连springmvc的工作原理接。

    为了简化开发,Spring高速缓存抽象同时支持Jacache的注释,Jacache也是一组规范。

    JCache定义了五个核心接口:

    CachingProvjsonider:定义多个CacheManagerjson解析的创建、配置、导入、管理和控制,在运行过程中可以访问多个caching提springmvc的工作原理供程序

    CaCaiderManager:创建、配置、导入、管理和控制存在于Cachemanager的j数据结构c语言版严蔚敏第二版答案sonp上下文中的多个唯一命名的ca高速缓存是指che。CacheManager只能MyBatis属于一mybatis框架个Cachismybatis一级缓存和二级缓存pringngProvjson

    Cache:暂时储存类似快取的Map数目jsonp资料结构、金钥索引值。缓存只能属于一个CacheManager

    数据结构题库目:高速缓存

    的Key-数据结构有哪些Value对
  • Expiry:每一个存储spring面试题在Ca缓存文件夹名称che中的条目有一个mybatis注解定义的有效期,一旦超过这个事件,条目为过期状态且无法访问、更新和删除,缓存有数据结构知识点总结效期可以通过ExpiryPolicy设置
  • 为了简化开发,更多是使Spring用Spring的缓存抽象,Spring的缓存抽mybatis中$和井号区别象的底数据结构教程第5版李春葆答案层概念与JSR107是一致的

    Spring 缓存抽象中的重要注解

    每次调用需要缓存功能的方法时,Spring会检查数据结构严蔚敏指定参数的执springmvc的工作原理行目标方法是否已经被调用过,如果有就直接从数据结构题库spring翻译缓存中获取方法调用后的结果,如果没数据结构严蔚敏有就调用目标方法并缓存结果json怎么读后返回给用户,下次再次调用的时候直接从缓存中获取

    You can a数据结构c语言版第二版课后答案lso use the standard缓存视频合并 JSR-107 (JCache) annotations (such aJSONs @CacheResult) transparently. However, we strongly advise you to not mix and match the Spring Cache and JCache annotations.

    Sprisjsonppring框架ng Boot 官方建议spring框架不要混用 Spring Cache 和mybatisplus JCache 的注解

    工程搭建与测试

    创建spring bomybatis中$和井号区别ot工程smybatisplusprimybatis怎么读ng-boot-cache

    根据S缓存的视频在哪QL文件新建tesla、json格式怎么打开factory两数据结构有哪些张表

    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    -- ----------------------------
    -- Table structure for factory
    -- ----------------------------
    DROP TABLE IF EXISTS `factory`;
    CREATE TABLE `factory` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `factory_name` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1166057542 DEFAULT CHARSET=utf8;
    -- ----------------------------
    -- Records of factory
    -- ----------------------------
    BEGIN;
    INSERT INTO `factory` VALUES (1, '上海特斯拉超级工厂');
    INSERT INTO `factory` VALUES (2, '加州弗拉蒙特特斯拉超级工厂');
    INSERT INTO `factory` VALUES (3, '得克萨斯州特斯拉超级工厂');
    INSERT INTO `factory` VALUES (4, '柏林特斯拉超级工厂');
    COMMIT;
    SET FOREIGN_KEY_CHECKS = 1;
    
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    -- ----------------------------
    -- Table structure for tesla
    -- ----------------------------
    DROP TABLE IF EXISTS `tesla`;
    CREATE TABLE `tesla` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) DEFAULT NULL,
      `price` double(10,2) DEFAULT NULL,
      `vehicle_type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
      `factory_id` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1166057542 DEFAULT CHARSET=utf8;
    -- ----------------------------
    -- Records of tesla
    -- ----------------------------
    BEGIN;
    INSERT INTO `tesla` VALUES (1166057520, 'Model 3P 2021', 280000.00, '四门轿车', 1);
    COMMIT;
    SET FOREIGN_KEY_CHECKS = 1;
    

    entity包下增加Tesla和Factory实体类

    @Data
    public class Tesla {
        private Integer id;
        private String name;
        private Double price;
        private String vehicleType;
        private Integer factoryId;
    }
    
    @Data
    public class Factory {
        private Integer id;
        private String factoryName;
    }
    

    application.ym数据结构c语言版第二版课后答案l中配置druid

    spring:
      datasource:
        # driver可以不写,会根据连接自动判断
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: root
        password: 123456
        url: jdbc:mysql://localhost:3306/test
        druid:
          # 初始化大小,最小,最大
          initial-size: 5
          max-active: 100
          min-idle: 1
          # 配置获取连接等待超时的时间
          max-wait: 60000
          # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位毫秒
          time-between-eviction-runs-millis: 60000
          # 配置一个连接在池中最小生存时间
          min-evictable-idle-time-millis: 300000
          # 用来检测连接是否有效的sql 必须是一个查询语句 注意没有此语句以下三个属性不会生效
          validation-query: SELECT 1 FROM DUAL
          # 归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
          test-on-return: false
          # 申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
          test-on-borrow: true
          # 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
          test-while-idle: true
          # 配置监控统计拦截的 Filter,去掉后监控界面 SQL 无法统计,wall 用于防火墙
          filters: stat,wall
          # 通过 connection-properties 属性打开 mergeSql 功能;慢 SQL 记录
          connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
          # 配置 DruidStatFilter
          web-stat-filter:
            enabled: true
            url-pattern: /*
            exclusions: .js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*
          # 配置 DruidStatViewServlet
          stat-view-servlet:
            url-pattern: /druid/*
            # IP 白名单,没有配置或者为空,则允许所有访问
            #allow: 127.0.0.1
            # IP 黑名单,若白名单也存在,则优先使用
            #deny: 192.168.31.253
            # 禁用 HTML 中 Reset All 按钮
            reset-enable: true
            # 登录用户名/密码
            login-username: root
            login-password: 123
            # 注意 此处必须开启,否则无法访问druid监控面板
            enabled: true
          use-global-data-source-stat: true
    logging:
      level:
        # 输出mapper接口中方法执行的SQL语句
        com.lilith.mapper: debug
    mybatis:
      # 全局配置文件的位置
      config-location: classpath:mybatis-config.xml
      mapper-locations: classpath:mappers/*.xml
        # configuration:
      # map-underscore-to-camel-case: true
    debug: true
    

    在mymybatisplusbatis-config.mybatis分页插件实现原理xml缓存视频合并app中配置MyBatis全局配置

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <settings>
            <setting name="mapUnderscoreToCamelCase" value="true"/>
        </settings>
        <typeAliases>
            <package name="com.lilith.entity"/>
        </typeAliases>
    </configuration>
    

    mapper包下增加TeslaMapper和FactspringoryMapper两个接口,实现增删改查方法

    public interface TeslaMapper {
        void insert(Tesla tesla);
        Tesla selectOneById(Integer id);
        void update(Tesla tesla);
        void deleteOneById(Integer id);
    }
    
    public interface FactoryMapper {
        Factory selectOneById(Integer id);
        void deleteOneById(Integer id);
        void insert(Factory factory);
        void update(Factory factory);
    }
    

    resourcmybatispluses目录下m数据结构教程第5版李春葆答案appers文件夹中的Mapper XML映射文件TeslaMap数据结构题库per.xml和FactoryMapper.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.lilith.mapper.TeslaMapper">
        <sql id="Base_Columns_List">
            id, name, price, vehicle_type, factory_id
        </sql>
        <select id="selectOneById" resultType="tesla">
            select <include refid="Base_Columns_List" /> from tesla where id = #{id}
        </select>
        <insert id="insert">
            INSERT INTO tesla (name, price, vehicle_type, factory_id)
            VALUES (#{name}, #{price}, #{vehicleType},#{factoryId})
        </insert>
        <update id="update">
            UPDATE tesla SET name = #{name}, price = #{price}, vehicle_type = #{vehicleType}, factory_id = #{factoryId}
            WHERE id = #{id}
        </update>
        <delete id="deleteOneById">
            DELETE FROM tesla WHERE id=#{id}
        </delete>
    </mapper>
    
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.lilith.mapper.FactoryMapper">
        <sql id="Base_Columns_List">
            id, factory_name
        </sql>
        <select id="selectOneById" resultType="factory">
            SELECT <include refid="Base_Columns_List" /> FROM factory WHERE id = #{id}
        </select>
        <delete id="deleteOneById">
            DELETE FROM factory WHERE id=#{id}
        </delete>
        <insert id="insert" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
            INSERT INTO factory (factory_name)
            VALUES (#{factoryName})
        </insert>
        <update id="update">
            UPDATE factory SET factory_name = #{factoryName} where id = #{id}
        </update>
    </mapper>
    

    初始化spring-boot-cache工程的步骤:

    1. 创建tesla和factory两张表
    2. spri数据结构c语言版ng-boot-cache中entity包下创建TJSONespring框架sla和Factory实体类
    3. 整合Druid数据源
    4. 配置MyBatis
    5. 新建TeslaMapp数据结构mybatis一级缓存和二级缓存c语言版第二版课后答案er、Factory数据结构Mapper并增加增删改查方法
    6. 测试TeslaMapper、FactoryMapper的增删改缓存查方法

    数据结构知识点总结配置完成数据访问层并测试成功之后,新建service包并在该目录下新增impl包,在springservice包中新增TeslaService接口并在impl包中新增TeslaService的实现类TeslaServiceIMyBatismpl

    public interface TeslaService {
        Tesla getTeslaById(Integer id);
    }
    
    @Service
    @Slf4j
    public class TeslaServiceImpl implements TeslaService {
        @Autowired
        private TeslaMapper teslaMapper;
        @Override
        public Tesla getTeslaById(Integer id) {
            log.info("查询" + id + "特斯拉");
            return teslaMapper.selectOneById(id);
        }
    }
    

    新增controller包,spring增加TeslaController类,返回JSON格式数据

    @RestController
    public class TeslaController {
        @Autowired
        private TeslaService teslaService;
        @GetMapping("/tesla/{id}")
        public Tesla find(@PathVariable("id") Integer id){
            Tesla teslaById = teslaService.getTeslaById(id);
            return teslaById;
        }
    }
    

    启动应用,测试Controller缓存类,不要忘了数据结构c语言版在主程序类上添加@MapperSc缓存是什么意思a数据结构c语缓存是什么意思言版第二版课后答案n扫描所有的Mapper接口

    Spring Cache 的使用

    首先在主程序类上使用@EnableCachimybatis中$和井号区别ng来开启基于注解的缓存

    @Cacheable

    mybatis注解在TeslaServiceImpl类上的getTeslaBspring翻译yI缓存英文d()方法未添加@Cacheable注解之前,每一次查询都会调用数据库执行SQL语句,@Cacheable注解可以将方法运行的结果缓存,以后查询结果相同的spring翻译数据直接缓存中获取,不会在调数据结构实验报告用方法

    增加@Cacheable注解后,添加ca缓存清理cheNames属性,重启应用,多次查询只会执行一次SQL语句

    @Cacheable的几mybatis分页插件实现原理个属性

    缓存SpELl表达式

    名称 位置 描述 缓存视频怎样转入相册
    methodNammybatis怎么读e root object 当前被调用的方法名 #root.met数据结构有哪些hodName
    method root object 当前被调用的方法 #root.method.name
    target root object 当前被调缓存视频变成本地视频用的目标对象 #root.taspringrget
    targespring翻译tClass root object 当前被调用的目标对象类 #root.targetClasspring框架s
    args rootmybatis框架 objejson数据ct 当前被调用的参数列表 #root.args[0]
    cachesspring是什么意思 root object 当前方法调用使用的缓存列表数据结构c语言版,@Cacheable(value={“cache1”, “cache2”}) #root.caches.name[0]
    argumMyBatisent name evaluation context 方法参数的名字,可以直接 “缓存的视频在spring漏洞#参数名”, 也可以使用”#p0″或者”#a0″, 0代表索引 #p0
    result evaluation context 方法执行后的返回值,仅当该结果会被缓存时才可使用 #result
  • 安全 | 聊聊挖矿哪些事儿(一)

    安全 | 聊聊挖矿哪些事儿(一)

    一起养成写作习惯!这是我参与「日新计划 4 月更文挑战」的第19天,点击查看活动详情。

    (更多…)

  • 头歌-Mongo入门

    头歌-Mongo入门

    第一章 MongoDB数据库增删改查

    1-2 Mongodb 数据库基本操作

    第三关 文档操作一

    Use Testdb3 //Testdb3数据库输入

    Docu仓鼠寿命ment={

    _id: 1、

    Name :“张晓华”,

    Sex :“男人”,

    “Phone:”是,

    Hobbies: [ ‘篮球 ‘, ‘足球 ‘, ‘歌曲’]

    }

    Db.stu1.insert服务器内存和台式机内存区别(文档);长沙师范学院

    Db.stu2.insert(文档);

    Db.stu3.insert(文档);

    db . stu 2 . update({ phone 3360 ‘长沙师范学院 12356986594 },{ $ set : { phone 3Go360 ‘ 18356971462)

    Db.stu2.find()。pretty();//查看stu2

    Db.s长生十万年tu3.save({

    _id: 1、

    Name: ‘张晓晓 ‘仓鼠寿命

    Sex :“女人”,

    “Phone:”是498704。

    Hobbies: [ ‘跳舞’, ‘羽毛球 ‘, ‘唱歌’],

    });

    第四关 文档操作二

    #########begin

    Echo ‘

    Document=[

    {

    ‘ id 1,

    西施(cisi)表示,

    Sex“女人”是,

    ‘a

    ge” : 23, “national” : “汉族” }, { “_id” : 2, “name” : “东东”, “sex” : “男”, “age” : 20, “national” : “苗族” }, { “_id” : 3, “name” : “北北”, “sex” :服务器系统 “男”, “age” : 19, “national” : “汉族” }, { “_id” : 4, “name” : “南南”, “sex” : “女”, “age” : 15, “nati服务器怎么搭建onal长沙师范学院” : “傣族” } ]; db.stu1.insert(document); db.stu2.insert(document); db.stu1长沙市疫情最新情况.find({ age:{$gte: 15 } ,sex: “女” }); db.stu1.find(Go{ national:”苗族”}).pretty(); db.stu1.find({ age:{$lt: 20 }, sex: “男” }); db.stu2.remojsonobjectve({}) ‘ #########en工龄差一年工资差多少d#########

    第二章 MongoDB数据公司让员json工下班发手机电量截图库的权限设置

    2辰时是几点-1 MongoDB数据库安全

    第一关 创建管理员用户

    use admin
    db.createUser({user:"admin",pwd:"123456",roles:[{role:"root",db:"admin"}]})
    

    第二关 按需求创建普通用户

    use firstdb
    db.createUser({user:"people",pwd:"people",roles:[{role:"read",db:"firstdb"}]})
    

    第三关 数据库限制访问

    use admin #进入admin数据库
    db.shutdownServer() #关闭服务
    exit #退出数据库
    mongod -port 20018 --dbpath /data/db --logpath /tmp/mongodb.log --bind_ip 127.0.0.1 --fork
    

    第三章 MongoDB数据库高工龄差一年工资差多少级查询

    3-1长沙市天气 MongoDB 之聚合函数查询统计

    第一关 聚合管道操服务工资超过5000怎么扣税器租用作符将文json是什么意思档定制格式输出(一)长沙师范学院

    # 先将数据插入
    use test1 
    document = [
            {
                    "_id" : 1,
                    "course" : "Python表达式问题求解实训",
                    "author" : "李暾",
                    "tags" : [
                            "Python基础",
                            "求解"
                    ],
                    "learning_num" : 1882
            },
            {
                    "_id" : 2,
                    "course" : "Java语言之基本语法",
                    "author" : "余跃",
                    "tags" : [
                            "Java基础",
                            "语法"
                    ],
                    "learning_num" : 814
            },
            {
                    "_id" : 3,
                    "course" : "Python面向对象编程实训",
                    "author" : "李暾",
                    "tags" : [
                            "Python基础",
                            "面向对象"
                    ],
                    "learning_num" : 143
            },
            {
                    "_id" : 4,
                    "course" : "Android综合实训之物联网移动应用开发(1)",
                    "author" : "prophet5",
                    "tags" : [
                            "Android",
                            "物联网",
                            "移动开发"
                    ],
                    "learning_num" : 207
            }
    ]
    db.educoder.insert(document)
    #********* Begin *********#
    echo "
    db.educoder.aggregate({$project:{_id:0,course:1,learning_num:1}});
    db.educoder.aggregate({$match:{learning_num:1882}});
    "
    #********* End *********#
    

    第二关 聚合管道操作符将文档定制格式输出(二)

    # 先插入数据
    use test2 
    document = [
            {
                    "_id" : 1,
                    "course" : "Python表达式问题求解实训",
                    "author" : "李暾",
                    "tags" : [
                            "Python基础",
                            "求解"
                    ],
                    "learning_num" : 1882
            },
            {
                    "_id" : 2,
                    "course" : "Java语言之基本语法",
                    "author" : "余跃",
                    "tags" : [
                            "Java基础",
                            "语法"
                    ],
                    "learning_num" : 814
            },
            {
                    "_id" : 3,
                    "course" : "Python面向对象编程实训",
                    "author" : "李暾",
                    "tags" : [
                            "Python基础",
                            "面向对象"
                    ],
                    "learning_num" : 143
            },
            {
                    "_id" : 4,
                    "course" : "Android综合实训之物联网移动应用开发(1)",
                    "author" : "prophet5",
                    "tags" : [
                            "Android",
                            "物联网",
                            "移动开发"
                    ],
                    "learning_num" : 207
            }
    ]
    db.educoder.insert(document)
    #********* Begin *********#
    echo "
    db.educoder.aggregate({$limit:3});
    db.educoder.aggregate({$sort:{learning_num:1}});
    db.educoder.aggregate([{$skip:2}]);
    "
    #********* End *********#
    

    第三关 聚合表达式对文档数Go据进行统计

    # 先插入数据 (自行插入)
    #********* Begin *********#
    echo "
    db.educoder.aggregate([{$group:{_id:'$author',first_course:{$first:'$course'}}}]);
    db.educoder.aggregate([{$group:{_id:'$author',learning_avg:{$avg:'$learning_num'}}}]);
    db.educoder.aggregate([{ $unwind:'$tags'} , { $group:{_id:'$tags',course_num:{$sum:1} } }] 
    "
    #********* End *********#
    

    3-2 MongoDB 之滴滴、摩工龄差一年工资差多少拜都在用的索引

    第一关 了解并创建一个简单索引

    use test
    document = [
            {
                    "_id" : "1",
                    "name" : "王小明",
                    "age" : "15",
                    "score" : "90"
            },
            {
                    "_id" : "2",
                    "name" : "周晓晓",
                    "age" : "18",
                    "score" : "86"
            },
            {
                    "_id" : "3",
                    "name" : "王敏",
                    "age" : "20",
                    "score" : "96"
            },
            {
                    "_id" : "4",
                    "name" : "李晓亮",
                    "age" : "15",
                    "score" : "74"
            },
            {
                    "_id" : "5",
                    "name" : "张青青",
                    "age" : "21",
                    "score" : "88"
            }
    ]
    db.student.insert(document)
    db.student.createIndex({score:-1})
    

    第二关 常见索引的创建

    document = [
            {
                    "_id" : "1",
                    "title" : "提升程序员工作效率的6个工具利器",
                    "tags" : "Alfred,幕布",
                    "follwers" : 543
            },
            {
                    "_id" : "2",
                    "title" : "我是如何从零开始学习前端的",
                    "tags" : "HTML,Html5,CSS",
                    "follwers" : 1570
            },
            {
                    "_id" : "3",
                    "title" : "20个非常有用的JAVA程序片段",
                    "tags" : "Java,编程",
                    "follwers" : 1920
            }
    ]
    use test2
    db.article.insert(document)
    # 用字段 follwers 和 title 创建复合升序索引;
    db.article.createIndex({ follwers: 1, title: 1 });
    # 用字段 tags 创建多 key 降序索引;
    db.article.createIndex({ tags: -1 });
    # 用_id创建哈希索引;
    db.article.createIndex({ _id: "hashed" });
    # 用字段 title 和 tags 创建文本索引。
    db.article.createIndex(
    ... {
    ... title:"text",
    ... tags:"text"
    ... }
    ... )
    

    第三关 有NM趣的地理位置索引

    #**********Begin**********#
    echo '
      db.people.insert({
        _id: 1,
        name: "A",
        personloc: { type: "Point", coordinates: [116.403981, 39.914935] },
      });
      db.people.insert({
        _id: 2,
        name: "B",
        personloc: { type: "Point", coordinates: [116.433733, 39.909511] },
      });
      db.people.insert({
        _id: 3,
        name: "C",
        personloc: { type: "Point", coordinates: [116.488781, 39.949901] },
      });
      db.people.insert({
        _id: 4,
        name: "D",
        personloc: { type: "Point", coordinates: [116.342609, 39.948021] },
      });
      db.people.insert({
        _id: 5,
        name: "E",
        personloc: { type: "Point", coordinates: [116.328236, 39.901098] },
      });
      db.people.insert({
        _id: 6,
        name: "F",
        personloc: { type: "Point", coordinates: [116.385728, 39.871645] },
      });
      db.people.createIndex({ personloc: "2dsphere" });
      db.runCommand({
        geoNear: "people",
        near: { type: "Point", coordinates: [116.403981, 39.914935] },
        spherical: true,
        minDistance: 100,
        maxDistance: 3000,
      });
      db.runCommand({
        geoNear: "people",
        near: { type: "Point", coordinates: [116.433733, 39.909511] },
        spherical: true,
        minDistance: 100,
        maxDistance: 5000,
      });
      db.runCommand({
        geoNear: "people",
        near: { type: "Point", coordinates: [116.488781, 39.949901] },
        spherical: true,
        minDistance: 3000,
        maxDistance: 8000,
      });
      db.runCommand({
        geoNear: "people",
        near: { type: "Point", coordinates: [116.342609, 39.948021] },
        spherical: true,
        minDistance: 3000,
        maxDistance: 8000,
      });
    '
    #**********End**********#
    

    3-3 MondoDB文档的高级查询操作

    第一关 数据的导入导出

    #  將 /home/example 路径下的文件 student.csv 导入到数据库 mydb1 的 test 集合中;
    mongoimport -d mydb1 -c test --type csv  --headerline --ignoreBlanks --file /home/example/student.csv
    # 将 /home/example/person.json 文件导入到数据库 mydb2 中的 test 集合中。
    mongoimport -d mydb2 -c test  --type json --file /home/example/person.json
    # 将数据库 mydb1 的 test 集合以 json 格式导出到 /home/test1.json 的 json 文件中;
    mongoexport -d mydb1 -c test  -o /home/test1.json  --type json
    # 将数据库 mydb1 的 test 集合以 csv 格式导出到 /home/test1.csv 的 CSV 文件中
    mongoexport -d mydb1 -c test  -o /home/test1.csv  --type csv -f "_id,name,age,sex,major"
    

    第二关 高级查询(一)

    // 执行查询命令,查找所有喜欢唱歌和跳舞的人的信息,并按照_id升序排序;
      db.test.find({ hobbies: { $all: ["唱歌", "跳舞"] } }).sort({ _id: 1 });
      // 执行查询命令,查找所有喜欢羽毛球和跳舞的人的信息,并按照_id升序排序;
      db.test.find({ hobbies: { $all: ["羽毛球", "跳舞"] } }).sort({ _id: 1 });
      // 执行查询命令,查找有3个爱好的人的信息,并按照_id升序排序;
      db.test.find({ hobbies: { $size: 3 } }).sort({ _id: 1 });
      // 执行查询命令,查找文档中存在 hobbies 字段的人的信息,并按照_id升序排序;
      db.test.find({ hobbies: { $exists: true } }).sort({ _id: 1 });
      // 执行查询命令,查找19岁和23岁的人的信息,并按照_id升序排序;
      db.test.find({ age: { $in: [19, 23] } }).sort({ _id: 1 });
      // 执行查询命令,查找不是20岁的人的信息,并按照_id升序排序;
      db.test.find({ age: { $nin: [20] } }).sort({ _id: 1 });
      // 执行查询命令,查找 age 取模9等于2的人的信息,并按照_id升序排序。
      db.test.find({ age: { $mod: [9, 2] } }).sort({ _id: 1 });
    
    #********* Begin *********#
    echo "
      db.test.find({ hobbies: { $all: ['唱歌', '跳舞'] } }).sort({ _id: 1 });
      db.test.find({ hobbies: { $all: ['羽毛球', '跳舞'] } }).sort({ _id: 1 });
      db.test.find({ hobbies: { $size: 3 } }).sort({ _id: 1 });
      db.test.find({ hobbies: { $exists: true } }).sort({ _id: 1 });
      db.test.find({ age: { $in: [19, 23] } }).sort({ _id: 1 });
      db.test.find({ age: { $nin: [20] } }).sort({ _id: 1 });
      db.test.find({ age: { $mod: [9, 2] } }).sort({ _id: 1 });
    "
    #********* End *********#
    

    第三关 高级查询(二)

    mongoimport -d mydb3 -c test --type json --file /home/example/person.json
    #********* Begin *********#
    echo "
    db.test.find({$and:[{age:20},{sex:'男'}]}).sort({_id:1});
    db.test.find({$or:[{age:20},{sex:'男'}]}).sort({_id:1});
    db.test.find({name:/^韩./}).sort({_id:1});
    db.test.find({$and:[{age:{$gte:19}},{age:{$lt:22}}]}).sort({_id:1});
    db.test.find({$or:[{age:{$lt:19}},{age:{$gt:21}}]}).sort({_id:1});
    db.test.find({name:{$not:/^韩./}}).sort({_id:1});
    db.test.find({name:{$not:/^韩.*/}}).sort({_id:1}).count();
    db.test.find({$and:[{age:{$gte:19}},{age:{$lt:22}}]}).sort({_id:1}).count();
    "
    #********* End *********#
    

    第四关 游标

    use mydb4
    for(var i=0;i<10000;i++)db.test.insert({_id:i,title:"MongoDB"+i,content:"hello"+i})
    mongoexport -d mydb4 -c test -o /home/test/test4.csv --type csv -f "_id,title,content"
    

    第四章 MongoDB分布式集群

    4-1 Mongodb复制集&分片

    第一关 ACD ABD

    命令行参数二关 MongoDB 复制集搭建

    mkdir -p /data/test/db1 /data/test/db2 /data/test/db3
    mkdir -p /logs/test
    touch { /logs/test/mongod1.log /logs/test/mongod2.log /logs/test/mongod3.log }
    mkdir -p /etc/test
    touch { /etc/test/mongod1.conf /etc/test/mongod2.conf /etc/test/mongod3.conf }
    # 创建三个配置文件
    port=20001 #配置端口号
    dbpath=/data/test/db1 #配置数据存放的位置
    logpath=/logs/test/mongod1.log #配置日志存放的位置
    logappend=true #日志使用追加的方式
    fork=true #设置在后台运行
    replSet=CHANG #配置复制集名称,该名称要在所有的服务器一致
    mongod -f /etc/test/mongod1.conf
    mongod -f /etc/test/mongod2.conf
    mongod -f /etc/test/mongod3.conf
    config = {
      _id:"CHANG",
      members:[
          {_id:0,host:'127.0.0.1:20001'},
          {_id:1,host:'127.0.0.1:20002',arbiterOnly:true},
          {_id:2,host:'127.0.0.1:20003'},
      ]
    }
    rs.initiate(config)
    

    头歌-Mongo入门

    第三关 MongoDB分片集搭建

    mkdir -p /data/test2/shard1/db
    mkdir -p /logs/test2/shard1/log
    mkdir -p /data/test2/shard2/db
    mkdir -p /logs/test2/shard2/log
    mkdir -p /data/test2/shard3/db
    mkdir -p /logs/test2/shard3/log
    mkdir -p /data/test2/config/db
    mkdir -p /logs/test2/config/log
    mkdir -p /logs/test2/mongs/log
    mkdir -p /etc/test2
    root@evassh-6088960:/etc/test2# cat mongod1.conf mongod2.conf mongod3.conf 
    # mongod1.conf
    dbpath=/data/test2/shard1/db
    logpath=/logs/test2/shard1/log/mongodb.log
    port=21001
    shardsvr=true
    fork=true
    # mongod2.conf
    dbpath=/data/test2/shard2/db
    logpath=/logs/test2/shard2/log/mongodb.log
    port=21002
    shardsvr=true
    fork=true
    # mongod3.conf
    dbpath=/data/test2/shard3/db
    logpath=/logs/test2/shard3/log/mongodb.log
    port=21003
    shardsvr=true
    fork=true
    # 启动mongo
    mongod -f /etc/mongo/mongod1.conf
    mongod -f /etc/mongo/mongod2.conf
    mongod -f /etc/mongo/mongod3.conf
    # 配置config
     mongod --dbpath /data/test2/config/db --logpath /logs/test2/config/log/mongodb.log --port 21004 --configsvr --replSet cs --fork
    # 链接21004
    mongo localhost:21004
    use admin
    cfg = {
      _id:'cs',
      configsvr:true,
      members:[
          {_id:0,host:'localhost:21004'}
       ]
    }
    rs.initiate(cfg)
    # 配置route
    mongos --configdb cs/localhost:21004 --logpath /logs/test2/mongs/log/mongodb.log --port 21005 --fork
    # 连接 21005
    mongo localhost:21005
    sh.addShard('localhost:21001')
    sh.addShard('localhost:21002')
    sh.addShard('localhost:21003')
    

    第五章 数据备份和恢复

    第一关 数据备份

    # 命令行
    mongoimport -d test1 -c person --type json --file /home/example/person.json
    mongoimport -d test2 -c student --type csv --headerline --ignoreBlanks --file /home/example/student.csv
    # 将所有数据库被分到/opt/mongodb
    mongodump -h 127.0.0.1:27017 -o /opt/mongodb
    # 将 test1 数据库备份到 /opt/mongodb_1 目录下;
    mongodump -h 127.0.0.1:27017 -d test1 -o /opt/mongodb_1
    # 将 person 集合备份到 /opt/collection_1 目录下;
    mongodump -h 127.0.0.1:27017   -d test1 -c person -o /opt/collection_1 
    # 将 student 集合压缩备份到 /opt/collection_2 目录下;
    mongodump -h 127.0.0.1:27017  -d test2 -c student -o /opt/collection_2 --gzip 
    # 将 test2 数据库压缩备份到 /opt/mongodb_2 目录下。
    mongodump -h 127.0.0.1:27017  -d test2 -o /opt/mongodb_2 --gzip
    

    第二关 数据恢复

    # 将 /opt/mongodb 目录下的数据恢复到 MongoDB 中;
    mongorestore -h 127.0.0.1:27017  /opt/mongodb
    # 将 /opt/mongodb_1 目录下的数据恢复到 mytest1 数据库中;
    mongorestore -h 127.0.0.1:27017  -d mytest1 --drop  /opt/mongodb_1/test1/
    # 将 /opt/collection_1 目录下的数据恢复到 mytest2 数据库的 person 集合中;
    mongorestore -h 127.0.0.1:27017  -d mytest2 -c person --drop /opt/collection_1/test1/person.bson
    # 将 /opt/collection_2 目录下的数据恢复到 mytest3 数据库的 student 集合中,并删除之前备份的表;
    mongorestore -h 127.0.0.1:27017  -d mytest3  --drop -c student --gzip /opt/collection_2/test2/student.bson.gz
    # 将 /opt/mongodb_2 目录下的数据恢复到 mytest4 的数据库中,并删除之前的备份的数据库。
    mongorestore -h 127.0.0.1:27017  -d mytest4  --drop -c student --gzip /opt/mongodb_2/test2/student.bson.gz
    

    第六章

    第一关 优化查询原则

    CD服务器ADACABDBCDABCDCDAD

    第二关 MongoDB 的 Profiling 工具(一)

    头歌-Mongo入门

    第三关 MongoDB 的 Profilin命令行快捷键g 工具(二)

    use mydb3
    db.setProfilingLevel(1,5)
    for(var i=0;i<100000;i++)db.items1.insert({_id:i,text:"Hello MongoDB"+i})
    for(var i=0;i<100000;i++)db.items2.insert({_id:i,text:"Hello MongoDB"+i})
    

    第七章

    第一关 Java 操命令行快捷键作 MongoDB 数据库(一)

    package step1;
    import java.util.function.Consumer;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import java.util.ArrayList;
    import java.util.List;
    import org.bson.Document;
    import com.mongodb.MongoClient;
    import com.mongodb.client.MongoCollection;
    import com.mongodb.client.MongoDatabase;
    import com.mongodb.client.FindIterable;
    import com.mongodb.Block;
    public class Mongoconnect{
        public static void main( String args[] ){
            Logger log = Logger.getLogger("org.mongodb.driver");
            log.setLevel(Level.OFF);          //屏蔽带时间的输出
            try{
                //在下面补充代码,连接到mongodb服务
                /********* Begin *********/
                MongoClient mongoClient = new MongoClient("localhost",27017);     //启动本地服务,端口号为27020
                MongoDatabase mongoDatabase = mongoClient.getDatabase("databaseName");     //连接名为databaseName数据库
                /********* End *********/
                //在下面补充代码,创建集合test1
                /********* Begin *********/
                mongoDatabase.createCollection("test1");     //创建集合test【如果存在将这一行内容注释】
                /********* End *********/
                //在下面补充代码,获取集合test1
                /********* Begin *********/
                MongoCollection<Document> collection = mongoDatabase.getCollection("test1"); 
                /********* End *********/
                //在下面补充代码,插入编程要求中的数据到集合test1
                /********* Begin *********/
                Document document1 = new Document();     //创建一条文档 document1,以下代码为向文档 document1 中追加数据
                document1.append("_id", "1");
                document1.append("name", "Xiaoming");
                document1.append("sex", "man");
                document1.append("age", 21);
                List<Document> documents = new ArrayList<Document>();     //将以上文档打包存放,为文档插入做准备
                documents.add(document1);
                collection.insertMany(documents);     //插入多条文档到集合中
                /********* End *********/
                //在Begin和End之间补充代码,请勿修改代码的原本框架
                FindIterable<Document> iter = collection.find();
                iter.forEach(new Consumer<Document>() {
                    @Override
                    public void accept(Document document) {
                        System.out.println(document.toJson());
                    }
                });
                Document doc = collection.find().first();
                collection.deleteOne(doc);
            }catch (Exception e) {
                System.err.println( e.getClass().getName() + ": " + e.getMessage() );
            }
        }
    }}
    

    第二关 Java服务器怎么搭建 操作 MongoDB 数据库(二)

    package step2;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.function.Consumer;
    import org.bson.Document;
    import com.mongodb.MongoClient;
    import com.mongodb.client.MongoCollection;
    import com.mongodb.client.MongoDatabase;
    import com.mongodb.client.FindIterable;
    import com.mongodb.Block;  
    import com.mongodb.client.model.Filters;
    import com.mongodb.client.MongoCursor;
    public class Mongo{
        public static void main( String args[] ){
            Logger log = Logger.getLogger("org.mongodb.driver");  
            log.setLevel(Level.OFF);          //屏蔽带时间的输出
            try{ 
                //仿照第一关,连接数据库mydb2并选择集合test2
                /********* Begin *********/ 
                MongoClient mongoClient = new MongoClient("localhost",27017);     //启动本地服务,端口号为27017
                MongoDatabase mongoDatabase = mongoClient.getDatabase("mydb2");     //连接名为mydb2数据库
                MongoCollection<Document> collection = mongoDatabase.getCollection("test2"); 
                /********* End *********/
                //在下面补充代码,插入文档到集合test2中
                /********* Begin *********/ 
                Document document1 = new Document();      
                document1.append("_id", "1");
                document1.append("name", "Xiaoming");
                document1.append("sex", "man");
                document1.append("age", 21);
                Document document2 = new Document();      
                document2.append("_id", "2");
                document2.append("name", "Xiaohong");
                document2.append("sex", "woman");
                document2.append("age", 20);
                Document document3 = new Document();      
                document3.append("_id", "3");
                document3.append("name", "Xiaoliang");
                document3.append("sex", "man");
                document3.append("age", 22);
                List<Document> documents = new ArrayList<Document>();     //将以上文档打包存放,为文档插入做准备
                documents.add(document1);
                documents.add(document2);
                documents.add(document3);
                collection.insertMany(documents);     //插入多条文档到集合中
                /********* End *********/
                //在Begin和End之间补充代码,请勿修改代码的原本框架
                FindIterable<Document> iter = collection.find();
                System.out.println("文档插入结果如下:");
                iter.forEach(new Block<Document>() {
                  public void apply(Document _doc) {
                    System.out.println(_doc.toJson());
                  }
                });
                //在下面补充代码,更新 Xiaohong 的信息为23岁
                /********* Begin *********/ 
                collection.updateMany(Filters.eq("name", "Xiaohong"), new Document("$set",new Document("age",23)));
                /********* End *********/
                //在Begin和End之间补充代码,请勿修改代码的原本框架
                FindIterable<Document> findIterable = collection.find();  
                MongoCursor<Document> mongoCursor = findIterable.iterator(); 
                System.out.println("更新后文档内容如下:");
                while(mongoCursor.hasNext()){  
                System.out.println(mongoCursor.next());  
                };
                //在下面补充代码,删除Xiaoliang的信息
                /********* Begin *********/ 
                collection.deleteOne(Filters.eq("name", "Xiaoliang"));
                /********* End *********/ 
                //在Begin和End之间补充代码,请勿修改代码的原本框架
                FindIterable<Document> iter1 = collection.find();
                System.out.println("删除信息后的文档内容为:");
                iter1.forEach(new Consumer<Document>() {
                    @Override
                    public void accept(Document document) {
                        System.out.println(document.toJson());
                    }
                });
                collection.drop();
            }catch (Exception e) {
                System.err.println( e.getClass().getName() + ": " + e.getMessage() );
            }
        }
    }
    
  • 赶快把常用的代码都做成代码片段snippets吧,它真的很香!

    赶快把常用的代码都做成代码片段snippets吧,它真的很香!

    一、什么是代码片段?

    (更多…)