Ver Fonte

Z991239-905 #comment feat: mod_evtconverter实体迁移

陈礼鹏80274480 há 5 anos atrás
pai
commit
d3b55ae022

+ 1 - 1
CMakeLists.txt

@@ -141,7 +141,7 @@ endif(CONAN_EXPORTED)
 
 
 include(conan)
-conan_cmake_run(REQUIRES RvcFramework/1.0.2-dev1@LR04.02_FrameworkLib/testing
+conan_cmake_run(REQUIRES RvcFramework/1.0.3-dev1@LR04.02_FrameworkLib/testing
 BASIC_SETUP CMAKE_TARGETS
 BUILD missing)
 

+ 28 - 0
Module/mod_evtconverter/CMakeLists.txt

@@ -0,0 +1,28 @@
+define_module("eventconverter")
+
+set(${MODULE_PREFIX}_SRCS
+	evtengine.cpp
+	evtengine.h
+	mod_evtconverter.cpp
+	)
+
+set(MOD_VERSION_STRING "0.0.1-dev1")
+add_module_libraries(${MODULE_PREFIX} ${MODULE_NAME} ${MOD_VERSION_STRING})
+
+target_include_directories(${MODULE_NAME} PRIVATE
+	${CONAN_INCLUDE_DIRS_SCEW}
+	${CONAN_INCLUDE_DIRS_EXPAT}
+)
+
+target_link_directories(${MODULE_NAME} PRIVATE
+	${ThirdPartyLib}
+	${CONAN_LIB_DIRS_SCEW}
+	${CONAN_LIB_DIRS_EXPAT}
+)
+
+
+# 添加实体需要依赖的其他共享库(包括系统库)
+set(${MODULE_PREFIX}_LIBS  ${MODULE_BASE_ALL_LIBS} scew expat)
+target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS})
+
+deploy_module(${MODULE_PREFIX} ${MODULE_NAME})

+ 2 - 0
Module/mod_evtconverter/ChangeLog

@@ -0,0 +1,2 @@
+
+* 2020-9-15 实体迁移

+ 20 - 9
Module/mod_evtconverter/evtengine.cpp

@@ -56,7 +56,7 @@ static int nIslog = 0;
 
 struct evt_filter_key_t 
 {
-	unsigned __int64 listen_id; // id
+	unsigned long long listen_id; // id
 };
 
 struct evt_filter_t
