- Vapor实战项目
- 项目模仿参考
- 项目规划
- 分支管理
- 表设计
- 自定义工作目录
- 路由
- 数据库
- 认证
- Heroku 部署
- 其他
- Ubuntu 20.04
- Leaf 的使用
- 配置远程 vscode remote
- 配置 VSCode,编写 Swift 代码更舒心
- main 是稳定分支
- dev 是开发分支
main 的改动会触发项目的自动部署,无需人工改动
-
users 用户
- id
- name
- is_email_verified 邮箱是否验证
- avatar 头像
- role_id 角色id
- created_at
- updated_at
last_sign_at
:Date 最近一次登录- blocked:Bool 是否屏蔽用户
- banned_to_post: Date 禁言,在该时间前不能发布言论
- gender: enum 性别 0女, 1男, 2 其他, 可以设计为枚举
- brief:String 简介,一句话介绍自己,70个字符限制
- source: 用户注册来源, 0->iPhone, 1->iPad, 2->Android, 3->H5, 4->网站, 5->iOS
- posts_count:int 帖子累积
- comment_count:int 评论累积
- fans_count: int 粉丝累积
- like_countL: int 获取赞累积
- follow_people_count: 用户关注人累积 - follow_peoples
- follow_posts_count: 关注的话题累积 -- follow_posts
- block_people_count: 屏蔽人的数量 -- block_peoples
- find_notification_at: Date 最近一次查询Notification的日期
-
user_auths 用户认证账号
- id
- user_id
- auth_type 类型 email, wxapp
- identifier 标志 (手机号,邮箱,用户名或第三方应用的唯一标识)
- credential 码凭证(站内的保存密码, 站外的不保存或保存 token)
- created_at
- updated_at
-
role 角色
- id
- name
-
roles_permissions 关系表
- id
- role_id
- permission_id
-
permissions 权限
- id
- name
-
access_tokens
- id
- token
- user_id
- expires_at
-
notifications(通知)
- id
- sender_id
- addressee_id
- target
- type
- deleted: bool
- created_at
-
user_notifications
- id
- type https://github.com/54sword/api.xiaoduyu.com/blob/master/src/schemas/user-notification.ts
- send_id
- addressee_id
- posts_id
- comment_id
- has_read: Bool
- deleted: Bool
- created_at
-
message:
- id
- user_id
- addressee_id
- type 1. 普通消息 2系统消息
- content: 内容
- content_html
- created_at
- device
- ip
- has_read
- blocked 是否被屏蔽
- deleted: 是否删除
-
topics 话题
- id
- user_id
- parent_id 父
- name 名称
- brief 摘要
- desc 详情
- avator 节点图标
- background 背景图
- follow_count 关注总数
- post_count 提问累积
- comment_count 评论总数
- sort 排序
- created_at
- language: 语言
- recommend: 是否推荐
- last_posts_at: 最近发帖的日期
- children: 与子的关系
-
reports 举报
- id
- user_id
- post_id
- comment_id
- people_id
- detail
- created_at
-
posts 帖子
- id
- user_id
- topic_id
- type: 0 提问 1 分享
- title: 标题
- content: 内容
- content_html 内容转化后的html 格式
- created_at
- updated_at
- last_comment_at
- comment: 关系,评论
- comment_count: 评论数
- replay_count: 回复
- view_count: 浏览数
- follow_count: 关注
- like_count: 点赞数
- device: 设备
- ip
- deleted_at
- verify: 是否是审核
- recommend: 是否推荐
- weaken: 削弱,将不再出现在首页
-
blocks 屏蔽
- user_id
- post_id
- comment_id
- people_id
- deleted_at
- created_at
- ip
-
comments
- user_id
- post_id
- parent_id
- reply_id
- content
- content_html
- created_at
- updated_at
- last_reply_at
- reply_count
- reply
- like_count
- device
- ip
- blocked: bool
- deleted: bool
- verify: 内容校验是否成功
- weaken: 削弱
- recommend: 推荐
-
like
- user_id
- type
- target_id
- mood 0 赞 1 喜欢
- deleted: bool
- created_at
-
follow
- user_id
- post_id
- topic_id
- people_id
- deleted
- created_at
-
feeds 动态流
- user_id
- topic_id
- post_id
- comment_id
- deleted
- created_at
如果是 xcode 运行,需要设置为当前项目根目录
1; 安装
$ brew install postgresql
$ brew link postgresql
2; 启动
$ brew services start postgresql
3; 关闭
$ brew services stop postgresql
4; 创建一个 PostgreSQL 用户
$ createuser username -P
#Enter password for new role
#Enter it again
上面的username
是用户名,回车输入 2 次用户密码后即用户创建完成。更多用户创建信息可以createuser –help
查看。
5; 创建数据库
$ createdb dbname -O username -E UTF8 -e
上面创建了一个名为dbname
的数据库,
并指定username
为改数据库的拥有者(owner),
数据库的编码(encoding)是 UTF8,
参数 -e
是指把数据库执行操作的命令显示出来。
6; 删除数据库
dropdb -h localhost -p 5432 -U username dbname
-e:显示dropdb
生成的命令并发送到数据库服务器。
-h host:指定运行服务器的主机名。
-p port:指定服务器监听的端口,或者 socket 文件。
-U username:连接数据库的用户名。
dbname
要删除的数据库名
本项目中运行的方式是:
createuser vapor -P
createdb blog -O vapor -E UTF8 -e
注意
- 更改数据库后,需要写迁移代码,完成后记得执行
vapor run migrate
- 模型间有依赖关系,注意迁移类的调用顺序
- 用户+密码换取 access_token 和 refresh_token
- 通过 access_token 校验,判断是否登录
- 如果 access_token 过期,通过 refresh_token 重新生成 access_token
- 如果 access_token 过期,那么需要用户重新登录
Heroku 平台的灵活性极高且支持多种编程语言。若想把程序部署到 Heroku 上,开发者可以直接使用 Git 把程序推送到 Heroku 的 Git 服务器上。在服务器上, git push 命令会自动触发安装、配置和部署程序。
您将需要一个 heroku 帐户,如果您没有,请在此处注册:https://#.heroku.com/
确保已安装 heroku cli 工具。
-
HomeBrew
brew install heroku/brew/heroku
-
其他安装选项 在此处查看替代安装选项:https://devcenter.heroku.com/articles/heroku-cli#download-and-install.
安装 cli 后,请输入以下内容:
$ heroku login
用以下命令来验证邮箱是否登录:
$ heroku auth:whoami
访问 dashboard.heroku.com,登录您的帐户,并从右上角的下拉列表中创建一个新应用程序。按照 Heroku 提供的提示进行操作即可。
将您的应用程序与 heroku 连接(your-apps-name-here 替换为您的应用程序名称)
$ heroku git:remote -a your-apps-name-here
设置 buildpack 告诉 heroku 如何处理这个 vapor 项目。
$ heroku buildpacks:set vapor/vapor
buildpack 会寻找一个.swift-version 文件,获知使用的 swift 版本。 (可根据自己的项目来替换下面的 5.2.1)
echo "5.2.1" > .swift-version
这将创建 .swift-version
文件,内容为 5.2.1。
Heroku 使用 Procfile 知道如何运行您的应用程序,我们可以使用下面:
web: Run serve --env production --hostname 0.0.0.0 --port $PORT
可以使用以下终端命令进行创建:
echo "web: Run serve --env production" \
"--hostname 0.0.0.0 --port \$PORT" > Procfile
您已经准备好部署,可以在终端上运行它。构建可能需要一段时间。
$ git push heroku main
成功构建之后,您需要添加至少一台服务器,一台网络是免费的,您可以通过以下方式获得它:
heroku ps:scale web=1
每当您想更新时,只需将最新的更改放入 main 并推送到 heroku,它将重新部署。
除了以上的方式,其实直接在 heroku 控制台操作即可,相对来说会简单好多:
项目同样需要配置 Swift 版本文件
和 Procfile
, 这两部跟 cli 操作一样,然后将修改提交到 github 上。
在 heroku 创建应用后,可在做如下图的配置:
我们配置了与 github 仓库的关联,且配置了,在 main 分支的有提交的时候,自动进行部署,无需人工操作。
然后还需配置 buildpacks
:
点击添加 add buildpack
, 将url(https://github.com/vapor-community/heroku-buildpack)填入即可:
在 dashboard.heroku.com 访问您的应用程序,然后转到 Add-ons
部分。
从这里输入 postgres
,您将看到Heroku Postgres
的选项,选择它。
选择hobby dev free plan
,并进行配置。 剩下的事由 Heroku 完成。
完成后,您将看到数据库显示在 Resources
选项卡下。
现在,我们必须告诉我们的应用程序如何访问数据库。在项目的根目录中,运行以下命令:
$ heroku config
这将会有如下输出:
=== today-i-learned-vapor Config Vars
DATABASE_URL: postgres://cybntsgadydqzm:2d9dc7f6d964f4750da1518ad71hag2ba729cd4527d4a18c70e024b11cfa8f4b@ec2-54-221-192-231.compute-1.amazonaws.com:5432/dfr89mvoo550b4
DATABASE_URL
此处将代表 postgres 数据库。不要将这个 URL 写入到你的代码中,这也是一个坏习惯。
下面是一个数据库配置的样例
if let databaseURL = Environment.get("DATABASE_URL") {
app.databases.use(try .postgres(
url: databaseURL
), as: .psql)
} else {
// ...
}
如果您使用 Heroku Postgres's standard plan
,则需要 Unverified TLS
。
不要忘记提交你所做的修改:
git add .
git commit -m "configured heroku database"
你可以使用 heroku 的 run 命令执行 revert
或者其他命令。默认情况下执行的是 Run
。
还原数据库:
$ heroku run Run -- revert --all --yes --env production
迁移:
$ heroku run Run -- migrate --env production
# 或者指定 app
heroku run Run --app=teamboke --env production -- migrate
杀死指定端口的进程
lsof -i:8080
kill xxxx
创建文件夹
mkdir -p Resources/Views
- swiftenv
- clang
- vapor
- zlib: sudo apt install zlib1g-dev
模板复用,需要用到 #extend
,#import
和 #export
,那么如何理解这三个tag:
#extend
标签允许您将一个模板的内容复制到另一个模板中。
#import
是暴露一个插槽。
#export
是实现特定的插槽。
举例:
<!-- base.html -->
<html>
<head>
<title>#(title)</title>
</head>
<body>#import("body")</body>
</html>
base.html
是个模板,它里面通过 #import
定义了 body 这么一个插槽,方便扩展它的文件可以自定义实现。
复用这个base.html
模板,假设我们创建了 welcome.html
:
<!-- welcome.html -->
#extend("base"):
#export("body"):
<p>Welcome to TEAM-BOKE!</p>
#endexport
#endextend
#extend
后面是我们要扩展的文件名,比如我们要扩展 base.html
, 那么就传入 base
即可。
#export
是我们对基模板中的插槽的自定义实现,指明需要实现的插槽的名字。
那么当 ["title": "Hi there!"]
从Swift
传递过来时,welcome.html
将被渲染为:
<html>
<head>
<title>Hi there!</title>
</head>
<body><p>Welcome to TEAM-BOKE!</p></body>
</html>
非常方便编写服务器代码
1.在插件市场中搜索并安装 Remote Development 2.执行 ssh-keygen 命令创建密钥
ssh-keygen -t rsa -C 'your email@xxx.com'
3.生成ssh key了之后,需要将ssh key放到远程服务器上。
使用 scp 命令将本地的公钥文件 id_rsa.pub 复制到需要连接的Linux服务器:
scp ~/.ssh/id_rsa.pub 用户名@ip:/home/id_rsa.pub
4.登录服务器,把公钥追加到服务器ssh认证文件中:
cat /home/id_rsa.pub >> ~/.ssh/authorized_keys
5.使用 cmd+shift+p
的快捷键调用命令,执行 Remote-SSH:Connect to Host...
, 然后选择配置文件的路径
图文教程可参考文章
在 Linux 的环境中,建议用swiftenv 安装Swift,因为这样安装可以快速管理多个swift版本。
在用 VSCode 编写 Swift 代码,首先我们需要代码高亮,代码自动补全。这是两个非常基础的需求。
对于代码高亮VSCode 已经帮我们支持了。
那么自动补全的话,我们需要安装 SourceKit-LSP 的插件。
LSP的全程是Language Sever Protocol,是微软提出的一项标准化协议,旨在统一开发工具与Lanuguage Server之间的通信。LSP为支持的语言提供了一套通用的功能集,包括:语法高亮、自动补全、定义跳转、查找引用等等。
Swift ToolChain 中已经集成了 LSP
, 不行,你可以快速找下路径:
$ which sourcekit-lsp
/home/mac/.swiftenv/shims/sourcekit-lsp
sourcekit-lsp 这个路径等下配置 vscode 的时候我们需要用到。
第二步,就是安装插件,很幸运,苹果给我们写好了文档,操作下来也没啥问题
第三步,配置 sourcekit 的路径。
将 Sourcekit-lsp: Server Path 中的路径配置为 /home/mac/.swiftenv/shims/sourcekit-lsp
。
然后重启 VSCode,便可支持代码自动补全、定义跳转等功能。
如果还需要更丰富的配置,如代码格式化,Debug 等,那么可以参考这篇文章:在Linux系统上搭建Swift开发调试环境