当前位置: 首页 > news >正文

动易网站首页制作如何制作一个游戏app

动易网站首页制作,如何制作一个游戏app,青海城乡住房建设厅网站,wordpress更改地址项目地址 腾讯APIJSON官方网站 定义 APIJSON 可以定义为一个面向HTTP 协议的JSON 规范#xff0c;一个面向数据访问层的ORM 框架。其主要工作流程包括#xff1a;前端按照既定格式组装 JSON 请求报文#xff0c;通过 APIJSON-ORM 将这些报文直接转换为 SQL 语句#xff0c…项目地址 腾讯APIJSON官方网站 定义 APIJSON 可以定义为一个面向HTTP 协议的JSON 规范一个面向数据访问层的ORM 框架。其主要工作流程包括前端按照既定格式组装 JSON 请求报文通过 APIJSON-ORM 将这些报文直接转换为 SQL 语句进而执行数据库操作如增删改查等。完成后系统将数据再按照指定格式封装成 JSON 响应报文高效地实现前后端的数据交互并将最终结果反馈给用户。 架构 图2.1 基于APIJSON的交互流程图 通过图2.1 基于APIJSON的交互流程图我们可以发现APIJSON 的设计思路主要用于前端可以通过基于APIJSON的语法格式直接处理数据的增删改查。也可以说是后端通过使用APIJSON-ORM 框架定义了一个万能的Controller接口层从而使得前端可以通过这个接口实现全部的CRUD 操作。 图2.2 基于APIJSON 构件生态的框架图 APIJSON-ORMAPIJSON-ORM 是 APIJSON 框架的核心组件它是一个对象关系映射ORM框架专门用于将 JSON 格式的请求自动转换为 SQL 语句从而快速实现对数据库的增删改查操作。APIJSON-frameworkAPIJSON-framework 是 APIJSON 的基础框架它提供了一套完整的解决方案包括请求的解析、处理、权限验证以及响应的封装等还包含了基于unitAuto 的自动化单元测试的内容。这个框架使得开发者能够快速搭建起一个高效、安全、易用的后端 API 服务。APIJSON-cloumnAPIJSON 的字段处理插件包含了表字段相关工具类unitauto-javaunitauto-java 是一个自动化测试框架它可以自动生成和执行单元测试代码。这个框架旨在减少手动编写测试代码的工作量提高代码质量和测试覆盖率。APIJSON-routerAPIJSON 的路由插件用于将Restful API 转成 APIJSON API格式请求APIJSON-builder采用类似mybaits 中 wrapper 封装的方式组装前端请求报文。用于生成符合 APIJSON 规范的 JSON 请求和响应结构。 主要功能 APIJSON 定义了前端请求后端操作数据库的JSON报文格式。APIJSON-framework 包含一套完整的前后端CRUD操作的解决方案主要包括权限校验远程函数/脚本调用请求合法性校验 单元测试等功能。APIJSON-ROM 简化了后端数据仓储层的操作大大减少了软件运维过程中的重复造轮子过程让开发者可以将精力专注于开发创新和商业赋能。 优缺点 优点在此借用APIJSON 官网的图来表述使用APIJSON的优点: 开发提速对比表 缺点(个人观点 APIJSON-framework 依赖了mysql和postgresql两个数据库引擎以及直接集成了作者的另一个自动化单元测试的项目UnitAuto。这使得APIJSON-framework 的技术架构耦合性比较高。APIJSON-cloumn 就是一个工具类在我看来完全可以集成于APIJSON-frameworkAPIJSON-ORM 的核心代码有待优化 使用规范 语法 key[]:{} // 查询数组key{}:[1,2,3] // 匹配选项范围key{}:10;length(key)1... // 匹配条件范围key():function(arg0,arg1...) // 远程调用函数key:key0/key1.../targetKey // 引用赋值key$:%abc% // 模糊搜索key~:^[0-9]$ // 正则匹配key%:2018-01-01,2018-10-01 // 连续范围key:[1] // 增加/扩展key-:888.88 // 减少/去除 name:alias // 新建别名combine:name~,tag~ // 条件组合column:id,sex,name // 返回字段group:userId // 分组方式having:max(id)100 // 聚合函数order:date-,name // 排序方式schema:sys // 集合空间database:POSTGRESQL // 跨数据库datasource:DRUID // 多数据源explain:true // 性能分析role:LOGIN // 访问角色 功能列表 功能 键值对格式 使用示例 查询数组 key[]:{}后面是JSONObjectkey可省略。当key和里面的Table名相同时Table会被提取出来即 {Table:{Content}} 会被转化为 {Content} {User[]:{User:{}}}(opens new window) 查询一个User数组。这里key和Table名都是UserUser会被提取出来即 {User:{id, ...}} 会被转化为 {id, ...}如果要进一步提取User中的id可以把User[]改为User-id[] 匹配选项范围 key{}:[]后面是JSONArray作为key可取的值的选项 id{}:[38710,82001,70793](opens new window) 对应SQL是id IN(38710,82001,70793) 查询id符合38710,82001,70793中任意一个的一个User数组 匹配条件范围 key{}:条件0,条件1...条件为SQL表达式字符串可进行数字比较运算等 id{}:80000,90000(opens new window) 对应SQL是id80000 OR id90000 查询id符合id80000 | id90000的一个User数组 包含选项范围 key:Object key:[Object]key对应值的类型必须为JSONArrayObject类型不能为JSON contactIdList:38710(opens new window) 对应SQL是json_contains(contactIdList,38710) 查询contactIdList包含38710的一个User数组 判断是否存在 key}{:{ from:Table, Table:{ ... } } 其中 }{ 表示 EXISTS key 用来标识是哪个判断 后面是 子查询 对象具体见下方 子查询 的说明。 id}{:{   from:Comment,   Comment:{      momentId:15   }}(opens new window) WHERE EXISTS(SELECT * FROM Comment WHERE momentId15) 远程调用函数 key():函数表达式函数表达式为 function(key0,key1...)会调用后端对应的函数 function(JSONObject request, String key0, String key1...)实现 参数校验、数值计算、数据同步、消息推送、字段拼接、结构变换 等特定的业务逻辑处理 可使用 - 和 表示优先级解析 key-() 解析当前对象 解析 key() 解析子对象 解析 key() isPraised():isContain(praiseUserIdList,userId)(opens new window) 会调用远程函数 boolean isContain(JSONObject request, String array, String value) 然后变为 isPraised:true 这种假设点赞用户id列表包含了userId即这个User点了赞 存储过程 key():SQL函数表达式函数表达式为 function(key0,key1...) 会调用后端数据库对应的存储过程 SQL函数 function(String key0, String key1...) 除了参数会提前赋值其它和 远程函数 一致 limit:10,offset:0,procedure():getCommentByUserId(id,limit,offset)(opens new window) 会转为getCommentByUserId(38710,10,0) 来调用存储过程 SQL 函数getCommentByUserId(IN id bigint, IN limit int, IN offset int) 然后变为 procedure:{ count:-1, update:false, list:[] } 其中 count 是指写操作影响记录行数-1 表示不是写操作update 是指是否为写操作增删改list 为返回结果集 引用赋值 key:key0/key1/.../refKey引用路径为用/分隔的字符串。以/开头的是缺省引用路径从声明key所处容器的父容器路径开始其它是完整引用路径从最外层开始。 被引用的refKey必须在声明key的上面。如果对refKey的容器指定了返回字段则被引用的refKey必须写在column对应的值内例如 column:refKey,key1,... Moment:{   userId:38710},User:{   id:/Moment/userId}(opens new window) User内的id引用了与User同级的Moment内的userId 即User.id Moment.userId请求完成后 id:/Moment/userId 会变成 id:38710 子查询 key:{ range:ALL, from:Table, Table:{ ... } } 其中 range 可为 ALL,ANY from 为目标表 Table 的名称 后面的对象类似数组对象可使用 count 和 join 等功能。 id:{   from:Comment,   Comment:{      column:min(userId)   }}(opens new window) WHERE id(SELECT min(userId) FROM Comment) 模糊搜索 key$:SQL搜索表达式 key$:[SQL搜索表达式]任意SQL搜索表达式字符串如 %key%(包含key), key%(以key开始), %k%e%y%(包含字母k,e,y) 等%表示任意字符 name$:%m%(opens new window) 对应SQL是name LIKE %m% 查询name包含m的一个User数组 正则匹配 key~:正则表达式 key~:[正则表达式]任意正则表达式字符串如 ^[0-9]$ *~ 忽略大小写可用于高级搜索 name~:^[0-9]$(opens new window) 对应SQL是name REGEXP ^[0-9]$ 查询name中字符全为数字的一个User数组 连续范围 key%:start,end key%:[start,end]其中 start 和 end 都只能为 Boolean, Number, String 中的一种如 2017-01-01,2019-01-01 [1,90000, 82001,100000] 可用于连续范围内的筛选 date%:2017-10-01,2018-10-01(opens new window) 对应SQL是date BETWEEN 2017-10-01 AND 2018-10-01 查询在2017-10-01和2018-10-01期间注册的用户的一个User数组 新建别名 name:aliasname映射为alias用alias替代name。可用于 column,Table,SQL函数 等。只用于GET类型、HEAD类型的请求 column:toId:parentId(opens new window) 对应SQL是toId AS parentId 将查询的字段toId变为parentId返回 增加 或 扩展 key:ObjectObject的类型由key指定且类型为Number,String,JSONArray中的一种。如 82001,apijson,[url0,url1] 等。只用于PUT请求 praiseUserIdList:[82001]对应SQL是json_insert(praiseUserIdList,82001) 添加一个点赞用户id即这个用户点了赞 减少 或 去除 key-:Object与key相反 balance-:100.00对应SQL是balance balance - 100.00 余额减少100.00即花费了100元 比较运算 , , , 比较运算符用于 ① 提供 id{}:90000 这种条件范围的简化写法 ② 实现子查询相关比较运算 不支持 key:Object 和 key!:Object 这两种写法直接用更简单的 key:Object 和 key!:Object 替代。 ① id:90000(opens new window) 对应SQL是id90000 查询符合id90000的一个User数组 ② id:{   from:Comment,   Comment:{      column:min(userId)   }}(opens new window) WHERE id(SELECT min(userId) FROM Comment) 逻辑运算 , |, ! 逻辑运算符对应数据库 SQL 中的 AND, OR, NOT。 横或纵与同一键值对的值内条件默认 | 或连接可以在 key 后加逻辑运算符来具体指定不同键值对的条件默认 与连接可以用下面说明的对象关键词 combine 来具体指定。 ① 可用于key{}:条件等 ② | 可用于key|{}:条件, key|{}:[]等一般可省略 ③ ! 可单独使用如key!:Object也可像,|一样配合其他功能符使用 key!:null 无效null 值会导致整个键值对被忽略解析可以用 key{}:!null 替代 key:null 同理用 key{}:null 替代。 ① id{}:80000,90000(opens new window) 对应SQL是id80000 AND id90000 即id满足id80000 id90000 ② id|{}:90000,80000(opens new window) 同id{}:90000,80000对应SQL是id80000 OR id90000 即id满足id90000 | id80000 ③ id!{}:[82001,38710](opens new window) 对应SQL是id NOT IN(82001,38710) 即id满足 ! (id82001 | id38710)可过滤黑名单的消息 数组关键词可自定义 key:Objectkey为 []:{} 中{}内的关键词Object的类型由key指定 ① count:Integer查询数量0 表示最大值默认最大值为100 ② page:Integer查询页码从0开始默认最大值为100一般和count一起用 ③ query:Integer查询内容 0-对象1-总数和分页详情2-数据、总数和分页详情 总数关键词为 total分页详情关键词为 info 它们都和 query 同级通过引用赋值得到例如 total:/[]/total, info:/[]/info 这里query及total仅为GET类型的请求提供方便 一般可直接用HEAD类型的请求获取总数 ④ join:/Table0/key0,/Table1/key1 多表连接方式 - LEFT JOIN - RIGHT JOIN - INNER JOIN | - FULL JOIN ! - OUTER JOIN - APP JOIN 其中 APP JOIN 为应用层连表会从已查出的主表里取得所有副表 key 关联的主表内的 refKey 作为一个数组 refKeys: [value0, value1...]然后把原来副表 count 次查询 key$refKey 的 SQL 用 key IN($refKeys) 的方式合并为一条 SQL 来优化性能 其它 JOIN 都是 SQL JOIN具体功能和 MySQL,PostgreSQL 等数据库的 JOIN 一一对应join:/ViceTable/key, MainTable:{}, ViceTable:{key:/MainTable/refKey} 会对应生成MainTable LEFT JOIN ViceTable ON ViceTable.keyMainTable.refKey ⑤ otherKey:Object自定义关键词名称和以上系统关键词不一样且原样返回上传的值 ① 查询User数组最多5个count:5(opens new window) 对应SQL是LIMIT 5 ② 查询第3页的User数组每页5个count:5,page:3(opens new window) 对应SQL是LIMIT 5 OFFSET 15 ③ 查询User数组和对应的User总数[]:{   query:2,   User:{}},total:/[]/total,info:/[]/info(opens new window) 返回的数据中总数及分页详情结构为 total:139, //总数 info:{ //分页详情 total:139, //总数 count:5, //每页数量 page:0, //当前页码 max:27, //最大页码 more:true, //是否还有更多 first:true, //是否为首页 last:false //是否为尾页 } ④ Moment INNER JOIN User LEFT JOIN Comment[]:{   join:/User/id,/Comment/momentId,   Moment:{     group:id //主副表不是一对一要去除重复数据   },   User:{     name~:t,     id:/Moment/userId   },   Comment:{     momentId:/Moment/id   }}(opens new window) ⑤ 每一层都加当前用户名User:{},[]:{   name:User/name, //自定义关键词   Moment:{}}(opens new window) 对象关键词可自定义 key:Objectkey为 Table:{} 中{}内的关键词Object的类型由key指定 ① combine:key0,key1,|key2,key3, !key4,!key5,key6,key7...条件组合方式| 可省略。会自动把同类的合并外层按照 | ! 顺序内层的按传参顺序组合成 (key0 key1 key6 其它key) (key2 | key3 | key7) !(key4 | key5) 这种连接方式其中 其它key 是指与 combine 在同一对象且未被它声明的条件 key默认都是 连接 ② column:column;function(arg)...返回字段 ③ order:column0,column1-...排序方式 ④ group:column0,column1...分组方式。如果column里声明了Table的id则id也必须在group中声明其它情况下必须满足至少一个条件: 1.分组的key在column里声明 2.Table主键在group中声明 ⑤ having:function0(...)?value0;function1(...)?value1;function2(...)?value2...SQL函数条件一般和group一起用函数一般在column里声明 ⑥ schema:sys集合空间(数据库名/模式)非默认的值可通过它来指定可以在最外层作为全局默认配置 ⑦ database:POSTGRESQL数据库类型非默认的值可通过它来指定可以在最外层作为全局默认配置 ⑧ datasource:DRUID跨数据源非默认的值可通过它来指定可以在最外层作为全局默认配置 ⑨ json:key0,key1...转为 JSON 格式返回符合 JSONObject 则转为 {...}符合 JSONArray 则转为 [...] ⑩ role:OWNER来访角色包括 UNKNOWN,LOGIN,CONTACT,CIRCLE,OWNER,ADMIN 可以在最外层作为全局默认配置 可自定义其它角色并重写 Verifier.verify 等相关方法来自定义校验 ⑪ explain:true性能分析可以在最外层作为全局默认配置 ⑫ raw:key0,key1...其中 key0, key1 都对应有键值对 key0:SQL片段或SQL片段的别名, key1:SQL片段或SQL片段的别名 自定义原始SQL片段可扩展嵌套SQL函数等复杂语句必须是后端已配置的只有其它功能符都做不到才考虑谨慎使用注意防SQL注入 ⑬ otherKey:Object自定义关键词名称和以上系统关键词不一样且原样返回上传的值 ① 搜索name或tag任何一个字段包含字符a的User列表name~:a,tag~:a,combine:name~,tag~(opens new window) 对应SQL是name REGEXP a OR tag REGEXP a ② 只查询id,sex,name这几列并且请求结果也按照这个顺序column:id,sex,name(opens new window) 对应SQL是SELECT id,sex,name ③ 查询按 name降序、id默认顺序 排序的User数组order:name-,id(opens new window) 对应SQL是ORDER BY name DESC,id ④ 查询按userId分组的Moment数组group:userId,id(opens new window) 对应SQL是GROUP BY userId,id ⑤ 查询 按userId分组、id最大值100 的Moment数组column:userId;max(id),group:userId,having:max(id)100(opens new window) 对应SQL是SELECT userId,max(id) ... GROUP BY userId HAVING max(id)100 还可以指定函数返回名column:userId;max(id):maxId,group:userId,having:maxId100(opens new window) 对应SQL是SELECT userId,max(id) AS maxId ... GROUP BY userId HAVING maxId100 ⑥ 查询 sys 内的 User 表schema:sys(opens new window) 对应SQL是FROM sys.User ⑦ 查询 PostgreSQL 数据库的 User 表database:POSTGRESQL(opens new window) ⑧ 使用 Druid 连接池查询 User 表datasource:DRUID(opens new window) ⑨ 将 VARCHAR 字符串字段 get 转为 JSONArray 返回json:get(opens new window) ⑩ 查询当前用户的动态role:OWNER(opens new window) ⑪ 开启性能分析explain:true(opens new window) 对应SQL是EXPLAIN ⑫ 统计最近一周偶数userId的数量column:date;left(date,10):day;sum(if(userId%20,1,0)),group:day,having:to_days(now())-to_days(date)7,raw:column,having(opens new window) 对应SQL是SELECT date, left(date,10) AS day, sum(if(userId%20,1,0)) ... GROUP BY day HAVING to_days(now())-to_days(date)7 ⑬ 从pictureList获取第0张图片position:0, //自定义关键词firstPicture():getFromArray(pictureList,position)(opens new window) 全局关键词 为最外层对象 {} 内的关键词。其中 databaseschema, datasource, role, explain 基本同对象关键词见上方说明区别是全局关键词会每个表对象中没有时自动放入作为默认值。 ① tag:String后面的 tag 是非 GET、HEAD 请求中匹配请求的 JSON 结构的标识一般是要查询的 Table 的名称或该名称对应的数组 Table[] 或 Table:[]由后端 Request 表中指定。 ② version:Integer接口版本version 不传、为 null 或 0 都会使用最高版本传了其它有效值则会使用最接近它的最低版本由后端 Request 表中指定。 ③ format:Boolean格式化返回 Response JSON 的 key一般是将 TableName 转为 tableName, TableName[] 转为 tableNameList, Table:alias 转为 alias, TableName-key[] 转为 tableNameKeyList 等小驼峰格式。 ① 查隐私信息{tag:Privacy,Privacy:{id:82001}}(opens new window) ② 使用第 1 版接口查隐私信息{version:1,tag:Privacy,Privacy:{id:82001}}(opens new window) ③ 格式化朋友圈接口返回 JSON 中的 key{   format:true,   []:{     page:0,     count:3,     Moment:{},     User:{       id:/Moment/userId     },     Comment[]:{       count:3,       Comment:{         momentId:[]/Moment/id       }     }   }} 适用场景 全栈开发一个小型web 项目初识APIJSON我认为APIJSON 可以大大简化后端但需要前端同学学习APIJSON 定义的JSON 协议规则语法以及需要前端同学对数据库操作语法有一定的理解。所以目前看来我让前端同学直接从原有开发模式转成基于APIJSON 的开发是不现实的。所以我认为APIJSON 更适合个人全栈开发一个小型的web 项目。报表类服务报表类服务没有复杂的项目逻辑大多数是基于数据的查询APIJSON 比较适合。数据维护服务数据维护服务没有复杂的项目逻辑大多数是基于数据的增删改查操作APIJSON 比较适合。 项目重构思路 本人后续准备对APIJSON项目进行重构编写一个基于APIJSON的开源项目easy-APIJSON重构的内容列表包括 1. 使用配置文件的方式封装APIJSON-ORM 中AbstractSQLConfig 中关于数据库关键字函数运算符的配置我想以文本文档的方式将这些内容封装整理方便后续的软件维护工作 2. 整体重构 APIJSON-framework 去掉强相关的数据库依赖以及单元测试依赖等去掉APIJSON-framework 关于权限校验请求校验等基于数据库操作的内容。将APIJSON-clolumn 的内容集成与APIJSON-framework中加入通用排序工具通用分页工具等丰富APIJSON-framework的内容。 图3.1 easy-APIJSON 架构图 3. 我希望的easy-APIJSON的架构是这样的easy-APIJSON 整体项目与三方依赖以及数据库无关APIJSON 提供的是通用的处理方法。用户可以自主选择技术实现方案如采用数据库配置、代码配置或文件配置等方式去实现某个功能。 4. 基于easy-APIJSONAPIJSON-builder 提供前端明确的语法文档和示例,在easy-APIJSON运行时可提供网页文档。 参考文献 APIJSON 官方网站腾讯APIJSON官方网站 APIJSON 官方文档介绍 | apijson-doc
http://www.w-s-a.com/news/977939/

