首页 文章 精选 留言 我的

精选列表

搜索[基础搭建],共10000篇文章
优秀的个人博客,低调大师

关于SAP CRM中间件系统搭建中遇到的一些问题

Sent: Friday, August 8, 2014 12:42 PM Subject: RE: CRM 713 X3D环境SETUP 之前我遇到一个问题,从ERP QV5到CRM X3D的response没有回来,原因是因为在ERP端的CRMRFAPCR表里面,没有到X3D的配置,新增一条配置信息: OBJNAME = MATERIAL && DOWNLOAD = R, 这样会优先选出更Specific的到X3D的这条。 重新执行,Request就可以返回CRM端了,但是还有错: Debug发现是因为在CRM上配的源系统跟Download过来的系统不匹配,在CRM端的CRMMLSGUID表里面: 可以看到X3D原来配的系统是QI3,之前用T-CODE SMOEAC找到的SITE里面有多个系统: 之前我想QI3已经被X3C用了,而且X3D到QI3的SM59连接测试不通过,所以就重新找了一个看起来好用的QV5,现在似乎又绕回来了。 能想到的有两个办法:X3D继续用QV5,在X3D的CRMMLSGUID表里增加QV5配置作为workaround,测完了删掉。X3D连QI3,报IT TICKET建立X3D/QI3的双向RFC连接,在QI3的CRMRFAPCR表里配置回到X3D的信息,考虑到X3C已经在QI3上测了,可能要用不同测Client避免冲突。 本文来自云栖社区合作伙伴“汪子熙”,了解相关信息可以关注微信公众号"汪子熙"。

优秀的个人博客,低调大师

JAVA开发者看好了,教你如何使用eclipse搭建python开发环境

前言有很多的IDE,今天为大家介绍一个eclipse+Pydev的组合,记录自己的配置。**一、前提准备** eclipse下载:http://www.eclipse.org/downloads/ PyDev下载:http://www.pydev.org/download.html Python下载:https://www.python.org/downloads/ jdk下载 :http://www.oracle.com/technetwork/java/javase/downloads/index.html 二、配置 废话不多说,说重点 安装JDK。安装路径我设置为C:javajdk1.7.0_51,之后的jre也放在C:java目录下 path变量的设置: ;C:jdk1.7.0_51bin; (记得前后都加上分号。简单地设置path就可以用了,关于JAVA_HOME和CLASSPATH的配置见:http://my.oschina.net/cqslpxzzp/blog/363433) 安装Python(为了学习方便,同时安装3.4和2.7) 解压eclipse和PyDev,将PyDev中plugins和features中内容复制到eclipse的对应目录中,即可启动eclipse 配置Pyhton解释器: 编码改为UTF-8: Windows -> Preferences -> General -> Editors -> Text Editors -> Spelling -> encoding : utf-8 Windows -> Preferences -> General -> Workspace -> Text file encoding : utf-8 模板: Windows -> Preferences -> PyDev -> Editor -> Templates -> <Empty> 第一行写入: #coding=utf-8 (这句主要是为了照顾python 2.x,在3.x中默认使用utf-8。以后新建.py文件时eclipse会自动在文件前加上模板的内容) 修改字体:中文默认采用西欧字符,中文太小 Windows -> Preferences -> General -> Appearance -> Colors and Fonts -> Basic -> Text font -> 脚本:中欧字符 修改注释颜色:默认的浅绿色实在看不太清 Windows -> Preferences -> PyDev -> Editor -> Apprearances color options -> Comments 显示行号: Windows -> Preferences -> General -> Editors -> Text Editors -> Show line numbers 定义快捷键 : 我使用esc来执行程序 Windows -> Preferences -> General -> Editors -> Keys **小编推荐一个学python的学习qun 740322234无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!** 最后是布局,右边有3个console,一个显示运行结果,另两个分别是Python 3 和Python 2的shell,方便测试 设置步骤: 最后一定记得钉住,不然一运行代码,Python console又会变成java Stack Trace console 修改布局后记得保存下来(不过这样改了console后,虽然下次打开布局依旧,可是还得重新设置console内容,不过为了学习方便也值得) 然后就可以看到新的布局

