SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3634|回复: 1

[推荐] 解决多设备对多平台的移动应用程序集成挑战

[复制链接]
发表于 2013-2-19 08:47:19 | 显示全部楼层 |阅读模式
本帖最后由 技术狂人 于 2013-2-19 08:49 编辑
4 }0 S# X, |# M, d, `. r* e  j% y2 S
企业的移动性项目越来越多,那些有价值的项目需要创建更多的项目;但这一需求是一个主要瓶颈。现在已经不再是将一个数据源连接到某种移动设备,IT 基础架构面对的是多个设备平台、复杂的安全性问题、不同的企业应用程序和数据源,许多设备没有 API。 # G# q, Z$ I% ]6 J7 D. R9 j6 |/ I
这种 “多设备对多平台” 的移动应用程序集成场景会带来一些移动集成挑战。
5 q8 n( p2 R5 r0 i$ i. F
移动集成挑战
公司面临的将移动应用程序整合到其云环境中的集成挑战包括:
+ g9 a; k1 F5 x( _0 l9 f
  • 现有应用程序的移动支持。
  • 复杂的移动开发语言。
  • 自带设备 (bring-your-own-device, BYOD) 的趋势。
  • 如何创建和定位业务逻辑。
  • 如何才能不会将移动的面向 Web 的架构错认为 SOA。
    & T% M* s, O7 S
让我们对它们做进一步的研究;稍后,我会更加详细地介绍我的团队如何在开发我们的产品过程中处理这些问题。   E* A0 F8 T# a* _
现有的应用程序不支持移动
支持移动意味着允许访问这些应用程序的数据和业务逻辑,但不幸的是,这些应用程序很少能够提供构建新的移动用户界面所需的 API 或服务。要减少改变现有应用程序的工作负载,一个解决方案是通过连接器在未发生改变的现有应用程序上支持移动功能。
3 D2 r' j8 E8 A& C9 n
开发人员可能没有使用复杂移动开发语言的经验
开发移动应用程序通常需要使用一些复杂的 Objective C 和 Java™ 资源,而初级的 Web 开发人员对这些资源往往并不十分了解。不过,在结构上,移动应用程序的确会使用要求提供 HTML5 和 JavaScript 技能的用户界面,而这些技能是 Web 开发人员所具备的。应对这一挑战的一个解决方案是提供一个转换桥(Bridge),让 Web 开发人员可以通过该转换桥使用自己知道的技术编写移动应用程序代码。
" r8 \$ {$ S  t
企业必须支持多个特定平台以及自带设备的趋势
跨平台挑战要求移动开发一次完成即可在多个平台(iOS、Android、Blackberry、Windows Phone 等)以及具有不同内存和显示器大小参数的多个设备(智能手机、平板电脑等)上运行。正如上一节中提到的那样,一个常见的、更易于使用的转换桥可能是解决这个挑战的关键。
$ ^5 r4 r& {" R  W+ {3 y
何处是使用应用程序业务逻辑的最佳位置?
应用程序业务逻辑不应编码到移动设备中:设备内编码应用程序业务逻辑会导致跨多个移动应用程序的相同业务过程的难以管理和重复编码处理。如果业务逻辑集中在服务器端,则会带来更为有效和更易管理的架构,能够在多个移动应用程序中重用。在服务器上创建业务逻辑层,以便能够组合、编排和计算自多个企业源的数据,这是一种明智之举。
5 ^0 x( a) W0 K2 F# z( ^
不要混淆 SOA 与 WOA
大多数企业都知晓(或者专长于)面向服务的体系架构的概念和结构。它们可能有一个基于 SOAP Web 服务的信息系统,由企业业务总线编排。但移动世界并不是以 SOA 为基础的。大多数移动设备环境都依赖于 WOA,即面向 Web 的架构,该结构基于 REST 或 JSON 服务,并通过 OAuth 协议进行验证。这些协议针对低带宽的 3G 网络进行了优化。在 WOA 世界中,应该有一种利用组织的 SOA 属性的方法;一种解决方案是在非常结构化的、严格的 SOA 与灵活而又敏捷的 WOA 之间建立一个接口层。例如,该接口层应该通过几次单击就能够让现有的 SOAP Web 服务转变成 REST/JSON 服务。
8 t- m$ Q9 H: N' ^8 X现在,让我们来快速看看移动企业应用程序平台(或 MEAP)如何适应我之前描述的移动应用程序集成场景。 * Y  s1 e4 f- G


; I; i! V3 |, d& |( l
9 g  o0 g- v- Y6 W7 D
MEAP 内幕
移动企业应用程序平台是一个产品和服务的综合套件,通过处理过程的某些细节来支持应用程序的开发和部署。在应用程序部署阶段和整个生命周期中,MEAP 通过添加一个管理层来处理设备、网络和用户组的范围,从而帮助开发人员解决开发移动软件的各种难题。
4 c, Q/ L$ U* R# p# O  `1 q1 oMEAP 的一些常见属性包括: ( @' Y0 X* l0 e# C
  • 跨平台,“只需编写一次,即可到处部署” 的能力。
  • 让您不再纠结于基础业务逻辑的界面。
  • 适用于:
    9 O) f" G2 [- B! e: o" o
    • 公司想要在单个基础架构上部署的多个应用程序。
    • 可扩展到公司目前移动用户群规模的应用程序。
    • 在联线和离线模式均可使用的应用程序。, g' U6 h* G0 k' P1 U& A0 S
  • 易于开发的模板,让程序员无需精通就可以利用较为复杂的语言。
    3 ^) N) O! E6 P  D$ x0 `7 o; ~
常用的 MEAP 结构
MEAP 通常由三个组件组成:
" E- j3 M( E2 V7 I
  • 移动中间件服务器:处理所有的系统集成、安全性、通信、可伸缩性、跨平台支持等。数据没有存储在服务器上;该服务器管理后端系统与设备之间的数据。
  • 移动客户应用程序:连接到中间件服务器,并驱动设备上的用户界面和业务逻辑。它们有 “胖” 版本(安装在此设备上的本地应用程序上)和 “瘦” 版本(以类似 HTML5 这样的形式呈现在设备浏览器中)。
  • 移动配置/开发工具箱:创建并调整移动组件。
    . P" [+ u; E' s# W/ C3 d/ X
我何时应该考虑使用 MEAP?
IT 分析公司 Gartner 建议,如果想让移动功能支持三个或更多的移动应用程序或移动操作系统,或是想要与至少三个后端数据源集成在一起,那么就可以考虑使用 MEAP。(Gartner RAS Core Research Note G00211688, 20 April 2011;需要注册。)


1 v9 Q& R) l% O: x3 d2 g
, P' ]$ W7 z, [) k: ?+ L$ X3 j
真实的示例:Convertigo Mobilizer
Convertigo Mobilizer 是我的团队和我共同创建的,它是一个 MEAP,可为企业提供移动集成所需的一个可调的单点,这样一来,您就可以开发企业级的移动应用程序并重用有价值的现有 IT 资产。Mobilizer 提供了一个能立刻从任何企业数据源或应用程序提取数据并处理数据的核心技术平台;它还能执行来自任何现有网站或应用程序的动态和事务性集成。Convertigo 集成了在 IBM® iSeries 或 zSeries 这类系统上运行的大型主机和遗留应用程序。图 1 显示了 Convertigo Mobilizer 在整个环境中所在的位置。 ' _, I9 X2 b" x2 Z
5 G) f8 r! E) B1 I4 K, w
图 1. Mobilizer MEAP 在环境中的位置
) i7 ^1 Z* D! J/ c & o' D2 v8 {5 l& {+ Z
还记得之前提到的移动集成挑战吗?Mobilizer 解决了这些难题:
- E0 e( ^2 Z5 w$ c( x9 p
  • 现有应用程序的移动支持。这个挑战的解决方案是提供一组功能强大的连接器,这些连接器能够连接到任何基于 Web 或基于大型主机的应用程序,并与之无缝交互,不需要在目标应用程序上做任何更改。
  • 复杂的移动开发语言。这个挑战的解决方案是使用诸如 jQuery Mobile 和 Sencha Touch(与 Apache Cordova/PhoneGap 技术相关)这样的、广受欢迎的、基于 Web 的框架。这些组件使 Web 开发人员能够用其钟爱的语言编写可本地运行在多个平台上的移动应用程序。
  • 自带设备 (BYOD) 的趋势。这个挑战的解决方案是集成刚刚提到的那些框架(jQuery Mobile、Sencha Touch 和 PhoneGap)。
  • 如何创建和定位业务逻辑。这个挑战的解决方案是提供一个能够组合、编排和计算来自多个企业源的数据的功能强大的业务逻辑层。Convertigo Sequencer 可以处理复杂的业务逻辑并执行业务逻辑流,而它们的编程无需操作者掌握很多的技术知识。此外,由于 Sequencer 执行的是元数据描述的流,因此可以避免生成或编译代码。这就意味着一个高度敏捷的开发过程会随之形成,这节省了时间并降低了开发成本。
  • 如何才能不会将移动的面向 Web 的架构错认为 SOA。 这个挑战的解决方案是支持之前建议过的机制,该机制提供了所需的中间件,在非常结构化的、严格的 SOA 与灵活而又敏捷的 WOA 之间建立了一个接口层。' g) b3 X- a# ]7 I, l3 [
现在,让我们来看看 Convertigo Mobilizer 在 IBM SmartCloud Enterprise 上的使用。 , w3 M) h% W+ m( g4 m: c' Z


7 s( ?; l+ b& [$ C# @) l1 \7 U1 M
IBM SmartCloud Enterprise 上的 Convertigo Mobilizer
Convertigo Mobilizer MEAP 在 IBM SmartCloud Enterprise 上可用,这就让企业可以在企业移动性方面利用功能强大的 IBM SmartCloud 特性。 - E$ T* q4 ~/ X7 z
入门
  • 登录 IBM SmartCloud,开始一个实例,选择您的数据中心并查找 Convertigo Enterprise Mashup Server 映像。图 2 所示的是一个 Raleigh 数据中心内的 Convertigo 映像的例子。 " M8 e" w' S4 H- T" ^3 G/ w

    - l) a1 Q+ M( k- b  |图 2. 添加实例1 b* {4 P2 S6 I

    - x# G" P, p  w, m& o9 h' g9 E: V1 t% ]1 G- a. |: h
    Convertigo 映像也可以以 BYOL(自带许可)的方式使用,这意味着您需要从 Convertigo 获得产品的有效许可。如果没有许可,那么 Convertigo Enterprise Mashup Server (EMS) 只提供 30 天的全面服务。
  • 选择 Convertigo EMS 映像并单击 Next
  • 填写要求的字段来启动实例。我们建议在 "Copper" 或 "Silver" 模型上运行 Convertigo。在更高级别的服务器配置上运行它并不能提高性能,因为这个 Convertigo 映像已针对两个到四个虚拟核心的 CPU 进行了量身定做。
  • 启动该实例并等待完成 IBM SmartCloud 配置。准备好后,您就会看到以下面板:
    $ ~7 t' r6 N" [- ~  ?. A7 S8 o7 ^
    图 3. SmartCloud 控制台页面
    , W( ~6 h2 x1 h  Z4 [
  • 查找 IBM SmartCloud 分配的 IP 地址(在图 3 中用红色突出显示)。启动 Google Chrome 浏览器,并访问位于 http:// 之上的运行的 Convertigo EMS 实例。此时,在 IBM SmartCloud 欢迎页面上应该包含 Convertigo EMS。
    . b$ [. Z6 l; |0 O: P6 \  t- L, ?
持久化 Convertigo 服务器工作空间
默认情况下,当在 IBM SmartCloud 上启动一个 Convertigo 映像时,不会将持久存储器附加于运行中的映像。Convertigo 服务器需要一个持久存储器来存储以下这些关键数据: ! \8 P; l- x4 W8 c* F( S' B
  • 所部署的 Convertigo 项目
  • 执行日志
  • 许可信息( r8 j3 r: J8 P2 i2 R2 j. I
此数据只简单存储于一个名为 workspace 的文件系统。要设立一个持久性工作空间,可以使用 IBM SmartCloud 控制台来添加一个持久性文件系统,并将它装在 /mnt/extra 内。这个文件系统将会保存许可信息,所以,您应该在设立好持久存储器之后,在 Convertigo 管理控制台内输入一个有效的 Convertigo 许可密钥(参见图 4)。 # q& _- L. X" D1 u! l

' e" y4 Y, N3 z. e6 m图 4. Convertigo 服务器的启动屏幕7 l* I8 P9 B7 W  U: w, Z
. f+ P' T! T! P, n/ ~8 l" P4 N: o
开发您的第一个移动项目
  • Convertigo Studio 可帮助您开发移动应用程序。通过单击 Convertigo 服务器启动页面内的 Download Convertigo Studio 按钮(参见图 4)可以下载它。Convertigo Studio 是一个基于 Eclipse 的开发工具,提供了 Convertigo 服务器编程环境。项目开发完毕后,就可以将它部署于 IBM SmartCloud 中运行的 Convertigo EMS 之上。
  • 等待完成 Convertigo Studio 的下载(约 250MB)并启动 convertigo-studio-6.x.x-vXXXX-win32-install.exe。在安装过程中,系统会向您询问代理设置。请确保它们的设置是正确的,否则您无法将项目部署到 IBM SmartCloud 上运行的 Convertigo EMS 内。 目前,Convertigo Studio 只能运行在 Windows 上;Mac 版本需满足特殊要求才能使用。
  • 启动 Convertigo Studio。初次运行时,Convertigo Studio 会向您询问注册证书。这个证书对于 IBM SmartCloud 不是必需的,因此单击 Ignore 按钮即可(参见图 5)。 1 e6 h$ F3 B7 o& v1 i/ ^/ Q" g+ M
    6 x! F& R4 z# T- e6 c' g
    图 5. 注册窗口
    4 k8 B9 y5 v  j0 F( X1 u. M/ |( o6 z
  • 在随后出现的消息框内确认 yes
    7 e( H! w- R0 S* ]" g& d
Convertigo Studio 现在应该已经启动并运行。( d& j5 C8 e" `. e4 C
开发您的第一个项目
首先,必须了解 Convertigo 编程模型。这个模型基于服务器端编程和客户端(移动)编程。服务器端和客户端通过 JSON/REST/XML 协议在 http 或 https 上进行交互。 Convertigo Studio 让两端编程可以在惟一的集成环境(即基于 Eclipse 的 Convertigo Studio)内完成。
$ \$ z- ~( c$ |( Y9 u: A& l- Q& H3 y0 b; }! P
图 6. 移动设备与服务器的交互9 V; B, c0 n# v3 t

+ a4 S8 b! u& }6 k3 @服务器端编程模型
+ b- G6 x/ s/ c3 W7 P, |服务器端编程基于 Convertigo 对象的汇编和配置,这些对象也称为连接器、事务和序列:
  d- F* h2 X2 T; g7 l$ @, S: Q
  • 连接器负责处理到后端应用程序的连接。目前有几种类型的连接器:
    ! O7 X2 M- G& L& B, W
    • SQL 连接器可连接到任何与 JDBC 兼容的数据库。
    • HTTP 连接器使用任何现有的 SOAP/REST/JSON Web 服务。
    • Legacy Screen 连接器连接到任何 iSeries、zSeries 或基于 UNIX® 屏幕的应用程序。
    • HTML 连接器连接到任何现有的、基于 Web 的应用程序。
      2 o7 f6 c( W& v8 C1 [! e: e
  • 事务负责处理与远端系统的基本交互。任何事务都会基于现有 Convertigo 连接器之一。例如:
    7 S( r- p" E; A5 o" H# H
    • SQL 事务执行 SQL 连接器上的特定 SQL 请求,以便从一个数据库中读取数据或将数据写入数据库。
    • HTTP 事务在 SOAP/REST 或 JSON 基础上调用任何基于 HTTP 的 Web 服务。
    • HTML 事务能够连接到任何现有的基于 Web 的应用程序、与之交互、填写表单,以及单击任何的 Web UI 元素,以一个结果页结束,而这个结果页会以 XML 响应的形式进行读取和构造。
    • Legacy Screen 事务能够连接到任何基于屏幕的 TN5250、TN3270 和 Telnet 应用程序,在读取和写入过程中与之交互,并以构造好的 XML 响应的形式返回数据。
      ) v2 n  ~/ }1 `: Y
  • 序列 (sequence) 负责安排不同连接器上的事务。序列可以实现业务逻辑流、能够做决策、处理循环以及并行执行几个线程。
    6 C% P# u" x! d
虽然 Convertigo 内可用的 SQL 和 Web 服务连接器在其他 MEAP 中十分常见,但是 HTML 和 Legacy Screen 连接器却是 Convertigo MEAP 才有的。通过实现对所有现有业务应用程序的非侵入性连接,这些连接器提供了一种功能强大的移动支持技术。 ) V0 q; q) J" n3 X8 D: X' X$ y- `
借助自身的一组连接器,Convertigo Mobilizer 可以连接到任何目标应用层,使得移动应用程序能够继承所有现有的业务逻辑,如图 7 所示。 . U, ?+ H7 ^6 ]

2 G& J6 T! K( I6 Y1 B" X/ h图 7. 连接到任何目标应用层& f; H/ J  Y8 Q

1 e0 ~1 T0 }- O3 J8 C( [" o图 8 展示了不同 Convertigo 组件之间的交互。 8 |* `; k8 v( r0 C! F6 Q, S

: r6 G# |+ O& a6 w1 s' g% U; A; d/ p图 8. 全局 Convertigo 组件0 N0 a/ o( ~; X& c, g( b

5 B4 t, q0 j2 {5 ]8 B1 Z" t有关服务器端编程的更多信息,请参考一些入门教程(在参考资料中)。 4 w2 y8 r8 m1 l
客户端编程模型
0 l7 o2 V- m. ~' k对于 Convertigo MEAP,客户端编程是使用 HTML5 和 JavaScript 框架来完成的。Convertigo 集成对 jQuery Mobile 和用于用户界面的 Sencha Touch 框架,并使用 PhoneGap/Apache Cordova 实现了跨平台本机应用程序支持。 7 W6 U, f; |1 K
利用这些框架,只需编写一次客户应用程序,即可在四种不同的移动平台(iOS、Android、Blackberry 6 和 Windows Phone 7.5)上运行该程序,还可以将该应用程序作为移动 Web 应用程序来运行,从而避免了应用程序存储部署过程。请参考一些入门手册(参考资料),获得开发您的第一个客户端 UI 项目的帮助。
以 US Directory 为样例开发您的项目
' w2 {' P1 m9 p您还可以借助一个现实的使用 Studio 示例,比如 US Directory 样例。此项目展示了 usdirectory 网站是如何支持移动的。
/ X! `, q1 J7 ], z, X7 x
  • 要在 Convertigo Studio 中加载这个样例,请转至 File > New > Project
  • 浏览至 Convertigo projects > Sample > Mobile Samples 并选择 Sencha-based US Directory Sample(参见图 9)。
    2 C" ^( d2 Y" w8 X- j  q7 u. H/ c; \( g& L/ P9 C! }+ e& I: O& [
    图 9. US Directory 样例7 k7 G& [* c5 V. W7 m& y
  • 完成这个向导;此项目使用的是 Sencha Framework,所以向导会让您将它下载到您的工作站。 4 y6 w- I5 ^! C; g# }; M+ W& Y; V% L
    ) @5 L( w; ]  X* l
    图 10. Sencha 下载向导
    , d0 o$ d' l! A# ] 0 g; e9 T, B5 r( y+ ?6 Y1 q

    + q/ b$ H0 a; k1 d请确保已经下载了 Sencha Touch 1.x 框架。此向导内提供的链接可能会将您带到 Sencha 2.0 下载页面,所以请确保找到的是 Sencha 1.X 下载链接。
  • 完成 Sencha Framework 下载后,请将 ZIP 文件复制到向导突出显示的目录中,并单击 Finish。这样就可以即那个 US Directory 样例加载到 Convertigo Studio 中。 2 l7 _9 i* Z7 h
    / ], D; c* o1 W8 Z, o8 s$ s
    图 11. 加载样例
    " M# e* {% \' u! H  i4 ~1 \" P' }0 w& v/ f2 K
将项目部署到在 SmartCloud 上运行的 Convertigo EMS& e4 \) b* J& G4 ^1 K! m' h; C9 r
此项目现在已经在您的本地 studio 内打开。要将其部署到您的 IBM SmartCloud 帐户的 Convertigo 服务器,可以:
& ~4 [/ D' {3 H+ i9 |  O
  • 右键单击 Studio 项目浏览器中的项目名称并选择 Deploy
  • 此时部署窗口会打开。在第一个字段内键入 SmartCloud 上 Convertigo Server 的地址:/convertigo。
  • 在 Server administrator 字段内键入 admin,在 Password 字段内键入 admin。不要使用任何 http 或 https 前缀。例如: * B5 o  |/ u# G5 f- m9 Y; H" i

    0 P1 M% Y9 ^4 K9 h" M( C; @+ u" m7 |图 12. 部署窗口9 B4 u" g/ _2 ?1 f# K6 k
  • 单击 Deploy
  • 等待项目部署。 * N& `8 O6 p. p, j3 |& b* p) n

    ! t4 |- z1 P( v图 13. 部署
    ; s: f% ~5 |6 p- }; \, x. D
  • 完成项目部署之后,会出现一个确认窗口: 4 T2 J! w9 w$ e1 t
    ) k8 b7 J; A& H7 d% J+ B. r# ]0 _
    图 14. 部署完毕8 v+ W# g' b& k: R
  • 要运行此项目,只需单击所提供的链接。确保使用了一个 Google Chrome 浏览器。
    7 h% L4 }8 ^  Y. A7 z$ L2 R5 Z
    - }' u8 X  p  ?图 15. 项目的测试平台( b, [8 ^; {, G& r( _

    ! _! n4 z% D  @+ e1 w: v3 W
