FlyFish2.0版本后端源码学习笔记

代码整体结构

├── code-server                               #在线编辑器
│   ├── linux
│   └── macos
├── config                                    #初始化数据库配置文件
│   ├── database.${dev}.json
│   ├── node.development.js                   #入口文件
├── download                                  #大屏模块文件
├── log                                       #日志
├── migrations_init                           #数据库初始化
├── runtime                                   #运行时配置存储
├── src                                       #后端项目核心代码
│   ├── common                                #通用业务配置
│   │ ├── bootstrap                          #
│   │ ├── config                             #通用配置
│   │ │   ├── adapter                       #适配器配置
│   │ │   ├── config                        #通用配置
│   │ │   ├── extend                        #拓展配置
│   │ │   ├── middleware                    #中间件配置
│   │ │   ├── validator                     #自定义复杂校验规则,在logic中使用
│   │ ├── constants                          #枚举
│   │ ├── middleware                         #中间件
│   │ ├── model                              #Model层---M
│   │ │   ├── baseModel.js                  #定义了基本的CURD,其它所有的model都继承自它
│   │ ├── service                            #通用逻辑方法
│   └── web                                   #定制化业务-----实现具体业务逻辑
│     ├── config                              #业务配置
│     ├── controller                          #控制器层---C
│     ├── logic                               #前置后置操作---如字段校验、权限控制,其它通用逻辑
│     ├── model                               #数据库操作
│     ├── service                             #业务逻辑---数据处理、格式转换等业务逻辑操作
├── scripts                                    #项目部署脚本
├── storage                                    #
├── template                                   #大屏、组件模板
├── view                                       #html模板
├── www                                        #静态资源
│   ├── solution-platform-web
│   └── static
│   └── upload
├── Dockerfile                                 #dockerFile
├── options.json
├── options.json
├── pm2.json
├── README.md
├── startup.sh                                 #启动项目脚本

以上是代码的基本结构,使用的是基于MVC的thinkJS框架,但是通篇看下来,你是不是注意到,只看到了M(Model)和C(Controller),唯独缺少View,所以View在哪?所以就带着这个问题继续学习下去。
先从thinkJS框架开始学习:
Config:通用配置,如上config所示,可配置项目各种配置,最后会根据运行环境合到一起;
Context:上下文,用户请求、回复数据存储对象以及状态透传;
Middleware:中间件,在配置与使用上类似于webpack的plugins,可使用各项函数(内置或引入)实现各项功能,所有的用户请求处理都是由middleware完成;
Logic:逻辑,其中的action与controller的action一一对应,可定义执行action的前置后置操作;
Controller:控制器,和.net的控制器的使用非常相似,其内会按照路由执行对应的action;
View:视图(这里就是答案了),需要使用拓展来实现视图;
Router:路由,可自定义路由规则;
Adapter:适配器,解决一类功能的多种实现,配合extend,如view、数据库,view可以选择多种模板引擎,数据库可配置多种数据库,通过 think-helper模块中的 parseAdapterConfig解析;
Extend:拓展,支持的扩展类型为:think、application、context、request、response、controller、logic 和 service,框架内置的很多功能也是扩展来实现的,如:Session、Cache。

view是如何生成的

adapter.js里面配置view模板的目录为view里面的html模板,模板引擎为nunjucks,配合extend里面引入的think-view使用。

/**
 * view adapter config
 * @type {Object}
 */