优秀的个人博客,低调大师

为自己搭建一个分布式 IM 系统二【从查找算法聊起】

前言 最近这段时间确实有点忙,这篇的目录还是在飞机上敲出来了的。 言归正传,上周更新了 cim 第一版;没想到反响热烈,最高时上了 GitHub Trending Java 版块的首位,一天收到了 300+ 的 star。 现在总共也有 1.3K+ 的 star,有几十个朋友参加了测试,非常感谢大家的支持。 在这过程中也收到一些 bug 反馈,feature 建议;因此这段时间我把一些影响较大的 bug 以及需求比较迫切的 feature 调整了,本次更新的 v1.0.1 版本: 客户端超时自动下线。 新增 AI 模式。 聊天记录查询。 在线用户前缀模糊匹配。 下面谈下几个比较重点的功能。 客户端超时自动下线 这个功能涉及到客户端和服务端的心跳设计,比较有意思,也踩了几个坑;所以准备留到下次单独来聊。 AI 模式 大家应该还记得这个之前刷爆朋友圈的 估值两个一个亿的 AI 核心代码。 和我这里的场景再合适不过了。 于是我新增了一个命令用于一键开启 AI 模式,使用情况大概如下。 欢迎大家更新源码体验,融资的请私聊我🤣。 聊天记录 聊天记录也是一个比较迫切的功能。 使用命令 :q 关键字 即可查询与个人相关的聊天记录。 这个功能其实比较简单,只需要在消息发送及接收消息时保存即可。 但要考虑的一点是,这个保存消息是 IO 操作,不可避免的会有耗时;需要尽量避免对消息发送、接收产生影响。 异步写入消息 因此我把消息写入的过程异步完成,可以不影响真正的业务。 实现起来也挺简单,就是一个典型的生产者消费者模式。 主线程收到消息之后直接写入队列,另外再有一个线程一直源源不断的从队列中取出数据后保存聊天记录。 大概的代码如下: 写入消息的同时会把消费消息的线程打开: 而最终存放消息记录的策略,考虑后还是以最简单的方式存放在客户端,可以降低复杂度。 简单来说就是根据当前日期+用户名写入到磁盘里。 当客户端关闭时利用线程中断的方式停止了消费队列的线程。 这点的设计其实和 logback 写日志的方式比较类似,感兴趣的可以去翻翻 logback 的源码,更加详细。 回调接口 至于收到其他客户端发来的消息时则是利用之前预留的消息回调接口来写入日志。 收到消息后会执行自定义的回调接口。 于是在这个回调方法中实现写入逻辑即可,当后续还有其他的消息处理逻辑时也能在这里直接添加。 当处理逻辑增多时最好是改为责任链模式,更加清晰易维护。 查找算法 接下来是本文着重要讨论的一个查找算法,准确的说是一个前缀模糊匹配的算法。 实现的效果如下: 使用命令 :qu prefix 可以按照前缀的方式搜索用户信息。 当然在命令行中其实意义不大,但是在移动端中确是比较有用的。类似于微信按照用户名匹配: 因为后期打算出一个移动端 APP,所以就先把这个功能实现了。 从效果也看得出来:就是按照输入的前缀匹配字符串(目前只支持英文)。 在没有任何限制的条件下最快、最简单的实现方式可以直接把所有的字符串存放在一个容器中 (List、Set),查询时则挨个遍历;利用 String.startsWith("prefix") 进行匹配。 但这样会有几个问题: 存储资源比较浪费,不管是 list 还是 Set 都会有额外的损耗。 查询效率较低,需要遍历集合后再遍历字符串的 char 数组(String.startsWith 的实现方式)。 字典树 基于以上的问题我们可以考虑下: 假设我需要存放 java,javascript,jsp,php 这些字符串时在 ArrayList 中会怎么存放? 很明显,会是这样完整的存放在一个数组中;同时这个数组还可能存在浪费,没有全部使用完。 但其实仔细观察这些数据会发现有一些共同特点,比如 java,javascript 有共同的前缀 java;和 jsp 有共同的前缀 j。 那是否可以把这些前缀利用起来呢?这样就可以少存储一份。 比如写入 java,javascript 这两个字符串时存放的结构如下: 当再存入一个 jsp 时: 最后再存入 jsf 时: 相信大家应该已经看明白了,按照这样的存储方式可以节省很多内存,同时查询效率也比较高。 比如查询以 jav 开头的数据,只需要从头结点 j 开始往下查询,最后会查询到 ava 以及 script 这两个个结点,所以整个查询路径所经历的字符拼起来就是查询到的结果java+javascript。 如果以 b 开头进行查询,那第一步就会直接返回,这样比在 list 中的效率高很多。 但这个图还不完善,因为不知道查询到啥时候算是匹配到了一个之前写入的字符串。 比如在上图中怎么知道 j+ava 是一个我们之前写入的 java 这个字符呢。 因此我们需要对这种是一个完整字符串的数据打上一个标记: 比如这样,我们将 ava、script、p、f 这几个节点都换一个颜色表示。表明查询到这个字符时就算是匹配到了一个结果。 而查到 s 这个字符颜色不对,代表还需要继续往下查。 比如输入关键字 js 进行匹配时,当它的查询路径走到 s 这里时判断到 s 的颜色不对,所以不会把 js 作为一个匹配结果。而是继续往下查,发现有两个子节点 p、f 颜色都正确,于是把查询的路径 jsp 和 jsf 都作为一个匹配结果。 而只输入 j,则会把下面所有有色的字符拼起来作为结果集合。 这其实就一个典型的字典树。 具体实现 下面则是具体的代码实现,其实算法不像是实现一个业务功能这样好用文字分析;具体还是看源码多调试就明白了。 谈下几个重点的地方吧: 字典树的节点实现,其中的 isEnd 相当于图中的上色。 利用一个 Node[] children 来存放子节点。 为了可以区分大小写查询,所以子节点的长度相当于是 26*2。 写入数据 这里以一个单测为例,写入了三个字符串,那最终形成的数据结构如下: 图中有与上图有几点不同: 每个节点都是一个字符,这样树的高度最高为52。 每个节点的子节点都是长度为 52 的数组;所以可以利用数组的下标表示他代表的字符值。比如 0 就是大 A,26 则是小 a,以此类推。 有点类似于之前提到的布隆过滤器,可以节省内存。 debug 时也能看出符合上图的数据结构: 所以真正的写入步骤如下: 把字符串拆分为 char 数组,并判断大小写计算它所存放在数组中的位置 index。 将当前节点的子节点数组的 index 处新增一个节点。 如果是最后一个字符就将新增的节点置为最后一个节点,也就是上文的改变节点颜色。 最后将当前节点指向下一个节点方便继续写入。 查询总的来说要麻烦一些,其实就是对树进行深度遍历;最终的思想看图就能明白。 所以在 cim 中进行模糊匹配时就用到了这个结构。 字典树的源码在此处: https://github.com/crossoverJie/cim/blob/master/cim-common/src/main/java/com/crossoverjie/cim/common/data/construct/TrieTree.java 其实利用这个结构还能实现判断某个前缀的单词是否在某堆数据里、某个前缀的单词出现的次数等。 总结 目前 cim 还在火热内测中(虽然群里只有20几人),感兴趣的朋友可以私聊我拉你入伙☺️ 再没有新的 BUG 产生前会着重把这些功能完成了,不出意外下周更新 cim 的心跳重连等机制。 完整源码: https://github.com/crossoverJie/cim 如果这篇对你有所帮助还请不吝转发。

