asp.net mvc开发的社区产品相关开发文档分享
分享一款基于asp.net mvc框架开发的社区产品--近乎。目前可以在官网免费下载,下载地址:http://www.jinhusns.com/Products/Download?type=whp
1 引言
1.1 目的
用于社会化开发平台的架构设计指导,阐述基础设施及关键技术构件、业务构件的设计思想及具体实现。
读者包括但不限于社会化开发平台的研发人员,使用社会化开发平台的产品定制人员以及公司外部的二次开发者。
1.2 参考资料
《架构使用说明书》
《业务使用说明书》
《皮肤设计机制》
1.3 引用术语与缩写解释
缩写、术语 |
解释 |
多租户模式 |
产品中存在诸多业务逻辑相同但是使用者数据需要相互隔离的服务(可能是业务构件也可能是应用),采用多租户模式可以使这类服务获得重用,从而简化开发。租户类型是指一类租户(例如:群组),租户是指租户类型的一个特定实例(例如:群组A)。 |
2 “平台+应用”设计思想
2.1 设计思想
2.1.1 目的
开发架构清晰,易于维护;
提升开发效率;
提升产品的可扩展性;
什么是应用?
2.1.2 概念
应用指产品中的功能模块,具有以下特征:
1) 具有一定独立性的完整的功能模块;
2) 可以在产品中安装、卸载、禁用/启用;
3) 可以在呈现区域安装、卸载(如果允许在呈现区域安装);
4) 应用可以设置为锁定状态,锁定的应用不允许卸载(可以禁用);
什么是呈现区域?
呈现区域之间彼此隔离,具有独立性,可以有独立的皮肤设计规约及导航,皮肤都是针对呈现区域进行设计的,呈现区域可以看作多个应用数据的容器。频道、用户空间、群组空间、后台,都是呈现区域,都可以定义自己的皮肤及导航。
什么是呈现区域实例?
是指呈现区域在运行期间生成的一个具体可以使用的实例,呈现区域分为单例和多例,每个呈现区域实例都有自己的Owner。例如:
1) 频道、后台属于单例:Owner=0;
2) 用户空间、群组空间属于多例:Owner为UserId或GroupId;
应用与呈现区域的关系
1) 1个应用可以在多个呈现区域中使用,可以为不同的呈现区域提供数据;
2) 1个呈现区域下,可以有多个应用,为应用数据提供统一的导航及皮肤设计;
2.1.3 设计要点
图表1应用设计整体设想
应用应该保持独立性:
1) 应用设计在物理上、逻辑上尽量独立;
2) 尽量避免应用之间的依赖;
应用的设计主要包括两部分的内容,一部分是数据另一部分是如何呈现;
应用的数据部分支持多租户,租户可以是呈现区域(PersentArea)也可以是另一个应用。
2.1.3.1 数据部分
在数据库设计方面采用最简单的方式,在应用数据表中增加TenantTypeId(存储对应的PersentAreaKey或ApplicationId)。
2.1.3.2 呈现部分
按照当前的皮肤设计机制,应用的View仅有一份(在所有皮肤中共用),而导航等UI元素的风格又经常会在不同皮肤中进行调整,因此必须把这一部分UI元素交由平台部分进行设计,各应用仅对外公布呈现这部分UI元素的数据。基于这个原因,需要抽象出来的UI元素包括:导航、管理菜单、快捷操作,这几个UI元素在不同的呈现区域各不相同因此应该重新设计。
2.2 设计实施
2.2.1 设计规则
应用可以由开发者设置为锁定状态,锁定状态的应用不允许删除(可以禁用);
应用在呈现区域可以设置为内置应用:
1) 内置应用不允许卸载;
2) 内置应用属于自动安装应用(无论自动安装属性设置何值);
应用在呈现区域可以设置为自动安装:创建呈现区域实例时,自动安装到该呈现区域中;
在站点安装/卸载(目前仅考虑手动进行安装/卸载)时需要添加/移除以下数据:
2.2.2 安装/卸载
1) tn_Applications:应用表;
2) tn_ApplicationInPresentAreaSettings:应用在呈现区域的设置;
3) tn_InitialNavigations:应用在呈现区域的初始化导航;
4) tn_ApplicationManagementOperations:应用在呈现区域的管理操作;
在呈现区域安装/卸载(由呈现区域实例Owner在管理界面执行)时需要添加/移除以下数据:
1) tn_ApplicationInPresentAreaInstallations:应用在呈现区域的安装记录;
2) tn_PresentAreaNavigations:呈现区域实例的导航数据;
3) 应用数据中与该呈现区域实例相关的数据(卸载时需要考虑);
在其他应用安装/卸载:
1) 当前底层设计支持一个应用安装在另一个应用中;
2) 由开发者自行完成;
2.2.3 平台支撑
为了最大限度提升应用的开发效率,把应用开发常用的代码封装成可重用的技术构件(Infrastructure)和业务构件(BusinessComponents)。
图表2平台+应用详细视图
3 应用开发指导
3.1 开发流程概览
3.2 建立应用的目录结构
3.2.1 手动建立
您可以手动的建立您的应用目录结构:
在Web/Applications/建立以应用的ApplicationKey命名的Web Application;
在Web/Applications/{ApplicationKey}/建议包含以下目录结构:
图表1应用模块目录结构
3.2.2 自动建立
您还可以使用我们提供的AppHelper程序来自动生成目录结构。点击附件进行下载:[attach:2818]
图表2 AppHelper
3.3 开发必需的程序代码
从ApplicationBase派生自己的Application类,必须实现以下方法:
方法名称 |
成员修饰 |
说明 |
备注 |
Install(string presentAreaKey, long ownerId):bool |
internal protected |
为呈现区域实例安装应用 |
|
UnInstall(string presentAreaKey, long ownerId):bool |
internal protected |
为呈现区域实例卸载应用 |
|
DeleteUser(long userId, string reassignContentToUserName = null):void |
internal protected |
删除用户在应用中的数据 |
从ApplicationConfig派生自己的应用配置类,必须重写以下属性:
属性名称 |
成员修饰 |
说明 |
备注 |
ApplicationId : int |
public |
该应用的ApplicationId |
|
ApplicationKey : string |
public |
该应用的ApplicationKey |
定义UrlRoutingRegistration.cs
1) 从System.Web.Mvc.AreaRegistration派生;
2) 使用ApplicationKey作为AreaName;
如果需要则创建Application.config;
图表3开发应用需要实现的抽象类
3.4 配置应用
创建应用(涉及到tn_Applications表)
字段名称 |
字段描述 |
日志应用配置示例 |
ApplicationId |
应用Id 要求全局唯一,第三方应用建议从3001开始 |
1002 |
ApplicationKey |
Application英文唯一标识 |
Blog |
Description |
应用描述 |
N’’ |
IsEnabled |
是否启用 不启用的应用,在前台各呈现区域中,不会显示 |
1 |
IsLocked |
是否锁定 目前版本暂时用不到 |
0 |
分析应用和呈现区域(涉及到tn_ApplicationInPresentAreaSettings表)
分析该应用可能会在那些呈现区域中使用,是否允许用户安装或卸载,是否为用户自动安装应用,是否会产生数据。具体配置说明如下:
字段名称 |
字段描述 |
ApplicationId |
应用Id |
PresentAreaKey |
呈现区域标识 |
IsBuiltIn |
是否为呈现区域内置应用 内置应用会默认创建,并且不允许卸载 |
IsAutoInstall |
是否在呈现区域自动安装 |
IsGenerateData |
应用在该呈现区域是否产生数据 |
日志配置示例如下:
tn_ApplicationInPresentAreaSettings |
||||
ApplicationId |
PresentAreaKey |
IsBuiltIn |
IsAutoInstall |
IsGenerateData |
1002 |
N'Channel' |
0 |
1 |
0 |
1002 |
N'UserSpace' |
0 |
1 |
1 |
导航
分析应用在各个呈现区域会有哪些导航,导航的链接地址、图标会是什么,是否在新窗打开,具体配置说明如下:
字段名称 |
字段描述 |
NavigationId |
定义规则:[呈现区域Id:2位][应用Id:4位][ 顺序号:N位] 呈现区域Id包括:10(频道)、11(用户空间)、13(群组空间)、20(后台); 应用ID若不足四位,请用零左补齐;必须唯一; |
ParentNavigationId |
父导航Id 一级导航,请填写0; |
Depth |
深度(从上到下以0开始) |
PresentAreaKey |
呈现区域标识 可选值:N'Channel'(频道)、N'UserSpace'(用户空间)、N'GroupSpace'(群组空间)、N'ControlPanel'(后台) |
ApplicationId |
应用Id |
NavigationType |
导航类型 可选值:0(来源于Application)、1(呈现区域初始化的导航)、2(呈现区域Owner新增的导航) 应用初始化数据中,请填写0 |
NavigationText |
导航文字 |
ResourceName |
导航文字资源名称(如果同时设置NavigationText则以NavigationText优先) 此项比配置导航文字的优势之处在于,方便实现国际化 |
NavigationUrl |
导航url,如果是来源于应用,并且该字段为空,则根据UrlRouteName获取 通过后台添加外链时,可使用此项 |
UrlRouteName |
应用导航路由规则名称将会根据该规则名称获取应用导航地址 在应用初始化数据中,请使用UrlRouteName获取导航地址 |
RouteDataName |
路由数据名称 使用UrlRouteName字段时,此项才有效 |
IconName |
系统内置图标名称 |
ImageUrl |
菜单文字旁边的图标url(预留字段,暂时用不到) |
NavigationTarget |
是新开窗口还是在当前窗口(默认:_self) |
DisplayOrder |
排序序号 建议和导航Id保持一致 |
OnlyOwnerVisible |
是否仅拥有者可见 |
IsLocked |
是否锁定
|
IsEnabled |
是否启用 |
日志配置示例如下:
tn_InitialNavigations |
||||||
字段名称 |
频道日志 一级导航示例 |
频道日志 二级导航示例 |
频道日志 二级导航示例2 |
用户空间日志 一级导航示例 |
用户空间日志 二级导航示例 |
后台日志 导航示例 |
NavigationId |
10100201 |
10100202 |
10100203 |
11100201 |
11100202 |
20100201 |
ParentNavigationId |
0 |
10100201 |
10100201 |
0 |
11100201 |
20000011 |
Depth |
0 |
1 |
1 |
0 |
1 |
2 |
PresentAreaKey |
N'Channel' |
N'Channel' |
N'Channel' |
N'UserSpace' |
N'UserSpace' |
N'ControlPanel' |
ApplicationId |
1002 |
1002 |
1002 |
1002 |
1002 |
1002 |
NavigationType |
0 |
0 |
0 |
0 |
0 |
0 |
NavigationText |
N'日志' |
N'日志首页' |
N'我的日志' |
N'日志' |
N'日志首页' |
N'日志' |
ResourceName |
N'' |
N'' |
N'' |
N'' |
N'' |
N'' |
NavigationUrl |
N'' |
N'' |
N'' |
N'' |
N'' |
N'' |
UrlRouteName |
N'Channel_Blog_Home' |
N'Channel_Blog_Home' |
N'UserSpace_Blog_Blog' |
N'UserSpace_Blog_Home' |
N'UserSpace_Blog_Home' |
N'ControlPanel_Blog_Home' |
RouteDataName |
NULL |
NULL |
N'spaceKey' |
NULL |
NULL |
NULL |
IconName |
N'Blog' |
NULL |
NULL |
N'Blog' |
NULL |
NULL |
ImageUrl |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
NavigationTarget |
N'_self' |
N'_self' |
N'_self' |
N'_self' |
N'_self' |
N'_self' |
DisplayOrder |
10100201 |
10100202 |
10100203 |
11100202 |
11100202 |
20100201 |
OnlyOwnerVisible |
0 |
0 |
0 |
1 |
1 |
0 |
IsLocked |
0 |
0 |
0 |
0 |
0 |
0 |
IsEnabled |
1 |
1 |
1 |
1 |
1 |
1 |
管理操作
字段名称 |
字段描述 |
OperationId |
定义规则:[呈现区域Id:2位][应用Id:4位][ 顺序号:N位] 呈现区域Id包括:10(频道)、11(用户空间)、13(群组空间)、20(后台); 应用ID若不足四位,请用零左补齐;必须唯一; |
ApplicationId |
应用Id |
AssociatedNavigationId |
关联的导航Id(适用于显示在主导航旁边的快捷操作,例如我的首页左侧的相册导航,可以在其旁边再加一个“上传”快捷操作) |
PresentAreaKey |
呈现区域标识 |
OperationType |
管理操作类型 可选值:1(快捷操作)、2(管理菜单) |
OperationText |
操作的文字 |
ResourceName |
操作文字资源名称(如果同时设置OperationText则以OperationText优先) |
NavigationUrl |
导航url |
UrlRouteName |
导航路由规则名称 |
RouteDataName |
路由数据名称 |
IconName |
系统内置图标名称 |
ImageUrl |
菜单文字旁边的图标url(预留字段,暂时用不到) |
NavigationTarget |
是新开窗口还是在当前窗口(默认:_self) |
DisplayOrder |
排序序号 |
OnlyOwnerVisible |
是否仅拥有者可见 |
IsLocked |
是否锁定
|
IsEnabled |
是否启用 |
日志配置示例如下:
字段名称 |
频道日志 一级导航示例 |
频道日志 二级导航示例 |
OperationId |
10100201 |
11100201 |
ApplicationId |
1002 |
1002 |
AssociatedNavigationId |
0 |
0 |
PresentAreaKey |
N'Channel' |
N'UserSpace' |
OperationType |
1 |
1 |
OperationText |
N'撰写日志' |
N'撰写日志' |
ResourceName |
N'' |
N'' |
NavigationUrl |
N'' |
N'' |
UrlRouteName |
N'UserSpace_Blog_Create' |
N'UserSpace_Blog_Create' |
RouteDataName |
N'spaceKey' |
NULL |
IconName |
N'Write' |
N'Write' |
ImageUrl |
NULL |
N'' |
NavigationTarget |
N'_blank' |
N'_self' |
DisplayOrder |
10100202 |
11100201 |
OnlyOwnerVisible |
1 |
1 |
IsLocked |
0 |
1 |
IsEnabled |
1 |
1 |
3.5 开发必须的SQL脚本
安装脚本:需要考虑以下表的初始化数据:
1) tn_Applications:应用表;
2) tn_ApplicationInPresentAreaSettings:应用在呈现区域的设置;
3) tn_InitialNavigations:应用在呈现区域的初始化导航;
4) tn_ApplicationManagementOperations:应用在呈现区域的管理操作;
卸载脚本:
1) 清除安装时添加的数据;
2) tn_ApplicationStatisticalData:应用统计数据;
3) tn_PresentAreaNavigations:应用在呈现区域的导航数据;
4) 以及应用自身的数据;
升级脚本:由开发者根据应用情况自行设计;
4 高级应用
4.1 界面融合
要达到和现有皮肤整体风格保持一致,应用页面就需要使用预置的布局,具体说明如下:
a) 频道布局包括:app-1col.cshtml(通栏布局)、app-home-2cols.cshtml(应用首页两栏布局)、app-home-3cols.cshtml(应用首页三栏布局)、app-list-2cols.cshtml(应用列表两栏布局)、app-detail-2cols.cshtml(应用详情两栏布局)、app-form-2cols.cshtml(应用表单两栏布局);
b) 群组布局包括:app-1col.cshtml(通栏布局)、app-list-2cols.cshtml(应用列表两栏布局)、app-detail-2cols.cshtml(应用详情两栏布局)、app-form-2cols.cshtml(应用表单两栏布局)、app-outer-home-2cols.cshtml(对外显示时,应用首页两栏布局);
c) 用户空间布局包括:app-1col.cshtml(通栏布局)、app-list-2cols.cshtml(应用列表两栏布局)、app-detail-2cols.cshtml(应用详情两栏布局)、app-form-2cols.cshtml(应用表单两栏布局)、app-outer-home-2cols.cshtml(对外显示时,应用首页两栏布局);
4.2 使用业务构件与平台深度开发
常用到的业务构件有:审核、动态、通知、积分、权限,具体请参见《业务构件使用说明书》
4.3 扩展新视频、音乐网站解析插件
视频网站解析插件:
a) 在~/Plugins/MediaParsers/Video/目录下,创建View文件,并以视频网站的域名关键词(保证域名中包含该关键词,并与其它视频网站解析插件名不同即可)命名;
b) 编辑View文件,实现以下逻辑:
i. 匹配该视频网站的视频详细页面地址,匹配成功则继续以下操作;
ii. 抓取页面内容,分析出视频名称、视频播放地址、视频缩略图、视频描述,并构建ParsedMedia实体,保存至数据库;
iii. 输出ParsedMedia实体的Json格式。
音乐网站解析,与视频网站解析类似。
4.4 使用ORM、缓存快速开发数据访问
参见《架构使用说明书》4.1之前版本[attach:2818]4.2版本[attach:5180]
asp.net mvc开发的社区产品相关开发文档分享的更多相关文章
- ASP.NET MVC开发:Web项目开发必备知识点
最近加班加点完成一个Web项目,使用Asp.net MVC开发.很久以前接触的Asp.net开发还是Aspx形式,什么Razor引擎,什么MVC还是这次开发才明白,可以算是新手. 对新手而言,那进行A ...
- 解析ASP.NET Mvc开发之删除修改数据
目录: 1)从明源动力到创新工场这一路走来 2)解析ASP.NET WebForm和Mvc开发的区别 3)解析ASP.NET Mvc开发之查询数据实例 4)解析ASP.NET Mvc开发之EF延迟加载 ...
- 基于C#和Asp.NET MVC开发GPS部标视频监控平台
基于C#和Asp.NET MVC开发GPS部标监控平台 目前整理了基于.NET技术的部标平台开发文章,可以参考: 1.部标Jt808协议模拟终端的设计和开发 2.C#版的808GPS服务器开发-> ...
- iOS开发-开发文档安装
iOS开发肯定离不开开发文档,苹果有在线帮助文档,xCode其实可以下载模拟器文档和iOS8.1文档的,不过下载的速度实在不敢恭维,而且比较头疼的是不显示下载进度条的,苹果的开发文档都是放在)/应用程 ...
- ASP.Net MVC开发基础学习笔记:一、走向MVC模式
一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/bl ...
- ASP.Net MVC开发基础学习笔记(1):走向MVC模式
一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/bl ...
- ASP.NET MVC开发基础
一.ASP.Net MVC的开发模式 (1)处理流程 在ASP.Net MVC中,客户端所请求的URL是被映射到相应的Controller去,然后由Controller来处理业务逻辑,或许要从Mode ...
- ASP.Net MVC开发基础学习笔记:四、校验、AJAX与过滤器
一.校验 — 表单不是你想提想提就能提 1.1 DataAnnotations(数据注解) 位于 System.ComponentModel.DataAnnotations 命名空间中的特性指定对数据 ...
- ASP.Net MVC开发基础学习笔记:五、区域、模板页与WebAPI初步
一.区域—麻雀虽小,五脏俱全的迷你MVC项目 1.1 Area的兴起 为了方便大规模网站中的管理大量文件,在ASP.NET MVC 2.0版本中引入了一个新概念—区域(Area). 在项目上右击创建新 ...
随机推荐
- HDU 4463 Outlets (最小生成树)
题意:给定n个点坐标,并且两个点已经连接,但是其他的都没有连接,但是要找出一条最短的路走过所有的点,并且路线最短. 析:这个想仔细想想,就是应该是最小生成树,把所有两点都可以连接的当作边,然后按最小生 ...
- PHP 中运用 elasticsearch
PHP扩展安装 1. 环境要求:PHP_VERSION >= 5.3.9,composer工具 2. 在E盘新建文件夹命名为elastic,,拷贝composer.phar到 E:/e ...
- sre_constants.error: unbalanced parenthesis
Traceback (most recent call last): File "androidmarket82.py", line 108, in <module> ...
- 【不积跬步,无以致千里】安装roundcube 时出现 “DSN (write): NOT OK(SQLSTATE[HY000] [2002] No such file or directory)”
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- Win7激活后添加grub引导Linux最简单方法
因为Win7(Vista同理)的激活方式是通过grub摸你OEM的Slic信息,所以主引导分区MBR被这个grub占用,以此才能激活WIn7.但是如果想同时安装Linux在别的分区,就会产生问题:gr ...
- PostgreSQL的 initdb 源代码分析之二十二
继续分析 load_plpgsql(); 展开: 就是让postgres 执行 create extension plpgsql cmd是: "/home/pgsql/project/bin ...
- 经常使用的android弹出对话框
我们在平时做开发的时候,免不了会用到各种各样的对话框,相信有过其它平台开发经验的朋友都会知道,大部分的平台都仅仅提供了几个最简单的实现,假设我们想实现自己特定需求的对话框,大家可能首先会想到,通过继承 ...
- Oracle学习(七):集合运算
1.知识点:能够对比以下的录屏进行阅读 SQL> -- 查询10和20号部门的员工的3种方法 SQL> --1. select * from emp where deptno in (10 ...
- pthread实现多线程查询(转)
导读:大多数网站的性能瓶颈不在PHP服务器上,因为它可以简单地通过横向增加服务器或CPU核数来轻松应对(对于各种云主机,增加VPS或CPU核数就更方便了,直接以备份镜像增加VPS,连操作系统.环境都不 ...
- 《Linux内核设计与实现》读书笔记
http://www.cnblogs.com/wang_yb/tag/linux-kernel/