Skip to content

swiftdo/team-boke

Repository files navigation

Vapor实战项目

项目模仿参考

项目规划

项目 源码
web网站 https://github.com/swiftdo/web-team-boke.git
App(iOS\Android) https://github.com/swiftdo/app-team-boke.git
后端API https://github.com/swiftdo/team-boke.git
后台管理 https://github.com/swiftdo/admin-team-boke.git

分支管理

  • main 是稳定分支
  • dev 是开发分支

main 的改动会触发项目的自动部署,无需人工改动

表设计

  • users 用户

    • id
    • name
    • email
    • 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

  • 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

注意

  1. 更改数据库后,需要写迁移代码,完成后记得执行 vapor run migrate
  2. 模型间有依赖关系,注意迁移类的调用顺序

认证

  1. 用户+密码换取 access_token 和 refresh_token
  2. 通过 access_token 校验,判断是否登录
  3. 如果 access_token 过期,通过 refresh_token 重新生成 access_token
  4. 如果 access_token 过期,那么需要用户重新登录

Heroku 部署

Heroku 平台的灵活性极高且支持多种编程语言。若想把程序部署到 Heroku 上,开发者可以直接使用 Git 把程序推送到 Heroku 的 Git 服务器上。在服务器上, git push 命令会自动触发安装、配置和部署程序。

注册 Heroku 账户

您将需要一个 heroku 帐户,如果您没有,请在此处注册:https://#.heroku.com/

通过 cli 方式进行 heroku 部署

安装 cli

确保已安装 heroku cli 工具。

登录

安装 cli 后,请输入以下内容:

$ heroku login

用以下命令来验证邮箱是否登录:

$ heroku auth:whoami

创建一个应用程序

访问 dashboard.heroku.com,登录您的帐户,并从右上角的下拉列表中创建一个新应用程序。按照 Heroku 提供的提示进行操作即可。

与 Heroku 连接

将您的应用程序与 heroku 连接(your-apps-name-here 替换为您的应用程序名称)

$ heroku git:remote -a your-apps-name-here

设置 Buildpack

设置 buildpack 告诉 heroku 如何处理这个 vapor 项目。

$ heroku buildpacks:set vapor/vapor

Swift 版本文件

buildpack 会寻找一个.swift-version 文件,获知使用的 swift 版本。 (可根据自己的项目来替换下面的 5.2.1)

echo "5.2.1" > .swift-version

这将创建 .swift-version 文件,内容为 5.2.1。

Procfile

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

部署到 Heroku

您已经准备好部署,可以在终端上运行它。构建可能需要一段时间。

$ git push heroku main

Scale Up

成功构建之后,您需要添加至少一台服务器,一台网络是免费的,您可以通过以下方式获得它:

heroku ps:scale web=1

持续部署

每当您想更新时,只需将最新的更改放入 main 并推送到 heroku,它将重新部署。

在 heroku 控制台进行部署

除了以上的方式,其实直接在 heroku 控制台操作即可,相对来说会简单好多:

项目同样需要配置 Swift 版本文件Procfile, 这两部跟 cli 操作一样,然后将修改提交到 github 上。

在 heroku 创建应用后,可在做如下图的配置:

我们配置了与 github 仓库的关联,且配置了,在 main 分支的有提交的时候,自动进行部署,无需人工操作。

然后还需配置 buildpacks:

点击添加 add buildpack, 将url(https://github.com/vapor-community/heroku-buildpack)填入即可:

heroku 中 Postgres 的配置

添加 PostgreSQL 数据库

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

Ubuntu 20.04

  • swiftenv
  • clang
  • vapor
  • zlib: sudo apt install zlib1g-dev

Leaf 的使用

模板复用,需要用到 #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>

配置远程 vscode remote

非常方便编写服务器代码

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..., 然后选择配置文件的路径

图文教程可参考文章

配置 VSCode,编写 Swift 代码更舒心

在 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 的时候我们需要用到。

第二步,就是安装插件,很幸运,苹果给我们写好了文档,操作下来也没啥问题

VSCode SourceKit-LSP 插件文档

第三步,配置 sourcekit 的路径。

将 Sourcekit-lsp: Server Path 中的路径配置为 /home/mac/.swiftenv/shims/sourcekit-lsp。 然后重启 VSCode,便可支持代码自动补全、定义跳转等功能。

如果还需要更丰富的配置,如代码格式化,Debug 等,那么可以参考这篇文章:在Linux系统上搭建Swift开发调试环境