精华内容
参与话题
问答
  • android 漂亮的UI界面 完整的界面设计

    万次下载 热门讨论 2012-02-17 22:19:40
    声明:这也是我学习时在网上下载的,鉴于分享精神,并且觉得很不错才上传...android 漂亮的UI界面 完整的界面设计 这是一个完整的UI设计,但是没写动作,这是一个公司程序员的公司任务设计,请别商用,要用请修改。。。
  • 非常漂亮后台UI 纯静态UI界面

    千次下载 热门讨论 2013-06-03 20:18:42
    效果图:首页主界面真心觉得非常吸引人,给客户,用户体验非常舒服, 相信很多朋友一看就明白怎么回事,我要的就是这个效果,因为简单所以编程快乐!~~
  • 当处理过程比较复杂,或者耗时较长时,容易引起UI界面无响应. 比如我们执行一个复杂的运算,要随时在界面上显示它的结果.但是UI界面卡死了,不能随时看到运算的结果. 这种情况下 我们可以另开线程1,把运算的过程...

    当处理过程比较复杂,或者耗时较长时,容易引起UI界面无响应.

    比如我们执行一个复杂的运算,要随时在界面上显示它的结果.但是UI界面卡死了,不能随时看到运算的结果.


    这种情况下 我们可以另开线程1,把运算的过程放到线程1中启动,然后用委托唤醒显示语句.


    引用线程命名空间

    using System.Threading;


    //定义线程
     private Thread workerThread1 = null;
     
    
            private void button3_Click(object sender, EventArgs e)
            {
    //给线程赋值,启动
                workerThread1 = new Thread(new ThreadStart(make_number));
                workerThread1.Start();
            }
    
    //定义委托,显示函数
            private delegate void setStatusDelegate(string iteration, string error);
            private void setStatus(string a, string b)
            {
                this.label11.Text = a.ToString();
                this.label12.Text = b.ToString();
    
              
            }
    //定义运算函数,也就是运算的过程.里面要用委托调用显示函数.
            private void make_number()
            { 
             int a=0;
             int b=0;
            for(int i=0;i<100;i++)
    {
    //用委托调用函数
              this.Invoke(new setStatusDelegate(setStatus), a.ToString(), b.ToString());
     a++;
    b=b+2;
                 
     }
    
    }
     



    为什么要用委托,而不是直接在make_number函数里 写

    this.label1.text=a.tostring();

    this.label2.text=b.tostring();

    因为会报错,只有form窗体的线程中才能给窗体的控件赋值,线程1不能直接赋值

    所以线程1中只是唤醒显示函数,显示函数仍是处于窗体线程中.

    展开全文
  • UI界面设计初识

    千次阅读 热门讨论 2015-03-22 11:55:20
     UI(User Interface) 简称用界面,第一次了解到UI时是高三从一些行业专业书中了 解到的,UI设计师,UI设计是一个高薪工作行业。真正有点了解UI是学习三层架构时, UI、BLL、DAL中出现了UI(用户界面)层。 一、...

                                      

                UI界面设计初识


      

      UI(User Interface) 简称用界面,第一次了解到UI时是高三从一些行业专业书中了

    解到的,UI设计师,UI设计是一个高薪工作行业。真正有点了解UI是学习三层架构时,

    UI、BLL、DAL中出现了UI(用户界面)层。                     


    一、回顾一下什么是三层架构?
      UI(表现层):主要是指与用户交互的界面。用于接收用户输入的数据和显示处理后用户

    需要的数据。
     
      BLL:(业务逻辑层):UI层和DAL层之间的桥梁。实现业务逻辑。业务逻辑具体包含:验

    证、计算、业务规则等等。
     
      DAL:(数据访问层):与数据库打交道。主要实现对数据的增、删、改、查。将存储在数

    据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。

    (当然这些操作都是基于UI层的。用户的需求反映给界面(UI),UI反映给BLL,BLL反

    映给DAL,DAL进行数据的操作,操作后再一一返回,直到将用户所需数据反馈给用户)

                                                    
        在三层架构中我们发现,最先展现在我们眼前就是UI层,UI的展现通过调研BLL层,

    访问DAL层最后又反馈给UI层实现操作逻辑、数据库、界面等的人机交交互!
                                                 


        UI设计好一款界面之后,都会经过让用户体验度,到拥有用户,交易成功,最后被

    分析、被使用这几个过程!
        ​  

      记得老师常常说的一句话,生活中最危险就是没有需要,包括之前的软件设计、数

    据库的设计,MBA的管理经济学中都是从需要开始,UI界面的设计也不例外,从了解用户

    的需求开始,用户是如何使用WEB的呢?   

                   





     
                ​

     比较上面的两个界面,你会发现第一个是不是很繁琐,东西内容很多,有一

    打开就像关了的感觉,事实上,好的网站好的界面就是要:让用户有一个顺利开始!
       
    例如:
       这是个什么网站——网站的标志
       这网站主页的标目是什么——网站导航
       在这个层次上我有哪些选择——本页导航
       我在导航系统的位置——“你在这里”的指示器
       我怎么搜索——搜索框



    二、UI界面设计要素
      

    总原则:为扫描设计,不为阅读设计

         

     利用习惯:我们都用惯了“百度”  “Google”等简单快捷的界面,如果你

    设计一个别具一格的很可能就会缺少用户。
     建立视觉层次
     内容格式清楚
     标志明显
             


    三、软件界面设计

      软件界面的设计开发主要包括:软件启动封面,框架设计,菜单设计,滚动条及状态
    栏设计,包装及商品化的设计五项,


    启动封面设计:高清晰度的图像,安全色,大小适中,整体设计统一和延续性,品牌标

    志、公司标志、产品商标、软件名称等等都要进行适当的选择和安排。

    框架设计:这要很好的和用户需求相结合,开发人员和用户进行共同的沟通,以设计出

    友好、独特的、符号程序开发原则的软件框架,符合视觉流程和用户使用心里框架!

    面板设计:软件面板设计要有自动缩放功能,可别小看这一点,有的软件在PC中还行,但是一到手机上就不行了。面板应该对功能区间划分清晰,和对话框、弹出框等风格进行匹配,并且尽量节省空间,切换方便!

    菜单设计:菜单设计一般有选中状态和未选中状态,左边名称,右边快捷键,如果有下

    拉菜单应该有下级箭头,不同的功能区间也应该用线条进行分割开来,这在Microsoft公

    几乎所有的软件中就相当的明显 。



    滚动条以状态栏设计:滚动条主要为了对区域性空间的固定大小中内容量的变换进行设

    计,英东游上下箭头,滚动标等.有些还有翻页标,状态栏主要是为了对软件的当前状态进

    行显示和提示.

    包装及商品化;这就类似也公司产品做好了,给产品做包装广告一样,最后的软件产品

    的包装应该考虑保护好软件产品、功能的宣传融于美观中,可以印刷部分的产品介绍,

    产品界面设计。



    四、手机界面设

      1、界面效果的整体性、一致性
      2、界面效果的个性化
      3、界面视觉元素的规范


    五、网站界面设计


      3c原则

          Concision(简洁)
             

                Coherence(一致性)
            

                       Contrast(对比度)


      醒目的标题,界面设计的标题常常采用图形来表示,但是这要求我们设计  者对图

    形的设计也要求简单清晰。
      限制字体和颜色数目
      页面上的元素都应该有明确的含义和用途,不应该有含糊!
      排版一致性。




    小结:
        听了师姐和老师的课,只是对UI设计的一个简单初步的了解、总结和研究。总的

    说就设计者要满足客户的需求,用户怎么用着舒服就界面就怎么设计,在界面布局、

    现内容、用户操作、显示效率上满足可以的喜好,做到不要让用户去思考等待,你就

    功了!


                    

            

                还请各位高手多多指点和赐教!






    展开全文
  • Spark UI界面原理

    万次阅读 2016-07-06 23:21:51
    本文以Spark-1.6.0源码为基础,分析了Spark UI界面的框架构成,及页面数据展示方法。

      当Spark程序在运行时,会提供一个Web页面查看Application运行状态信息。是否开启UI界面由参数spark.ui.enabled(默认为true)来确定。下面列出Spark UI一些相关配置参数,默认值,以及其作用。

    参数 默认值 作用描述
    spark.ui.enabled true 是否开启UI界面
    spark.ui.port 4040(顺序探查空闲端口) UI界面的访问端口号
    spark.ui.retainedJobs 1000 UI界面显示的Job个数
    spark.ui.retailedStages 1000 UI界面上显示的Stage个数
    spark.ui.timeline.tasks.maximum 1000 Stage页面显示的Tasks个数
    spark.ui.killEnabled true 是否运行页面上kill任务
    spark.ui.threadDumpsEnabled true Executors页面是否可以展示线程运行状况

      本文接下来分成两个部分,第一部分基于Spark-1.6.0的源码,结合第二部分的图片内容来描述UI界面在Spark中的实现方式。第二部分以实例展示Spark UI界面显示的内容。

    一、Spark UI界面实现方式

    1、UI组件结构

      这部分先讲UI界面的实现方式,UI界面的实例在本文最后一部分。如果对这部分中的某些概念不清楚,那么最好先把第二部分了解一下。
      从下面UI界面的实例可以看出,不同的内容以Tab的形式展现在界面上,对应每一个Tab在下方显示具体内容。基本上Spark UI界面也是按这个层次关系实现的。
      以SparkUI类为容器,各个Tab,如JobsTab, StagesTab, ExecutorsTab等镶嵌在SparkUI上,对应各个Tab,有页面内容实现类JobPage, StagePage, ExecutorsPage等页面。这些类的继承和包含关系如下图所示:
      这里写图片描述

    2、初始化过程

      从上面可以看出,SparkUI类型的对象是UI界面的根对象,它是在SparkContext类中构造出来的。

    private var _ui: Option[SparkUI] = None //定义
    _ui = //SparkUI对象的生成
      if (conf.getBoolean("spark.ui.enabled", true)) {
        Some(SparkUI.createLiveUI(this, _conf, listenerBus, _jobProgressListener,
          _env.securityManager, appName, startTime = startTime))
      } else {
        // For tests, do not enable the UI
        None
      }
    _ui.foreach(_.bind())  //启动jetty。bind方法继承自WebUI,该类负责和真实的Jetty Server API打交道

      上面这段代码中可以看到SparkUI对象的生成过程,结合上面的类结构图,可以看到bind方法继承自WebUI类,进入WebUI类中,

      protected val handlers = ArrayBuffer[ServletContextHandler]() // 这个对象在下面bind方法中会使用到。
      protected val pageToHandlers = new HashMap[WebUIPage, ArrayBuffer[ServletContextHandler]] // 将page绑定到handlers上
      /** 将Http Server绑定到这个Web页面 */
      def bind() {
        assert(!serverInfo.isDefined, "Attempted to bind %s more than once!".format(className))
        try {
          serverInfo = Some(startJettyServer("0.0.0.0", port, handlers, conf, name))
          logInfo("Started %s at http://%s:%d".format(className, publicHostName, boundPort))
        } catch {
          case e: Exception =>
            logError("Failed to bind %s".format(className), e)
            System.exit(1)
        }
      }

    上面代码中handlers对象维持了WebUIPage和Jetty之间的关系,org.eclipse.jetty.servlet.ServletContextHandler是标准jetty容器的handler。而对象pageToHandlers维持了WebUIPage到ServletContextHandler的对应关系。

      各Tab页以及该页内容的实现,基本上大同小异。接下来以AllJobsPage页面为例仔细梳理页面展示的过程。

    3、SparkUI中Tab的绑定

      从上面的类结构图中看到WebUIPage提供了两个重要的方法,render和renderJson用于相应页面请求,在WebUIPage的实现类中,具体实现了这两个方法。
      在SparkContext中构造出SparkUI的实例后,会执行SparkUI#initialize方法进行初始化。如下面代码中,调用SparkUI从WebUI继承的attacheTab方法,将各Tab页面绑定到UI上。

      def initialize() {
        attachTab(new JobsTab(this))
        attachTab(stagesTab)
        attachTab(new StorageTab(this))
        attachTab(new EnvironmentTab(this))
        attachTab(new ExecutorsTab(this))
        attachHandler(createStaticHandler(SparkUI.STATIC_RESOURCE_DIR, "/static"))
        attachHandler(createRedirectHandler("/", "/jobs/", basePath = basePath))
        attachHandler(ApiRootResource.getServletHandler(this))
        // This should be POST only, but, the YARN AM proxy won't proxy POSTs
        attachHandler(createRedirectHandler(
          "/stages/stage/kill", "/stages/", stagesTab.handleKillRequest,
          httpMethods = Set("GET", "POST")))
      }

    4、页面内容绑定到Tab

      在上一节中,JobsTab标签绑定到SparkUI上之后,在JobsTab上绑定了AllJobsPage和JobPage类。AllJobsPage页面即访问SparkUI页面时列举出所有Job的那个页面,JobPage页面则是点击单个Job时跳转的页面。通过调用JobsTab从WebUITab继承的attachPage方法与JobsTab进行绑定。

    private[ui] class JobsTab(parent: SparkUI) extends SparkUITab(parent, "jobs") {
      val sc = parent.sc
      val killEnabled = parent.killEnabled
      val jobProgresslistener = parent.jobProgressListener
      val executorListener = parent.executorsListener
      val operationGraphListener = parent.operationGraphListener
    
      def isFairScheduler: Boolean =
        jobProgresslistener.schedulingMode.exists(_ == SchedulingMode.FAIR)
    
      attachPage(new AllJobsPage(this))
      attachPage(new JobPage(this))
    }

    5、页面内容的展示

      知道了AllJobsPage页面如何绑定到SparkUI界面后,接下来分析这个页面的内容是如何显示的。进入AllJobsPage类,主要观察render方法。在页面展示上Spark直接利用了Scala对html/xml的语法支持,将页面的Html代码嵌入Scala程序中。具体的页面生成过程可以查看下面源码中的注释。这里可以结合第二部分的实例进行查看。

      def render(request: HttpServletRequest): Seq[Node] = {
        val listener = parent.jobProgresslistener //获取jobProgresslistener对象,页面展示的数据都是从这里读取
        listener.synchronized {
          val startTime = listener.startTime // 获取application的开始时间,默认值为-1L
          val endTime = listener.endTime // 获取application的结束时间,默认值为-1L
          val activeJobs = listener.activeJobs.values.toSeq // 获取当前application中处于active状态的job
          val completedJobs = listener.completedJobs.reverse.toSeq // 获取当前application中完成状态的job
          val failedJobs = listener.failedJobs.reverse.toSeq  // 获取当前application中失败状态的job
    
          val activeJobsTable =
            jobsTable(activeJobs.sortBy(_.submissionTime.getOrElse(-1L)).reverse)
          val completedJobsTable =
            jobsTable(completedJobs.sortBy(_.completionTime.getOrElse(-1L)).reverse)
          val failedJobsTable =
            jobsTable(failedJobs.sortBy(_.completionTime.getOrElse(-1L)).reverse)
    
          val shouldShowActiveJobs = activeJobs.nonEmpty
          val shouldShowCompletedJobs = completedJobs.nonEmpty
          val shouldShowFailedJobs = failedJobs.nonEmpty
    
          val completedJobNumStr = if (completedJobs.size == listener.numCompletedJobs) {
            s"${completedJobs.size}"
          } else {
            s"${listener.numCompletedJobs}, only showing ${completedJobs.size}"
          }
    
          val summary: NodeSeq =
            <div>
              <ul class="unstyled">
                <li>
                  <strong>Total Uptime:</strong> // 显示当前Spark应用运行时间
                  {// 如果还没有结束,就用系统当前时间减开始时间。如果已经结束,就用结束时间减开始时间
                    if (endTime < 0 && parent.sc.isDefined) {
                      UIUtils.formatDuration(System.currentTimeMillis() - startTime)
                    } else if (endTime > 0) {
                      UIUtils.formatDuration(endTime - startTime)
                    }
                  }
                </li>
                <li>
                  <strong>Scheduling Mode: </strong> // 显示调度模式,FIFO或FAIR
                  {listener.schedulingMode.map(_.toString).getOrElse("Unknown")}
                </li>
                {
                  if (shouldShowActiveJobs) { // 如果有active状态的job,则显示Active Jobs有多少个
                    <li>
                      <a href="#active"><strong>Active Jobs:</strong></a>
                      {activeJobs.size}
                    </li>
                  }
                }
                {
                  if (shouldShowCompletedJobs) { // 如果有完成状态的job,则显示Completed Jobs的个数
                    <li id="completed-summary">
                      <a href="#completed"><strong>Completed Jobs:</strong></a>
                      {completedJobNumStr}
                    </li>
                  }
                }
                {
                  if (shouldShowFailedJobs) { // 如果有失败状态的job,则显示Failed Jobs的个数
                    <li>
                      <a href="#failed"><strong>Failed Jobs:</strong></a>
                      {listener.numFailedJobs}
                    </li>
                  }
                }
              </ul>
            </div>
    
          var content = summary // 将上面的html代码写入content变量,在最后统一显示content中的内容
          val executorListener = parent.executorListener // 这里获取EventTimeline中的信息
          content ++= makeTimeline(activeJobs ++ completedJobs ++ failedJobs,
              executorListener.executorIdToData, startTime)
    // 然后根据当前application中是否存在active, failed, completed状态的job,将这些信息显示在页面上。
          if (shouldShowActiveJobs) {
            content ++= <h4 id="active">Active Jobs ({activeJobs.size})</h4> ++
              activeJobsTable // 生成active状态job的展示表格,具体形式可参看第二部分。按提交时间倒序排列
          }
          if (shouldShowCompletedJobs) {
            content ++= <h4 id="completed">Completed Jobs ({completedJobNumStr})</h4> ++
              completedJobsTable
          }
          if (shouldShowFailedJobs) {
            content ++= <h4 id ="failed">Failed Jobs ({failedJobs.size})</h4> ++
              failedJobsTable
          }
    
          val helpText = """A job is triggered by an action, like count() or saveAsTextFile().""" +
            " Click on a job to see information about the stages of tasks inside it."
    
          UIUtils.headerSparkPage("Spark Jobs", content, parent, helpText = Some(helpText)) // 最后将content中的所有内容全部展示在页面上
        }
      }

      接下来以activeJobsTable代码为例分析Jobs信息展示表格的生成。这里主要的方法是makeRow,接收的是上面代码中的activeJobs, completedJobs, failedJobs。这三个对象都是包含在JobProgressListener对象中的,在JobProgressListener中的定义如下:

    // 这三个对象用于存储数据的主要是JobUIData类型,
      val activeJobs = new HashMap[JobId, JobUIData]
      val completedJobs = ListBuffer[JobUIData]()
      val failedJobs = ListBuffer[JobUIData]()

      将上面三个对象传入到下面这段代码中,继续执行。

      private def jobsTable(jobs: Seq[JobUIData]): Seq[Node] = {
        val someJobHasJobGroup = jobs.exists(_.jobGroup.isDefined)
    
        val columns: Seq[Node] = { // 显示的信息包括,Job Id(Job Group)以及Job描述,Job提交时间,Job运行时间,总的Stage/Task数,成功的Stage/Task数,以及一个进度条
          <th>{if (someJobHasJobGroup) "Job Id (Job Group)" else "Job Id"}</th>
          <th>Description</th>
          <th>Submitted</th>
          <th>Duration</th>
          <th class="sorttable_nosort">Stages: Succeeded/Total</th>
          <th class="sorttable_nosort">Tasks (for all stages): Succeeded/Total</th>
        }
    
        def makeRow(job: JobUIData): Seq[Node] = {
          val (lastStageName, lastStageDescription) = getLastStageNameAndDescription(job)
          val duration: Option[Long] = {
            job.submissionTime.map { start => // Job运行时长为系统时间,或者结束时间减去开始时间
              val end = job.completionTime.getOrElse(System.currentTimeMillis())
              end - start
            }
          }
          val formattedDuration = duration.map(d =>  // 格式化任务运行时间,显示为a h:b m:c s格式UIUtils.formatDuration(d)).getOrElse("Unknown")
          val formattedSubmissionTime = // 获取Job提交时间job.submissionTime.map(UIUtils.formatDate).getOrElse("Unknown")
          val jobDescription = UIUtils.makeDescription(lastStageDescription, parent.basePath) // 获取任务描述
    
          val detailUrl = // 点击单个Job下面链接跳转到JobPage页面,传入参数为jobId
            "%s/jobs/job?id=%s".format(UIUtils.prependBaseUri(parent.basePath), job.jobId)
          <tr id={"job-" + job.jobId}>
            <td sorttable_customkey={job.jobId.toString}>
              {job.jobId} {job.jobGroup.map(id => s"($id)").getOrElse("")}
            </td>
            <td>
              {jobDescription}
              <a href={detailUrl} class="name-link">{lastStageName}</a>
            </td>
            <td sorttable_customkey={job.submissionTime.getOrElse(-1).toString}>
              {formattedSubmissionTime}
            </td>
            <td sorttable_customkey={duration.getOrElse(-1).toString}>{formattedDuration}</td>
            <td class="stage-progress-cell">
              {job.completedStageIndices.size}/{job.stageIds.size - job.numSkippedStages}
              {if (job.numFailedStages > 0) s"(${job.numFailedStages} failed)"}
              {if (job.numSkippedStages > 0) s"(${job.numSkippedStages} skipped)"}
            </td>
            <td class="progress-cell"> // 进度条
              {UIUtils.makeProgressBar(started = job.numActiveTasks, completed = job.numCompletedTasks,
               failed = job.numFailedTasks, skipped = job.numSkippedTasks,
               total = job.numTasks - job.numSkippedTasks)}
            </td>
          </tr>
        }
    
        <table class="table table-bordered table-striped table-condensed sortable">
          <thead>{columns}</thead> // 显示列名
          <tbody>
            {jobs.map(makeRow)} // 调用上面的row生成方法,具体显示Job信息
          </tbody>
        </table>
      }

      从上面这些代码中可以看到,Job页面显示的所有数据,都是从JobProgressListener对象中获得的。SparkUI可以理解成一个JobProgressListener对象的消费者,页面上显示的内容都是JobProgressListener内在的展现。
      在接下来一篇文章 Spark-1.6.0之Application运行信息记录器JobProgressListener中会分析运行状态数据是如何写入JobProgressListener中的。
      

    二、Spark UI界面实例

      默认情况下,当一个Spark Application运行起来后,可以通过访问hostname:4040端口来访问UI界面。hostname是提交任务的Spark客户端ip地址,端口号由参数spark.ui.port(默认值4040,如果被占用则顺序往后探查)来确定。由于启动一个Application就会生成一个对应的UI界面,所以如果启动时默认的4040端口号被占用,则尝试4041端口,如果还是被占用则尝试4042,一直找到一个可用端口号为止。
      下面启动一个Spark ThriftServer服务,并用beeline命令连接该服务,提交sql语句运行。则ThriftServer对应一个Application,每个sql语句对应一个Job,按照Job的逻辑划分Stage和Task。

    1、Jobs页面

    这里写图片描述
      连接上该端口后,显示的就是上面的页面,也是Job的主页面。这里会显示所有Active,Completed, Cancled以及Failed状态的Job。默认情况下总共显示1000条Job信息,这个数值由参数spark.ui.retainedJobs(默认值1000)来确定。
      从上面还看到,除了Jobs选项卡之外,还可显示Stages, Storage, Enviroment, Executors, SQL以及JDBC/ODBC Server选项卡。分别如下图所示。

    2、Stages页面

    这里写图片描述

    3、Storage页面

    这里写图片描述

    4、Enviroment页面

    这里写图片描述

    5、Executors页面

    这里写图片描述

    6、单个Job包含的Stages页面

    这里写图片描述

    7、Task页面

    这里写图片描述
      

    展开全文
  • Swagger 自定义UI界面

    万次阅读 多人点赞 2017-09-13 14:11:48
    Swagger 自定义UI界面 Swagger简单介绍 如何使用Swagger 添加自定义UI界面 使用swagger-ui-layer

    Swagger 自定义UI界面

    • Swagger简单介绍
    • 如何使用Swagger
    • 添加自定义UI界面
    • 使用swagger-ui-layer

    Swagger简单介绍

    Swagger是一个Restful风格接口的文档在线自动生成和测试的框架
    官网:http://swagger.io
    官方描述:The World’s Most Popular Framework for APIs.

    Swagger ui 的原生UI界面如下:
    Swagger ui 的原生UI界面

    个人感觉原生UI显示的有些不够漂亮和清晰,特别是request 的model部分
    所以想重新设计一个更加友好美观的UI界面。

    最后的效果图如下:

    • 接口文档信息界面

    接口文档信息界面

    • 接口文档调试界面

    接口文档调试界面

    实现原理:

    因为Swagger-ui读取的数据来源于/v2/api-docs,并且返回的是json数据。
    所以只要自己写一个页面去解析json数据,并展现就可以实现自定义swagger的UI界面了

    如何使用Swagger

    1、引入jar包

    首先需要在你的 pom.xml 中引入swagger的包

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.2.2</version>
    </dependency>
    2.启用swagger

    启用swagger ,创建SwaggerConfig文件,内容如下,

    @Configuration
    @EnableSwagger2
    public class SwaggerConfig {
    
        @Bean
        public Docket ProductApi() {
            return new Docket(DocumentationType.SWAGGER_2)
                    .genericModelSubstitutes(DeferredResult.class)
                    .useDefaultResponseMessages(false)
                    .forCodeGeneration(false)
                    .pathMapping("/")
                    .select()
                    .build()
                    .apiInfo(productApiInfo());
        }
    
        private ApiInfo productApiInfo() {
            ApiInfo apiInfo = new ApiInfo("XXX系统数据接口文档",
                    "文档描述。。。",
                    "1.0.0",
                    "API TERMS URL",
                    "联系人邮箱",
                    "license",
                    "license url");
            return apiInfo;
        }
    }
    3.添加swagger注解

    常用的swagger注解
    Api
    ApiModel
    ApiModelProperty
    ApiOperation
    ApiParam
    ApiResponse
    ApiResponses
    ResponseHeader
    具体可以参考swagger官方注解文档:http://docs.swagger.io/swagger-core/apidocs/index.html

    4.添加自定义UI界面

    有两种方式
    1.可以在项目的基础上新增一个servlet ,指向对应的html文件
    html文件里再去解析json,并渲染UI

    2.新建一个项目,用webjars将前端资源打成jar包,再供其他项目使用
    项目结构如图
    swagger-ui-layer项目结构如图

    主要文件是docs.html,此文件作用是解析json和渲染UI

    通过ajax请求v2/api-docs,再解析json。

    $.ajax({
        url : "v2/api-docs",
        //url : "http://petstore.swagger.io/v2/swagger.json",
        dataType : "json",
        type : "get",
        success : function(data) {
            //do something
           console.log(data);
        }
    });

    这里为了页面方便渲染,还用到了jsrender模板引擎

    完整 html 源码如下
    https://github.com/caspar-chen/swagger-ui-layer/blob/master/swagger-ui-layer/src/main/resources/docs.html

    使用swagger-ui-layer

    现在已经将项目在github上开源了,取名为swagger-ui-layer
    欢迎star,fork,commit,也可以随意修改成自己喜欢的UI风格

    github地址:https://github.com/caspar-chen/swagger-ui-layer
    码云地址:https://www.oschina.net/p/swagger-ui-layer

    要使用swagger-ui-layer很简单
    只需要在pom.xml中加入引用最新版本jar包就可以了
    最新版jar包地址:
    http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.caspar-chen%22%20AND%20a%3A%22swagger-ui-layer%22

    <dependency>
      <groupId>com.github.caspar-chen</groupId>
      <artifactId>swagger-ui-layer</artifactId>
      <version>最新版本</version>
    </dependency>

    然后就可以直接查看效果了
    swagger-ui-layer 的默认访问地址是: http://${host}:${port}/docs.html

    展开全文
  • 一、将标题栏和状态栏以及中央部件集成于一个类中  单独作为一个类,提供标题栏和状态栏以及中央部件指针成员; class QBaseWidget : public QFrame { QVBoxLayout *m_...QWidget *m_pContentWidget
  • 仿微信UI界面 全套源码下载

    千次下载 热门讨论 2014-01-08 21:08:04
    本软件基本实现微信的所有UI效果。具备如下功能点: 登录、功能指引、退出对话框、设置界面、会话界面、右上角功能键、详细资料头像点击放大等各种功能,很完整详细的源码下载!
  • 一,问题引入  异常: Only the original thread that created a view hierarchy can touch its views的解决方案   为什么会有这种异常产生呢?   ... 当每个应用程序apk第一次启动时,Android会同时启动一个...
  • 用 Silverlight 做UI界面

    千次阅读 2011-10-25 13:47:07
    用 Silverlight 做UI界面 罗朝辉(http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 最近在做构架调研,高层希望尽量用少的代价实现跨平台,于是有了研究 wpf 和 Silverlight 的机会,此次研究的版本是 ...
  • ![这里是两个不同的ui](https://img-ask.csdn.net/upload/201710/25/1508897252_684798.png)
  • javafx ui界面

    千次阅读 2017-12-07 17:22:11
    使用javafx做了个界面,一个仿照botstrap后台页面, 界面如下:  另外一个仿照http://pratikborsadiya.in/vali-admin/charts.html  第三个还没有完成,界面有点不好看:    代码路径: ...
  • spark的UI界面

    万次阅读 多人点赞 2017-06-20 15:16:00
    [看图说话] 基于Spark UI性能优化与调试——初级篇 Spark有几种部署的模式,单机版、集群版等等,平时单机版在数据量不大的时候可以跟传统的java程序一样进行断电调试、但是在集群上调试就比较麻烦了.....
  • UE4 UI界面

    千次阅读 2019-04-25 16:58:26
    在UE4中创建UI界面是创建一个widget 进去之后左上角是选择控件,找到直接拖上去,中间那个框代表的就是我们的屏幕 在button中打字也就是给button命名时需要在上面在拖一个text控件 更好的排版可以改变锚点 ...
  • 前端常用的UI插件

    千次阅读 2017-10-06 20:38:31
    前端用到的UI插件
  • 概述:每个Android应用程序都运行在一个dalvik虚拟机进程中,进程开始的时候会启动一个主线程(MainThread),主线程负责处理和ui相关的事件,因此主线程通常又叫UI线程。而由于Android采用UI单线程模型,所以只能在...
  • Consul:4:可视化UI界面

    千次阅读 2020-02-29 09:07:38
    Consul本身提供了一个可视化的UI界面,这篇文章对此进行简单介绍。
  • C#UI界面

    万次阅读 2014-07-21 17:12:43
    比较好的C# UI界面库:
  • 科幻风UI界面

    千次阅读 2018-09-05 09:05:25
    最近看了许多科幻风的大数据平台界面,挑选了几个供大家参考, 源码地址https://download.csdn.net/download/qq_29099209/10646178 其一: 其二 其三 其四 这个下载都要收费 没找到免费的,花钱买了一...
  • QtUI界面美化

    千次阅读 2019-01-30 16:46:59
    在属性编辑器中设置stylesheet来修改界面 1.QRadioButton QRadioButton{ spacing: 5px; } QRadioButton::indicator{ width: 45px; height: 30px; } QRadioButton::indicator:unchecked{ ...
  • DirectUI界面编程(零)简介

    千次阅读 2015-07-07 21:47:34
    使用Windows 标准控件创建用户界面,美化起来是相当困难的,例如我们需要使用一张位图作为按钮的背景,MFC应用需要以下几个步骤: 1.继承CButton类。 2.为按钮添加BS_OWNERDRAW样式。 3.重写DrawItem函数,在该函数...
  • qt ui界面设计

    千次阅读 2018-04-09 09:15:49
    新建Mainwindow类型的项目,点击ui界面设计,就可以不用编写代码直接设计界面.如何用代码操作ui上的控件,使用ui-&gt;button类型方式,可以操作.mainwindow是属于带菜单栏的文件类型.在进行菜单栏的编辑时,可以直接...
  • DirectUI界面

    千次阅读 2012-10-05 10:49:27
    DirectUI界面库 取名自微软的一个窗口类名“DirectUIHWND”,意为Paint on parent dc directly。即子窗口不以窗口句柄的形式创建,只是逻辑上的窗口,绘制在父窗口之上。微软的“DirectUI”技术广泛的应用于Window ...
  • 用到了mavon-editor库 官网:mavon-editor官网看文档安装和使用
  • UE4使用widget创建UI界面播放视频

    万次阅读 2016-07-12 16:14:55
    我的目的非常简单,点击按钮,播放或暂停场景中的视频
  • 修改QTui界面

    2013-05-09 17:07:04
    同学发过来的程序要我帮他改ui界面 我需要添加按钮与功能 但是我总改不了他的ui界面 是怎莫回事 运行后仍然是原来的界面 那位大师帮帮忙 新手学QT 懂得很少 这个问题困扰好几天了 我是在winsowns下运行的
  • Unity Lua UI界面封装

    千次阅读 2017-10-26 16:25:36
    lua做UGUI界面控制,找到一个界面的所有要用到的控件去绑定事件或者做控制,如果很原始的Find和GetComponent是一个很痛苦的事情,因为UGUI的界面层级...-- 1、先找到UI的GameObject,例如 local uiObj = GameObject.

空空如也

1 2 3 4 5 ... 20
收藏数 370,487
精华内容 148,194
关键字:

ui界面