优秀的个人博客,低调大师

技本功丨甲方大人来了之运维数据分析平台搭建实战

袋鼠云日志团队时常遇到各种各样的甲方大人,毕竟我们是一个非常优秀的企业服务公司(自信满满),当然面对甲方大人的时候要做到处变不惊,临危不乱,镇定自若的接受需求…… 甲方大人的常用台词一定要记住:我们很忙,有好几套监控系统,能不能再不砍掉监控系统的情况下,帮助我们搞定日运维需求呢?这样的需求每天通过项目经理→产品经理→研发经理→浣熊(我)。 But,这个需求有点麻烦呀~ 我捋过我日渐稀疏的发,只能加油干啦! 先说下甲方大人的需求和痛点,甲方大人说平日的系统运维工作主要围绕应用、主机、数据库和业务四个方面。 (1)应用发布平台是IBM的WebSphereApplicationServer(简称WAS),应用的性能监控基于WAS自带监控模块 (2)主机监控基于IBMTivoliMonitoringSystem,业务监控则通过分析应用日志的方式实现 (3)数据库监控依赖一个古老的oracle性能监控工具 (4)应用日志需要登陆到AIX业务机器上查看 “每当出现一个问题,先登陆was看下业务进程性能趋势,再登陆Tivoli查看主机性能趋势,然后登陆数据库监控查看数据库性能趋势,再然后登陆AIX主机查看日志。一套下来肚子就饿了,到食堂发现好吃的饭菜已经被别人抢光了,希望你们能帮我们改善改善伙食“。嗯,听上去影响蛮大的,不过他们怎么知道我烧菜的手艺的,上周末做的清蒸鲈鱼味道还不错... 四个字,赶紧干活。在了解了甲方大人的需求和痛点后,经过一番苦思冥想,设计了下面的看上去有点复杂的架构图。大道至简,借鉴老子的一段话附和一下这张图,“人法地、地法天、天法道、道法自然”,老子用了十三个字,将天、地、人乃至整个宇宙的生命规律精辟涵括、阐述出来。 菜谱准备好了,小葱拌豆腐,开始下锅。 数据采集上,针对WAS、Tivoli、Oracle和AIX应用主机的采集需求,需要coding了(没有什么需求是一坨代码解决不了的,如果有那就两坨),前方高能,请做好笔记: (1)开发一个WAS进程性能采集器,参考https://github.com/alexivkin/WebSphere-Performance-Monitor,万能的python,哦no,这个是Jython,看起来跟python一样嘛,无非就是python里面用java,java里面跑python。由于是三年前的版本,加上没有IBM WAS的测试环境,花掉一个上午时间脑补调试,什么是脑补调试法,答按行过目代码、眼睛输入,大脑跑跑(非专业人士请勿模仿); (2)开发一个Tivoli数据收集器,又花掉一个晚上,Tivoli支持Soap方式拉取新能数据,我不会告诉你可以用一个CURL拉取所有主机性能所有数据的,想知道的留言处扣666; (3)开发一个Oracle数据库性能采集器,还好elastic 大佬开源了beats(https://github.com/elastic/beats),坑爹的是竟然不支持oracle,莫非oracle大佬的开发人员都休眠了么;花了两个晚上捣鼓捣鼓,支持个tps、qps、物理读、逻辑度、吞吐量还是可以的,小算一下支持200多个指标吧,oracle采集beat依赖oracleclient不是一般的麻烦; https://www.oracle.com/technetwork/topics/intel-macsoft-096467.html (4)开发一个AIX日志文件采集器,袋鼠云有技术大牛开发了一个,拿过来直接集成; https://github.com/DTStack/jfilebeat 数据接收和解析组件,袋鼠云自研了java版本的logstash,参考: https://github.com/DTStack/jlogstash 日志接收和解析性能是ruby版本性能5倍以上,关键是配置简单,分钟内上手 数据存储方面,最近一周的日志数据全部投递到elasticsearch里,以防哪天甲方大人心血来潮想搜个日志啥的;结构化的应用进程数据、主机性能数据、数据库性能数据和业务日志数据投递到clickhouse里,通过clickhouse强大的聚合计算能力(多表数据关联,sum/avg等聚合计算),计算出同一时间线上的业务和进程、主机以及数据库性能的关联趋势图。 一句话总结下ck吧,在sql里计算我只服ck! 链接: https://clickhouse-docs.readthedocs.io/en/latest/functions/ 源码请见: https://github.com/yandex/ClickHouse 坚持看到这里就是真爱了,贴上一张系统架构图,图中左方是数据采集层,easymanager是公司自研的自动部署神器(不用想了,没有开源),右边是数据展示端,把应用、主机、数据库、日志数据统一展示在一张大屏上,废话不说了,上菜!

