zoukankan      html  css  js  c++  java
  • 二次开发指南

    1       引言

    相关源码下载地址:http://www.jinhusns.com/Products/Download/?type=xcj

    1.1     目的

    用于社会化开发平台的架构设计指导,阐述基础设施及关键技术构件、业务构件的设计思想及具体实现。

    读者包括但不限于社会化开发平台的研发人员,使用社会化开发平台的产品定制人员以及公司外部的二次开发者。

    1.2     参考资料

    《架构使用说明书》

    《业务使用说明书》

    《皮肤设计机制》

    1.3     引用术语与缩写解释

    缩写、术语

    解释

    多租户模式

    产品中存在诸多业务逻辑相同但是使用者数据需要相互隔离的服务(可能是业务构件也可能是应用),采用多租户模式可以使这类服务获得重用,从而简化开发。租户类型是指一类租户(例如:群组),租户是指租户类型的一个特定实例(例如:群组A)。

    2       “平台+应用”设计思想

    2.1     设计思想

    2.1.1 目的

    1. 开发架构清晰,易于维护;

    2. 提升开发效率;

    3. 提升产品的可扩展性;

    4. 什么是应用?

    2.1.2 概念

    应用指产品中的功能模块,具有以下特征:

    1)         具有一定独立性的完整的功能模块;

    2)         可以在产品中安装、卸载、禁用/启用;

    3)         可以在呈现区域安装、卸载(如果允许在呈现区域安装);

    4)         应用可以设置为锁定状态,锁定的应用不允许卸载(可以禁用);

    1. 什么是呈现区域?

    呈现区域之间彼此隔离,具有独立性,可以有独立的皮肤设计规约及导航,皮肤都是针对呈现区域进行设计的,呈现区域可以看作多个应用数据的容器。频道、用户空间、群组空间、后台,都是呈现区域,都可以定义自己的皮肤及导航。

    1. 什么是呈现区域实例?

    是指呈现区域在运行期间生成的一个具体可以使用的实例,呈现区域分为单例和多例,每个呈现区域实例都有自己的Owner。例如:

    1)         频道、后台属于单例:Owner=0;

    2)         用户空间、群组空间属于多例:Owner为UserId或GroupId;

    1. 应用与呈现区域的关系

    1)         1个应用可以在多个呈现区域中使用,可以为不同的呈现区域提供数据;

    2)         1个呈现区域下,可以有多个应用,为应用数据提供统一的导航及皮肤设计;

    2.1.3 设计要点

     应用设计整体设想.png

    图表1应用设计整体设想

    1. 应用应该保持独立性:

    1)         应用设计在物理上、逻辑上尽量独立;

    2)         尽量避免应用之间的依赖;

    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. 应用在呈现区域可以设置为内置应用:

    1)         内置应用不允许卸载;

    2)         内置应用属于自动安装应用(无论自动安装属性设置何值);

    1. 应用在呈现区域可以设置为自动安装:创建呈现区域实例时,自动安装到该呈现区域中;

    2. 在站点安装/卸载(目前仅考虑手动进行安装/卸载)时需要添加/移除以下数据:

    2.2.2 安装/卸载

    1)         tn_Applications:应用表;

    2)         tn_ApplicationInPresentAreaSettings:应用在呈现区域的设置;

    3)         tn_InitialNavigations:应用在呈现区域的初始化导航;

    4)         tn_ApplicationManagementOperations:应用在呈现区域的管理操作;

    1. 在呈现区域安装/卸载(由呈现区域实例Owner在管理界面执行)时需要添加/移除以下数据:

    1)         tn_ApplicationInPresentAreaInstallations:应用在呈现区域的安装记录;

    2)         tn_PresentAreaNavigations:呈现区域实例的导航数据;

    3)         应用数据中与该呈现区域实例相关的数据(卸载时需要考虑);

    1. 在其他应用安装/卸载:

    1)         当前底层设计支持一个应用安装在另一个应用中;

    2)         由开发者自行完成;

    2.2.3 平台支撑

    为了最大限度提升应用的开发效率,把应用开发常用的代码封装成可重用的技术构件(Infrastructure)和业务构件(BusinessComponents)。

    平台+应用视图.jpg

    图表2平台+应用详细视图

    3       应用开发指导

    3.1     开发流程概览

    开发流程概览.jpg

    3.2     建立应用的目录结构

    3.2.1 手动建立

    您可以手动的建立您的应用目录结构:

    1. 在Web/Applications/建立以应用的ApplicationKey命名的Web Application;

    2. 在Web/Applications/{ApplicationKey}/建议包含以下目录结构:

     应用模板目录结构.png

    图表1应用模块目录结构

    3.2.2 自动建立

    您还可以使用我们提供的AppHelper程序来自动生成目录结构。点击附件进行下载:

    TunynetTool.AppHelper.zip36.58K下载次数:715

     AppHelper.png

    图表2 AppHelper

    3.3     开发必需的程序代码

    1. 从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

    删除用户在应用中的数据

    1. 从ApplicationConfig派生自己的应用配置类,必须重写以下属性:

    属性名称

    成员修饰

    说明

    备注

    ApplicationId : int

    public

    该应用的ApplicationId

    ApplicationKey : string

    public

    该应用的ApplicationKey

    1. 定义UrlRoutingRegistration.cs

    1)         从System.Web.Mvc.AreaRegistration派生;

    2)         使用ApplicationKey作为AreaName;

    1. 如果需要则创建Application.config;

     Application.png

    图表3开发应用需要实现的抽象类

    3.4     配置应用

    1. 创建应用(涉及到tn_Applications表)

    字段名称

    字段描述

    日志应用配置示例

    ApplicationId

    应用Id

    要求全局唯一,第三方应用建议从3001开始

    1002

    ApplicationKey

    Application英文唯一标识

    Blog

    Description

    应用描述

    N’’

    IsEnabled

    是否启用

    不启用的应用,在前台各呈现区域中,不会显示

    1

    IsLocked

    是否锁定

    目前版本暂时用不到

    0

    1. 分析应用和呈现区域(涉及到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

    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

    是否锁定

    1. 处于锁定状态的导航不允许删除;

    2. 处于锁定状态的导航仅允许修改以下内容:NavigationText、NavigationTarget、ImageUrl、DisplayOrder、IsEnabled;

    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

    是否锁定

    1. 处于锁定状态的管理操作不允许删除;

    2. 处于锁定状态的管理操作仅允许修改以下内容:OperationText、NavigationTarget、ImageUrl、DisplayOrder、IsEnabled;

    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     扩展新视频、音乐网站解析插件

    1. 视频网站解析插件:

    a)         在~/Plugins/MediaParsers/Video/目录下,创建View文件,并以视频网站的域名关键词(保证域名中包含该关键词,并与其它视频网站解析插件名不同即可)命名;

    b)         编辑View文件,实现以下逻辑:

                             i.              匹配该视频网站的视频详细页面地址,匹配成功则继续以下操作;

                           ii.              抓取页面内容,分析出视频名称、视频播放地址、视频缩略图、视频描述,并构建ParsedMedia实体,保存至数据库;

                          iii.              输出ParsedMedia实体的Json格式。

    1. 音乐网站解析,与视频网站解析类似。

  • 相关阅读:
    Python 两个list合并成一个字典
    python 取列表(数组)偶数和奇数位置的值
    爬虫-Xpath语法笔记-转载
    详解Python requests 超时和重试的方法-转载
    6种负载均衡算法-转载
    python学习点滴记录-Day22
    python学习点滴记录-Day21-项目
    python学习点滴记录-Day20(分页、cookie/session、ajax)
    vimrc
    使用 find 命令实现高级排除需求
  • 原文地址:https://www.cnblogs.com/xiaoxiaojia/p/5360239.html
Copyright © 2011-2022 走看看