朴雲霖 發表於 2023-8-6 00:00:00

详解linux下的.net/mvc/cms程序结构

<p>
        cms程序架构</p>
<p>
        本程序是主要是用于企业网站开发的,也可以做博客程序,程序是从之前上一篇的.net 博客程序改进过来的,主要技术由webform转成.net mvc了,由于是很早之前的项目,12年还是mvc3版本,当然还是跑在linux下的。</p>
<p>
        技术栈 .net framework 4.0 sqlite 数据库 mono linux 运行环境以及mono下的sqlite库 razor 模板引擎 dapper 轻量级orm框架 vs2017 社区版本</p>
<p>
        这次的开发工具比较新了吧,上次用vs2010发的,跨度比较大,这个项目之前也是在10下开发出来的,虽然用2017,其实没什么影响的。</p>
<p>
        razor引擎比nvelocity的易用性高很多,而且跟后端集合的比较好。</p>
<p>
        而且这次的项目完全使用dapper orm,整个数据库访问层操作看起来也清爽很多了。</p>
<p>
        代码结构</p>
<p>
        <img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/c32f0f69396fc702861c8410016b552f.jpg"></p>
<p>
        左侧主要分为三个文件夹,jqpress.web是存放web路由入口、模板皮肤、静态文件,上传文件夹,后台管理程序通过areas域管理来实现的,整个项目结构还是比较清晰的。</p>
<p>
        路由设计</p>
<p>
        <img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/28af9addfa6a16f81a6e830523ae3006.jpg"></p>
<p>
        路由入口为homecontroller这个文件,包括首页、产品列表,文章列表,文章内容等待,都是通过这个controller来路由的,虽然功能比较多,但是代码量不到300行,业务逻辑处理基本都在service层。</p>
<p>
        如下为一个列表界面的action逻辑才20几行</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterxhtml" id="highlighter_31025">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                        <div class="line number18 index17 alt1">
                                                                18</div>
                                                        <div class="line number19 index18 alt2">
                                                                19</div>
                                                        <div class="line number20 index19 alt1">
                                                                20</div>
                                                        <div class="line number21 index20 alt2">
                                                                21</div>
                                                        <div class="line number22 index21 alt1">
                                                                22</div>
                                                        <div class="line number23 index22 alt2">
                                                                23</div>
                                                        <div class="line number24 index23 alt1">
                                                                24</div>
                                                        <div class="line number25 index24 alt2">
                                                                25</div>
                                                        <div class="line number26 index25 alt1">
                                                                26</div>
                                                        <div class="line number27 index26 alt2">
                                                                27</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="xhtml plain">public actionresult category(string pagename) </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">{</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="xhtml spaces">   </code><code class="xhtml plain">var model = new postlistmodel();</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="xhtml spaces">   </code><code class="xhtml plain">categoryinfo cate = _categoryservice.getcategory(pagename);</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="xhtml spaces">   </code><code class="xhtml plain">model.category = cate;</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="xhtml spaces">   </code><code class="xhtml plain">if (cate != null)</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="xhtml spaces">   </code><code class="xhtml plain">{</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">int categoryid = cate.categoryid;</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">model.metakeywords = cate.catename;</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">model.metadescription = cate.description;</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">viewbag.title = cate.catename;</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">model.url = confighelper.siteurl + "category/" + jqpress.framework.utils.stringhelper.sqlencode(pagename) + "/page/{0}";</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">const int pagesize = 10;</code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">int count = 0;</code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">int pageindex = pressrequest.getint("page", 1);</code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">int cateid = pressrequest.getqueryint("cateid", -1);</code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">int tagid = pressrequest.getqueryint("tagid", -1);</code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">if (cateid &gt; 0)</code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                        <code class="xhtml spaces">     </code><code class="xhtml plain">pageindex = pageindex + 1;</code>
</div>
                                                                <div class="line number20 index19 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">var cateids =categoryid+","+ _categoryservice.getcategorylist().findall(c =&gt; c.parentid == categoryid).aggregate(string.empty, (current, t) =&gt; current + (t.categoryid + ",")).trimend(',');</code>
</div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">var postlist = _postservice.getpostpagelist(pagesize, pageindex, out count, cateids.trimend(','), tagid, -1, -1, -1, -1, -1,-1, "", "", "");</code>
</div>
                                                                <div class="line number22 index21 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">model.pagelist.loadpagedlist(postlist);</code>
</div>
                                                                <div class="line number23 index22 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">model.postlist = (list&lt;</code><code class="xhtml keyword">postinfo</code><code class="xhtml plain">&gt;)postlist;</code>
</div>
                                                                <div class="line number24 index23 alt1">
                                                                        <code class="xhtml spaces">   </code><code class="xhtml plain">}</code>
</div>
                                                                <div class="line number25 index24 alt2">
                                                                        <code class="xhtml spaces">   </code><code class="xhtml plain">model.isdefault = 0;</code>
</div>
                                                                <div class="line number26 index25 alt1">
                                                                        <code class="xhtml spaces">   </code><code class="xhtml plain">return view(model.category.viewname,model);</code>
