1、当我们创建的时候,Phoenix 为我们建立的根目录架构,如下:

  1. ├── _build
  2. ├── assets // 这个是放一下静态文件的,不如 js、css img 和 node_module 依赖包,都是基本放在这里
  3. ├── config // 是放一些配置的,数据库的配置也基本放在这里
  4. ├── deps // 这里应该是放 Elixir 这个语言的依赖包的
  5. ├── lib // 开发主要在这个目录下进行
  6. └── hello
  7. └── hello_web
  8. └── hello.ex
  9. └── hello_web.ex
  10. ├── priv // 这个下面是一些 assets 打包后,存放的文件
  11. ├── test // 这个估计是测试用的文件夹

  2、这篇文章的教程,大部分都是在 lib/hello_web 这个目录下进行,目录结构如下:(页面的路由,控件,模板都是在这个目录下)

  1. ├── channels // 这个不清楚
  2. └── user_socket.ex
  3. ├── controllers // 控制器
  4. └── page_controller.ex
  5. ├── templates // 模板放的位置
  6. ├── layout
  7. └── app.html.eex
  8. └── page
  9. └── index.html.eex
  10. └── views // 渲染页面的模块调用位置
  11. ├── error_helpers.ex
  12. ├── error_view.ex
  13. ├── layout_view.ex
  14. └── page_view.ex
  15. ├── endpoint.ex
  16. ├── gettext.ex
  17. ├── router.ex // 这个是路由配置文件

  

  3、静态的 js、css、图片 和 依赖包都在 priv/static 的文件夹中

  1. ├── assets
  2. ├── css
  3. └── app.css
  4. ├── js
  5. └── app.js
  6. └── static
  7. └── node_modules
  8. └── vendor

  

  4、在本地运行的文件,不在浏览器上传输的在 lib/hello 中

  1. lib
  2. ├── hello
  3. | ├── application.ex
  4. | └── repo.ex

  5、在 lib/hello_web/router.ex 文件中,所有的 http 路径请求 控制,会在这里控制,

  1. // 所有类似的路径请求,都会被 PageController 中的 index 方法处理,模块定义 路径在 lib/hello_web/controllers/page_controller.ex
  2. get "/", PageController, :index

  

  6、下面让我们创建一个 http://localhost:4000/hello 路径的页面,我们先在 router.ex 文件中 scope 里面,新增一个 路径为 /hello 的 get 请求,新增后如下:

  1. scope "/", HelloWeb do
  2. pipe_through :browser
  3.  
  4. get "/", PageController, :index
  5. get "/hello", HelloController, :index
  6. end

  

  7、在 lib/hello_web/controllers 目录下新建一个叫 hello_controller.ex 的文件,内容如下:

  1. defmodule HelloWeb.HelloController do
  2. use HelloWeb, :controller
  3. // 这里有两个参数
  4. // conn 是一个包含大量请求数据的结构
  5. // params 是请求参数,在这里没有使用,直接 params 会在编译的时候报警告,加上 _ 就可以避免了
  6. def index(conn, _params) do
  7.  
  8. // 这里的意思,是告诉 Phoenix 找到一个 模板叫做 index.html.eex 并且渲染它
  9. // Ps: 这里我们可以在这里用 atom(原子数据) 作为值,例如:render(conn, :index)
  10. // 但是 模板 会根据 atom 的值,作为头部,在 index.html / index.json 之间选择
  11. render(conn, "index.html")
  12. end
  13. end

  8、然后,官方推荐在 view 中处理数据(这我不确定是不是这样理解),所以在 lib/hello_web/views 下面新建一个 hello_view.ex 的文件,内容如下:

  1. defmodule HelloWeb.HelloView do
  2. use HelloWeb, :view
  3. end

  9、Phoenix 中的模板,使用的是 EEx(是 Elixir 的嵌入式,允许嵌入 Elixir 代码到 字符串),文件后缀是 .eex;

     模板的作用域是 一个 view,view 的作用域是 controller,我们最好统一命名,所以创建一个命名空间(也就是创建一个 文件夹);这里创建一个 hello 的文件夹,在 templates 文件夹下,然后在 hello 下创建一个 index.html.eex 文件,内容如下:

  1. <div class="phx-hero">
  2. <h2>第一个 Phoenix 的模板渲染</h2>
  3. </div>

  

  10、mix phx.server 运行 Phoenix 服务(如果你已经运行服务了,直接刷新就好了,Phoenix 已经做了热重载),访问路径 http://localhost:4000/hello,我们可以看到下图:

  11、为什么我们只写了一个 简单的 div 标签就看到一整个网页呢?是因为 templates/layout 下面的 app.html.eex 是一整个页面的模板,其中有一句 替换 成我们自己写的模板,就行渲染了。如下:

  1. // 就这一行代码,把我们写的模板替换到这里位置来,进行渲染。暂时只了解到这里,其他的用法之类的。后面学习。
  2. <%= render @view_module, @view_template, assigns %>

  12、到这里为止,我们的就算是学会了简单的新增路由,和简单的渲染。

