{"id":20768373,"url":"https://github.com/ainilili/no-framework","last_synced_at":"2025-10-13T19:05:24.955Z","repository":{"id":105569329,"uuid":"138448244","full_name":"ainilili/no-framework","owner":"ainilili","description":"A lightweight framework based on Java language development, personally realize JSON/XML parsing, service container, service framework, bytecode instrumentation, such as solution, study the cost is low, plug and play, high extensibility, the author is very active!","archived":false,"fork":false,"pushed_at":"2018-10-16T11:50:51.000Z","size":288,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-11T09:36:40.435Z","etag":null,"topics":["aop","framework","ioc","json","orm","xml"],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ainilili.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-06-24T02:44:01.000Z","updated_at":"2022-10-04T13:44:53.000Z","dependencies_parsed_at":null,"dependency_job_id":"2f54e0d0-bd92-4123-8c86-930cff661772","html_url":"https://github.com/ainilili/no-framework","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ainilili/no-framework","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ainilili%2Fno-framework","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ainilili%2Fno-framework/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ainilili%2Fno-framework/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ainilili%2Fno-framework/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ainilili","download_url":"https://codeload.github.com/ainilili/no-framework/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ainilili%2Fno-framework/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279016858,"owners_count":26085884,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-13T02:00:06.723Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aop","framework","ioc","json","orm","xml"],"created_at":"2024-11-17T11:38:25.996Z","updated_at":"2025-10-13T19:05:24.925Z","avatar_url":"https://github.com/ainilili.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# No Framework\n\u003ca href='https://gitee.com/ainilili/No-Framework/members'\u003e\u003cimg src='https://img.shields.io/maven-central/v/com.gitee.ainilili/noframework.svg?style=flat-square' alt='maven'\u003e\u003c/img\u003e\u003c/a\u003e\n\u003cimg alt=\"code style\" src=\"https://img.shields.io/badge/license-Apache%202-4EB1BA.svg?style=flat-square\"\u003e\n\n## 一、序言\nNoFramework是笔者在闲暇之余写的一个网络爬虫项目```Seeker```一路延续发展到后来的```No```系列的框架的诞生。一路走来，不知不觉已经快一年了，这期间有些项目有的被重写过，有的架构也发生了大的改变，还有的一直在调优过程中转变着解决方案，在付出时间的同时，获得的回报是独立思考过程带给自己的对底层细节的了解。\n\n很多人很疑惑于它的作用，在这里诠释一下:\n```\n它可以代替tomcat、spring、mybatis来帮助开发者进行web服务搭建！\n```\n\n您使用这套框架的好处是：\n\u003e - 可直接与作者沟通交流\n\u003e - 可参与框架的开发\n\u003e - 能够感受到使用国产框架的魅力\n\nJava界的很多框架原理都很简单，我所熟知的框架中不出意外的会利用到：\n\u003e - ThreadLocal\n\u003e - Dynamic Proxy\n\u003e - Reflect\n\u003e - Genericity\n\u003e - AQS\u0026CAS\n\n所以实现一套框架看起来很简单，因为需要的技术也并不怎么高大上，并且还有一堆现成的开源可以直接拿来用的。但是在实现的过程中确实有很多意想不到的难点，如果您有兴趣可以亲自简单实现个Spring并在测试环境下小用一下，保证能达到需求的情况下，这个过程应该会使您对我刚才的话感悟颇深。\n\n回归主题，在将近一年的时间里，我从最基本的```Json、XML解析```到```服务容器```再到```服务框架```最终满足了一个小型网站的基本开发。当然有些模块还有很多不足，也有很多待优化的功能，这些笔者都会坚持下来接着去完成。也许最终这些代码变得毫无意义，但是我仍然会坚持的去完成它，并将它打造的越来越好！\n\n## 二、项目介绍\nNo Framework，简称**NF**，为Java Web开发提供整套服务框架解决方案。\n\n### 2.1、NF模块构建\n- [x] Maven (groupId：com.gitee.ainilili)\n- [x] Git (https://gitee.com/ainilili)\n\n### 2.2、NF模块介绍\n#### 2.2.1、父模块\n项目名 | 版本号 | 功能\n---|---|---\nnoframework | 1.1.3 | 子模块的parent依赖\n\n#### 2.2.2、子模块\n\n项目名 | 版本号 | 功能\n---|---|---\nnoson | 1.1.3 | Json序列化\u0026反序列化\nnocat | 1.1.3 | 基于Java的Web容器\nnoaoc | 1.1.3 | IOC\u0026AOP\nnomvc | 1.1.3 | MVC\nnolog | 1.1.3 | 日志及工具包\nseeker | 1.1.3 | Xml解析\nnodb | 1.1.3 | ORM\nnoasm | 1.1.3 | ASM工具\nnomvc-support-for-nocat | 1.1.3 | 提供对Nocat的MVC支持\nnomvc-support-for-tomcat | 1.1.3 | 提供对Tomcat的MVC支持\nnoaoc-listener-for-nocat | 1.1.3 | Noaoc加载监听器\nnf | 1.1.3 | 提供其他模块的依赖\n\n### 2.3、NF模块详细介绍\n在学习使用之前，如果您有兴趣，可以先看看它们是具体作用~\n\nNF每个模块都占据着很重要的地位，它们相互协调，一起完成最终的工作，下面就简单介绍一下它们都担负着什么样的重要使命。\n#### 2.3.1、Noson - Json序列化及反序列化工具\n\nNoson负责着前后台交互过程中的Json数据解析工作，是MVC容器默认的Json序列化及反序列化工具。在经过不断的优化后，Noson的解析性能也是相当可观，虽然不及前辈们写的FastJson、Jackson、Gson等，但是如果不是对性能太过要求，Noson是您最好的选择。\n\nNoson有着极高的容错率，例如一下的Json字符串，Noson也能容错解析\n```\n{value:[{\\\"key1\\\":a,'key2':b,key3:1c,key4:'\\\"d',key5:\\\"'e\\\",key6:':,[]{}',key7:,key8:'%$\u0026%$\u0026%^\u003e\u003c:'}]}\n```\n以下是解析后并序列化为标准Json字符串\n```\n{\"value\":[{\"key1\":\"a\",\"key2\":\"b\",\"key3\":\"1c\",\"key4\":\"\\\"d\",\"key5\":\"\\'e\",\"key6\":\":,[]{}\",\"key7\":\"key8:\\'%$\u0026%$\u0026%^\u003e\u003c:\\'\"}]}\n```\nNoson也可以处理非常复杂的类型\n```\njson = \"{list:[{map:{map:{list:[{map:{value:{\\\"name\\\":nico,age:21,skill:[java,c,c#,python,php,javascript],deposit:0.0,info:{address:china,job:IT}}}},{map:{value:{\\\"name\\\":nico,age:21,skill:[java,c,c#,python,php,javascript],deposit:0.0,info:{address:china,job:IT}}}}]}}},{map:{map:{list:[{map:{value:{\\\"name\\\":nico,age:21,skill:[java,c,c#,python,php,javascript],deposit:0.0,info:{address:china,job:IT}}}},{map:{value:{\\\"name\\\":nico,age:21,skill:[java,c,c#,python,php,javascript],deposit:0.0,info:{address:china,job:IT}}}}]}}}]}\";\nMap\u003cString, List\u003cMap\u003cString, Map\u003cString, Map\u003cString, List\u003cMap\u003cString, Map\u003cString, Nico\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e target = Noson.convert(json, new NoType\u003cMap\u003cString, List\u003cMap\u003cString, Map\u003cString, Map\u003cString, List\u003cMap\u003cString, Map\u003cString, Nico\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e(){});\n```\nNoson可以解决循环嵌套\n```\nCycle c = new Cycle();\nSystem.out.println(Noson.reversal(c));\n\nMap\u003cString, Object\u003e map = new HashMap\u003cString, Object\u003e();\nmap.put(\"map\", map);\nSystem.out.println(Noson.reversal(map));\n\nList\u003cObject\u003e list = new ArrayList\u003cObject\u003e();\nlist.add(list);\nSystem.out.println(Noson.reversal(list));\n\nSet\u003cObject\u003e sets = new HashSet\u003cObject\u003e();\nsets.add(sets);\nSystem.out.println(Noson.reversal(sets));\n\nmap.put(\"list\", list);\nSystem.out.println(Noson.reversal(map));\n```\n输出\n```\n{\"cycle\":{}}\n{\"map\":{}}\n[[]]\n[[]]\n{\"list\":[[]],\"map\":{\"list\":[[]]}}\n```\nNoson还有更多神奇的地方，如果您有兴趣，可以在下一节学习的过程中深入了解。\n#### 2.3.2、Nocat - 轻量级的Web服务容器\nNocat是基于Java socket编制的轻量级web服务器，提供简单的资源访问功能，向外提供三大模块：\n- Filter\n- Listener\n- Api\n\n功能可以看做Tomcat的过滤器、监听器、Servlet，区别于Tomcat的地方在于Nocat可以更简单的在Main函数中启动一个服务：\n```\npublic static void main(String[] args) {\n\t\tServerBootStrap bootStrap = new ServerBootStrap();\n\t\tbootStrap.start(8080);\n\t}\n```\n上述代码会在本地启动一个```8080```为端口的服务。\n#### 2.3.3、Noaoc - IOC及AOP功能\nNoaoc使用及其少的代码量实现了Spring核心的两大模块```IOC```和```AOP```，并且同时支持xml及注解的配置。\n\nNoaoc负责整个大家族中的类依赖管理，并提供及其灵活的对外扩展能力，这就大大方便了```Nomvc```的接入。\n\nNoaoc提供一个对Nocat的Listener监听器用于容器初始化\n\u003e noaoc-listener-for-nocat\n\n在Nocat的xml配置文件中加上监听器并设置参数：\n```\n\u003clistener\u003e\n    \u003chandler\u003eorg.nico.aoc.listener.NoaocListener\u003c/handler\u003e\n\t\u003cpayload\u003e\n\t\t{\n\t\t    //要扫描的xml配置\n\t\t\t\"xmls\":[\"cat-mysql.xml\",\"cat-redis.xml\"],\n\t\t\t\n\t\t\t//要扫描的注解包配置\n\t\t\t\"packs\":[\"org.nico.ct\"],\n\t\t\t\n\t\t\t//自扩展组件\n\t\t\t\"compents\":[\"org.nico.cat.mvc.compent.MVCCompent\"]\n\t\t}\n\t\u003c/payload\u003e\n\u003c/listener\u003e\n```\n\n#### 2.3.4、Nomvc - 同时为Tomcat和Nocat提供MVC的技术支持\n\nNomvc是基于路由层的一个MVC控制器，出参入参使用Noson辅助解析，自带```Verify```模块负责方法入参的验证。\n\nNomvc对外提供两个扩展模块：\n\u003e nomvc-support-for-nocat\n\n\u003e nomvc-support-for-tomcat\n\n接入Nocat只需要在xml配置文件中加上监听器和Api拦截路径：\n```\n\u003clistener\u003e\n    \u003chandler\u003eorg.nico.cat.mvc.listener.ListenerForNocat\u003c/handler\u003e\n\t\u003cpayload\u003e\n\t    //mvc注解包\n\t\t{\"scanpack\":\"org.nico.ct.controller\"}\n\t\u003c/payload\u003e\n\u003c/listener\u003e\n```\n```\n\u003capi\u003e\n\t\u003curi\u003e/v1/**\u003c/uri\u003e\n\t\u003chandler\u003eorg.nico.cat.mvc.router.RouterForNocat\u003c/handler\u003e\n\u003c/api\u003e\n```\n#### 2.3.5、Nolog - 轻量级的日志及工具包\n\nNolog使用简单几个文件，实现了轻量级的日志工具，另外附带着一些常用的工具包。\n\nNolog本身并没有任何依赖，因为要支持切换```Log4J```，所以添加了对Log4J级SLF的依赖。\n\nNolog入口文件名为```logno.properties```，之后将会简单介绍Nolog的配置参数及使用。\n\n#### 2.3.6、Seeker - 超文本解析器及爬虫工具\n\nSeeker最初的定位是爬虫工具，将爬取的HTML文本解析并提供可搜索的接口去获取目标数据，后来发现Seeker也可以用来做XML的解析。\n\nSeeker在NF大家族中负责超文本解析工作，例如Nocat及Noaoc的配置。\n\n#### 2.3.7、Nodb - ORM框架\n\n类似Hibernate，但是比Hibernate轻得多的orm框架，目前只支持Mysql，性能直逼JDBC，提供方便的条件查询及分页接口。\n\n可使用Noaoc直接整合：\n```\n\u003cbook id=\"DataSource\" class=\"com.mchange.v2.c3p0.ComboPooledDataSource\"\u003e\n\t\u003cparam key=\"jdbcUrl\"\n\t\tvalue=\"jdbc:mysql://localhost:3306/xx?useUnicode=true\u0026characterEncoding=utf8\u0026useSSL=false\" /\u003e\n\t\u003cparam key=\"user\" value=\"xx\" /\u003e\n\t\u003cparam key=\"password\" value=\"xx\" /\u003e\n\t\u003cparam key=\"driverClass\" value=\"com.mysql.jdbc.Driver\" /\u003e\n\t\u003cparam key=\"maxPoolSize\" value=\"100\" /\u003e\n\t\u003cparam key=\"minPoolSize\" value=\"10\" /\u003e\n\u003c/book\u003e\n\n\u003cbook id=\"MysqlSession\" class=\"org.nico.db.session.branch.MysqlSession\"\u003e\n\t\u003cparam key=\"autoCommit\" value=\"false\" /\u003e\n\t\u003clabel name=\"dataSource\" ref=\"DataSource\" /\u003e\n\u003c/book\u003e\n\n\u003cbook id=\"MysqlDBHelper\" class=\"org.nico.db.helper.impl.MysqlDBHelper\"\u003e\n\t\u003cparam key=\"printLog\" value=\"false\" /\u003e\n\t\u003clabel name=\"session\" ref=\"MysqlSession\" /\u003e\n\u003c/book\u003e\n\n\u003cbook id=\"TransationManager\" class=\"org.nico.db.datasource.TransationManager\"\u003e\n\t\u003clabel name=\"dataSource\" ref=\"DataSource\" /\u003e\n\u003c/book\u003e\n```\n\n#### 2.3.8、Noasm - 简单的ASM框架\n依赖asm源码，目前提供的方法有：\n- 对象方法参数名的获取\n- 增强式反射\n\n#### 2.3.9、Nf - 懒人的利器\n如果您不想在pom.xml中写那么多的NF模块依赖，就直接引入NF模块即可。\n\n## 三、使用教程\n\n### 3.1、每个项目更详细的使用文档\n\n- [Noson详细文档](https://gitee.com/ainilili/No-Framework/blob/master/nico-noson/README.md)\n- [Nocat详细文档](https://gitee.com/ainilili/No-Framework/blob/master/nico-nocat/README.md)\n- [Noaoc详细文档](https://gitee.com/ainilili/No-Framework/blob/master/nico-noaoc/README.md)\n- [Nomvc详细文档](https://gitee.com/ainilili/No-Framework/blob/master/nico-nomvc/README.md)\n- [Noson详细文档](https://gitee.com/ainilili/No-Framework/blob/master/nico-noson/README.md)\n- [Nolog详细文档](https://gitee.com/ainilili/No-Framework/blob/master/nico-nolog/README.md)\n- [Seeker详细文档](https://gitee.com/ainilili/No-Framework/blob/master/nico-seeker/README.md)\n- [Nodb详细文档](https://gitee.com/ainilili/No-Framework/blob/master/nico-nodb/README.md)\n- [Noasm详细文档](https://gitee.com/ainilili/No-Framework/blob/master/nico-noasm/README.md)\n\n### 3.2、环境搭建\n\n#### 3.2.1、Maven搭建\n也许您需要引入父模块：\n```\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.gitee.ainilili\u003c/groupId\u003e\n  \u003cartifactId\u003enoframework\u003c/artifactId\u003e\n  \u003cversion\u003e${version}\u003c/version\u003e\n  \u003ctype\u003epom\u003c/type\u003e\n\u003c/dependency\u003e\n```\n\n如果想引入所有模块，您只需要引入```nf```依赖即可：\n```\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.gitee.ainilili\u003c/groupId\u003e\n  \u003cartifactId\u003enf\u003c/artifactId\u003e\n  \u003cversion\u003e${version}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n如果您想单独引用：\n```\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.gitee.ainilili\u003c/groupId\u003e\n  \u003cartifactId\u003e${module-name}\u003c/artifactId\u003e\n  \u003cversion\u003e${version}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n这里的```${module-name}```是模块名称，例如引入```noson v1.0.1```模块：\n```\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.gitee.ainilili\u003c/groupId\u003e\n  \u003cartifactId\u003enoson\u003c/artifactId\u003e\n  \u003cversion\u003e1.0.5\u003c/version\u003e\n\u003c/dependency\u003e\n```\n另外，有些模块是被其他模块依赖的，具体依赖可以到[http://mvnrepository.com/](进行查询)\n\n#### 3.2.2、普通项目搭建\n使用Git工具将项目```Clone```到本地，之后使用您的IDE为您的项目引入模块到环境中，或者您可以手动打包成jar然后引入!\n\n#### 3.2.3、DEMO\nNF提供一个简单的项目[CoffeeTime](https://gitee.com/ainilili/CoffeeTime)用来演示NF实战的过程，将项目通过Git工具Clone到本地，然后以```Maven\nProject```的方式导入到您的IDE中即可。\n\nCoffeeTime 启动入口：```org.nico.ct.CtApplication```\n\nTP：为了方便大家运行，数据库链接均使用笔者云服务器外网IP，希望大家不要做坏事，虽然服务器没什么价值，但是仍会给笔者带来一些困扰~\n### 3.3、使用演示\n下面就以[CoffeeTime](https://gitee.com/ainilili/CoffeeTime)来演示一下NF框架的使用。\n \u003e 项目结构如下：\n![输入图片说明](https://gitee.com/uploads/images/2018/0622/091221_6be055b3_1607679.png \"20180622010510611.png\")\n\n#### 3.3.1、创建项目\n新建一个Maven项目，并在pom中添加NF依赖及其他常用的 jar\n``` \n\u003cdependencies\u003e \n\t\u003cdependency\u003e\n\t  \u003cgroupId\u003ecom.gitee.ainilili\u003c/groupId\u003e\n\t  \u003cartifactId\u003enf\u003c/artifactId\u003e\n\t  \u003cversion\u003e1.0.5\u003c/version\u003e\n\t\u003c/dependency\u003e\n\t\u003cdependency\u003e\n\t    \u003cgroupId\u003eredis.clients\u003c/groupId\u003e\n\t    \u003cartifactId\u003ejedis\u003c/artifactId\u003e\n\t    \u003cversion\u003e2.8.1\u003c/version\u003e\n\t\u003c/dependency\u003e\n\t\u003cdependency\u003e\n\t    \u003cgroupId\u003emysql\u003c/groupId\u003e\n\t    \u003cartifactId\u003emysql-connector-java\u003c/artifactId\u003e\n\t    \u003cversion\u003e5.1.38\u003c/version\u003e\n\t\u003c/dependency\u003e\n\t\u003cdependency\u003e\n\t    \u003cgroupId\u003ec3p0\u003c/groupId\u003e\n\t    \u003cartifactId\u003ec3p0\u003c/artifactId\u003e\n\t    \u003cversion\u003e0.9.1.2\u003c/version\u003e\n\t\u003c/dependency\u003e\n\u003c/dependencies\u003e\n```\n#### 3.3.2、编写配置文件\n首先是**Nocat**的配置文件cat.xml：\n```\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003capp\u003e\n\t\u003ccat:welcomes\u003e\n\t\t\u003cwelcome\u003eindex.html\u003c/welcome\u003e\n\t\t\u003cwelcome\u003eindex.jsp\u003c/welcome\u003e\n\t\t\u003cwelcome\u003eindex.asp\u003c/welcome\u003e\n\t\t\u003cwelcome\u003eindex.php\u003c/welcome\u003e \n\t\u003c/cat:welcomes\u003e\n\n\t\u003ccat:configs\u003e\n\t\t\u003c!-- 定义访问资源的路径, / 代表项目工作路径 --\u003e\n\t   \t\u003cproperty field=\"server_resource_path\" \t\t\tvalue=\"/web\" \t\t\t\t/\u003e\n\t\t\u003cproperty field=\"server_port\" \t\t\t\t\tvalue=\"8080\" \t\t\t\t/\u003e\n\t\t\u003cproperty field=\"server_charset\" \t\t\t\tvalue=\"utf-8\" \t\t\t\t/\u003e\n\t\t\u003cproperty field=\"server_revice_buffer_size\" \tvalue=\"104857600\" \t\t\t/\u003e\n\t\t\u003cproperty field=\"server_so_timeout\" \t\t\tvalue=\"0\" \t\t\t\t\t/\u003e\n\t\u003c/cat:configs\u003e\n\t\n\t\u003ccat:listeners\u003e\n\t\t\u003clistener\u003e\n\t\t    \u003chandler\u003eorg.nico.aoc.listener.NoaocListener\u003c/handler\u003e\n\t\t\t\u003cpayload\u003e\n\t\t\t\t{\n\t\t\t\t\t\"xmls\":[\n\t\t\t\t\t\t\"cat-mysql.xml\",\n\t\t\t\t\t\t\"cat-redis.xml\"\n\t\t\t\t\t],\n\t\t\t\t\t\"packs\":[\n\t\t\t\t\t\t\"org.nico.ct\"\n\t\t\t\t\t],\n\t\t\t\t\t\"compents\":[\n\t\t\t\t\t\t\"org.nico.cat.mvc.compent.MVCCompent\"\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\u003c/payload\u003e\n\t\t\u003c/listener\u003e\n\t\t\u003clistener\u003e\n\t\t    \u003chandler\u003eorg.nico.cat.mvc.listener.ListenerForNocat\u003c/handler\u003e\n\t\t\t\u003cpayload\u003e\n\t\t\t\t{\"scanpack\":\"org.nico.ct.controller\"}\n\t\t\t\u003c/payload\u003e\n\t\t\u003c/listener\u003e\n\t\u003c/cat:listeners\u003e\n\t\n\t\u003ccat:filters\u003e\n\t\t\u003cfilter\u003e\n\t\t\t\u003curi\u003e/v1/authc/**\u003c/uri\u003e\n\t\t\t\u003chandler\u003eorg.nico.ct.section.AuthFilter\u003c/handler\u003e\n\t\t\u003c/filter\u003e\n\t\u003c/cat:filters\u003e\n\t\n\t\u003ccat:apis\u003e\n\t\t\u003capi\u003e\n\t\t\t\u003curi\u003e/v1/**\u003c/uri\u003e\n\t\t\t\u003chandler\u003eorg.nico.cat.mvc.router.RouterForNocat\u003c/handler\u003e\n\t\t\u003c/api\u003e\n\t\u003c/cat:apis\u003e\n\t\n\u003c/app\u003e\n```\n配置**Noaoc**对**Mysql**及**Redis**的集成文件\n\u003e cat-mysql.xml\n```\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cbooks\u003e\n\t\u003cbook id=\"DataSource\" class=\"com.mchange.v2.c3p0.ComboPooledDataSource\"\u003e\n\t\t\u003cparam key=\"jdbcUrl\"\n\t\t\tvalue=\"jdbc:mysql://localhost:3306/ct?useUnicode=true\u0026characterEncoding=utf8\u0026useSSL=false\" /\u003e\n\t\t\u003cparam key=\"user\" value=\"root\" /\u003e\n\t\t\u003cparam key=\"password\" value=\"root\" /\u003e\n\t\t\u003cparam key=\"driverClass\" value=\"com.mysql.jdbc.Driver\" /\u003e\n\t\t\u003cparam key=\"maxPoolSize\" value=\"100\" /\u003e\n\t\t\u003cparam key=\"minPoolSize\" value=\"10\" /\u003e\n\u003c!-- \t\t\u003cparam key=\"maxIdleTime\" value=\"0\" /\u003e --\u003e\n\t\u003c/book\u003e\n\n\t\u003cbook id=\"MysqlSession\" class=\"org.nico.db.session.branch.MysqlSession\"\u003e\n\t\t\u003cparam key=\"autoCommit\" value=\"false\" /\u003e\n\t\t\u003clabel name=\"dataSource\" ref=\"DataSource\" /\u003e\n\t\u003c/book\u003e\n\n\t\u003cbook id=\"MysqlDBHelper\" class=\"org.nico.db.helper.impl.MysqlDBHelper\"\u003e\n\t\t\u003cparam key=\"printLog\" value=\"false\" /\u003e\n\t\t\u003clabel name=\"session\" ref=\"MysqlSession\" /\u003e\n\t\u003c/book\u003e\n\n\t\u003cbook id=\"TransationManager\" class=\"org.nico.db.datasource.TransationManager\"\u003e\n\t\t\u003clabel name=\"dataSource\" ref=\"DataSource\" /\u003e\n\t\u003c/book\u003e\n\n\t\u003caspect id=\"TransationSection\" class=\"org.nico.ct.section.TransationSection\"\u003e\n\t\t\u003caop execution=\"expression(org.nico.ct.service.impl.*.*(..))\"\u003e\n\t\t\t\u003cbefore proxy-method=\"before\" /\u003e\n\t\t\t\u003caround proxy-method=\"around\" /\u003e\n\t\t\t\u003cafter proxy-method=\"after\" /\u003e\n\t\t\t\u003cwrong proxy-method=\"wrong\" /\u003e\n\t\t\u003c/aop\u003e\n\t\u003c/aspect\u003e\n\n\u003c/books\u003e\n```\n\u003e cat-redis.xml\n```\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cbooks\u003e\n\t\u003cbook id=\"JedisPoolConfig\" class=\"redis.clients.jedis.JedisPoolConfig\"\u003e\n\t\t \u003cparam key=\"maxTotal\" value=\"200\" /\u003e\n\t\t \u003cparam key=\"maxIdle\" value=\"50\" /\u003e\n\t\t \u003cparam key=\"testOnBorrow\" value=\"true\" /\u003e\n\t\t \u003cparam key=\"testOnReturn\" value=\"true\" /\u003e\n\t\u003c/book\u003e\n\t\n\t\u003cbook id=\"JedisPool\" class=\"redis.clients.jedis.JedisPool\"\u003e\n\t\t \u003clabel name=\"poolConfig\" ref=\"JedisPoolConfig\" /\u003e\n\t\t \u003cparam key=\"host\" value=\"localhost\" /\u003e\n\t\t \u003cparam key=\"port\" value=\"6379\" /\u003e\n\t\t \u003cparam key=\"timeout\" value=\"30000\" /\u003e\n\t\t \u003cparam key=\"password\" value=\"iamct\" /\u003e\n\t\t \u003cparam key=\"database\" value=\"0\" /\u003e\n\t\u003c/book\u003e\n\t\n\t\u003cbook id=\"JedisUtils\" class=\"org.nico.ct.util.JedisUtils\"\u003e\n\t\t \u003clabel name=\"jedisPool\" ref=\"JedisPool\" /\u003e\n\t\u003c/book\u003e\t \n\n\u003c/books\u003e\n```\n\u003e Nolog的配置 logno.properties：\n```\nnico.log.path\t= noblog.log\nnico.log.level\t= DEBUG\nnico.log.format\t= ${time} [\\t${threadId}\\t] ${logType} ${className}\\uFF1A${line}  -  ${message}\nnico.log.print.stack.trace = on\n#nico.log.type = LOG4J\n```\n#### 3.3.3、包结构\n![输入图片说明](https://gitee.com/uploads/images/2018/0622/091404_06d5eeca_1607679.png \"20180622011634646.png\")\n#### 3.3.4、Dao层配置\n\u003e BaseDao.java\n\n![输入图片说明](https://gitee.com/uploads/images/2018/0622/091448_68429722_1607679.png \"201806220117535.png\")\n\u003e DaoImpl.java，@Dao用于声明一个Bean\n\n![输入图片说明](https://gitee.com/uploads/images/2018/0622/091542_ef5f288b_1607679.png \"20180622011859484.png\")\n#### 3.3.5、Service配置\n\u003e ServerImpl配置，@Label用于注入Bean，@Service用于声明一个Service\n\n![输入图片说明](https://gitee.com/uploads/images/2018/0622/091620_7a20b863_1607679.png \"20180622012018464.png\")\n#### 3.3.6、Controller配置及使用\n\u003e Controller基础配置\n\n\u003e @RestCinema用于声明一个Controller，直接返回Json\n\n\u003e @Lobby用于定制路由\n![输入图片说明](https://gitee.com/uploads/images/2018/0622/091641_b7ea5d74_1607679.png \"20180622012131470.png\")\n\u003e path入参\n\n\u003e @PathParam声明该参数来源于path\n![输入图片说明](https://gitee.com/uploads/images/2018/0622/091706_e14359cb_1607679.png \"20180622012519870.png\")\n\u003e body及url传参\n\n\u003e @Body用于声明参数来源于Body\n\n\u003e @QueryParam用于声明参数来源于url\n![输入图片说明](https://gitee.com/uploads/images/2018/0622/091722_8ece7b40_1607679.png \"20180622012607804.png\")\n\u003e 参数验证\n\n\u003e @Verify声明一个需要进一步验证的实体类\n\n\u003e @NotNull不允许为空\n\n\u003e @Length限制长度\n\n\u003e @Match正则验证\n\n\u003e @Range范围验证\n\n![输入图片说明](https://gitee.com/uploads/images/2018/0622/091740_b2ec5bfc_1607679.png \"20180622012700367.png\")\n#### 3.3.7、Aop切面配置\n\u003e 数据库事务配置\n```\npackage org.nico.ct.section;\n\nimport java.sql.SQLException;\n\nimport org.nico.aoc.aspect.AspectProxy;\nimport org.nico.aoc.aspect.point.AspectPoint;\nimport org.nico.aoc.aspect.point.ProcessingAspectPoint;\nimport org.nico.aoc.scan.annotations.After;\nimport org.nico.aoc.scan.annotations.Around;\nimport org.nico.aoc.scan.annotations.Before;\nimport org.nico.aoc.scan.annotations.Label;\nimport org.nico.aoc.scan.annotations.Wrong;\nimport org.nico.db.datasource.TransationManager;\n\n//@Aspect\t//这里不使用注解，使用XML配置增加清晰明了\npublic class TransationSection implements AspectProxy{\n\n\t@Label\n\tprivate TransationManager tm;\n\t\n\t@Override\n\t@Before(value = \"expression(org.nico.ct.service.impl.*.*(..))\")\n\tpublic void before(AspectPoint point) {\n\t\ttry {\n\t\t\ttm.beginTransaction();  \n\t\t} catch (SQLException e) {\n\t\t\te.printStackTrace();\n\t\t} \n\t}\n\t\n\t@Override\n\t@Around(value = \"expression(org.nico.ct.service.impl.*.*(..))\")\n\tpublic Object around(ProcessingAspectPoint point) throws Throwable {\n\t\tObject result = point.process();\n\t\treturn result;\n\t}\n\n\t@Override\n\t@After(value = \"expression(org.nico.ct.service.impl.*.*(..))\")\n\tpublic void after(AspectPoint point) {\n\t\ttry {\n\t\t\ttm.commitTransaction();\n\t\t\ttm.relaseConnection();\n\t\t} catch (SQLException e) {\n\t\t} \n\t}\n\n\t@Override\n\t@Wrong(value = \"expression(org.nico.ct.service.impl.*.*(..))\")\n\tpublic void wrong(ProcessingAspectPoint point, Throwable e) throws Throwable{\n\t\ttm.rollbackTransaction();\n\t\tthrow e;\n\t}\n\n}\n```\n\u003e 登录验证\n![输入图片说明](https://gitee.com/uploads/images/2018/0622/091838_337cf736_1607679.png \"2018062201331579.png\")\n#### 3.3.8、启动服务\n![输入图片说明](https://gitee.com/uploads/images/2018/0622/091906_46ef2765_1607679.png \"20180622013503203.png\")\n![输入图片说明](https://gitee.com/uploads/images/2018/0622/091929_7c51ccc2_1607679.png \"20180622013550452.png\")\n#### 3.3.9、前端页面存放\n![输入图片说明](https://gitee.com/uploads/images/2018/0622/091958_530682e7_1607679.png \"20180622013824512.png\")\n#### 3.3.10、访问\n![输入图片说明](https://gitee.com/uploads/images/2018/0622/092012_79e4c86a_1607679.png \"20180622014041959.png\")\n![输入图片说明](https://gitee.com/uploads/images/2018/0622/092024_b4f8b4fd_1607679.png \"20180622014118338.png\")\n![输入图片说明](https://gitee.com/uploads/images/2018/0622/092037_d1f30c59_1607679.png \"20180622014143509.png\")\n![输入图片说明](https://gitee.com/uploads/images/2018/0622/092048_5a4507b9_1607679.png \"20180622014216392.png\")\n视频直播流媒体支持\n![视频流](https://gitee.com/uploads/images/2018/0622/092104_511b2231_1607679.png \"20180622014606746.png\")\n\n## 四、继续努力\n\n### 4.1、发现Bug\n如果您发现项目中存在BUG或者设计不合理的地方，非常希望能够提``Issues```给我，让NF框架越来越完美\n### 4.2、下一步计划\n - 使用NF写完CoffeeTime\n - 使用NF写完CoffeeBlog\n - 完善Nocat上传模块\n - 增加RPC模块\n - Noaoc增加定时\n - 优化Nodb\n - 以后再定\n\n### 4.3、联系我\nEmail - ```ainililia@163.com```\n\nQQ  - ```473048656```\n\n交流群 - ```177563526```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fainilili%2Fno-framework","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fainilili%2Fno-framework","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fainilili%2Fno-framework/lists"}