您的项目现在已成功部署到了 IBM SmartCloud 上运行的 Convertigo 内。
* K. ]8 l% t7 Y9 [$ q" N要将您的应用程序作为一个移动 Web 应用程序运行,请执行以下操作:5 m% T9 w, w+ ]9 J
  • 随意打开一个设备,比如 Android:
    ( O: H. v# [0 J& _& A6 {8 N. i- l8 t9 q8 O& p* o9 b
    图 16. 作为 Web 应用程序运行" k7 L9 k: E/ R2 O
  • 您可以单击 Execute 或用您的 Android 设备扫描 WebApplication QR 码。单击 Execute 按钮即可在 Convertigo 的测试平台中运行这个移动应用程序。 ! D$ @0 b' b% R' [0 r

    6 U4 c; `8 Z# v+ |) P! g( Q! U图 17. 运行项目; D: F' `; g; _+ B, J4 Q, C
您还可以通过复制页面上突出显示的 URL 来获得此 WebApplication 的完整 URL。 2 O+ C, D, D8 _8 L2 ?& I% A0 m' j
构建本地跨平台应用程序! Q; x2 M5 y* x; F6 |7 ^
有了一个正常工作的移动 Web 应用程序后,就可以为每个受支持的平台构建本地包。此过程会为 iOS 平台(iPhones 和 iPad)生成 .IPA 文件,为 Android 平台(电话或平板电脑)生成 .APK 包。
, K5 ^* p" e2 J! {; s要构建本地包,请执行以下步骤:
$ s$ }! l) O8 O$ W% }, M
  • 单击 Build mobile applications3 o4 r* [5 w1 Q0 c. r

    0 v5 v: ^7 h  E' [$ p9 e$ U% k图 18. 构建本地应用程序
  • 单击 Build the mobile devices。Convertigo 开始为每个平台构建应用程序并显示一个等待符号。当完成应用程序的构建之后,等待符号会被一个 QR 码替代。 # `0 k; |$ s4 S: |

    " T6 z! O! Q/ b: q图 19. 本地应用程序构建
  • 可以扫描或单击这个 QR 码,将本地应用程序文件下载到工作站。然后再将这些应用程序提交给公用的 Apple 或 Android 存储,或是在您的私有企业存储中发布这些应用程序。
    2 R( v  C# {6 D5 p  O& J


% N8 t* z9 _( ^' p3 G5 ?( \2 i9 z7 X. V
结束语
MEAP 是一款强大的工具,能够快速地为您的云环境提供移动支持,并且没有陡峭的学习曲线。通过了解 MEAP 是什么、能做什么以及应该何时应考虑使用它,您可以更轻松地解决 “多设备对多平台” 的移动应用程序集成挑战。 * B% U% _* Q; T" S
. N7 r6 j  T, b* [. h) ?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
 楼主| 发表于 2013-2-19 08:50:27 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

SCMLife推荐上一条 /4 下一条

QQ|小黑屋|手机版|无图版|SCMLife.com ( 京ICP备06056490号-1 )

GMT+8, 2018-12-11 22:48 , Processed in 0.070792 second(s), 7 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

快速回复 返回顶部 返回列表