我是分割线-------------------------------------------------------------------------------------我是分割线

  13、先新建一个路由,我们这里是一个动态路由,如下:

  1. // :messager 这个大概都知道是什么了。
  2. // 在 Elixir 中 :messager 中,叫原子,也就是 键值对都是 messager 的值。但在路由中,也就是 messager = 1 的话,动态路由的路径是 /hello/1 了。
  3. get "/hello/:messenger", HelloController, :show

  

  14、新增一个动作,因为我们上面定义的 是 :show ,而不是已经存在的 :index 动作,因为都是 hello 这个路由下,所以我们还在 hello_controller 这个文件中 新增就行了,如下:

  1. def show(conn, %{"messenger" => messenger}) do
  2. render(conn, "show.html", messenger: messenger)
  3. end
  4.  
  5. // 新增后 hello_controller.ex 文件的内容,如下:
  6. // 这里可能有小白,没空 Elixir 语法就跑过来看了, 我大概讲解一下,
  7. // defmodule 空间.名称 do 这个,就是 Elixir 定义模块的方法,模块这个,我也只是大概看了一下,说法不一定对
  8. // def 名称 do 是定义函数的,Elixir 是函数式编程,所以函数式第一公民
  9. // end 是说明这个模块(或者函数),到这里结束。
  10. defmodule HelloWeb.HelloController do
  11. use HelloWeb, :controller
  12.  
  13. def index(conn, _params) do
  14. render(conn, "index.html")
  15. end
  16.  
  17. def show(conn, %{"messenger" => messenger}) do
  18. render(conn, "show.html", messenger: messenger)
  19. end
  20. end

  

  15、如果动态路由。有多个值,如下:

  1. #hello_controller.ex 文件
  2. def show(conn, %{"messenger" => messenger, "test" => test}) do
  3. render(conn, "show.html", messenger: messenger, test: test)
  4. end
  5.  
  6. #router.ex 文件
  7. defmodule HelloWeb.Router do
  8. use HelloWeb, :router
  9.  
  10. pipeline :browser do
  11. plug :accepts, ["html"]
  12. plug :fetch_session
  13. plug :fetch_flash
  14. plug :protect_from_forgery
  15. plug :put_secure_browser_headers
  16. end
  17.  
  18. pipeline :api do
  19. plug :accepts, ["json"]
  20. end
  21.  
  22. scope "/", HelloWeb do
  23. pipe_through :browser
  24.  
  25. get "/", PageController, :index
  26.  
  27. get "/hello", HelloController, :index
  28.  
  29. get "/hello/:messenger/:test", HelloController, :show
  30. end
  31.  
  32. # Other scopes may use custom stacks.
  33. # scope "/api", HelloWeb do
  34. # pipe_through :api
  35. # end
  36. end
  37.  
  38. #show.html.eex 文件
    // 一个 <%= %> 好像只能嵌入一个 变量
  39. <div class="phx-hero">
  40. <p>Hello World, from <%= @messenger %> 我是测试数据<%= @test %> </p>
  41. </div>

