发表日期: 2021-04-27 08:43:05 浏览次数:155
邳州网站建设【邳州网络公司】邳州做网站、邳州微信公众号开发、邳州网站设计、邳州小程序制作
邳州,简称“邳”,江苏省徐州市代管县级市, [1-2] 古称良城、邳国、下邳、邳县,位于苏鲁交界,东接新沂市,西连徐州市铜山区、贾汪区,南界睢宁县,北邻山东省兰陵县。 [3] 1992年撤县设市。
邳州历史悠久,境内大墩子文化遗址距今6000年,是江苏文明最早的起源之一。境内有邳州市艾山风景名胜区、沙沟湖水杉公园、国家银杏博览园、小萝卜头纪念馆等旅游景点。邳州的城市精神是“创新、争先、开放、包容”。 [4]
邳州发展的目标是东陇海产业带重要的水陆交通枢纽、新兴工贸城市,京杭运河沿岸具有水乡特色和历史文化底蕴的生态宜居城市。
2019年7月,邳州入选国家知识产权强县工程试点县(区)。2019年,邳州位居全国综合实力百强县市第37位、经济竞争力百强第40位、全国投资潜力百强县市第18位、全国绿色发展百强县市第33位、全国科技创新百强县市第36位、全国新型城镇化质量百强县市第51位。
除了制定了客户端接入规范,我们在Family 2.0 项目中还制定了服务端开发规范。希望此开发规范,能约束开发人员产出更优质的代码,并作为快速开发教程,为新加入的团队成员提供指引和帮助,降低学习成本。
1、Git代码签出
新项目成员需要与项目经理申请Git帐号和权限,并创建各自对应的个人开发分支或者协同开发分支,然后在本地开发环境进行代码签出和部署。
2、开发流程
a、测试先行
根据PhalApi框架所推荐的TDD一般开发步骤,在编写产品代码前,先编写测试代码。可使用phalapi-buildtest命令来生成单元骨架代码。
b、实现接口服务
在测试驱动开发的指导下,根据从Api接口层、Domain领域层再到Model数据源层的顺序进行开发。
c、提供文档
除了提供PhalApi在线接口文档外,还需要参考附录A,编写提供接口服务文档。
d、与客户端联调
当接口服务开发完成并自测通过后,与客户端开发人员进行必要的开发联调。
e、数据库变更
当有数据库变更时,如服务器迁移、新加表或字段等,请将变更的SQL语句保存到./Config/sql目录下,并同步外网环境。
3、常用操作
对于登录态验证,可以有两种检查方式,一种是在失败时直接抛出异常的拦截式检测,另一种是在失败时返回检测结果的温柔式检测。分别如下:
// 拦截式检测:如果未登录时,直接400返回DI()->userLite->check(true);// 温柔式检测:获取登录的情况,为不同的业务提供不同的选择DI()->userLite->check();复制代码
对于原始的数值型的用户ID,由于其可遍历性,为了保障用户信息的安全性,需要将数字转换成不可遍历、更复杂的字符串。对于这两者之间的互相转换,可以使用:
// UUID --> userId$userId = Domain_User_Helper::UUID2UserId('AAAD56B5460339234A4A2492680171A88818B96B8D8DA687FB');// userId --> UUID$UUID = Domain_User_Helper::userId2UUID(187);复制代码4、约定编程
接口参数、返回字段、数据库的字段,这些外部可见的数据全部使用下划线分割的格式,如:
接口参数:
// 正确的&user_id=888// 错误的&userId=888复制代码
返回字段:
// 正确的"device_type": "cube",// 错误的"deviceType": "cube",复制代码
数据库字段:
-- 正确的`user_id` bigint(20) DEFAULT '0' COMMENT '创建者的用户ID',-- 错误的`userId` bigint(20) DEFAULT '0' COMMENT '创建者的用户ID',复制代码
内部PHP代码变量则使用驼峰命名法,如:
接口参数规则:
// 正确的'otherUserId' => array('name' => 'other_user_id', 'type' => 'int', 'min' => 1, 'require' => true),// 错误的'other_user_id' => array('name' => 'other_user_id', 'type' => 'int', 'min' => 1, 'require' => true),复制代码5、一键测试
在测试环境上,执行以下命令可进行一键测试:
$ ./run_tests复制代码
运行效果类似:

图6-2 一键测试的运行效果
一键测试,作为持续集成的一部分,应该随时、频繁执行,以校验接口服务的正确性,最大限度保证项目质量。如果做不到持续集成,至少在以下场景中应当执行一键测试: 发布版本到生产环境前;更新PhalApi框架后;进行大范围改动,或底层修改后。
Family 2.0 业务模块主要有原有的业务线智能电子相框,以及新增的业务线母婴营养称。需要服务的客户端除了安卓、iOS移动设备外,还有PC版的客户端和PC端的管理后台系统,除此之外,还有电子相框和营养称这些硬件设备。为清晰划分这些不同的模块,经过不断迭代,最终创建的项目有:
Fami项目 提供重写原有接口系统后的接口服务,包括原有的用户模块、家庭圈模块、动态模块和电子相框模块。并且作为整个系统的基础项目,提供公共接口服务。
Scale项目 提供新增的母婴营养称业务线的接口服务,包括了秤模块、体重模块、食谱模块等。可结合营养秤上报的体重进行分析,然后提供改善建议。
Admin项目 主要针对管理后台系统提供接口服务,用于实现下订购买、售后服务、后台运营等功能。
Task项目 负责用于计划任务的耗时接口服务的实现,如为商家生成一系列设备信息,进行消息推送等。
PC项目 针对PC版客户端提供AJAX接口,由于此场景不适宜采用签名加密,所以需要自定义接口服务白名单,以便前端能正常调用指定的接口服务。
上面所说的项目,是指放置源代码的项目,类似默认的Demo项目,每个项目都是可作为单独的子系统。这些项目都位于根目录的Apps目录下。
Family-2.0$ tree ./Apps/./Apps/├── Admin├── Fami├── Pc├── Scale└── Task复制代码
经过综合考虑,决定对外提供多个访问入口,这些入口与上面划分的项目对应,但又有所变化,主要有:
电子相框访问入口/fami 对外提供Fami项目的接口服务。
母婴营养秤访问入口/scale 对外提供Scale项目的接口服务,但内部实现依赖于Fami项目。
管理后台访问入口/admin_28***4 为管理后台提供Admin项目的接口服务,但内部实现依赖于Fami项目和Scale项目。增加数字后续是为了避免外界简单地猜测到此入口路径。
PC端访问入口/web 对外提供Fami项目和Scale项目的部分接口服务,并且不需要任何签名验证。
由于Task计划任务的接口服务都是本地调用,故不需要对外提供访问入口。
原有的系统,使用硬编码的方式配置数据库连接等配置信息。一如常见的:
'servers' => array( 'db_demo' => array( //服务器标记 'host' => 'localhost', //数据库域名 'name' => 'phalapi', //数据库名字 'user' => 'root', //数据库用户名 'password' => '', //数据库密码 'port' => '3306', //数据库端口 'charset' => 'UTF8', //数据库字符集 ), ),复制代码
为了更方便在不同环境下,在不改动任何代码的情况下实现快速部署,在Family 2.0 系统中全部数据库链接、Memcache链接等配置信息采用系统环境变量的方式配置。例如,上面的配置换为:
'servers' => array( 'db_A' => array( //服务器标记 'host' => $_ENV['FAMILY_V2_DB_HOST'], //数据库域名 'name' => $_ENV['FAMILY_V2_DB_NAME'], //数据库名字 'user' => $_ENV['FAMILY_V2_DB_USER'], //数据库用户名 'password' => $_ENV['FAMILY_V2_DB_PASS'], //数据库密码 'port' => $_ENV['FAMILY_V2_DB_PORT'], //数据库端口 'charset' => $_ENV['FAMILY_V2_DB_CHARSET'], //数据库字符集 ), ),复制代码
下面分别简单介绍,对于本书的开发环境,对于cli命令行和php-fpm这两种模式如何配置这些系统变量。
首先,确保在php.ini配置文件中已经开启$_ENV全局变量。可打开/etc/php5/fpm/php.ini配置文件,并确保variables_order值为“EGPCS”,其中首字母E表示$_ENV全局变量。即:
# vim /etc/php5/fpm/php.inivariables_order = "EGPCS"复制代码
其次,在php-fpm相应的配置文件中添加相应的env配置,如:
# vim /etc/php5/fpm/pool.d/www.confenv[FAMILY_V2_DB_HOST]=$FAMILY_V2_DB_HOSTenv[FAMILY_V2_DB_NAME]=$FAMILY_V2_DB_NAMEenv[FAMILY_V2_DB_USER]=$FAMILY_V2_DB_USERenv[FAMILY_V2_DB_PASS]=$FAMILY_V2_DB_PASSenv[FAMILY_V2_DB_PORT]=$FAMILY_V2_DB_PORTenv[FAMILY_V2_DB_CHARSET]=$FAMILY_V2_DB_CHARSET复制代码
接着,在/etc/profile中,添加相应的系统变量。即:
# vim /etc/profileexport FAMILY_V2_DB_HOST=localhost export FAMILY_V2_DB_NAME=phalapi export FAMILY_V2_DB_USER=root export FAMILY_V2_DB_PASS='' export FAMILY_V2_DB_PORT=3306 export FAMILY_V2_DB_CHARSET=UTF8复制代码
为了让php-fpm每次重启时能自动加载系统变量,可以修改php-fpm的启动脚本,并在合适的位置添加source操作,即:
# vim /etc/init.d/php5-fpm. /etc/profile