优秀的个人博客,低调大师

搭建JEESZ分布式架构1--CentOs下安装jdk7(环境准备)

声明:因为运行环境是基于Linux系统的,在做此框架之前需要做一些前期的环境准备工作CentOs下安装jdk7网上很多实例,因为博客后期作为框架的原生教程,故这边做详细的安装记录 首 先在CentOs下下载jdk7解压文件,tar包安装(目前Oracle官方上,对于文件的下载,加了Cookie验证机制,所以直接下载文件包,会出 现找不到的错误,最老土的办法,本地下载,使用FTP上传服务器),我这边已经下载好了,通过ssh已经上传到指定的目录,这里直接讲解安装的过程。 一、准备工作卸载OpenJDK1.查找需要卸载的OpenJDK[root@cloud/]rpm -qa |grep openjdk | grep -v grepJava-1.7.0-openjdk-1.7.0.75-2.5.4.2.el7_0.x86_64java-1.6.0-openjdk-devel-1.6.0.34-1.13.6.1.el7_0.x86_64java-1.7.0-openjdk-headless-1.7.0.75-2.5.4.2.el7_0.x86_64java-1.6.0-openjdk-1.6.0.34-1.13.6.1.el7_0.x86_64 java-1.7.0-openjdk-devel-1.7.0.75-2.5.4.2.el7_0.x86_64 2.依次卸载 [root@cloud/]rpm -e --nodepsjava-1.7.0-openjdk-1.7.0.75-2.5.4.2.el7_0.x86_64[root@cloud/]rpm -e–nodeps java-1.6.0-openjdk-devel-1.6.0.34-1.13.6.1.el7_0.x86_64[root@cloud/]rpm -e–nodeps java-1.7.0-openjdk-headless-1.7.0.75-2.5.4.2.el7_0.x86_64[root@cloud/]rpm -e–nodeps java-1.6.0-openjdk-1.6.0.34-1.13.6.1.el7_0.x86_64[root@cloud /]rpm -e –nodepsjava-1.7.0-openjdk-devel-1.7.0.75-2.5.4.2.el7_0.x86_64注:权限不足,请使用su root权限 二、安装配置JDK7 1.解压安装jdk文件 [root@cloud /]tar-zxvf jdk-7u75-linux-x64.tar.gz./jdk1.7.0_45/jre/lib/management/snmp.acl.template./jdk1.7.0_45/jre/lib/logging.properties........../jdk1.7.0_45/db/LICENSE./jdk1.7.0_45/db/NOTICE./jdk1.7.0_45/db/3RDPARTY./jdk1.7.0_45/db/README-JDK.html[root@cloud tools]#lsjdk1.7.0_45jdk1.7.0_45.tar.gz[root@cloud tools]#mkdir /usr/java[root@cloud tools]#mv jdk1.7.0_45/ /home/java/jdk1.7[root@cloud tools]#rm -rf . jdk1.7.0_45 2.配置JDK7编辑/etc/profile文件[root@cloud jdk1.7]#vi /etc/profile在/etc/profile文件尾部添加export JAVA_HOME=/usr/java/1.7.0_45exportCLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport PATH=$PATH:$JAVA_HOME/bin使用source /etc/profile命令重新加载/etc/profile文件,使修改的内容在当前shell窗口中生效 三、测试[root@cloud ~]#java -versionJavaversion "1.7.0_45"Java(TM) SE Runtime Environment (build 1.7.0_45-b18)Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode) 表示已经安装成功~~~

