• Tiny实例:TINY框架官网制作过程详解


    新增加war包下载地址,呵呵愿意体验的可以直接下载并发布到容器即可试用,也可以查看里面的内容。 
    由于只花了两天时间制作,一天时间搞页面,一天时间搞内容,所以还非常粗糙,还有许多需要完善的地方,欢迎同学们提出改进和完善意见,但是今天网站做的好不好不是重点,重点讲讲网站是怎么做出来的。当然了,不用问,必须用Tiny框架来做,所以今天就来讲一下如何利用Tiny框架来高速有效的进行网站开发。 

    网站模板选择 
    首先声明,本人是美工盲,前台界面盲,JS盲。所以,指望自己弄个漂亮的网站出来那是根本没有可能的。好在现在互联网发达,只要用心找就是可以找得到的。想想准备用bootstrap方式的响应式网页方式,于是就找到了themeforest.net,然后就在其主题世界荡漾,最后感觉Perfetto网站效果不错,是我想要的效果,再查看一下源文件,发现比较简单,比较容易搞定。于是就想着就是它了。 
    于是从http://www.angelomazzilli.com/Perfetto/index.html上把源文件搞下来,呵呵,第一手资料就算有了。由于这个不是重点,所以就快速过掉,总之,我拿到了这个网站的html,js,css,图片等等一应资源,在本地目录中打开文件访问也正确,OK,可以进入下一步骤。 

    宏提取 
    所谓宏提取,就是把网页里重复出现的东东搞成个宏,这样就避免了重复内容到处复制来复制去: 

    1. #macro (a $aHref $title $aTarget )
    2. <a#if($title) title="$title"#end#if($aHref)
    3.               href="#if($aHref.startWith('/'))#if($TINY_CONTEXT_PATH.equals("/"))#else{TINY_CONTEXT_PATH}#end$#end$aHref"#end#if($aTarget)
    4.               target="$aTarget"#end>
    5.     $bodyContent
    6. </a>
    7. #end
    8. #macro (img $imgHref $imgTitle)
    9.         <img#if($imgTitle) alt="$imgTitle"#end#if($imgHref)
    10.                            src="#if($imgHref.startWith('/'))#if($TINY_CONTEXT_PATH.equals("/"))#else{TINY_CONTEXT_PATH}#end$#end$imgHref"#end#>
    11. </a>
    12. #end
    13. #macro(section)
    14. <div class="section">
    15.     $bodyContent
    16. </div>
    17. #end
    18. #macro(container)
    19. <div class="container">
    20.     $bodyContent
    21. </div>
    22. #end
    23. #macro(row)
    24. <div class="row">
    25.     $bodyContent
    26. </div>
    27. #end
    28. #macro(span1)
    29. <div class="span1">
    30.     $bodyContent
    31. </div>
    32. #end
    33. #macro(span2)
    34. <div class="span2">
    35.     $bodyContent
    36. </div>
    37. #end
    38. #macro(span3)
    39. <div class="span3">
    40.     $bodyContent
    41. </div>
    42. #end
    43. #macro(span4)
    44. <div class="span4">
    45.     $bodyContent
    46. </div>
    47. #end
    48. #macro(span5)
    49. <div class="span5">
    50.     $bodyContent
    51. </div>
    52. #end
    53. #macro(span6)
    54. <div class="span6">
    55.     $bodyContent
    56. </div>
    57. #end
    58. #macro(span7)
    59. <div class="span7">
    60.     $bodyContent
    61. </div>
    62. #end
    63. #macro(span8)
    64. <div class="span8">
    65.     $bodyContent
    66. </div>
    67. #end
    68. #macro(span9)
    69. <div class="span9">
    70.     $bodyContent
    71. </div>
    72. #end
    73. #macro(span10)
    74. <div class="span10">
    75.     $bodyContent
    76. </div>
    77. #end
    78. #macro(span11)
    79. <div class="span11">
    80.     $bodyContent
    81. </div>
    82. #end
    83. #macro(span12)
    84. <div class="span12">
    85.     $bodyContent
    86. </div>
    87. #end
    88. #macro(hr)
    89. <hr/>
    90. #end
    91. #macro(dropdownMenu $dropdownTitle $dropdownHref $dropdownSubTitle )
    92. <li class="dropdown"><a href="$dropdownHref?activePage=$!menuKey">$dropdownTitle</a> <b class="caret"></b>
    93.     <span>$dropdownSubTitle</span>
    94.     $!bodyContent
    95. </li>
    96. #end
    97. #macro(menu $menuTitle $menuHref $menuSubTitle  $menuKey)
    98. <li class="dropdown#if($menuKey==$activePage) active#end"><a
    99.         href="${menuHref}">$menuTitle</a>
    100.     <span>$menuSubTitle</span>
    101.     $!bodyContent
    102. </li>
    103. #end
    104. #macro(nav)
    105. <ul class="nav">
    106.     $bodyContent
    107. </ul>
    108. #end
    109. #macro(subMenu)
    110. <ul>
    111.     $bodyContent
    112. </ul>
    113. #end
    114. #macro(subMenuItem  $title $href $menuKey)
    115. <li><a href="$href"#if($menuKey==$activePage) class="current"#end >$title</a></li>
    116. #end
    117. #macro(pageTitle $title $page)
    118.     #set($pageTitle="$title")
    119.     #set($activePage="$page")
    120. #end
    121. #macro(modalFooter)
    122. <div class="modal-footer">
    123.     <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
    124. </div>
    125. #end
    126. #macro(breadcrumb)
    127. <ul class="breadcrumb">
    128.     $bodyContent
    129. </ul>
    130. #end
    131. #macro(breadcrumbParentItem $title $url)
    132. <li>#@a($url $title)$title#end <span class="divider">/</span></li>
    133. #end
    134. #macro(breadcrumbItem $title)
    135. <li class="active">$title</li>
    136. #end
    137. #macro(thumbnails $thumbnailsId)
    138. <ul class="thumbnails"#if($thumbnailsId)id="$thumbnailsId"#end>
    139.     $bodyContent
    140. </ul>
    141. #end
    142. #macro(filterContainer)
    143. <ul id="portfolio" class="thumbnails ">
    144.     $bodyContent
    145. </ul>
    146. #end
    147. #macro(filterContainerItem $column $type)
    148. <li class="span$column $type" style="opacity: 1;">
    149.     <div class="thumbnail" style="text-align:left;">
    150.             $bodyContent
    151.     </div>
    152. </li>
    153. #end
    154. #macro(clearfix)
    155. <div class="clearfix"></div>
    156. #end
    157. #macro(thumbnailsItem $name $title $qq $email $imgUrl)
    158. <li class="span3">
    159.     <div class="thumbnail">
    160.         #img($imgUrl)
    161.         <div class="caption">
    162.             <h3><a href="#">$name</a></h3>
    163.             <em>$title</em>
    164.             <p>QQ:$!qq</p>
    165.             <p>邮箱:$!email</p>
    166.             #clearfix
    167.             $!bodyContent
    168.         </div>
    169.     </div>
    170. </li>
    171. #end
    172. #macro(slides)
    173. <div class="slides">
    174.     $bodyContent
    175. </div>
    176. #end
    177. #macro(slidesItem $imgSrc $title $href)
    178. <div>#@a($href $title)#img($imgSrc $title) #end
    179. $bodyContent
    180. </div>
    181. #end
    182. #macro(slidesDetail)
    183. <div class="detail">
    184.     $bodyContent
    185. </div>
    186. #end
    187. #macro(slidesDetailInfo $title $subTitle)
    188. <h3>#@a($href $title)$title#end</h3>
    189. <em>$subTitle</em>
    190.     $bodyContent
    191. #end
    192. #macro(title $title $subTitle)
    193. <div class="row">
    194.     <div class="span12">
    195.         <h1 class="no-margin">$title</h1>
    196.         <p class="lead">$subTitle</p>
    197.     </div>
    198. </div>
    199. #end
    200. #macro(wideBanner)
    201. <!-- Wide Banner -->
    202. <div class="wide-bg">
    203.     <div class="container">
    204.         $bodyContent
    205.     </div>
    206. </div>
    207. #end
    208. #macro(sidebar $title)
    209. <!-- Sidebar -->
    210. <div class="span3 sidebar">
    211.     #if($title)
    212.         <h3 class="half-margin">$!title</h3>
    213.     #end
    214.     <ul class="nav nav-tabs nav-stacked">
    215.         $bodyContent
    216.     </ul>
    217. </div>
    218. #end
    219. #macro(sidebarItem $title $href )
    220. <li>#@a($href $title)$title#end</li>
    221. #end
    222. #macro(lead $id $title)
    223. <p class="lead no-margin" id="$id">$title</p>
    224. <div class="">
    225.     $bodyContent
    226. </div>
    227. <hr class="no-margin" style="margin: 5pt;5pt;5pt;5pt;"/>
    228. #end
    229. #macro(filter)
    230. <!-- Portfolio Filter -->
    231. <div id="filter" class="half-margin">
    232.     $bodyContent
    233. </div>
    234. <div class="clearfix"></div>
    235. </div>
    236. #end
    237. #macro(filterItem $title $current)
    238. <button class="btn btn-small half-margin#if($current) current#end">$title</button>
    239. #end
    240. #macro(shortcut $title $href $icon)
    241.     #@a($href $title "_blank")#img($icon)#end
    242. #end
    243. #macro(caption $title)
    244. <div class="head" style="text-align: left;">
    245.     <h3><strong>$title</strong></h3>
    246.     $bodyContent
    247. </div>
    248. #end
    249. #macro(masonry)
    250. <div id="masonry">
    251.     $bodyContent
    252. </div>
    253. #end
    254. #macro(masonryItem $masonryItemClass)
    255. <div class="single $masonryItemClass">
    256.     $bodyContent
    257. </div>
    258. #end
    259. #macro(logo)
    260. <p class="logo"><a href="home.page"><span>Tiny Framework</span></a></p>
    261. #end
    262. #macro(toTop)
    263. <div id="toTop">Top</div>
    264. #end
    265. 通用的宏已经写好,接下来就是写与网站有关部分的宏: 
    266. #macro(header)
    267. <!-- Header -->
    268.     #@row()
    269.         #@span3()
    270.         #logo
    271.         #end
    272.         #@span9()
    273.         <div class="top-header text-right"><em>QQ群: <em>228977971</em> 邮箱:<a
    274.                 href="mailto:luo_guo@icloud.com">luo_guo@icloud.com</a></em>
    275.             <div class="social">
    276.                 #shortcut("Sonar代码检查" "http://www.tinygroup.org/sonar/dashboard/index/org.tinygroup:tiny" "img/sonar.ico")
    277.                 #shortcut("Hudson持续集成" "http://www.tinygroup.org/hudson/job/tiny/" "img/hudson.png")
    278.                 #shortcut("TinyFramework OSC首页" "http://www.tinygroup.org/sonar/dashboard/index/org.tinygroup:tiny" "img/osc.ico")
    279.                 #shortcut("TinyFramework GIT网址" "http://git.oschina.net/tinyframework/tiny" "img/git.ico")
    280.             </div>
    281.         </div>
    282.         <div class="text-left">
    283.             <h2></bit> Think big, start small, scale fast.</h2>
    284.         </div>
    285.         #end
    286.     #end
    287. #end
    288. #macro(footer)
    289.     #@section()
    290.         #@container()
    291.         <!-- Footer -->
    292.             #@row()
    293.                 #@span12()
    294.                 <div class="footer">
    295.                     <hr/>
    296.                     <p class="text-center">©Copy Right 2009~2014 <strong>tiny group</strong><br/>
    297.                         www.tinygroup.org</p>
    298.                 </div>
    299.                 #end
    300.             #end
    301.         #end
    302.     #end
    303. #end
    304. #macro(navbar)
    305. <!-- Navbar -->
    306. <div class="navbar"#* id="nav-follow"*#>
    307.     <div class="navbar-inner">
    308.         <div class="container"><a data-target=".navbar-responsive-collapse" data-toggle="collapse"
    309.                                   class="btn btn-navbar"><i class="icon-th-list"></i></a> <a
    310.                 data-target=".navbar-responsive-collapse" data-toggle="collapse" class="brand">Navbar</a>
    311.             <div class="nav-collapse collapse navbar-responsive-collapse">
    312.                 #@nav()
    313.                     #@menu("Homepage" "home.page" "首页" "home")#end
    314.                     #@menu("philosophy" "philosophy.page" "设计理念" "philosophy")#end
    315.                     #@menu("principle" "principle.page" "设计原则" "principle")#end
    316.                     #@menu("Features" "feature.page" "功能特性" "feature")#end
    317.                     #@menu("FAQ" "faq.page" "常见问题解答" "faq")#end
    318.                     #@menu("encourage us" "encourage.page" "鼓励我们" "encourage")#end
    319.                     #@menu("About us" "about.page" "关于我们" "about")#end
    320.                 #end
    321.             </div>
    322.         </div>
    323.     </div>
    324. </div>
    325. #end
    复制代码




    上面就把宏处理方面的工作处理完毕了,接下来就是设定页面结构了。  
    页面结构设计 
    Html页面结构 

    1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
    2.         "http://www.w3.org/TR/html4/strict.dtd">
    3. <!--[if IE 7 ]>        <html class="no-js ie ie7 lte7 lte8 lte9" lang="en-US"> <![endif]-->
    4. <!--[if IE 8 ]>        <html class="no-js ie ie8 lte8 lte9" lang="en-US"> <![endif]-->
    5. <!--[if IE 9 ]>        <html class="no-js ie ie9 lte9>" lang="en-US"> <![endif]-->
    6. <!--[if (gt IE 9)|!(IE)]><!-->
    7. <html class="no-js" lang="en-US"> <!--<![endif]-->
    8. <html lang="en">
    9. <head>
    10.     <meta charset="utf-8"/>
    11.     <link rel="shortcut icon" href="${TINY_CONTEXT_PATH}/tinysite/img/tiny.png" type="image/x-icon"/>
    12.     <title>Tiny Framework-$!pageTitle</title>
    13.     <meta name="description" content="Tiny Framework 是基于Java语言的面向组件的企业级开发框架。"/>
    14.     <meta name="keywords" content="Tiny,Framework,Java,SOA,框架,组件,分层,水平扩展,分区,分表,分布式计算,VFS,Web" />
    15.     <script src="${TINY_CONTEXT_PATH}/uiengine.uijs"></script>
    16.     <link href="${TINY_CONTEXT_PATH}/uiengine.uicss" rel="stylesheet" />
    17. </head>
    18. <body class="boxed"  style="background: url(${TINY_CONTEXT_PATH}/tinysite/img/bg/parquet-bg.jpg);">
    19. $pageContent
    20. </body>
    21. </html>
    复制代码



    网站页面结构: 
    #@section()
        #@container()
        #header
        #navbar
        #hr
        #end
        #@container()
            $pageContent
        #end
    #end
    #footer
    #toTop

    上面的页面结构就非常清晰了: 
    下面详细解释: 

    #@section()##开一段
        #@container()##开一个容器
        #header##放header进去
        #navbar##放导航条进去
        #hr##放一个分隔线
        #end
        #@container()##再开一个容器
            $pageContent##里面放展现的内容
        #end
    #end
    #footer ##这里放页脚
    #toTop  ##这里放返回页顶按钮

    是不是非常清晰呀? 
    然后就是每一页的内容编写了。 

    页面编写 

    首页 
    在需要解释的行的后面我会增加注释 

    #pageTitle("首页" "home")##设定这一面展现时的标题是”首页“,并且置"home"菜单为选中状态<span></span> #title("Tiny framework" "基于组件化的J2EE开发框架")

    #@slides()##轮播
        #@slidesItem("img/example-slide-1.jpg" "hoto" "#")##第一个轮播项
            #@slidesDetail()
                #@slidesDetailInfo("名字" "Tiny名称的来历")##轮播中的详细解释段
                <p>取名Tiny是取其微不足道,微小之意。</p>
                <p>Tiny的构建者认为,一个J2EE开发框架是非常复杂的,只有把框架分解成非常细小、可控的部分,并且对每个细小、可控的部分都有一个最优解或相对最优解,
                那么整个方案也就可以非常不错的落地。</p>
                #end
            #end
        #end
        #@slidesItem("img/example-slide-2.jpg" "hoto" "#")
            #@slidesDetail()
                #@slidesDetailInfo("策略" "Tiny框架的构建策略")
                <p>Think big, start small, scale fast.</p>
                <p>想法要宏伟,但是要从小的开始,同时可以快速的进行扩展。</p>
                <p>Tiny框架的构建者认为:如果想法不够宏伟,那么就会局限于细节;如果一开始就铺非常大的摊子,将会失去控制;如果不能快速扩展,就无法满足应用需要。</p>
                #end
            #end
        #end
        #@slidesItem("img/example-slide-3.jpg" "hoto" "#")
            #@slidesDetail()
                #@slidesDetailInfo("定位" "Tiny框架的应用定位")
                <p>基于WEB的展现平台</p>
                <p>主要包括展现层及控制层,可以让开发人员方便快速的实现WEB层的开发,同时要避免现有方案的缺点,同时要有自己非常突出的优点。</p>
                <p>基于SOA的服务开发平台</p>
                <p>可以方便的开发平台无关的服务,同时有水平扩展,应用集群方面要有良好的支持,可以满足7*24的运维要求。</p>
                #end
            #end
        #end
        #@slidesItem("img/example-slide-4.jpg" "hoto" "#")
            #@slidesDetail()
                #@slidesDetailInfo("目标" "Tiny框架的目标定位")
                <p>Tiny框架的构建者认为再好的框架也有过时的时候,再优秀的架构师也有视野盲区,再NB的写手也无法实现所有的部分。</p>
                <p>所以Tiny框架的构建者认为:只有建立一个良好的生态圈,让广大开发者使用者都在生态圈在找到自己的位置,才是有生命的模式。</p>
                #end
            #end
        #end
    #end

    可以看到上面的内容语法结构非常清晰,容易理解,容易修改。 

    设计理念 

    #pageTitle("philosophy" "philosophy")
    #title("philosophy" "主要介绍Tiny框架的设计理念")


    #@row()
        #@masonry()
        <!-- Content -->
            #@masonryItem()
                #@caption("使用灵活")
                <p>可以整个使用它,也可以只用它的一个或几个部分。</p>
                <p>Tiny构建者认为,一个完整的框架可能需要有许许多多个部分组成,但是对于实际应用的用户来说,它可能只需要其中的一部分功能。构架一定要有这种能力,可以由使用者进行点菜式,使用,避免只要用一点点功能,就要引入许许多多的内容。</p>
                #end
            #end

            #@masonryItem("big")
                #@caption("学习成本低、上手容易")
                <p>框架的学习成本必须非常低,这样才可以让使用者更容易上手,避免由于学习难度大而导致的学习曲线太陡、太长。</p>
                <p>经过许多次的实践,我们总结出来:有基础的JAVA开发人员经过半天的培训,就可以完全学会基于Tiny框架进行开发,经过1天到两天的实践就会变成熟手。</p>
                <p>对框架进行扩展或基于框架扩展接口进行扩展,则需要3天左右的培训,就可以完全掌握,经过一周的实践就会变成熟手。</p>
                #end
            #end

             ##后面的内容都类似就不贴了
        #end
    #end


    鼓励与支持 
    #pageTitle("鼓励" "encourage")
    #title("encourage" "鼓励与支持")
    #@row()
        #@span3()
        #end
        #@span6()
        <div class="thumbnail" style="text-align: left;">
                <p>我想每一个访问到这个页面的人,一定也是同样对技术有所追求的人。相对于金钱来说,我们更需要您的支持、鼓励,以及对我们所做工作的认可。</p>
                <p>我们不希望收到多少金钱,但是我们希望收获许多支持。</p>
                <p>如果您感受得到我们的努力及付出,请不辞辛苦为我们捐赠<em style="color:red"><strong>一块钱</strong></em>,为我们加油,为我们助威!</p>
                <p><em style="color:red">请用支付宝中的二维码扫描功能扫描下面的二维码</em></p>
            #img("img/appxl1rc0koh8fj044.png")
        </div>
        #end
        #@span3()
        #end
    #end

    其它页面也大同小异,这里就不贴了。  
    运行结果 

    125502_T1DY_1245989.png (199.12 KB, 下载次数: 0)

    下载附件

    2015-5-26 23:07 上传

     

    125700_7n3X_1245989.png (102.4 KB, 下载次数: 0)

    下载附件

    2015-5-26 23:07 上传

     

    125908_E9QS_1245989.png (189.1 KB, 下载次数: 0)

    下载附件

    2015-5-26 23:07 上传

     

    155553_517R_1245989.png (26.78 KB, 下载次数: 0)

    下载附件

    2015-5-26 23:07 上传

     



    更多页面,请看网站www.tinygroup.org 

    增加google及Baidu站点统计 

    1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
    2.         "http://www.w3.org/TR/html4/strict.dtd">
    3. <!--[if IE 7 ]>        <html class="no-js ie ie7 lte7 lte8 lte9" lang="en-US"> <![endif]-->
    4. <!--[if IE 8 ]>        <html class="no-js ie ie8 lte8 lte9" lang="en-US"> <![endif]-->
    5. <!--[if IE 9 ]>        <html class="no-js ie ie9 lte9>" lang="en-US"> <![endif]-->
    6. <!--[if (gt IE 9)|!(IE)]><!-->
    7. <html class="no-js" lang="en-US"> <!--<![endif]-->
    8. <html lang="en">
    9. <head>
    10.     <meta charset="utf-8"/>
    11.     <link rel="shortcut icon" href="${TINY_CONTEXT_PATH}/tinysite/img/tiny.png" type="image/x-icon"/>
    12.     <title>Tiny Framework-$!pageTitle</title>
    13.     <meta name="description" content="Tiny Framework 是基于Java语言的面向组件的企业级开发框架。"/>
    14.     <meta name="keywords" content="Tiny,Framework,Java,SOA,框架,组件,分层,水平扩展,分区,分表,分布式计算,VFS,Web" />
    15.     <script src="${TINY_CONTEXT_PATH}/uiengine.uijs"></script>
    16.     <link href="${TINY_CONTEXT_PATH}/uiengine.uicss" rel="stylesheet" />
    17. </head>
    18. <body class="boxed"  style="background: url(${TINY_CONTEXT_PATH}/tinysite/img/bg/parquet-bg.jpg);">
    19. $pageContent
    20. <script type="text/javascript">
    21.     var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");
    22.     document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3F08ed66f35813cc4b68c4607c2a40d33c' type='text/javascript'%3E%3C/script%3E"));
    23. </script>
    24. <script>
    25.     (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
    26.         (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
    27.             m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
    28.     })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
    29.     ga('create', 'UA-51345317-1', 'tinygroup.org');
    30.     ga('send', 'pageview');
    31. </script>
    32. </body>
    33. </html>
    复制代码




    考虑要个人也比较关心一些统计数据,于是就增加一baidu及google的统计分析。 
    很简单,只要在根目录中的default.layout中增加这两段js就可以了,所有的其它文件都不必修改。 
    哇,已经可以收集数据了,同时也再一次验证了Tiny框架对于DRY原则的坚持。 

    总结 
    上面展示了Tiny框架强大的页面开发能力。 
    对于页面开发人员来说,进行了相当的封装,避免了直接使用html而出现不应该出现的问题。 
    对于开发人员来说,不必关心页面结构,也不必关系js,css相关的内容,只要设置好页面上的元素即可。 
    这里就可以非常清晰的看到,界面开发程序员做的事情非常简单、易懂,且易于维护。明眼人也看得非常清晰,如果数据是来自于数据库,那处理就更简单了。

  • 相关阅读:
    每日作业报告
    每日作业报告
    每日作业报告
    每日作业报告
    每日作业报告
    每日作业报告
    每日作业报告
    每日作业报告
    每日作业报告
    关系模式分解例题
  • 原文地址:https://www.cnblogs.com/j2eetop/p/4610438.html
Copyright © 2020-2023  润新知