exports.view = {
   
    type: 'nunjucks', // 这里指定默认的模板引擎是 nunjucks
    common: {
   
        viewPath: path.join(think.ROOT_PATH, 'view'),//模板文件的根目录
        sep
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一款极为优秀的资料搜索、资料收集、资料数据库保存、资料浏览、资料批处理的专业工具软件,是学习、科研、开发人员的极好助手; 本地搜索功能较WINDOWS自带的搜索功能更为实用,并且功能在逐步增加; 可以按关键词的组合快速搜索各种文件类型或文件名的文件; 可以轻松编辑文件列表:反选择文件;选择全部文件;不选任何文件; 可以对列表中文件按“文件名”“文件路径”“文件大小”“文件创建日期”“文件修改日期”“文件搜索范围”“文件版本”进行进一步模糊查询,和轻松选定; 可以打开列表中任何文件或目录; 可以查看列表文件的详细信息; 可以批量大写或小写所选文件名或文件夹名; 可以用默认的程序打开所选文件名或文件夹名; 可以复制、移动和删除文件,在复制和移动文件时,对相同的文件名可以自动重命名...; 可以批量重置文件各种属性; 可以搜索网页文件,自带浏览器的极为方便,快捷; 可以保存和加载保存的搜索列表文件; 可以批量修改网页软件,替换或插入您需要的内容; 可以自动生成电脑中网页文件的索引文件; 可以定时自动快速浏览网页文件、WORD文件、文本文件的内容,每秒可以浏览几十个文件; 可以实现*.JS文件和*.HTM网页文件之间的转换; 可以将某个网页文件或某个目录下的所有网页文件内容导入数据库保存,可以将他人保存的数据导入自己的数据库中,便于数据信息交流 可以对数据库实现SQL查询; 利用本软件上网浏览网页,会自动将网页内容载入数据库保存; 软件窗口自动伸缩,便于浏览、切换...... 本软件的特点: 1、组合快速本地搜索,进一步的模糊查询和筛选; 2、快速智能网络搜索,自动网页过滤保存、数据库保存及数据库的查询; 3、方便的网页浏览,页面内容快速模糊查询
FlyFish 3.0 是一个基于 Java 开发的轻量级 Web 框架,它采用了 MVC 设计模式,具有简单易用、灵活高效、扩展性强等特点。下面我们来讲解一下 FlyFish 3.0 的源码。 1. 核心配置文件 FlyFish 3.0 的核心配置文件是 flyfish.properties,它位于 src/main/resources 目录下。该文件中定义了一些框架的基本配置信息,如数据库连接信息、视图文件存放路径、路由器类名等。以下是 flyfish.properties 文件的示例: ``` # 数据库连接信息 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/test jdbc.username=root jdbc.password=123456 # 视图文件存放路径 view.path=/WEB-INF/views/ # 路由器类名 router.class=com.flyfish.mvc.router.DefaultRouter ``` 2. 核心类 FlyFish 3.0 的核心类是 com.flyfish.mvc.DispatcherServlet,它是一个 Servlet 类,负责接收客户端请求并进行分发处理。该类的 doGet 方法中首先获取请求的 URI,然后根据 URI 获取对应的控制器类和方法,最后调用该方法并返回处理结果。 ``` protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String uri = request.getRequestURI(); Method method = router.route(uri); if (method != null) { try { Object result = method.invoke(controllerFactory.getController(method.getDeclaringClass()), request, response); if (result instanceof String) { request.getRequestDispatcher(viewResolver.resolve((String) result)).forward(request, response); } else if (result instanceof ModelAndView) { ModelAndView modelAndView = (ModelAndView) result; request.getRequestDispatcher(viewResolver.resolve(modelAndView.getViewName())).forward(request, response); } } catch (Exception e) { e.printStackTrace(); response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } } else { response.sendError(HttpServletResponse.SC_NOT_FOUND); } } ``` 3. 控制器类 控制器类是 FlyFish 3.0 的核心组件之一,它们负责接收客户端请求并进行处理。控制器类必须实现 com.flyfish.mvc.Controller 接口,并且通常以 Controller 结尾。以下是一个示例控制器类: ``` public class UserController implements Controller { private UserService userService = new UserService(); @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) { String action = request.getParameter("action"); if ("list".equals(action)) { List<User> userList = userService.getUserList(); ModelAndView modelAndView = new ModelAndView("user/list"); modelAndView.addAttribute("userList", userList); return modelAndView; } else if ("add".equals(action)) { String username = request.getParameter("username"); String password = request.getParameter("password"); String email = request.getParameter("email"); User user = new User(username, password, email); userService.addUser(user); return new ModelAndView("redirect:/user?action=list"); } else { return new ModelAndView("redirect:/user?action=list"); } } } ``` 4. 视图解析器 视图解析器是负责将控制器返回的逻辑视图名称解析成实际的视图文件路径的组件。FlyFish 3.0 中提供了两种视图解析器:InternalResourceViewResolver 和 JspViewResolver。以下是 InternalResourceViewResolver 的示例代码: ``` public class InternalResourceViewResolver implements ViewResolver { private String prefix; private String suffix; public InternalResourceViewResolver(String prefix, String suffix) { this.prefix = prefix; this.suffix = suffix; } @Override public String resolve(String viewName) { return prefix + viewName + suffix; } } ``` 5. 路由器 路由器是负责将请求 URI 映射到控制器类和方法的组件。FlyFish 3.0 中提供了 DefaultRouter 和 AnnotationRouter 两种路由器,其中 DefaultRouter 是默认的路由器实现。以下是 DefaultRouter 的示例代码: ``` public class DefaultRouter implements Router { private Map<String, Method> routeMap = new HashMap<>(); public DefaultRouter(List<Class<?>> controllerClassList) { for (Class<?> controllerClass : controllerClassList) { Method[] methods = controllerClass.getDeclaredMethods(); for (Method method : methods) { if (method.isAnnotationPresent(RequestMapping.class)) { RequestMapping requestMapping = method.getAnnotation(RequestMapping.class); String uri = requestMapping.value(); routeMap.put(uri, method); } } } } @Override public Method route(String uri) { return routeMap.get(uri); } } ``` 6. 数据库访问 FlyFish 3.0 中提供了 JdbcTemplate 类来简化数据库访问操作。以下是 JdbcTemplate 的示例代码: ``` public class JdbcTemplate { private Connection connection; public JdbcTemplate(String jdbcUrl, String jdbcUsername, String jdbcPassword) throws SQLException { connection = DriverManager.getConnection(jdbcUrl, jdbcUsername, jdbcPassword); } public <T> List<T> queryForList(String sql, RowMapper<T> rowMapper, Object... params) throws SQLException { List<T> resultList = new ArrayList<>(); PreparedStatement preparedStatement = connection.prepareStatement(sql); for (int i = 0; i < params.length; i++) { preparedStatement.setObject(i + 1, params[i]); } ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { resultList.add(rowMapper.mapRow(resultSet)); } return resultList; } public int update(String sql, Object... params) throws SQLException { PreparedStatement preparedStatement = connection.prepareStatement(sql); for (int i = 0; i < params.length; i++) { preparedStatement.setObject(i + 1, params[i]); } return preparedStatement.executeUpdate(); } public void close() throws SQLException { connection.close(); } } ``` 7. 安全过滤器 FlyFish 3.0 中提供了 SecurityFilter 类来实现基本的安全过滤功能。SecurityFilter 可以通过配置文件进行配置,支持白名单和黑名单两种模式。以下是 SecurityFilter 的示例代码: ``` public class SecurityFilter implements Filter { private Set<String> excludeSet = new HashSet<>(); @Override public void init(FilterConfig filterConfig) throws ServletException { String mode = filterConfig.getInitParameter("mode"); if ("white".equals(mode)) { String excludeList = filterConfig.getInitParameter("exclude"); String[] excludeArray = excludeList.split(","); excludeSet.addAll(Arrays.asList(excludeArray)); } } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; String uri = httpRequest.getRequestURI(); if (excludeSet.contains(uri)) { chain.doFilter(request, response); } else { httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN); } } @Override public void destroy() { // do nothing } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值