优秀的个人博客,低调大师

使用.NET Core搭建分布式音频效果处理服务(六)让Middleware自动Invoke

为何要用中间件来实现音频处理的监听服务 当然也可以使用Startup来进行服务的自启动,或者也可以使用quartz定时调度任务来启动音频服务,大家随意。 笔者认为使用中间件的目的,是为了分离应用和服务,也是一种解耦手段。 我们知道,在NETCORE中的中间件,有点类似像AOP的一种实现形式,他的调用方式是通过Request=>Middleware=>next=>custom logic=>Response。我们可以用来做日志记录、权限验证、事物处理,多个中间件形成一个处理管道,甚至可以实现自定义的MVC和依赖注入。 创建一个中间件 为了便于区分,我们扩展一个名为“MediaHandlers”的IApplicationBuilder 1 public static class MediaHandlers 2 { 3 public static IApplicationBuilder UseMediaAudioHandlerMiddleware(this IApplicationBuilder builder, 4 MediaAudioOptions options) 5 { 6 if (builder == null) 7 throw new ArgumentNullException(nameof(builder)); 8 9 return builder.UseMiddleware<MediaAudioMiddleware>(options); 10 } 11 } 再创建一个名为“MediaAudioMiddleware”的中间件,其实就是一个实现类,但需要传递对象RequestDelegate做请求代理。 并且,我们将在中间件中实现依赖注入,而中间件的依赖注入却无法通过构造函数的方式进行注入,需要通过Invoke来实现依赖注入,完整代码如下: 1 public async Task Invoke(HttpContext context, 2 IDataOpService iDataOpService, 3 ICacheAsyncService iCacheAsyncService, 4 IMsgBusService imsgBusService, 5 IHostingEnvironment iHostingEnvironment) 6 { 7 _dataOpService = iDataOpService; 8 _iMsgBusService = imsgBusService; 9 _iCacheAsyncService = iCacheAsyncService; 10 _ihostingEnvironment = iHostingEnvironment; 11 12 await _next(context); 13 } 跟之前的控制器注入的内容类型是一样的。然后我们再来看看构造函数中需要实现的一些事情: public MediaAudioMiddleware(RequestDelegate next, MediaAudioOptions options) { _next = next; Task.Factory.StartNew(() => { Thread.Sleep(3 * 1000); //...需要自定义启动的方法 }); } 构造函数中默认必须传递RequestDelegate类型参数,用于委托执行Request之后Response之前的代理。 将需要启动的服务已子任务(子线程)的方式交给Task工厂进行自行管理,再次分离了主管道请求应用。 但是,默认这个中间件是不会自动启动的。。。因为没有建立一个请求管道。 强制建立一个请求管道 笔者的思路是,通过httpclient请求主管道中的一个任意的API接口(比如你自定义实现的服务器信息接口),从而强制实现该请求管道的所有事情,比如循环,比如监听等等。参考如下: 1 using (var httpClient = new HttpClient()) 2 { 3 httpClient.BaseAddress = new Uri($"{General.LocalHostUrl}/Info"); 4 var r = httpClient.GetAsync(httpClient.BaseAddress).Result; 5 if (!r.ToString().Contains("200")) return; 6 Console.WriteLine("MediaAudioMiddleware Running"); 7 var mediaHandler = new AudioHandlerWorkUnit(iDataOpService: _dataOpService, 8 iCacheAsyncService: _iCacheAsyncService, 9 imsgBusService: _iMsgBusService, 10 iHostingEnvironment: _ihostingEnvironment, 11 millsSeconds: options.MillsSeconds 12 ); 13 mediaHandler.DoStart(); 14 } 当然,需要在命令参数中(或前置参数中约束该管道只建立一次),也许笔者的实现方式欠妥,如果你有更好的方法,欢迎交流。 感谢阅读

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册