【Phoenix】2、初始化 Phoenix 项目后的 目录结构的更多相关文章

  1. 利用vue-cli搭建项目后的目录结构

    npm install -g vue-cli vue init webpack my-project(项目名称)  后的目录结构: -----build         webpack配置相关 --- ...

  2. Vue学习之路3-浅析Vue-cli搭建项目后的目录结构

    1.前言 Vue并不限制你的代码结构.但是,它规定了一些需要遵守的规则:1.应用层级的状态应该集中到单个store对象中.2.提交mutation是更改状态的唯一方法,并且这个过程是同步的.3.异步逻 ...

  3. YII框架开发一个项目的通用目录结构

    YII框架开发一个项目的通用目录结构: 3 testdrive/ 4 index.php Web 应用入口脚本文件 5 assets/ 包含公开的资源文件 6 css/ 包含 CSS 文件 7 ima ...

  4. maven项目的标准目录结构

    maven项目的标准目录结构如下:

  5. maven 创建web项目的标准目录结构

      maven 创建web项目的标准目录结构 CreateTime--2018年4月18日21:05:37 Author:Marydon 1.标准目录介绍(开发目录) 2.在eclipse下,目录展示 ...

  6. eclipse下maven项目保持原有目录结构配置resin运行环境

    maven项目用起来很方便,但是它的目录结构和eclipse的目录结构是有区别的,故而在eclipse下的maven项目,直接运行调试是有一些问题的. 为了方便maven项目的运行调试,因而也就有了像 ...

  7. android项目的的目录结构

    然后我们看一下Helloword的程序目录: 我们可以看到 大致有的文件: 1. MainHelloWorld.java文件 2. R.java文件 3. android.jar文件 4. RES.L ...

  8. 踩过的坑:InteliIJ IDEA 打开的项目突然左侧目录结构消失了,如何处理?

    试了很多的办法,删除项目,然后重新从git下载,再导入项目,但是对于暂存未上传到git的文件也会被一并删除,这样就亏大发了 之前一直没有找到解决办法,这里记一下终身有效的办法,并且比较好操作 按下列步 ...

  9. Android项目实现Module目录结构分组

    一.背景 项目需求的频繁迭代,新的产品功能在不断添加和延伸,随之带来的是,项目技术复杂度的提升. 近几年来,Android模块化.组件化相关技术得到极速发展,将项目整体进行分层,不同的层次之间依据实际 ...

随机推荐

  1. form-create教程:移除默认提交按钮

    本文将介绍form-create如何修改,隐藏默认提交按钮 form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成器.并且支持生成任何 Vue 组件.结 ...

  2. MySQL锁表解决方法

    https://blog.csdn.net/a5582ddff/article/details/79566678 MySQL锁表解决方法 一.我的处理过程 1.查进程,主要是查找被锁表的那个进程的ID ...

  3. [LeetCode] 219. Contains Duplicate II ☆(存在重复元素2)

    每天一算:Contains Duplicate II 描述 给出1个整形数组nums和1个整数k,是否存在索引i和j,使得nums[i] == nums[j] 且i和j之间的差不超过k Example ...

  4. kbmMW 5.10.01试用报告

    1.FileClient.SameFile 调用这个方法,当本地文件不存在时,会一直等待.跟踪代码,发现: function TkbmMWCustomFileClient.SameFileEx(Loc ...

  5. Java学习第三天之注释

    编写程序时,总需要为程序添加一些注释,用以说明某段代码的作用,或者说明某个类的用途.某个方法的功能,以及该方法的参数和返回值的数据类型及意义等. 一.为什么要添加注释? (1)便于自己理解:有些人可能 ...

  6. Linux 01 Liunx系统简介

    Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件.应用程序和网络协议.它支持32位 ...

  7. mongodb索引 多健索引

    多健索引与单键索引创建形式相同,区别在于字段的值,单键索引,顾名思义,他的值为一个单一的值,例如字符串,数字或者日期,而多健索引,他的值具有多个记录,例如一个数组,两者建立方式类似 增加一条数组记录 ...

  8. 模糊查询的sql语句

    Java程序中使用的sql语句一直不明白是什么作用,在网上搜索了一些资料,看到一篇博客,稍微解答了具体每条代码的作用,因为作者加了详细的注解,可以作为参考 <JavaWeb dao层条件查询(模 ...

  9. 第69题:x的平方根

    一. 问题描述 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输 ...

  10. linux学习-添加多个硬盘和lvm配置

    原文 一般,服务器会有多个硬盘,一块硬盘分区安装操作系统,另外多块硬盘分区做存储使用.现在测试添加多块硬盘分区,使用lvm进行实现动态磁盘分配. 1.新增硬盘查看 fdisk -l 可以看到新增的两块 ...