精华内容
参与话题
问答
  • viewer.js插件的使用

    万次阅读 2017-04-13 20:41:26
    Viewer.js JavaScript image viewer. Homepage Viewer as jQuery plugin Table of contents Features Main Getting started Keyboard support Options Methods Events No conflict Browser support C...

    Viewer.js

    JavaScript image viewer.

    Table of contents

    Features

    • Supports options
    • Supports methods
    • Supports events
    • Supports touch
    • Supports move
    • Supports zoom
    • Supports rotation
    • Supports scale (flip)
    • Supports keyboard
    • Cross-browser support

    Main

    dist/
    ├── viewer.css     ( 8 KB)
    ├── viewer.min.css ( 7 KB)
    ├── viewer.js      (60 KB)
    └── viewer.min.js  (22 KB)

    Getting started

    Quick start

    Four quick start options are available:

    • Download the latest release.
    • Clone the repository: git clone https://github.com/fengyuanchen/viewerjs.git.
    • Install with NPMnpm install viewerjs.
    • Install with Bowerbower install fengyuanchen/viewerjs.

    Installation

    Include files:

    <link  href="/path/to/viewer.css" rel="stylesheet">
    <script src="/path/to/viewer.js"></script>

    Usage

    Initialize with Viewer constructor:

    • Browser: window.Viewer
    • CommonJS: var Viewer = require('viewer')
    • NodeJS: var Viewer = require('viewerjs')(window)
    <!-- a block container is required -->
    <div>
      <img id="image" src="picture.jpg" alt="Picture">
    </div>
    
    <div>
      <ul id="images">
        <li><img src="picture.jpg" alt="Picture"></li>
        <li><img src="picture-2.jpg" alt="Picture 2"></li>
        <li><img src="picture-3.jpg" alt="Picture 3"></li>
      </ul>
    </div>
    // View one image
    var viewer = new Viewer(document.getElementById('image'), options);
    
    // View some images
    var viewer = new Viewer(document.getElementById('images'), options);

    Keyboard support

    Only available in modal mode.

    • Esc: Exit full screen or stop play.
    • Space: Stop play.
    • : View the previous image.
    • : View the next image.
    • : Zoom in the image.
    • : Zoom out the image.
    • Ctrl + 0: Zoom out to initial size.
    • Ctrl + 1: Zoom in to natural size.

    ⬆ back to top

    Options

    You may set viewer options with new Viewer(image, options). If you want to change the global default options, You may use Viewer.setDefaults(options).

    inline

    • Type: Boolean
    • Default: false

    Enable inline mode.

    button

    • Type: Boolean
    • Default: true

    Show the button on the top-right of the viewer.

    navbar

    • Type: Boolean or Number
    • Default: true
    • Options:
      • 0 or false: hide the navbar
      • 1 or true: show the navbar
      • 2: show the navbar only when screen width great then 768 pixels
      • 3: show the navbar only when screen width great then 992 pixels
      • 4: show the navbar only when screen width great then 1200 pixels

    Specify the visibility of the navbar.

    title

    • Type: Boolean or Number
    • Default: true
    • Options:
      • 0 or false: hide the title
      • 1 or true: show the title
      • 2: show the title only when screen width great then 768 pixels
      • 3: show the title only when screen width great then 992 pixels
      • 4: show the title only when screen width great then 1200 pixels

    Specify the visibility of the title (the current image's name and dimensions).

    The name comes from the alt attribute of an image element or the image name parsed from URL.

    toolbar

    • Type: Boolean or Number
    • Default: true
    • Options:
      • 0 or false: hide the toolbar
      • 1 or true: show the toolbar
      • 2: show the toolbar only when screen width great then 768 pixels
      • 3: show the toolbar only when screen width great then 992 pixels
      • 4: show the toolbar only when screen width great then 1200 pixels

    Specify the visibility of the toolbar.

    tooltip

    • Type: Boolean
    • Default: true

    Show the tooltip with image ratio (percentage) when zoom in or zoom out

    movable

    • Type: Boolean
    • Default: true

    Enable to move the image.

    zoomable

    • Type: Boolean
    • Default: true

    Enable to zoom the image.

    rotatable

    • Type: Boolean
    • Default: true

    Enable to rotate the image.

    scalable

    • Type: Boolean
    • Default: true

    Enable to scale the image.

    transition

    • Type: Boolean
    • Default: true

    Enable CSS3 Transition for some special elements.

    fullscreen

    • Type: Boolean
    • Default: true

    Enable to request full screen when play.

    Requires the browser supports Full Screen API.

    keyboard

    • Type: Boolean
    • Default: true

    Enable keyboard support.

    interval

    • Type: Number
    • Default: 5000

    Define interval of each image when playing.

    zoomRatio

    • Type: Number
    • Default: 0.1

    Define the ratio when zoom the image by wheeling mouse.

    minZoomRatio

    • Type: Number
    • Default: 0.01

    Define the min ratio of the image when zoom out.

    maxZoomRatio

    • Type: Number
    • Default: 100

    Define the max ratio of the image when zoom in.

    zIndex

    • Type: Number
    • Default: 2015

    Define the CSS z-index value of viewer in modal mode.

    zIndexInline

    • Type: Number
    • Default: 0

    Define the CSS z-index value of viewer in inline mode.

    url

    • Type: String or Function
    • Default: 'src'

    Define where to get the original image URL for viewing.

    If it is a string, it should be one of the attributes of each image element. If it is a function, it will be called on each image and should return a valid image URL.

    build

    • Type: Function
    • Default: null

    A shortcut of the "build" event.

    built

    • Type: Function
    • Default: null

    A shortcut of the "built" event.

    show

    • Type: Function
    • Default: null

    A shortcut of the "show" event.

    shown

    • Type: Function
    • Default: null

    A shortcut of the "shown" event.

    hide

    • Type: Function
    • Default: null

    A shortcut of the "hide" event.

    hidden

    • Type: Function
    • Default: null

    A shortcut of the "hidden" event.

    view

    • Type: Function
    • Default: null

    A shortcut of the "view" event.

    viewed

    • Type: Function
    • Default: null

    A shortcut of the "viewed" event.

    ⬆ back to top

    Methods

    All methods allow chain composition.

    As there are some asynchronous processes when start the viewer, you should call a method only when it is available, see the following lifecycle:

    new Viewer(image, {
      built: function () {
        // 2 methods are available here: "show" and "destroy".
      },
      shown: function () {
        // 9 methods are available here: "hide", "view", "prev", "next", "play", "stop", "full", "exit" and "destroy".
      },
      viewed: function () {
        // All methods are available here except "show".
        this.viewer.zoomTo(1).rotateTo(180);
      }
    });

    show()

    Show the viewer.

    Only available in modal mode.

    hide()

    hide the viewer.

    Only available in modal mode.

    view([index])

    • index (optional):
      • Type: Number
      • Default: 0
      • The index of the image for viewing

    View one of the images with image's index.

    viewer.view(1); // View the second image

    prev()

    View the previous image.

    next()

    View the next image.

    move(offsetX[, offsetY])

    • offsetX:

      • Type: Number
      • Moving size (px) in the horizontal direction
    • offsetY (optional):

      • Type: Number
      • Moving size (px) in the vertical direction.
      • If not present, its default value is offsetX

    Move the image with relative offsets.

    viewer.move(1);
    viewer.move(-1, 0); // Move left
    viewer.move(1, 0);  // Move right
    viewer.move(0, -1); // Move up
    viewer.move(0, 1);  // Move down

    moveTo(x[, y])

    • x:

      • Type: Number
      • The left value of the image
    • y (optional):

      • Type: Number
      • The top value of the image
      • If not present, its default value is x.

    Move the image to an absolute point.

    zoom(ratio[, hasTooltip])

    • ratio:

      • Type: Number
      • Zoom in: requires a positive number (ratio > 0)
      • Zoom out: requires a negative number (ratio < 0)
    • hasTooltip (optional):

      • Type: Boolean
      • Default: false
      • Show tooltip

    Zoom the image with a relative ratio

    viewer.zoom(0.1);
    viewer.zoom(-0.1);

    zoomTo(ratio[, hasTooltip])

    • ratio:

      • Type: Number
      • Requires a positive number (ratio > 0)
    • hasTooltip (optional):

      • Type: Boolean
      • Default: false
      • Show tooltip

    Zoom the image to an absolute ratio.

    viewer.zoomTo(0); // Zoom to zero size (0%)
    viewer.zoomTo(1); // Zoom to natural size (100%)

    rotate(degree)

    • degree:
      • Type: Number
      • Rotate right: requires a positive number (degree > 0)
      • Rotate left: requires a negative number (degree < 0)

    Rotate the image with a relative degree.

    viewer.rotate(90);
    viewer.rotate(-90);

    rotateTo(degree)

    • degree:
      • Type: Number

    Rotate the image to an absolute degree.

    viewer.rotateTo(0); // Reset to zero degree
    viewer.rotateTo(360); // Rotate a full round

    scale(scaleX[, scaleY])

    • scaleX:

      • Type: Number
      • Default: 1
      • The scaling factor to apply on the abscissa of the image
      • When equal to 1 it does nothing.
    • scaleY (optional):

      • Type: Number
      • The scaling factor to apply on the ordinate of the image
      • If not present, its default value is scaleX.

    Scale the image.

    viewer.scale(-1); // Flip both horizontal and vertical
    viewer.scale(-1, 1); // Flip horizontal
    viewer.scale(1, -1); // Flip vertical

    scaleX(scaleX)

    • scaleX:
      • Type: Number
      • Default: 1
      • The scaling factor to apply on the abscissa of the image
      • When equal to 1 it does nothing

    Scale the abscissa of the image.

    viewer.scaleX(-1); // Flip horizontal

    scaleY(scaleY)

    • scaleY:
      • Type: Number
      • Default: 1
      • The scaling factor to apply on the ordinate of the image
      • When equal to 1 it does nothing

    Scale the ordinate of the image.

    viewer.scaleY(-1); // Flip vertical

    play()

    Play the images.

    stop()

    Stop play.

    full()

    Enter modal mode.

    Only available in inline mode.

    exit()

    Exit modal mode.

    Only available in inline mode.

    tooltip()

    Show the current ratio of the image with percentage.

    Requires the tooltip option set to true.

    toggle()

    Toggle the image size between its natural size and initial size.

    reset()

    Reset the image to its initial state.

    destroy()

    Destroy the viewer and remove the instance.

    ⬆ back to top

    Events

    All events can access the viewer instance with this.viewer in its handler.

    var viewer = new Viewer(image, {
      viewed: function () {
        console.log(this.viewer === viewer);
        // > true
      }
    });

    build

    This event fires when a viewer instance starts to build.

    built

    This event fires when a viewer instance has built.

    show

    This event fires when the viewer modal starts to show.

    Only available in modal mode.

    shown

    This event fires when the viewer modal has shown.

    Only available in modal mode.

    hide

    This event fires when the viewer modal starts to hide.

    Only available in modal mode.

    hidden

    This event fires when the viewer modal has hidden.

    Only available in modal mode.

    view

    This event fires when a viewer starts to show (view) an image.

    viewed

    This event fires when a viewer has shown (viewed) an image.

    ⬆ back to top

    No conflict

    If you have to use other viewer with the same namespace, just call the Viewer.noConflictstatic method to revert to it.

    <script src="other-viewer.js"></script>
    <script src="viewer.js"></script>
    <script>
      Viewer.noConflict();
      // Code that uses other `Viewer` can follow here.
    </script>
    展开全文
  • Viewer.js的简单使用

    万次阅读 2018-10-18 18:14:29
    前台页面要求图片的查看,是在表格中点击查看才弹出图片,网上发现用Viewer插件的挺多,就选用的这款插件,但是Viewer插件会产生缩略图,这里取巧了,将缩略图统一替换成了一个带有查看两字的小图片,这样就解决了...

    前台页面要求图片的查看,是在表格中点击查看才弹出图片,网上发现用Viewer插件的挺多,就选用的这款插件,但是Viewer插件会产生缩略图,这里取巧了,将缩略图统一替换成了一个带有查看两字的小图片,这样就解决了表格中方缩略图空间不足的问题。

    下载地址:http://www.jqhtml.com/6750.html

    引用

    <link rel="stylesheet" type="text/css" href="/plugins/viewer/css/viewer.min.css">
    <script type="text/javascript" charset="utf-8" src="/plugins/viewer/js/viewer.min.js"></script>

    我这里引用的是js版的,没有使用jquery版本的,刚开始也是用的jquery版的,出现了一些bug,在重新请求的时候页面刷新而导致点开查看的时候总是显示的是空白,换成js版的,在重新加载的时候清空下viewer就好使了,大家可以多看看上面的几个index的示例。

    js代码

    /**
     * 获取文件的图片
     * @param uuid
     */
    var viewer;
    var flag = false;
    function getZFilePic(uuid) {
        $("#zPic").html("");
        $.ajax({
            url: "",
            type: "POST",
            data: {uuid: uuid},
            dataType: "json",
            success: function (data) {
                let status = data.status;
                if (status == 1) {
                    let result = data.result;
                    let html = "";
                    for (let i = 0; i < result.length; i++) {
                        //这里是一段拼接页面的代码 省略了一部分
                       html+="<td><img data-original='****/****.do?uuid=" + result[i].id + "' src='static/ace/images/open.png' alt='查看'></td>";
                    }
                    $("#zPic").html(html);
                    if (result.length > 0) {
                        if (flag) {
    //这里做了一个开关,当已经加载过一次的时候,进行第二次加载时,把第一次的销毁掉,不然会出一些莫名其妙的问题
                            viewer.destroy();
                        }
                        viewer = new Viewer(document.getElementById('zPic'), {
                            url: 'data-original',
                            navbar: false//点开查看的时候不显示缩略图
                        });
                        flag = true;
                    }
                } else {
                    alert(data.message);
                }
    
            }
        });
    }

     主要页面代码

    <td><img data-original='****/****.do?uuid=" + result[i].id + "' src='static/ace/images/open.png' alt='查看'></td>

    data-original这里主要是我们要查看的图片的下载地址或者路径,都可以

    src是img标签取巧的时候显示的查看的小图片路径

    页面效果

     查看图片效果(去掉了查看时候下方的缩略图)

     最终的结果还是可以的,我这前台写的比较渣一些,多多见谅吧。

    展开全文
  • jq viewer 用法

    2019-07-22 16:49:59
    js和css 下载地址:百度网盘链接:...提取码:vpmn 复制这段内容后打开百度网盘手机App,操作更方便哦 基本:引进js css 我使用的是: jquery 版本 代码示例: <... <div class="tp...

    js和css 下载地址:百度网盘链接:https://pan.baidu.com/s/1uigA0EVOLptxHOl38O567A
    提取码:vpmn
    复制这段内容后打开百度网盘手机App,操作更方便哦
    基本:引进js css
    在这里插入图片描述
    我使用的是: jquery 版本
    代码示例:

      <div id="jqhtml" class="imgDiv">
    	   <div class="tpSHow" dat1a-original="${GLOB_HOME}/filedbserver/imgfl/5af02fed-9a94-47f4-93d0-66293e79dbce">
    	   <img style="width:100%;height:100%;" " src="${GLOB_HOME}/filedbserver/imgfl/5af02fed-9a94-47f4-93d0-66293e79dbce">
    	   </div> 
    	 </div>
    

    js代码:使用id创建view对象

    $(document).ready(function(){
    	reloadWiewer();
    });
    var VIEW;
    function reloadWiewer(){
    	VIEW= $('#jqhtml').viewer({
    			 url:    'dat1a-original',
    		});
    }
    

    动态加载:需要杀死初始化的或者更新 ,对象.viewer(‘关键字’) 它内置属性 函数等;例如:show,viewd,update,具体可查看一下源码
    在这里插入图片描述

     var imghtml='<div class="tpSHow" dat1a-original="${GLOB_HOME}/filedbserver/imgfl/'+pid+'">'
                		 +'<img style="width:100%;height:100%;" " src="${GLOB_HOME}/filedbserver/imgfl/'+pid+'">'
                		 +'</div> ';
                	 $("#jqhtml").append(imghtml);
                	 //这里更新 viewer
                	 VIEW.viewer('update')
    

    viewer.js将标签下的所有元素扩展了viewer()方法,可以通过传入配置参数的方式来进行配置;支持的配置项:

    名称 类型 默认值 说明
    inline 布尔值 false 启用 inline 模式
    button 布尔值 true 显示右上角关闭按钮(jQuery 版本无效)
    navbar 布尔值/整型 true 显示缩略图导航
    title 布尔值/整型 true 显示当前图片的标题(现实 alt 属性及图片尺寸)
    toolbar 布尔值/整型 true 显示工具栏
    tooltip 布尔值 true 显示缩放百分比
    movable 布尔值 true 图片是否可移动
    zoomable 布尔值 true 图片是否可缩放
    rotatable 布尔值 true 图片是否可旋转
    scalable 布尔值 true 图片是否可翻转
    transition 布尔值 true 使用 CSS3 过度
    fullscreen 布尔值 true 播放时是否全屏
    keyboard 布尔值 true 是否支持键盘
    interval 整型 5000 播放间隔,单位为毫秒
    zoomRatio 浮点型 0.1 鼠标滚动时的缩放比例
    minZoomRatio 浮点型 0.01 最小缩放比例
    maxZoomRatio 数字 100 最大缩放比例
    zIndex 数字 2015 设置图片查看器 modal 模式时的 z-index
    zIndexInline 数字 0 设置图片查看器 inline 模式时的 z-index
    url 字符串/函数 src 设置大图片的 url
    build 函数 null 回调函数,具体查看演示
    built 函数 null 回调函数,具体查看演示
    show 函数 null 回调函数,具体查看演示
    shown 函数 null 回调函数,具体查看演示
    hide 函数 null 回调函数,具体查看演示
    hidden 函数 null 回调函数,具体查看演示
    view 函数 null 回调函数,具体查看演示

    展开全文
  • viewerjs使用及问题解决方法

    千次阅读 2019-07-09 10:42:18
    1.多次点击时图片不显示,只有遮挡框,或者是点击多次后,会形成多个遮挡框。 <el-form-item label="图片" prop="imgUrl" v-if="fileList!=null && fileList.length!=0">...img...

    1.多次点击时图片不显示,只有遮挡框,或者是点击多次后,会形成多个遮挡框。

      <el-form-item label="图片" prop="imgUrl" v-if="fileList!=null && fileList.length!=0">
                <div id="imageUrls">
                  <img v-for="(item,index) in fileList" :src="item" :key="index" height="100"/>
                </div>
              </el-form-item>

    增加v-if判断,该情况消失。看网上有说 调用一下.destroy()方法,但是我调用了没管用。

    v-if="fileList!=null && fileList.length!=0"

    2.点击后,图片显示在dialog框后面。

    这是由于图层显示问题,官网文档显示默认值是2015,手动设置一下。

          /**
           *@description 初始化viewer插件
           */
          initImageTools() {
            //初始化 viewerjs
            //  new Viewer(document.getElementById('imageUrls')).destroy();
            const ViewerDom = document.getElementById('imageUrls');
            new Viewer(ViewerDom, {
              // 相关配置项,详情见下面
              zIndex: 3018,
            });
            const viewer = new Viewer(ViewerDom, {url: "src"});
          },

    增加  zIndex: 3018配置,其余全部是默认的。根据自己的项目去配置

     

    具体相关代码:

       <el-dialog title="预览" @close="closeDialogSource"
                     :visible.sync="dialogVisibleSourceImg" :close-on-click-modal="modalVisible">
            <div style="text-align: center" v-if="sourceMediaImgUrl!=null && sourceMediaImgUrl.length!=0">
              <div id="imageUrlsCourseSource"><img :src="sourceMediaImgUrl" height="200"></div>
            </div>
          </el-dialog>
      //图片预览
      import 'viewerjs/dist/viewer.css'
      import Viewer from 'viewerjs'
      /**
           *@description 素材预览
           */
          viewSource(row) {
            let _this = this;        
              //图片
              _this.sourceMediaImgUrl = row.mediaUrl;
              _this.dialogVisibleSourceImg = true;
              this.$nextTick(() => {
                //重点:要在图片已经请求到再调用!!
                _this.initImageTools();
              })    
          },
       /**
           *@description 初始化viewer插件
           */
          initImageTools() {
            //初始化 viewerjs
            const ViewerDom = document.getElementById('imageUrlsCourseSource');
            new Viewer(ViewerDom, {
              // 相关配置项,详情见下面
              zIndex: 3018,
            });
            const viewer = new Viewer(ViewerDom, {url: "src"});
          },

     

    展开全文
  • viewerlite

    2018-11-18 19:42:15
    用于查看分子图形的软件,适合化学,生物学,生物信息学的学生,查看分子图形。
  • TeamViewer 软件 - 彻底卸载 (Windows)

    万次阅读 2019-04-26 16:39:05
    TeamViewer 软件- 彻底卸载 (Windows) 1. 免费版仅供个人使用。您的会话将在 5 分钟后终止。 2. Close TeamViewer by locating the TeamViewer icon in the system tray, right click and Exit TeamViewer. ...
  • Viewer.js-图片预览Demo

    2018-03-09 10:46:56
    Viewer.js-图片预览Demo,一款强大的 jQuery 图像浏览插件。
  • 基于js的viewer.js 强大的图片查看,各种姿势,基于js的viewer.js 强大的图片查看
  • Viewer.js的使用

    万次阅读 热门讨论 2018-09-29 13:07:13
    viewer.js GitHub地址:https://github.com/fengyuanchen/viewerjs https://github.com/fengyuanchen/viewer 两个版本的使用方式不完全相同; 尽管作者已经将使用方法都列出了...
  • Teamviewer13版的安装及使用教程

    千次阅读 2019-04-19 11:44:00
    Teamviewer官方个人版下载地址:https://www.teamviewer.com/cn/c 1.从网站下载下来之后,是这样的一个安装程序,如下图:
  • Vue 中使用图片查看器 v-viewer

    千次阅读 2019-10-15 10:28:34
    基于 viewer.js 插件,用于 Vue 的图像查看器组件 官网地址:https://mirari.cc/v-viewer/ 下载安装 通过 npm 安装: npm install v-viewer GitHub 下载地址:https://github.com/mirari/v-viewer UMD ...
  • 1.第一种方法:使用geometry参数进行调整 vncserver -geometry 1280x1024即可,之后通过window下vnc连接后的ubuntu分辨率即为1280x1024了,注意这里的X是小写的x而不是* 2.第二种方法:修改配置文件vncservers ...
  • android自动化新人一个,目前研究PC端获取... adroid的目录tools下有2个自带的工具hierarchyviewer和uiautomatorviewer,打开后,如下所示:          分别来介绍它们怎么使用的:    UiAutoMatorViewer
  • jsonviewer(汉化中文版)

    千次下载 热门讨论 2013-09-02 12:33:58
    JSON Viewer是一款方便易用的Json格式查看器。Json格式的数据阅读性很差,如果数据量大的话再阅读方面会十分困难,有了这软件,问题就解决了,能够快速把Json字符串排列规则的树结构,支持对JSON字符串进行格式化...
  • harviewer-2.0.16.zip

    热门讨论 2015-02-08 20:46:59
    最新的harviewer,用来分析chrome生成的*.har文件。 用法: 1. 打开index.php和preview.php,将代码:("ga.php") ?> 删掉。 2. 重命名index.php为index.htm,preview.php为preview.htm 3. 用浏览器打开index.htm...
  • BIRT Viewer 参数设置详解

    千次阅读 2010-07-02 11:36:00
    <br />BIRT作为...在大家使用BIRT Viewer的时候,可能会对它日益纷繁的参数设置如云里雾里,在网上论坛里也有很多人碰到这样哪样的问题,同时官方的文档也不细致不全。所以我就对这些参数进行了一个简单系统的总
  • 【原文:https://segmentfault.com/a/1190000006685118】可视化:一目了然如题所示,可视化的重要性不必多说。在点云数据预处理中,要想知道点云的形状需要可视化; 要想了解精简/去噪/简化/压缩 的结果需要可视化;...
  • actionscript viewer 汉化破解版

    热门讨论 2013-07-04 10:53:46
    actionscript viewer 汉化破解版
  • Dicom Viewer——Philips Dicom Viewer

    万次阅读 2014-09-17 00:14:15
    前言: 正如前述文章中提到的,DICOM(Digitial Image Communications in Medicine)是所有从事医学影像处理的工作者需要了解的最基本的图像格式。 假设一个患者到医院就诊,为了判断他的病灶,医生需要指定不同的...
  • MingW编译virt-viewer

    千次阅读 热门讨论 2013-08-31 18:12:43
    在http://www.spice-space.org/download.html可以下载到windows版本的virt viewer,virt-viewer-x86-0.5.7.msi和virt-viewer-x64-0.5.7.msi是使用MingW编译出来的,源码就是使用virt-viewer-0.5.7.tar.gz ...

空空如也

1 2 3 4 5 ... 20
收藏数 102,882
精华内容 41,152
关键字:

viewer