【Phoenix】2、初始化 Phoenix 项目后的 目录结构
1、当我们创建的时候,Phoenix 为我们建立的根目录架构,如下:
├── _build
├── assets // 这个是放一下静态文件的,不如 js、css img 和 node_module 依赖包,都是基本放在这里
├── config // 是放一些配置的,数据库的配置也基本放在这里
├── deps // 这里应该是放 Elixir 这个语言的依赖包的
├── lib // 开发主要在这个目录下进行
│ └── hello
│ └── hello_web
│ └── hello.ex
│ └── hello_web.ex
├── priv // 这个下面是一些 assets 打包后,存放的文件
├── test // 这个估计是测试用的文件夹
2、这篇文章的教程,大部分都是在 lib/hello_web 这个目录下进行,目录结构如下:(页面的路由,控件,模板都是在这个目录下)
├── channels // 这个不清楚
│ └── user_socket.ex
├── controllers // 控制器
│ └── page_controller.ex
├── templates // 模板放的位置
│ ├── layout
│ │ └── app.html.eex
│ └── page
│ └── index.html.eex
└── views // 渲染页面的模块调用位置
│ ├── error_helpers.ex
│ ├── error_view.ex
│ ├── layout_view.ex
│ └── page_view.ex
├── endpoint.ex
├── gettext.ex
├── router.ex // 这个是路由配置文件
3、静态的 js、css、图片 和 依赖包都在 priv/static 的文件夹中
├── assets
│ ├── css
│ │ └── app.css
│ ├── js
│ │ └── app.js
│ └── static
│ └── node_modules
│ └── vendor
4、在本地运行的文件,不在浏览器上传输的在 lib/hello 中
lib
├── hello
| ├── application.ex
| └── repo.ex
5、在 lib/hello_web/router.ex 文件中,所有的 http 路径请求 控制,会在这里控制,
// 所有类似的路径请求,都会被 PageController 中的 index 方法处理,模块定义 路径在 lib/hello_web/controllers/page_controller.ex
get "/", PageController, :index
6、下面让我们创建一个 http://localhost:4000/hello 路径的页面,我们先在 router.ex 文件中 scope 里面,新增一个 路径为 /hello 的 get 请求,新增后如下:
scope "/", HelloWeb do
pipe_through :browser get "/", PageController, :index
get "/hello", HelloController, :index
end
7、在 lib/hello_web/controllers 目录下新建一个叫 hello_controller.ex 的文件,内容如下:
defmodule HelloWeb.HelloController do
use HelloWeb, :controller
// 这里有两个参数
// conn 是一个包含大量请求数据的结构
// params 是请求参数,在这里没有使用,直接 params 会在编译的时候报警告,加上 _ 就可以避免了
def index(conn, _params) do // 这里的意思,是告诉 Phoenix 找到一个 模板叫做 index.html.eex 并且渲染它
// Ps: 这里我们可以在这里用 atom(原子数据) 作为值,例如:render(conn, :index)
// 但是 模板 会根据 atom 的值,作为头部,在 index.html / index.json 之间选择
render(conn, "index.html")
end
end
8、然后,官方推荐在 view 中处理数据(这我不确定是不是这样理解),所以在 lib/hello_web/views 下面新建一个 hello_view.ex 的文件,内容如下:
defmodule HelloWeb.HelloView do
use HelloWeb, :view
end
9、Phoenix 中的模板,使用的是 EEx(是 Elixir 的嵌入式,允许嵌入 Elixir 代码到 字符串),文件后缀是 .eex;
模板的作用域是 一个 view,view 的作用域是 controller,我们最好统一命名,所以创建一个命名空间(也就是创建一个 文件夹);这里创建一个 hello 的文件夹,在 templates 文件夹下,然后在 hello 下创建一个 index.html.eex 文件,内容如下:
<div class="phx-hero">
<h2>第一个 Phoenix 的模板渲染</h2>
</div>
10、mix phx.server 运行 Phoenix 服务(如果你已经运行服务了,直接刷新就好了,Phoenix 已经做了热重载),访问路径 http://localhost:4000/hello,我们可以看到下图:

