{"id":20519683,"url":"https://github.com/zongxr/flask-ssm","last_synced_at":"2025-06-17T14:38:03.566Z","repository":{"id":215770030,"uuid":"443732124","full_name":"ZongXR/Flask-SSM","owner":"ZongXR","description":"一款模仿SpringFramework的Python的web后端框架，基于Flask二次封装。通过Python反射模拟了Java的IOC控制反转，通过Python装饰者模式模拟了Java的AOP面向切面编程。具有接口自动发现、定时任务自动注册、事务管理器、单元测试，等功能。简化web后端开发流程，聚焦业务逻辑，让你按照Spring的习惯写Python","archived":false,"fork":false,"pushed_at":"2025-06-16T07:21:56.000Z","size":345,"stargazers_count":25,"open_issues_count":1,"forks_count":5,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-06-16T08:28:22.571Z","etag":null,"topics":["aspect-oriented-programming","flask","flask-apscheduler","flask-sqlalchemy","inversion-of-control","java","mvc","mybatis","python","reflection","spring","springframework","web"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/Flask-SSM/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ZongXR.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,"zenodo":null}},"created_at":"2022-01-02T09:58:48.000Z","updated_at":"2025-06-16T07:15:59.000Z","dependencies_parsed_at":"2024-01-06T13:23:58.113Z","dependency_job_id":"449d4b1c-6c8b-4cf8-a836-3eb197250f50","html_url":"https://github.com/ZongXR/Flask-SSM","commit_stats":null,"previous_names":["zongxr/flask-ssm"],"tags_count":20,"template":false,"template_full_name":null,"purl":"pkg:github/ZongXR/Flask-SSM","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZongXR%2FFlask-SSM","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZongXR%2FFlask-SSM/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZongXR%2FFlask-SSM/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZongXR%2FFlask-SSM/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ZongXR","download_url":"https://codeload.github.com/ZongXR/Flask-SSM/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZongXR%2FFlask-SSM/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260381060,"owners_count":23000414,"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","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":["aspect-oriented-programming","flask","flask-apscheduler","flask-sqlalchemy","inversion-of-control","java","mvc","mybatis","python","reflection","spring","springframework","web"],"created_at":"2024-11-15T22:15:32.673Z","updated_at":"2025-06-17T14:37:58.537Z","avatar_url":"https://github.com/ZongXR.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1\u003e\u003ca href=\"https://github.com/ZongXR/Flask-SSM\" target=\"_blank\"\u003eFlask-SSM\u003c/a\u003e\u003c/h1\u003e\n一款模仿SpringFramework的Python的web后端框架，基于Flask二次封装。通过Python反射模拟了Java的IOC控制反转，通过Python装饰者模式模拟了Java的AOP面向切面编程。具有接口自动发现、定时任务自动注册、事务管理器、单元测试，等功能。简化web后端开发流程，聚焦业务逻辑，让你按照Spring的习惯写Python\n\u003ch2\u003e使用方法\u003c/h2\u003e\n首先使用以下命令安装该框架\u003cbr /\u003e\n\u003ccode\u003epip\u0026nbsp;install\u0026nbsp;Flask-SSM\u003c/code\u003e\u003cbr /\u003e\n使用教程请参考\u003ca href=\"https://github.com/ZongXR/Flask-SSM\" target=\"_blank\"\u003e此地址\u003c/a\u003e中的\u003ccode\u003e\u003ca href=\"./test/demo\" target=\"_blank\"\u003etest.demo\u003c/a\u003e\u003c/code\u003e包，这是一个具有典型MVC结构的最小web应用。\n\u003ch3\u003e创建基础环境\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n如\u003ccode\u003e\u003ca href=\"./test/demo\" target=\"_blank\"\u003etest.demo\u003c/a\u003e\u003c/code\u003e包所示，在\u003ccode\u003e\u003ca href=\"./test/demo/__init__.py\" target=\"_blank\"\u003etest.demo.__init__.py\u003c/a\u003e\u003c/code\u003e中定义\u003ccode\u003eSpringApplication\u003c/code\u003e类的对象。\n\u003cpre\u003esp = SpringApplication()\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n如\u003ccode\u003e\u003ca href=\"./app.py\" target=\"_blank\"\u003eapp.py\u003c/a\u003e\u003c/code\u003e所示，在\u003ccode\u003e\u003ca href=\"./app.py\" target=\"_blank\"\u003eapp.py\u003c/a\u003e\u003c/code\u003e中导入该对象，然后对其进行初始化。\n\u003cpre\u003e\nfrom test.demo import sp\napp = Flask(sp.base_package.__package__)\nsp.init_app(app)\napp.run()\n\u003c/pre\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3\u003e应用配置项\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n如\u003ccode\u003e\u003ca href=\"./test/demo/config\" target=\"_blank\"\u003etest.demo.config\u003c/a\u003e\u003c/code\u003e包所示，在\u003ccode\u003e\u003ca href=\"./test/demo/config/__init__.py\" target=\"_blank\"\u003etest.demo.config.__init__.py\u003c/a\u003e\u003c/code\u003e中导入\u003ccode\u003eConfiguration\u003c/code\u003e类，该包内的配置项能自动识别。\n\u003cpre\u003efrom flask_ssm.springframework.context.annotation import Configuration\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n建议将同一类别的配置写在同一模块内。如\u003ccode\u003e\u003ca href=\"./test/demo/config/app_config.py\" target=\"_blank\"\u003etest.demo.config.app_config\u003c/a\u003e\u003c/code\u003e所示：\n\u003cpre\u003e\nAPP_HOST = \"0.0.0.0\"      # 定义了应用的域\nAPP_PORT = 5000           # 定义了应用的端口\nAPPLICATION_ROOT = \"/\"    # 定义了应用的根路径\nUSE_RELOADER = False      # 是否开启热更新\nDEBUG = False             # 是否处于debug模式\nAPP_THREAD = False        # 是否开启多线程\nAPP_PROCESS = 1           # 进程个数\n\u003c/pre\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n需要注意的是：\n\u003cul\u003e\n\u003cli\u003e其中，配置项的key必须保持大写，才能被识别。\u003c/li\u003e\n\u003cli\u003e如果环境变量中有与key同名变量，变量值自动覆盖配置项。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eweb接口层\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n如\u003ccode\u003e\u003ca href=\"./test/demo/controller\" target=\"_blank\"\u003etest.demo.controller\u003c/a\u003e\u003c/code\u003e包所示，在\u003ccode\u003e\u003ca href=\"./test/demo/controller/__init__.py\" target=\"_blank\"\u003etest.demo.controller.__init__.py\u003c/a\u003e\u003c/code\u003e中导入\u003ccode\u003eController\u003c/code\u003e类，标记该包内所有模块的函数为web接口。\n\u003cpre\u003efrom flask_ssm.springframework.stereotype import Controller\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n如\u003ccode\u003e\u003ca href=\"./test/demo/controller/base_controller.py\" target=\"_blank\"\u003etest.demo.controller.base_controller\u003c/a\u003e\u003c/code\u003e所示，对需要注册的接口直接加上\u003ccode\u003e\u0026commat;RequestMapping\u0026lpar;value=**\u0026comma;\u0026nbsp;method=**\u0026rpar;\u003c/code\u003e或\u003ccode\u003e\u0026commat;GetMapping\u0026lpar;value=**\u0026rpar;\u003c/code\u003e或\u003ccode\u003e\u0026commat;PostMapping\u0026lpar;value=**\u0026rpar;\u003c/code\u003e。如果需要对参数的类型进行校验，可以使用type\u0026nbsp;hints。\n\u003c/li\u003e\n\u003cli\u003e\n如\u003ccode\u003e\u003ca href=\"./test/demo/controller/customize_controller.py\" target=\"_blank\"\u003etest.demo.controller.customize_controller\u003c/a\u003e\u003c/code\u003e所示，如果需要json格式的响应体，在\u003ccode\u003e\u0026commat;RequestMapping\u003c/code\u003e后面加上\u003ccode\u003e\u0026commat;ResponseBody\u003c/code\u003e，把函数返回值映射为json格式写入响应体中。\n\u003cpre\u003e\n@RequestMapping(\"/hello_world\", [RequestMethod.POST])\n@ResponseBody\ndef hello_world(param):\n    result = base_service.run(param)\n    return CommonResult.ok(data=result)\n\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n如果某个模块的接口均为restful风格，那么只需要在该模块引入\u003ccode\u003eRestController\u003c/code\u003e，而忽略\u003ccode\u003e\u0026commat;ResponseBody\u003c/code\u003e装饰器\n\u003cpre\u003efrom flask_ssm.springframework.web.bind.annotation import RestController\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n如\u003ccode\u003e\u003ca href=\"./test/demo/controller/customize_controller.py\" target=\"_blank\"\u003etest.demo.controller.customize_controller\u003c/a\u003e\u003c/code\u003e所示，对该模块内的全局异常处理函数加上\u003ccode\u003e\u0026commat;ExceptionHandler\u0026lpar;value=**\u0026rpar;\u003c/code\u003e\n\u003cpre\u003e\n@ExceptionHandler(Exception)\ndef custom_error_handler(e):\n    return str(e)\n\u003c/pre\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3\u003e业务逻辑层\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n如\u003ccode\u003e\u003ca href=\"./test/demo/service\" target=\"_blank\"\u003etest.demo.service\u003c/a\u003e\u003c/code\u003e包所示，在\u003ccode\u003e\u003ca href=\"./test/demo/service/__init__.py\" target=\"_blank\"\u003etest.demo.service.__init__.py\u003c/a\u003e\u003c/code\u003e中导入\u003ccode\u003eService\u003c/code\u003e类。\n\u003cpre\u003efrom flask_ssm.springframework.stereotype import Service\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n对于涉及数据修改的函数，使用\u003ccode\u003e\u0026commat;Transactional\u0026lpar;rollback_for=**\u0026rpar;\u003c/code\u003e修饰，并使用\u003ccode\u003erollback_for\u003c/code\u003e指定回滚的异常类型，从而开启事务。\n\u003c/li\u003e\n\u003cli\u003e\n如\u003ccode\u003e\u003ca href=\"./test/demo/service/base_service.py\" target=\"_blank\"\u003etest.demo.service.base_service\u003c/a\u003e\u003c/code\u003e所示，对于需要进行单元测试的函数，使用\u003ccode\u003e\u0026commat;Test\u003c/code\u003e修饰该函数，并作为入口运行。\n\u003cpre\u003e\n@Test\ndef run(param):\n    result = tablename_dao.query_one(param)\n    return str(result)\nif __name__ == \"__main__\":\n    print(run(\"Hello World\"))\n\u003c/pre\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3\u003e数据交互层\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n如\u003ccode\u003e\u003ca href=\"./test/demo/dao\" target=\"_blank\"\u003etest.demo.dao\u003c/a\u003e\u003c/code\u003e包所示，在\u003ccode\u003e\u003ca href=\"./test/demo/dao/__init__.py\" target=\"_blank\"\u003etest.demo.dao.__init__.py\u003c/a\u003e\u003c/code\u003e中导入\u003ccode\u003eRepository\u003c/code\u003e类，可以使用注解式数据查询。\n\u003cpre\u003efrom flask_ssm.springframework.stereotype import Repository\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n如\u003ccode\u003e\u003ca href=\"./test/demo/dao/tablename_dao.py\" target=\"_blank\"\u003etest.demo.dao.tablename_dao\u003c/a\u003e\u003c/code\u003e所示，对于查询函数，使用\u003ccode\u003e\u0026commat;Mapper\u0026lpar;result_type=**\u0026rpar;\u003c/code\u003e修饰，并使用\u003ccode\u003eresult_type\u003c/code\u003e指定返回类型。函数的参数为传入SQL语句的参数，返回值为SQL语句，SQL语句的参数部分同MyBatis的用法，即可实现返回对象的自动封装。如果需要对SQL语句传参类型进行校验，可以使用type\u0026nbsp;hints。\n\u003cpre\u003e\n@Mapper(result_type=str)\ndef query_one(param):\n    sql = \"\"\"\n        select #{param};\n    \"\"\"\n    return sql\n\u003c/pre\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3\u003e定时任务\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n如\u003ccode\u003e\u003ca href=\"./test/demo/task\" target=\"_blank\"\u003etest.demo.task\u003c/a\u003e\u003c/code\u003e包所示，在\u003ccode\u003e\u003ca href=\"./test/demo/task/__init__.py\" target=\"_blank\"\u003etest.demo.task.__init__.py\u003c/a\u003e\u003c/code\u003e中导入\u003ccode\u003eScheduled\u003c/code\u003e类，可以实现该包内的定时任务自动注册。\n\u003cpre\u003efrom flask_ssm.springframework.scheduling.annotation import Scheduled\u003c/pre\u003e\n\u003c/li\u003e\n\u003cli\u003e\n如\u003ccode\u003e\u003ca href=\"./test/demo/task/my_task.py\" target=\"_blank\"\u003etest.demo.task.my_task\u003c/a\u003e\u003c/code\u003e所示，在模块中声明\u003ccode\u003eFUNC\u003c/code\u003e, \u003ccode\u003eTRIGGER\u003c/code\u003e等用于标志定时任务的变量即可，这些变量必须大写。\u003ccode\u003eFUNC\u003c/code\u003e表示定时任务执行的函数名，对应的函数需要在文件内给出，置空禁用定时任务。其他标识与\u003ca href=\"https://segmentfault.com/a/1190000039111644\" target=\"_blank\"\u003eFlask-APScheduler\u003c/a\u003e的用法完全一致，直接填入即可。\n\u003cpre\u003e\nFUNC = \"my_func\"           # 生效的函数名，如需禁用可设为None\nTRIGGER = \"interval\"       # 触发条件，interval表示定时间间隔触发\nSECONDS = 5                # 触发时间间隔设定5秒\nREPLACE_EXISTING = True    # 重启替换持久化\ndef my_func():             # 定时执行的函数\n    current_app.logger.info(\"触发定时任务\")\n\u003c/pre\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3\u003eORM对象\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n如\u003ccode\u003e\u003ca href=\"./test/demo/pojo/pojo_demo.py\" target=\"_blank\"\u003etest.demo.pojo.pojo_demo\u003c/a\u003e\u003c/code\u003e所示，每一个ORM映射对象需要使用类进行定义，并使用\u003ccode\u003e\u0026commat;TableName\u0026lpar;value=**\u0026rpar;\u003c/code\u003e修饰，使用\u003ccode\u003evalue\u003c/code\u003e指定表名。类的属性需要与表的字段对应，并使用\u003ccode\u003eColumn\u003c/code\u003e类封装。\n\u003cpre\u003e\n@TableName(\"table_name\")\nclass Pojo:\n    user_id = Column(INTEGER, primary_key=True)\n    teach_time = Column(DECIMAL(precision=2, scale=0))\n\u003c/pre\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2\u003e版本更新\u003c/h2\u003e\n\u003ctable\u003e\n\u003ctr\u003e\n\u003cth\u003e版本\u003c/th\u003e\u003cth\u003e更新内容\u003c/th\u003e\u003cth\u003e更新日期\u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1.0.0.0\u003c/td\u003e\u003ctd\u003e完成模板搭建，实现MVC分层，现在可以自助接入自定义内容。\u003c/td\u003e\u003ctd\u003e2022年1月2日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1.1.0.0\u003c/td\u003e\u003ctd\u003e完善模板，现在可以在controller下自建多级包\u003c/td\u003e\u003ctd\u003e2022年1月9日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1.1.1.0\u003c/td\u003e\u003ctd\u003e完善模板，现在可以在service下自建多级包\u003c/td\u003e\u003ctd\u003e2022年1月10日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1.1.2.0\u003c/td\u003e\u003ctd\u003e完善模板，现在可以在task下自建多级包\u003c/td\u003e\u003ctd\u003e2022年1月11日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1.1.2.1\u003c/td\u003e\u003ctd\u003e添加模板目录\u003c/td\u003e\u003ctd\u003e2021年1月30日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1.2.0.0\u003c/td\u003e\u003ctd\u003eservice层设置为单例模式;补充SQLalchemy的点查询demo\u003c/td\u003e\u003ctd\u003e2022年7月14日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1.3.0.0\u003c/td\u003e\u003ctd\u003e分离pojo和dao\u003c/td\u003e\u003ctd\u003e2022年7月16日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1.3.1.0\u003c/td\u003e\u003ctd\u003e输出更多日志\u003c/td\u003e\u003ctd\u003e2022年7月16日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1.3.2.0\u003c/td\u003e\u003ctd\u003e增加ViewObject; 增加logs目录\u003c/td\u003e\u003ctd\u003e2022年8月5日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1.4.0.0\u003c/td\u003e\u003ctd\u003e修改前端页面，可自定义请求方式、mime值、url、请求正文; 更改数据库用户名密码; 输出更多日志\u003c/td\u003e\u003ctd\u003e2022年8月5日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1.4.1.0\u003c/td\u003e\u003ctd\u003e修改前端页面样式\u003c/td\u003e\u003ctd\u003e2022年8月5日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1.5.0.0\u003c/td\u003e\u003ctd\u003e新增自定义异常及全局、局部异常处理\u003c/td\u003e\u003ctd\u003e2022年8月5日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1.5.1.0\u003c/td\u003e\u003ctd\u003e优化导入包路径\u003c/td\u003e\u003ctd\u003e2022年8月5日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1.5.2.0\u003c/td\u003e\u003ctd\u003e将多个Controller分布到不同的蓝图\u003c/td\u003e\u003ctd\u003e2022年8月7日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1.6.0.0\u003c/td\u003e\u003ctd\u003e将蓝图注册与初始化解耦，自动将py模块注册为蓝图; 异常handler增加日志输出\u003c/td\u003e\u003ctd\u003e2022年8月7日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1.7.0.0\u003c/td\u003e\u003ctd\u003e规范命名; service使用模块自动单例模式\u003c/td\u003e\u003ctd\u003e2022年8月10日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1.7.0.1\u003c/td\u003e\u003ctd\u003e优化代码; 更新使用说明\u003c/td\u003e\u003ctd\u003e2022年8月11日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1.8.0.0\u003c/td\u003e\u003ctd\u003e现在不需要把BluePrint对象命名为bp，也能实现蓝图的自动注册\u003c/td\u003e\u003ctd\u003e2022年8月13日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1.8.0.1\u003c/td\u003e\u003ctd\u003efix some bugs\u003c/td\u003e\u003ctd\u003e2022年8月13日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1.9.0.0\u003c/td\u003e\u003ctd\u003e解耦task、controller、config、utils各个子模块，不需要的模块直接删除即可；fix some bugs\u003c/td\u003e\u003ctd\u003e2022年12月28日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.0.0.0\u003c/td\u003e\u003ctd\u003e优化代码，提升执行效率\u003c/td\u003e\u003ctd\u003e2022年12月28日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.1.0.0\u003c/td\u003e\u003ctd\u003e修复BUG; 新增事务管理器; 新增工具类\u003c/td\u003e\u003ctd\u003e2023年4月27日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.2.0.0\u003c/td\u003e\u003ctd\u003e新增运行入口; 新增docker部署运行方式\u003c/td\u003e\u003ctd\u003e2023年5月22日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.2.1.0\u003c/td\u003e\u003ctd\u003e暴露端口5000\u003c/td\u003e\u003ctd\u003e2023年5月22日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.2.2.0\u003c/td\u003e\u003ctd\u003e排除目录\u003ccode\u003edocs\u003c/code\u003e, \u003ccode\u003esql\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e2023年5月22日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.2.2.1\u003c/td\u003e\u003ctd\u003eadd some exclude path\u003c/td\u003e\u003ctd\u003e2023年5月22日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.2.2.2\u003c/td\u003e\u003ctd\u003e修复数据库连接包含特殊字符导致无法连接的BUG\u003c/td\u003e\u003ctd\u003e2023年5月26日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.3.0.0\u003c/td\u003e\u003ctd\u003e新增单元测试功能; 前端新增PUT和DELETE请求方式; 规范dao的用法\u003c/td\u003e\u003ctd\u003e2023年5月26日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.3.0.1\u003c/td\u003e\u003ctd\u003efix some bugs\u003c/td\u003e\u003ctd\u003e2023年5月29日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.4.0.0\u003c/td\u003e\u003ctd\u003eadd initializer\u003c/td\u003e\u003ctd\u003e2023年5月30日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.4.0.1\u003c/td\u003e\u003ctd\u003efix some bugs\u003c/td\u003e\u003ctd\u003e2023年5月30日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.4.0.2\u003c/td\u003e\u003ctd\u003efix some bugs\u003c/td\u003e\u003ctd\u003e2023年5月31日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.4.0.3\u003c/td\u003e\u003ctd\u003efix some bugs\u003c/td\u003e\u003ctd\u003e2023年6月1日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.5.0.0\u003c/td\u003e\u003ctd\u003eadd mapper decorator; fix some bugs; add unit test example; change dao function usage\u003c/td\u003e\u003ctd\u003e2023年6月2日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.5.1.0\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e@mapper\u003c/code\u003e新增\u003ccode\u003enp.ndarray\u003c/code\u003e类型支持, 新增其他自定义参数, 修复注释错误; \u003ccode\u003e@test\u003c/code\u003e优化执行逻辑\u003c/td\u003e\u003ctd\u003e2023年6月3日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.6.0.0\u003c/td\u003e\u003ctd\u003econfig包自动配置，现在仅需要在其中写入键值对即可自动生效\u003c/td\u003e\u003ctd\u003e2023年6月24日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.7.0.0\u003c/td\u003e\u003ctd\u003e将配置信息全部写入config包内; 新增eureka注册功能\u003c/td\u003e\u003ctd\u003e2023年6月24日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.7.1.0\u003c/td\u003e\u003ctd\u003e新增HOST, PORT等配置项; 初始化脚本新增\u003ccode\u003e--app-host\u003c/code\u003e, \u003ccode\u003e--app-port\u003c/code\u003e, \u003ccode\u003e--app-debug\u003c/code\u003e, \u003ccode\u003e--application-root\u003c/code\u003e选项\u003c/td\u003e\u003ctd\u003e2023年6月24日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.7.2.0\u003c/td\u003e\u003ctd\u003einitializer的\u003ccode\u003e--application-root\u003c/code\u003e选项修改\u003ccode\u003eindex.html\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e2023年6月25日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.7.3.0\u003c/td\u003e\u003ctd\u003efix some bugs\u003c/td\u003e\u003ctd\u003e2023年6月26日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.7.4.0\u003c/td\u003e\u003ctd\u003e允许使用同名环境变量对配置项覆盖; fix some bugs\u003c/td\u003e\u003ctd\u003e2023年6月27日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.7.5.0\u003c/td\u003e\u003ctd\u003e更换eureka客户端; fix some bugs\u003c/td\u003e\u003ctd\u003e2023年6月29日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.7.6.0\u003c/td\u003e\u003ctd\u003e增加多线程、多进程配置项\u003c/td\u003e\u003ctd\u003e2023年7月1日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.7.6.1\u003c/td\u003e\u003ctd\u003efix some bugs\u003c/td\u003e\u003ctd\u003e2023年7月14日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.8.0.0\u003c/td\u003e\u003ctd\u003e新增上传文件功能\u003c/td\u003e\u003ctd\u003e2023年7月17日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.8.1.0\u003c/td\u003e\u003ctd\u003e传输文件使用临时文件，避免磁盘IO\u003c/td\u003e\u003ctd\u003e2023年7月18日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.8.2.0\u003c/td\u003e\u003ctd\u003e增加定时任务配置项; 主页新增\"清屏\"按钮\u003c/td\u003e\u003ctd\u003e2023年7月20日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.8.2.1\u003c/td\u003e\u003ctd\u003e开启定时任务调度持久化; fix some bugs\u003c/td\u003e\u003ctd\u003e2023年7月20日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.8.2.2\u003c/td\u003e\u003ctd\u003efix some bugs\u003c/td\u003e\u003ctd\u003e2023年7月21日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.8.2.3\u003c/td\u003e\u003ctd\u003efix some bugs; 修改数据库配置项\u003c/td\u003e\u003ctd\u003e2023年7月23日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.8.2.4\u003c/td\u003e\u003ctd\u003e启用自动重新加载\u003c/td\u003e\u003ctd\u003e2023年7月24日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.8.2.5\u003c/td\u003e\u003ctd\u003e修正不规范的命名\u003c/td\u003e\u003ctd\u003e2023年7月26日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.8.2.6\u003c/td\u003e\u003ctd\u003e修复\u003ccode\u003epybatis\u003c/code\u003e的空指针异常\u003c/td\u003e\u003ctd\u003e2023年7月28日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.8.2.7\u003c/td\u003e\u003ctd\u003efix some bugs; 优化代码执行逻辑\u003c/td\u003e\u003ctd\u003e2023年8月11日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.9.0.0\u003c/td\u003e\u003ctd\u003e优化代码执行逻辑; 修改定时任务默认配置项; \u003ccode\u003e@mapper\u003c/code\u003e新增\u003ccode\u003eGenerator\u003c/code\u003e的定义\u003c/td\u003e\u003ctd\u003e2023年8月28日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.9.1.0\u003c/td\u003e\u003ctd\u003efix some bugs; 更新\u003ccode\u003epybatis\u003c/code\u003e的用法\u003c/td\u003e\u003ctd\u003e2023年8月31日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.9.1.1\u003c/td\u003e\u003ctd\u003e删除\u003ccode\u003eCursorResultUtils.py\u003c/code\u003e; 更新说明文档\u003c/td\u003e\u003ctd\u003e2023年9月1日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.9.1.2\u003c/td\u003e\u003ctd\u003efix some bugs\u003c/td\u003e\u003ctd\u003e2023年9月14日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.9.2.0\u003c/td\u003e\u003ctd\u003e更新\u003ccode\u003epybatis\u003c/code\u003e用法; 更新说明文档\u003c/td\u003e\u003ctd\u003e2023年9月15日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.9.3.0\u003c/td\u003e\u003ctd\u003e更新主页, 新增表单提交功能\u003c/td\u003e\u003ctd\u003e2023年9月20日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.9.4.0\u003c/td\u003e\u003ctd\u003e新增对mime值选项的悬停提示, 提示内容为后端接收参数方式\u003c/td\u003e\u003ctd\u003e2023年9月21日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.9.4.1\u003c/td\u003e\u003ctd\u003efix some bugs\u003c/td\u003e\u003ctd\u003e2023年9月25日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.9.5.0\u003c/td\u003e\u003ctd\u003e修改前端页面样式\u003c/td\u003e\u003ctd\u003e2023年10月12日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2.9.6.0\u003c/td\u003e\u003ctd\u003e基于反射技术给定时任务加入上下文，修复定时任务中缺失上下文的BUG; 修复前端页面多次请求参数错误的BUG\u003c/td\u003e\u003ctd\u003e2023年10月31日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.0.0.0\u003c/td\u003e\u003ctd\u003e彻底分离框架与业务逻辑，构建框架Flask-SSM\u003c/td\u003e\u003ctd\u003e2023年11月9日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.1.0.0\u003c/td\u003e\u003ctd\u003e新增装饰器\u003ccode\u003e\u0026commat;TableName\u003c/code\u003e\u0026semi;\u0026nbsp;装饰器\u003ccode\u003e\u0026commat;Test\u003c/code\u003e新增统计运行时间的功能，并输出到日志\u0026semi;\u0026nbsp;修复若干BUG\u003c/td\u003e\u003ctd\u003e2023年11月10日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.2.0.0\u003c/td\u003e\u003ctd\u003e新增安装脚本\u0026semi;\u0026nbsp;框架上传至pypi官方源\u003c/td\u003e\u003ctd\u003e2023年11月11日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.3.0.0\u003c/td\u003e\u003ctd\u003e新增\u003ccode\u003e\u0026commat;RequestMapping\u003c/code\u003e\u0026comma;\u0026nbsp;\u003ccode\u003e\u0026commat;ExceptionHandler\u003c/code\u003e装饰器\u0026semi;\u0026nbsp;修改包结构\u003c/td\u003e\u003ctd\u003e2023年11月12日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.4.0.0\u003c/td\u003e\u003ctd\u003e新增\u003ccode\u003e\u0026commat;GetMapping\u003c/code\u003e\u0026comma;\u0026nbsp;\u003ccode\u003e\u0026commat;PostMapping\u003c/code\u003e装饰器\u003c/td\u003e\u003ctd\u003e2023年11月13日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.5.0.0\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e\u0026commat;RequestMapping\u003c/code\u003e装饰器实现参数注入功能，现在可以直接把请求参数写入接口的函数形参。\u003c/td\u003e\u003ctd\u003e2023年11月14日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.5.1.0\u003c/td\u003e\u003ctd\u003e优化执行逻辑，提升执行效率\u003c/td\u003e\u003ctd\u003e2023年11月14日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.6.0.0\u003c/td\u003e\u003ctd\u003e新增\u003ccode\u003e\u0026commat;ResponseBody\u003c/code\u003e装饰器\u0026comma;\u0026nbsp;修复若干BUG\u003c/td\u003e\u003ctd\u003e2023年11月19日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.7.0.0\u003c/td\u003e\u003ctd\u003e新增\u003ccode\u003eRestController\u003c/code\u003e类\u003c/td\u003e\u003ctd\u003e2023年11月27日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.7.1.0\u003c/td\u003e\u003ctd\u003e新增\u003ccode\u003e\u0026commat;PutMapping\u003c/code\u003e\u0026comma;\u0026nbsp;\u003ccode\u003e\u0026commat;DeleteMapping\u003c/code\u003e\u0026comma;\u0026nbsp;\u003ccode\u003e\u0026commat;PatchMapping\u003c/code\u003e装饰器\u003c/td\u003e\u003ctd\u003e2023年11月30日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.7.1.1\u003c/td\u003e\u003ctd\u003efix some bugs\u003c/td\u003e\u003ctd\u003e2023年12月11日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.7.1.2\u003c/td\u003e\u003ctd\u003e去除不必要的依赖\u003c/td\u003e\u003ctd\u003e2023年12月13日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.7.2.0\u003c/td\u003e\u003ctd\u003e定时任务默认使用文件名作为\u003ccode\u003eID\u003c/code\u003e;\u0026nbsp;\u003ccode\u003eFUNC\u003c/code\u003e为空时禁用定时任务;\u0026nbsp;优化执行逻辑，提升运行效率\u003c/td\u003e\u003ctd\u003e2023年12月21日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.7.2.1\u003c/td\u003e\u003ctd\u003efix some bugs\u003c/td\u003e\u003ctd\u003e2023年12月25日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.7.2.2\u003c/td\u003e\u003ctd\u003eSQL语句兼容MyBatis的#\u0026lcub;param\u0026rcub;形式;\u0026nbsp;fix some bugs\u003c/td\u003e\u003ctd\u003e2023年12月26日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.7.2.3\u003c/td\u003e\u003ctd\u003eSQL语句兼容MyBatis的$\u0026lcub;param\u0026rcub;形式\u003c/td\u003e\u003ctd\u003e2023年12月26日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.7.2.4\u003c/td\u003e\u003ctd\u003efix some bugs\u003c/td\u003e\u003ctd\u003e2023年12月29日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.7.2.5\u003c/td\u003e\u003ctd\u003echange github username\u003c/td\u003e\u003ctd\u003e2023年12月29日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.7.2.6\u003c/td\u003e\u003ctd\u003echange github username\u003c/td\u003e\u003ctd\u003e2023年12月29日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.7.3.0\u003c/td\u003e\u003ctd\u003e兼容Python\u0026nbsp;3.10\u003c/td\u003e\u003ctd\u003e2024年7月12日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.7.3.1\u003c/td\u003e\u003ctd\u003efix some bugs\u003c/td\u003e\u003ctd\u003e2024年7月12日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.7.3.2\u003c/td\u003e\u003ctd\u003efix some bugs\u003c/td\u003e\u003ctd\u003e2024年7月13日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.7.3.3\u003c/td\u003e\u003ctd\u003efix some bugs\u003c/td\u003e\u003ctd\u003e2024年7月25日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.7.3.4\u003c/td\u003e\u003ctd\u003efix some bugs\u003c/td\u003e\u003ctd\u003e2024年7月27日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.8.0.0\u003c/td\u003e\u003ctd\u003e集成Flask-Pydantic，现在可以使用type\u0026nbsp;hints对API及SQL的参数类型进行校验\u003c/td\u003e\u003ctd\u003e2024年7月31日\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3.8.0.1\u003c/td\u003e\u003ctd\u003e修复使用外部web服务器运行带来的BUG\u003c/td\u003e\u003ctd\u003e2024年8月2日\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzongxr%2Fflask-ssm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzongxr%2Fflask-ssm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzongxr%2Fflask-ssm/lists"}