@@ -1497,12 +1497,18 @@ static int load_slot(evt_engine_t *engine, const char *ns, scew_element *slot_el
 	slot->arr_ref_trigger = array_make(-1, sizeof(evt_trigger_t*));
 	slot->arr_slotvar = array_make(-1, sizeof(evt_slotvar_t*));
 	slot->parent = engine;
+
+	char* code = NULL;
+	scew_list* slotval_list = NULL;
+	scew_list* filter_list = NULL;
+	scew_list* reset_list = NULL;
+
 	scew_attribute *attr = scew_element_attribute_by_name(slot_elem, "Code");
 	if (!attr) {
 				if (nIslog){Dbg("slot miss attribute code!");}
 		goto on_error;
 	} else {
-		char *code = parse_code(ns, scew_attribute_value(attr));
+		code = parse_code(ns, scew_attribute_value(attr));
 		if (!code) {
 					if (nIslog){Dbg("parse code failed!");}
 			goto on_error;
@@ -1535,7 +1541,7 @@ static int load_slot(evt_engine_t *engine, const char *ns, scew_element *slot_el
 	} else {
 		slot->once = 0;
 	}
-	scew_list *slotval_list = scew_element_list_by_name(slot_elem, "Var");
+	slotval_list = scew_element_list_by_name(slot_elem, "Var");
 	if (slotval_list) {
 		for (scew_list *it = scew_list_first(slotval_list); it; it = scew_list_next(it)) {
 			scew_element *elem = (scew_element *)scew_list_data(it);
@@ -1547,7 +1553,7 @@ static int load_slot(evt_engine_t *engine, const char *ns, scew_element *slot_el
 		}
 		scew_list_free(slotval_list);
 	}
-	scew_list *filter_list = scew_element_list_by_name(slot_elem, "Filter");
+	filter_list = scew_element_list_by_name(slot_elem, "Filter");
 	if (filter_list) {
 		for (scew_list *it = scew_list_first(filter_list); it; it = scew_list_next(it)) {
 			scew_element *elem = (scew_element *)scew_list_data(it);
@@ -1559,7 +1565,7 @@ static int load_slot(evt_engine_t *engine, const char *ns, scew_element *slot_el
 		}
 		scew_list_free(filter_list);
 	}
-	scew_list *reset_list = scew_element_list_by_name(slot_elem, "Reset");
+	reset_list = scew_element_list_by_name(slot_elem, "Reset");
 	if (reset_list) {
 		for (scew_list *it = scew_list_first(reset_list); it; it = scew_list_next(it)) {
 			scew_element *elem = (scew_element *)scew_list_data(it);
@@ -1631,6 +1637,8 @@ on_error:
 static int load_sysvar_rule(evt_engine_t *engine, evt_trigger_t *trigger, scew_element *sysvar_elem)
 {
 	evt_sysvar_rule_t *rule = ZALLOC_T(evt_sysvar_rule_t);
+	scew_list* state_list = NULL;
+
 	scew_attribute *attr = scew_element_attribute_by_name(sysvar_elem, "Code");
 	if (attr) {
 		char *code = (char*)scew_attribute_value(attr);
@@ -1661,7 +1669,7 @@ static int load_sysvar_rule(evt_engine_t *engine, evt_trigger_t *trigger, scew_e
 	}
 	rule->parent = trigger;
 	rule->arr_state = array_make(0, sizeof(char*));
-	scew_list* state_list = scew_element_children(sysvar_elem);
+	state_list = scew_element_children(sysvar_elem);
 	if (state_list) {
 		for (scew_list *it = scew_list_first(state_list); it; it = scew_list_next(it)) {
 			scew_element *state_elem = (scew_element *)scew_list_data(it);
@@ -1804,6 +1812,9 @@ static int load_file(evt_engine_t *engine, const char *filename)
 	char tmp_ns[MAX_PATH];
 	int rc = Error_Param;
 
+	scew_attribute* attr = NULL;
+	scew_element* elem = NULL;
+
 	reader = scew_reader_file_create(filename);
 	if (!reader) {			
 				if (nIslog){Dbg("open file %s failed!", filename);}
@@ -1821,7 +1832,7 @@ static int load_file(evt_engine_t *engine, const char *filename)
 		goto on_error;
 	}
 
-	scew_attribute *attr = scew_element_attribute_by_name(root, "xmlns");
+	attr = scew_element_attribute_by_name(root, "xmlns");
 	if (attr) {
 		ns = (const char*)scew_attribute_value(attr);
 	} else {
@@ -1832,7 +1843,7 @@ static int load_file(evt_engine_t *engine, const char *filename)
 		ns = tmp_ns;
 	}
 
-	scew_element *elem = scew_element_by_name(root, "SlotList");
+	elem = scew_element_by_name(root, "SlotList");
 	if (elem) {
 		scew_list *slot_list = scew_element_children(elem);
 		if (slot_list) {
@@ -1957,7 +1968,7 @@ int evt_engine_unload(evt_engine_t *engine)
 
 int evt_engine_process_log(evt_engine_t *engine, 
 							const CAutoArray<CUUID> &SubIDs,
-						   unsigned __int64 nLogID,
+						   unsigned long long nLogID,
 						   LogTypeEnum eLogType, 
 						   SeverityLevelEnum eLevel,
 						   DWORD dwSysError, 

+ 3 - 3
Module/mod_evtconverter/evtengine.h

@@ -13,8 +13,8 @@ typedef struct evt_engine_callback_t
 {
 	int (*set_timer)(evt_engine_t *engine, int timer_id, int interval, evt_engine_timer_func timer_cb, void *timer_user_data, void *user_data);
 	int (*kill_timer)(evt_engine_t *engine, int timer_id, void *user_data);
-	int (*subscribe_log)(evt_engine_t *engine, unsigned __int64 *sub_id, LogTypeEnum eLogType, const char *szEntity, SeverityLevelEnum eSeverityLevel, ErrorCodeEnum eSysError, DWORD dwUserCode, bool bIgnoreMessage, void *user_data);
-	int (*unsubscribe_log)(evt_engine_t *engine, unsigned __int64 sub_id, void *user_data);
+	int (*subscribe_log)(evt_engine_t *engine, unsigned long long *sub_id, LogTypeEnum eLogType, const char *szEntity, SeverityLevelEnum eSeverityLevel, ErrorCodeEnum eSysError, DWORD dwUserCode, bool bIgnoreMessage, void *user_data);
+	int (*unsubscribe_log)(evt_engine_t *engine, unsigned long long sub_id, void *user_data);
 	int (*subscribe_sysevent)(evt_engine_t *engine, void *user_data);
 	int (*unsubscribe_sysevent)(evt_engine_t *engine, void *user_data);
 	int (*get_sysevent)(evt_engine_t *engine, const char *key, CSimpleStringA &strValue, void *user_data);
@@ -30,7 +30,7 @@ int evt_engine_load(evt_engine_t *engine, int nfile, const char **files);
 int evt_engine_unload(evt_engine_t *engine);
 int evt_engine_process_log(evt_engine_t *engine, 
 							const CAutoArray<CUUID> &SubIDs,
-						  unsigned __int64 nLogID, 
+						  unsigned long long nLogID, 
 						  LogTypeEnum eLogType, 
 						  SeverityLevelEnum eLevel,
 						  DWORD dwSysError, 

+ 6 - 6
Module/mod_evtconverter/mod_evtconverter.cpp

@@ -1,7 +1,7 @@
 #include "stdafx.h"
 #include "SpBase.h"
 #include "evtengine.h"
-#include "..\EventCode.h"
+#include "../include/EventCode.h"
 
 
 class CEventConverterEntity : public CEntityBase, public ISysVarListener, public ILogListener
@@ -389,14 +389,14 @@ private:
 		return 0;
 	}
 
-	int subscribe_log(unsigned __int64 *sub_id, LogTypeEnum eLogType, const char *szEntity, SeverityLevelEnum eSeverityLevel, ErrorCodeEnum eSysError, DWORD dwUserCode, bool bIgnoreMessage)
+	int subscribe_log(unsigned long long *sub_id, LogTypeEnum eLogType, const char *szEntity, SeverityLevelEnum eSeverityLevel, ErrorCodeEnum eSysError, DWORD dwUserCode, bool bIgnoreMessage)
 	{
 		CUUID uuid;
 		ErrorCodeEnum Error = GetFunction()->SubscribeLog(uuid, this, eLogType, eSeverityLevel, eSysError, dwUserCode, szEntity, bIgnoreMessage);
 		if (Error != Error_Succeed) {
 			LOG_TRACE("subscribe log failed! Error = %d", Error);
 		} else {
-			*sub_id = (unsigned __int64)uuid;
+			*sub_id = (unsigned long long)uuid;
 			if (m_nIslog)
 			{
 				LOG_TRACE("subscribe log ok!");
@@ -405,7 +405,7 @@ private:
 		return (int)Error;
 	}
 
-	int unsubscribe_log(unsigned __int64 sub_id)
+	int unsubscribe_log(unsigned long long sub_id)
 	{
 		ErrorCodeEnum Error = GetFunction()->UnsubscribeLog(sub_id);
 		if (Error == Error_Succeed) {
@@ -477,12 +477,12 @@ private:
 		CEventConverterEntity *pThis = static_cast<CEventConverterEntity *>(user_data);
 		return pThis->kill_timer(timer_id);
 	}
-	static int __subscribe_log(evt_engine_t *engine, unsigned __int64 *sub_id, LogTypeEnum eLogType, const char *szEntity, SeverityLevelEnum eSeverityLevel, ErrorCodeEnum eSysError, DWORD dwUserCode, bool bIgnoreMessage, void *user_data)
+	static int __subscribe_log(evt_engine_t *engine, unsigned long long *sub_id, LogTypeEnum eLogType, const char *szEntity, SeverityLevelEnum eSeverityLevel, ErrorCodeEnum eSysError, DWORD dwUserCode, bool bIgnoreMessage, void *user_data)
 	{
 		CEventConverterEntity *pThis = static_cast<CEventConverterEntity *>(user_data);
 		return pThis->subscribe_log(sub_id, eLogType, szEntity, eSeverityLevel, eSysError, dwUserCode, bIgnoreMessage);
 	}
-	static int __unsubscribe_log(evt_engine_t *engine, unsigned __int64 sub_id, void *user_data)
+	static int __unsubscribe_log(evt_engine_t *engine, unsigned long long sub_id, void *user_data)
 	{
 		CEventConverterEntity *pThis = static_cast<CEventConverterEntity *>(user_data);
 		return pThis->unsubscribe_log(sub_id);

+ 0 - 111
Module/mod_evtconverter/mod_evtconverter.vcxproj

@@ -1,111 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{E70ABEC6-213C-42FF-AAF1-C54640EF3448}</ProjectGuid>
-    <RootNamespace>mod_evtconverter</RootNamespace>
-    <Keyword>Win32Proj</Keyword>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>Windows7.1SDK</PlatformToolset>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <Import Project="..\modmake.setting" />
-  <PropertyGroup>
-    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
-    <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(VCInstallDir)lib;$(WindowsSdkDir)lib;$(FrameworkSDKDir)\lib;$(APP_BIN_DIR)</LibraryPath>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;MOD_EVTCONVERTER_EXPORTS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MinimalRebuild>true</MinimalRebuild>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
-      <AdditionalIncludeDirectories>$(FrameworkHeadRoot)\Common;$(FrameworkHeadRoot)\libtoolkit;$(ThirdPartyHeadRoot)\scew-1.1.3\scew;$(ThirdPartyHeadRoot)\Expat-2.1.0\Source\lib</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Windows</SubSystem>
-      <TargetMachine>MachineX86</TargetMachine>
-      <AdditionalDependencies>$(FrameworkLib)\SpBase.lib;$(FrameworkLib)\libtoolkit.lib;$(ThirdPartyLib)\libscew.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <Optimization>MaxSpeed</Optimization>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;MOD_EVTCONVERTER_EXPORTS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <AdditionalIncludeDirectories>$(FrameworkHeadRoot)\Common;$(FrameworkHeadRoot)\libtoolkit;$(ThirdPartyHeadRoot)\scew-1.1.3\scew;$(ThirdPartyHeadRoot)\Expat-2.1.0\Source\lib</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Windows</SubSystem>
-      <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <TargetMachine>MachineX86</TargetMachine>
-      <AdditionalDependencies>$(FrameworkLib)\SpBase.lib;$(FrameworkLib)\libtoolkit.lib;$(ThirdPartyLib)\libscew.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="$(FrameworkHeadRoot)\Common\stdafx.cpp">
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
-    </ClCompile>
-    <ClCompile Include="evtengine.cpp" />
-    <ClCompile Include="mod_evtconverter.cpp" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="$(FrameworkHeadRoot)\Common\stdafx.h" />
-    <ClInclude Include="evtengine.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="..\..\Version.rc" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>

+ 0 - 32
Module/mod_evtconverter/mod_evtconverter.vcxproj.filters

@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="Source Files">
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
-    </Filter>
-    <Filter Include="Header Files">
-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
-      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="evtengine.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="mod_evtconverter.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\Framework\Common\stdafx.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="evtengine.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\Framework\Common\stdafx.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-  </ItemGroup>
-</Project>

+ 34 - 34
README.md

@@ -1,34 +1,34 @@
-# 招行可视柜台终端应用程序
-
-**可视柜台终端应用程序(Remote Video Counter Terminal Application)**是基于C/C++实现的运行在Windows平台上的异步调用、多进程通信的 Win32 位 Debug 版应用程序。
-
-## 目标
-
-重构和移植可视柜台终端框架以实现跨平台化,并新增特性最终打造成一个轻便的分布式容器类框架
-
-* 轻量级的架构和通信机制,能够按需伸缩
-* 每个实体运行在自己的进程中,模块间相对独立,结构间松耦合,而在功能上表现为统一的整体
-* 前端界面与后台独立,聚合后台服务,提供统一服务入口,让后台服务对前台透明(API 网关)
-
-* 
-
-## 依赖情况
-
-### libtoolkit
-
-### spbase
-
-依赖 scew 而 scew 依赖 libexpat
-
-### RvcComm
-
-### spshell
-
-### sphost
-
-
-
-
-
-## 规范准则
-
+# 招行可视柜台终端应用程序
+
+**可视柜台终端应用程序(Remote Video Counter Terminal Application)**是基于C/C++实现的运行在Windows平台上的异步调用、多进程通信的 Win32 位 Debug 版应用程序。
+
+## 目标
+
+重构和移植可视柜台终端框架以实现跨平台化,并新增特性最终打造成一个轻便的分布式容器类框架
+
+* 轻量级的架构和通信机制,能够按需伸缩
+* 每个实体运行在自己的进程中,模块间相对独立,结构间松耦合,而在功能上表现为统一的整体
+* 前端界面与后台独立,聚合后台服务,提供统一服务入口,让后台服务对前台透明(API 网关)
+
+* 
+
+## 依赖情况
+
+### libtoolkit
+
+### spbase
+
+依赖 scew 而 scew 依赖 libexpat
+
+### RvcComm
+
+### spshell
+
+### sphost
+
+
+
+
+
+## 规范准则
+