11、为什么我们只写了一个 简单的 div 标签就看到一整个网页呢?是因为 templates/layout 下面的 app.html.eex 是一整个页面的模板,其中有一句 替换 成我们自己写的模板,就行渲染了。如下:
// 就这一行代码,把我们写的模板替换到这里位置来,进行渲染。暂时只了解到这里,其他的用法之类的。后面学习。
<%= render @view_module, @view_template, assigns %>

12、到这里为止,我们的就算是学会了简单的新增路由,和简单的渲染。
我是分割线-------------------------------------------------------------------------------------我是分割线
13、先新建一个路由,我们这里是一个动态路由,如下:
// :messager 这个大概都知道是什么了。
// 在 Elixir 中 :messager 中,叫原子,也就是 键值对都是 messager 的值。但在路由中,也就是 messager = 1 的话,动态路由的路径是 /hello/1 了。
get "/hello/:messenger", HelloController, :show
14、新增一个动作,因为我们上面定义的 是 :show ,而不是已经存在的 :index 动作,因为都是 hello 这个路由下,所以我们还在 hello_controller 这个文件中 新增就行了,如下:
def show(conn, %{"messenger" => messenger}) do
render(conn, "show.html", messenger: messenger)
end
// 新增后 hello_controller.ex 文件的内容,如下:
// 这里可能有小白,没空 Elixir 语法就跑过来看了, 我大概讲解一下,
// defmodule 空间.名称 do 这个,就是 Elixir 定义模块的方法,模块这个,我也只是大概看了一下,说法不一定对
// def 名称 do 是定义函数的,Elixir 是函数式编程,所以函数式第一公民
// end 是说明这个模块(或者函数),到这里结束。
defmodule HelloWeb.HelloController do
use HelloWeb, :controller
def index(conn, _params) do
render(conn, "index.html")
end
def show(conn, %{"messenger" => messenger}) do
render(conn, "show.html", messenger: messenger)
end
end
15、如果动态路由。有多个值,如下:
#hello_controller.ex 文件
def show(conn, %{"messenger" => messenger, "test" => test}) do
render(conn, "show.html", messenger: messenger, test: test)
end #router.ex 文件
defmodule HelloWeb.Router do
use HelloWeb, :router pipeline :browser do
plug :accepts, ["html"]
plug :fetch_session
plug :fetch_flash
plug :protect_from_forgery
plug :put_secure_browser_headers
end pipeline :api do
plug :accepts, ["json"]
end scope "/", HelloWeb do
pipe_through :browser get "/", PageController, :index get "/hello", HelloController, :index get "/hello/:messenger/:test", HelloController, :show
end # Other scopes may use custom stacks.
# scope "/api", HelloWeb do
# pipe_through :api
# end
end #show.html.eex 文件
// 一个 <%= %> 好像只能嵌入一个 变量
<div class="phx-hero">
<p>Hello World, from <%= @messenger %> 我是测试数据<%= @test %> </p>
</div>
【Phoenix】2、初始化 Phoenix 项目后的 目录结构的更多相关文章
- 利用vue-cli搭建项目后的目录结构
npm install -g vue-cli vue init webpack my-project(项目名称) 后的目录结构: -----build webpack配置相关 --- ...
- Vue学习之路3-浅析Vue-cli搭建项目后的目录结构
1.前言 Vue并不限制你的代码结构.但是,它规定了一些需要遵守的规则:1.应用层级的状态应该集中到单个store对象中.2.提交mutation是更改状态的唯一方法,并且这个过程是同步的.3.异步逻 ...
- YII框架开发一个项目的通用目录结构
YII框架开发一个项目的通用目录结构: 3 testdrive/ 4 index.php Web 应用入口脚本文件 5 assets/ 包含公开的资源文件 6 css/ 包含 CSS 文件 7 ima ...
- maven项目的标准目录结构
maven项目的标准目录结构如下:
- maven 创建web项目的标准目录结构
maven 创建web项目的标准目录结构 CreateTime--2018年4月18日21:05:37 Author:Marydon 1.标准目录介绍(开发目录) 2.在eclipse下,目录展示 ...
- eclipse下maven项目保持原有目录结构配置resin运行环境
maven项目用起来很方便,但是它的目录结构和eclipse的目录结构是有区别的,故而在eclipse下的maven项目,直接运行调试是有一些问题的. 为了方便maven项目的运行调试,因而也就有了像 ...
- android项目的的目录结构
然后我们看一下Helloword的程序目录: 我们可以看到 大致有的文件: 1. MainHelloWorld.java文件 2. R.java文件 3. android.jar文件 4. RES.L ...
- 踩过的坑:InteliIJ IDEA 打开的项目突然左侧目录结构消失了,如何处理?
试了很多的办法,删除项目,然后重新从git下载,再导入项目,但是对于暂存未上传到git的文件也会被一并删除,这样就亏大发了 之前一直没有找到解决办法,这里记一下终身有效的办法,并且比较好操作 按下列步 ...
- Android项目实现Module目录结构分组
一.背景 项目需求的频繁迭代,新的产品功能在不断添加和延伸,随之带来的是,项目技术复杂度的提升. 近几年来,Android模块化.组件化相关技术得到极速发展,将项目整体进行分层,不同的层次之间依据实际 ...
随机推荐
- FlowPortal BPM多汇报线的设置及使用
1.在组织结构中设置多汇报线 2.流程中使用汇报线 3.流程节点上使用汇报线 流程节点默认启用流程中指定的汇报线,若流程中的某个节点需要启用特殊的汇报线,可通过设置节点业务属性实现.
- Go 字符串使用
Go语言中的字符串 Go 中的字符串是兼容 Unicode 编码的,并且使用 UTF-8 进行编码,这样每一个Unicode字符根据代码点的大小使用1.2.3或4个字节表示代码点.Go 语言中的字符串 ...
- Centos6.5 自带的Python2.6.6 如何安装setuptools和pip
setuptools-36.7.1 [root@ ]# wget https://files.pythonhosted.org/packages/a9/23/720c7558ba6ad3e0f5ad0 ...
- MySQL读写分离高可用集群及读操作负载均衡(Centos7)
目录 概述 keepalived和heartbeat对比 一.环境 二.部署 部署lvs代理和keepalived MySQL+heartbeat+drbd的部署 MySQL主从复制 web服务器及a ...
- linux在线安装jdk,tomcat,Nginx
安装jdk yum search java 查看java的所有版本内容 yum install -y java版本 -openjdk 安装成功 安装tomcat yum search tomcat y ...
- 《数据结构与算法之美》 <06>栈:如何实现浏览器的前进和后退功能?
浏览器的前进.后退功能,我想你肯定很熟悉吧? 当你依次访问完一串页面 a-b-c 之后,点击浏览器的后退按钮,就可以查看之前浏览过的页面 b 和 a.当你后退到页面 a,点击前进按钮,就可以重新查看页 ...
- 6.Hbase 原理
2 HBase体系结构 2.1 设计思路 HBase是一个分布式的数据库,使用Zookeeper管理集群,使用HDFS作为底层存储.在架构层面上由HMaster(Zookeeper选举产生的Leade ...
- python-----多线程笔记
多进程笔记: 多线程介绍: 多线程是为了同步完成多项任务,通过提高资源使用效率来提高系统的效率.线程是在同一时间需要完成多项任务的时候实现的. 最简单的比喻多线程就像火车的每一节车厢,而进程则是火车. ...
- 动态规划1——最长递增子序列、最长公共子序列、最长公共子串(python实现)
目录 1. 最长递增序列 2. 最长公共子序列 3. 最长公共子串 1. 最长递增序列 给定一个序列,找出其中最长的,严格递增的子序列的长度(不要求连续). 解法一:动态规划 通过一个辅助数组记录每一 ...
- App支付宝支付--PHP处理代码
/* *生成APP支付订单信息 * @param number uid 用户id * @param string token 用户token * @param number oid 订单id * @p ...