相关文章:

  • 手机建设中网站建立个人网站服务器
  • 网站开发工程师岗位概要网站怎么制作教程
  • 城乡建设主管部门官方网站公司简介模板ppt范文
  • 网站认证必须做么cc0图片素材网站
  • net域名 著名网站国外设计案例网站
  • 淘宝客网站哪里可以做app地推网
  • 宜昌建设厅网站中国最新时事新闻
  • 微网站怎么开发wordpress 发表评论
  • 山东网站建设是什么一页网站首页图如何做
  • 游戏开发与网站开发哪个难万网影
  • 做网站编程语言建筑施工特种证书查询
  • 找人做网站内容自己编辑吗修改wordpress登陆界面
  • 登陆建设银行wap网站湖南网站建设磐石网络答疑
  • 58网站怎么做浏览度才高论坛网站怎么做排名
  • wordpress 手机网站支付京东网站建设的经费预算
  • 自己怎么样做游戏网站做海外贸易网站
  • 建立什么样的网站好制作网页网站代码
  • 岳麓区专业的建设网站公司尚一网常德论坛
  • 电商网站建设实训报告360站长平台链接提交
  • 个性化网站建设公司个人网站备案类型
  • 腾讯建站模板上海网站开发有限公司
  • 网站和小程序的区别请问做网站怎么赚钱
  • 网站logo设计免费版在线网站开发建设准备工作
  • wordpress多站点 主题南京做网站好的公司
  • 广州 门户seo到底是做什么的
  • 可以登录国外网站吗如何用家用电脑做网站
  • 吉安建站公司wordpress企业
  • 河北住房和城乡建设厅网站6thinkphp做视频网站
  • 遵义网站制作一般需要多少钱深圳全国网站制作哪个好
  • 公众平台网站价格哪个网站做餐饮推广最好