</div>
                                                                <div class="line number27 index26 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
         </p>
<p>
        模板引擎设计</p>
<p>
        <img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/a5d7789c9c4ebdd21daef2781f45d4df.jpg"></p>
<p>
        <img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/e82e5c41fc3b09eedabecdce387b21b7.jpg"></p>
<p>
        模板引擎采用razor,不同的cms风格模板以文件夹的形式存放在themes文件夹下,通过后端设置可以随意切换模板(此功能还在完善当中)。</p>
<p>
        数据存储设计</p>
<p>
        <img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/6327c8fbd900c7b2e1770f84fb24853b.jpg"></p>
<p>
        作为轻量级的cms,当然不会用mysql或者sqlserver,依然坚定的使用sqlite,以上是通过dapper进行数据库操作,虽然没有微软增加的orm强大,但是可读性和操控性都是非常好的。</p>
<p>
        <img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/7ec7b134df805bc42c41e07bba95bd83.jpg"></p>
<p>
        因为要支持linux,所以sqlite的操作类需要<code>using mono.data.sqlite;</code><br>
        ,当然可以在windows下切换过来,上面我写的切换方式太粗暴了,学过设计模式的同学应该分分钟能够重构出来,切换windows和linux简直不要太方便。</p>
<p>
        数据库结构</p>
<p>
        <img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/083d40870092767d599e327b7300c8a5.jpg"></p>
<p>
        <code>jq_category</code> 分类及标签表 <code>jq_comments</code> 评论表 <code>jq_links</code> 友链及导航设置 <code>jq_posts</code> 文章表 <code>jq_sites</code> 站点访问统计数字及文章、分类、数量统计表 <code>jq_users</code> 账户表</p>
<p>
        数据库结构跟之前的 博客程序没差别,只是部分表结构字段有所差别</p>
<p>
        运行 vs2017调试模式预览</p>
<p>
        cms首页</p>
<p>
        <img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/30c1ad61cfc598d64846039c943eb9bc.jpg"></p>
<p>
        后台登录,默认用户名admin,密码123456</p>
<p>
        <img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/a00fcc5ee346023210fe030eaa06308a.jpg"></p>
<p>
        后台首页</p>
<p>
        <img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/ab95cb322270cc85166ef879825970c7.jpg"></p>
<p>
        文章列表</p>
<p>
        <img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/77d68d0d561967c673f0482f95693013.jpg"></p>
<p>
        文章编辑</p>
<p>
        <img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/9b81438a301be570d46b70c901bf4cdc.jpg"></p>
<p>
        linux下的部署方式 mono</p>
<p>
        <img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/e76d38f224dc9ef564f6bc9464f0d9f1.jpg"></p>
<p>
        上图为我服务器上的mono安装信息。</p>
<p>
        jexus</p>
<p>
        linux下需要安装mono和jexus就可以运行起来,mono作为.net framework的linux运行环境,jexus作为web服务器。</p>
<p>
        <img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/82ba01ee3d8d1d4ceba734a856c2f6c9.jpg"></p>
<p>
        jexus配置,因为我的服务器上还有其他语言的站点,所以没有直接采用jexus对外服务。</p>
<p>
        nginx</p>
<p>
        <img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/5638662b3b488d26a5611ce900517f55.jpg"></p>
<p>
        nginx代理了jexus的81端口,此地方不是必选,但是nginx作为常规的代理软件,可以在服务器上跑.net、php、java等,各司其职,百花齐放。</p>
<p>
        bin文件夹说明</p>
<p>
        <img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/e1cc5727fba7e4246f54a9d0880cb426.jpg"></p>
<p>
        .net mvc3在 linux下的部署需要注意的是需要将项目下引用的dll都需要上传到bin目录下。并且还需要上传microsoft.web.infrastructure.dll,这个是发布mvc项目需要用的。可以对比下我webform下的linux博客程序站点bin下只要引入mono和nvelocity这2个第三方dll,其他都是自己的业务程序,这个.net cms要的东西还挺多,下图是我的博客站点下的bin文件夹内容。</p>
<p>
        <img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/e24526ac22a1041aca68122af22d9e57.jpg"></p>
<p>
        linux服务器上的的.net 程序问题 jexus不支持中文,所以文件上传的路径必须重写成字母加数字符号形式, jexus web服务器是默认对大小写敏感的,所以部署的时候一定要</p>
<p>
        只需要把 jws这个脚本文件中的 “export MONO_IOMAP=...”这一句前边的“#”去掉,就可以不区分大小写了 源码获取</p>
<p>
        https://github.com/robotbird/jqpress.cms</p>
<p>
        为了防止部分同学无法访问Github,所以放oschina的gitee上了</p>
<p>
        https://gitee.com/robotbird/jqpress.cms</p>
<p>
        以上就是本次我们为大家整理的全部内容,希望对你有所帮助,如果大家还有任何不明白的地方可以在下方的留言区讨论,感谢你对的支持。</p>
頁: [1]
查看完整版本: 详解linux下的.net/mvc/cms程序结构