这两个半个月自己简单手撸了个 web 框架。用得是 PureScript 撸的, PureScript 跟 CoffeeScript 一样是一门 target 到 JavaScript 的语言,虽然 PureScript 从语言本身的设计角度来说比 CoffeeScript 不知道高到哪里去了……但那也架不住 CoffeeScript 简单方便易学大众有生态。
其实拿 PureScript 手撸这个 web 框架是用来炫技的, PureScript 的强类型纯函数式的特性我觉得真的不太适合应用场景,把本身很简单的事情变复杂了。用 JavaScript / Ruby / Python / PHP 我实现这些东西顶多就两三天。
》》Github 传送门
》》LoveAria.Me 博客主站
下面讲讲我主要做的事情:
虽然是自己手撸的……但是放心,注入不了的,本宝宝做了防注入的。
可以用下面哪种好看的方式做查询了,例如:
insert "article" [ "title" .= title
, "category_id" .= category_id
, "raw_content" .= content
, "content" .= Markdown content ]
update "article" [ "title" .= title
, "category_id" .= category_id
, "raw_content" .= content
, "content" .= Markdown content] ("id" .== id)
first "article" ("id" .== id .&& "user_id" .== user_id) (Asc "id")
findall "article" ("category_id" .<- [cid1, cid2, cid3]) (Desc "id")
list :: Array Category.RichArticle -> Template
list articles = do
base
title "Article"
extend "body" $ do
ifLogined $ \_ ->
t_a [a_href := "/article/create"] $ text "Create"
article_list articles
article_list :: Array Category.RichArticle -> Template
article_list articles = do
t_table [] do
t_tr [] do
t_th [] $ text "Id"
t_th [] $ text "Title"
t_th [] $ text "Category"
t_th [] $ text "Create At"
t_th [] $ text "Update At"
forT articles $ \article -> do
t_tr [] do
t_td [] $ text $ show article.id
t_td [] do
t_a [a_href := "/article/show/" ++ show article.id]
$ text article.title
t_td [] do
t_a [a_href := "/article/category/" ++ show article.category.id]
$ text article.category.name
t_td [] $ text article.create_at
t_td [] $ text article.update_at
main :: forall e. ModelApp (console :: CONSOLE | e)
main = do
liftEff $ log "Setting up"
setProp "json spaces" 4.0
useExternal $ MW.bodyParser {extended: false}
static_path <- liftEff $ Config.static_path
useExternalAt "/static" $ MW.static static_path
useExternal $ cookieSession {secret: Config.security_key}
useExternal $ MW.setCookiesMaxAge (3600 * 24 * 30)
use CacheHandler.logger
use CacheHandler.cacheMiddleware
mount "/" HomeHandler.main
mount "/user" UserHandler.main
mount "/article" ArticleHandler.main
mount "/category" CategoryHandler.main
mount "/cache" CacheHandler.main
前端方面我准备使用 PureCSS 来做基本的 CSS 框架,然后做一个简洁好看的 UI 。 /w\ 没错,本宝宝就是那么纯( Pure ) 。 JavaScript 部分依旧还是用 PureScript 来做。当然 PureScript 写前端也有些蛋疼,不过我能折腾 /w\。
啊~ 终于能够好好写东西并且实验奇怪小东西的地方啊啦~
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.