{"id":20627533,"url":"https://github.com/xubeiyan/nimingban","last_synced_at":"2026-05-02T08:31:52.786Z","repository":{"id":231686136,"uuid":"781547633","full_name":"xubeiyan/nimingban","owner":"xubeiyan","description":"an Adao like anonymous board, but with modern UI","archived":false,"fork":false,"pushed_at":"2026-04-22T10:05:19.000Z","size":732,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-04-22T10:13:10.760Z","etag":null,"topics":["anonymous-board","postgresql","svelte-kit","svelte4","tailwindcss"],"latest_commit_sha":null,"homepage":"https://nimingban.chenhai.net","language":"Svelte","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xubeiyan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-04-03T15:34:31.000Z","updated_at":"2026-04-22T10:05:24.000Z","dependencies_parsed_at":"2024-05-05T10:25:06.676Z","dependency_job_id":"b6001b72-e816-4550-ac3e-7ac6763bae9f","html_url":"https://github.com/xubeiyan/nimingban","commit_stats":null,"previous_names":["xubeiyan/nimingban"],"tags_count":21,"template":false,"template_full_name":null,"purl":"pkg:github/xubeiyan/nimingban","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xubeiyan%2Fnimingban","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xubeiyan%2Fnimingban/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xubeiyan%2Fnimingban/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xubeiyan%2Fnimingban/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xubeiyan","download_url":"https://codeload.github.com/xubeiyan/nimingban/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xubeiyan%2Fnimingban/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32528183,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-02T01:12:54.858Z","status":"online","status_checked_at":"2026-05-02T02:00:05.923Z","response_time":132,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["anonymous-board","postgresql","svelte-kit","svelte4","tailwindcss"],"created_at":"2024-11-16T13:17:12.373Z","updated_at":"2026-05-02T08:31:52.768Z","avatar_url":"https://github.com/xubeiyan.png","language":"Svelte","funding_links":[],"categories":[],"sub_categories":[],"readme":"# nimingban\n\n![这是图片](/images/screenshot.png '界面')\n\n## 简介\n\n#### 一个类似于A岛（已停止运营）或者2chan，4chan的匿名版论坛\n\n- 使用 `SvelteKit` 元框架，搭配 `Svelte v4`\n- 样式库使用 `TailwindCSS v3`\n- 数据库使用 `PostgresSQL`\n\n## 支持功能\n\n### 普通用户\n\n- [x] 明亮/黑暗模式\n- [x] 注册用户\n- [x] 登录用户\n- [x] 申请饼干（匿名版常用需要饼干才能发帖）\n- [x] 多饼干切换\n- [x] 密码修改\n- [x] 两层版块（第一层称作分区，第二层称作版块）\n- [x] 发串或者评论支持 `Markdown` 语法，有预览功能，具体参考[这里](#markdown-编辑器支持语法)\n- [x] 回复也支持 `Markdown` 语法（笑看某V2EX\n- [x] (作者)编辑串或者评论，会增加编辑标记，可增加发送时忘记添加的图片\n\n### 管理者\n\n- [x] 串管理（编辑、修改可见性、移动串至其他板块、删除）\n- [x] 版块管理（新建，删除，修改，列表）\n- [x] 版块简介支持 `Markdown` 语法\n- [x] 用户和饼干管理（查询，修改可用性）\n- [x] 匿名版参数修改（网站名，JWT）\n- [x] 增加 `web` 界面的安装过程\n- [x] 管理者添加和更新（在安装过程中配置）\n- [x] 管理者可以重置用户密码，将其设为随机字符串，供用户找回\n- [x] 管理者编辑串或者评论\n\n## 路由设计\n\n\u003cdetails\u003e\n\u003csummary\u003e点击展开路由设计\u003c/summary\u003e\n\n| 功能                             | 路径（和请求方法）                      | 携带参数 |\n| -------------------------------- | --------------------------------------- | -------- |\n| 主页                             | GET /                                   |          |\n| 某个版                           | GET /board/{board_url}                  |          |\n| （管理）编辑某串或评论           | POST /board/editPostOrComment/{post_id} |          |\n| 获取某个版的串                   | GET /board/getPosts/{board_url}         |          |\n| 发送串                           | POST /board/sendPost/{board_url}        |          |\n| 发送回复串                       | POST /board/sendComment/{post_id}       |          |\n| 获取某串回复                     | GET /comment/{post_id}                  |          |\n| 获取某串最新回复                 | GET /comment/latest/{post_id}           |          |\n| 获取单独某条回复                 | GET /comment/single/{comment_id}        |          |\n| 获取某串包含的图片               | GET /getImages/fromPostOrComment/{id}      |          |\n| 查看某串                         | GET /post/{post_id}                     |          |\n| 登录                             | POST /login                             |          |\n| （管理）添加版块                 | POST /manage/addBoard                   |          |\n| （管理）添加分区                 | POST /manage/addSection                 |          |\n| （管理）编辑串状态               | POST /manage/editPostStatus/{id}        |          |\n| （管理）获取版块列表             | GET /manage/getBoardList/{id}           |          |\n| （管理）获取分区列表             | GET /manage/getSectionList              |          |\n| （管理）获取网站设置             | GET /manage/getSettingList              |          |\n| （管理）移动串                   | POST /manage/movePost                   |          |\n| （管理）获取完整版块列表         | GET /manage/movePost/getFullBoardList   |          |\n| （管理）删除版块                 | GET /manage/removeBoard/{id}            |          |\n| （管理）删除评论                 | GET /manage/removeComment/{id}          |          |\n| （管理）删除串                   | GET /manage/removePost/{id}             |          |\n| （管理）删除分区                 | GET /manage/removeSection/{id}          |          |\n| （管理）将用户变更为重置密码状态 | POST /manage/resetPassword              |          |\n| （管理）搜索用户或饼干           | POST /manage/searchCookies              |          |\n| （管理）搜索用户详细信息         | POST /manage/searchUser                 |          |\n| （管理）切换用户或饼干状态       | POST /manage/toggleUserStatus           |          |\n| （管理）更新版块                 | POST /manage/updateBoard                |          |\n| （管理）更新分区                 | POST /manage/updateSection              |          |\n| （管理）更新网站设置             | POST /manage/updateSetting              |          |\n| 注册                             | POST /register                          |          |\n| 获取饼干                         | GET /user/getNewCookies                 |          |\n| 刷新JWT                          | POST /user/refreshJWT                   |          |\n| 修改密码                         | POST /user/updatePassword               |          |\n| 重置密码                         | POST /user/resetPassword                |          |\n\n\u003c/details\u003e\n\n## 参数设置\n\n- `site_name` 匿名版名称\n- `jwt_secert` JWT 密钥\n- `jwt_expire_minute` JWT 密钥过期时间\n\n## 表设计\n\n### section\n\n\u003cdetails\u003e\n\u003csummary\u003e点击展开 区域名 表设计\u003c/summary\u003e\n\n| 列名         | 数据类型   | 备注 |\n| ------------ | ---------- | ---- |\n| id           | uuid       |      |\n| section_name | vchar(256) |      |\n| order        | integer    |      |\n\n\u003c/details\u003e\n\n### board\n\n\u003cdetails\u003e\n\u003csummary\u003e点击展开 版块 表设计\u003c/summary\u003e\n\n| 列名               | 数据类型   | 备注                              |\n| ------------------ | ---------- | --------------------------------- |\n| id                 | uuid       |                                   |\n| parent_section_id  | uuid       |                                   |\n| min_post_second    | integer    | default 10                        |\n| min_post_timestamp | timestamp  |                                   |\n| access_type        | vchar(16)  | 可选值 `all` `view_only` `hidden` |\n| name               | vchar(256) |                                   |\n| url_name           | vchar(256) |                                   |\n| intro              | text       |                                   |\n| order              | integer    |                                   |\n\n\u003c/details\u003e\n\n### post\n\n\u003cdetails\u003e\n\u003csummary\u003e点击展开 串 表设计\u003c/summary\u003e\n\n| 列名              | 数据类型   | 备注                                   |\n| ----------------- | ---------- | -------------------------------------- |\n| id                | uuid       |                                        |\n| status            | vchar(16)  | 可选值 `repliable` `readonly` `hidden` |\n| belong_board_id   | uuid       |                                        |\n| poster_name       | vchar(256) |                                        |\n| poster_email      | vchar(256) |                                        |\n| title             | vchar(256) |                                        |\n| content           | text       |                                        |\n| poster_cookies_id | uuid       |                                        |\n| post_timestamp    | timestamp  |                                        |\n| edit_timestamp    | timestamp  |                                        |\n\n\u003c/details\u003e\n\n### post_comment_image\n\n\u003cdetails\u003e\n\u003csummary\u003e点击展开 串内图像 表设计\u003c/summary\u003e\n\n| 列名       | 数据类型   | 备注                                   |\n| ---------- | ---------- | -------------------------------------- |\n| id         | uuid       |                                        |\n| image_type | vchar(16)  | 可用值 `png` `jpg` `gif` `webp` `avif` |\n| exist_type | vchar(16)  | 可用值 `exist` `hidden` `remove`       |\n| post_id    | uuid       |                                        |\n| fullname   | vchar(128) |                                        |\n\n\u003c/details\u003e\n\n### comment\n\n\u003cdetails\u003e\n\u003csummary\u003e点击展开 评论 表设计\u003c/summary\u003e\n\n| 列名           | 数据类型   | 备注 |\n| -------------- | ---------- | ---- |\n| id             | uuid       |      |\n| belong_post_id | uuid       |      |\n| poster_name    | vchar(256) |      |\n| poster_email   | vchar(256) |      |\n| title          | vchar(256) |      |\n| content        | text       |      |\n| post_timestamp | timestamp  |      |\n| edit_timestamp | timestamp  |      |\n\n\u003c/details\u003e\n\n### user\n\n\u003cdetails\u003e\n\u003csummary\u003e点击展开 用户 表设计\u003c/summary\u003e\n\n| 列名             | 数据类型   | 备注                                         |\n| ---------------- | ---------- | -------------------------------------------- |\n| id               | uuid       |                                              |\n| status           | vchar(16)  | 可用值 `enable` `disable`                    |\n| username         | vchar(256) |                                              |\n| password_hash    | vchar(128) |                                              |\n| password_salt    | vchar(128) |                                              |\n| type             | vchar(16)  | 可用值 `admin` `user`                        |\n| create_timestamp | timestamp  |                                              |\n| reset_password   | vchar(128) | 有值则处于密码重置状态，且此值为重置后的代码 |\n\n\u003c/details\u003e\n\n### cookies\n\n\u003cdetails\u003e\n\u003csummary\u003e点击展开 用户饼干 表设计\u003c/summary\u003e\n\n| 列名             | 数据类型  | 备注                      |\n| ---------------- | --------- | ------------------------- |\n| id               | uuid      |                           |\n| belong_user_id   | uuid      |                           |\n| create_timestamp | timestamp |                           |\n| expire_timestamp | timestamp |                           |\n| content          | vchar(32) |                           |\n| status           | vchar(16) | 可用值 `enable` `disable` |\n\n\u003c/details\u003e\n\n### site_settings\n\n\u003cdetails\u003e\n\u003csummary\u003e点击展开 网站设定 表设计\u003c/summary\u003e\n\n| 列名        | 数据类型   | 备注 |\n| ----------- | ---------- | ---- |\n| name        | vchar(64)  |      |\n| data_type   | vchar(64)  |      |\n| value       | vchar(128) |      |\n| description | vchar(256) |      |\n\n| 支持的值     | 说明                | 数据类型 | 默认值              |\n| ------------ | ------------------- | -------- | ------------------- |\n| site_name    | 站点名称            | \"string\" | \"匿名版\"            |\n| cookie_limit | 饼干限制            | \"number\" | \"5\"                 |\n| jwt_secret   | JSON Web Token 密钥 | \"string\" | \"nimingban20241011\" |\n\n\u003c/details\u003e\n\n## Markdown 编辑器支持语法\n\n- [x] `heading` h1~h4\n- [x] `text`\n- [x] `paragraph`\n- [x] `emphasis`\n- [x] `strong`\n- [x] `inlineCode`\n- [x] `code`\n  - [x] 支持用`\u003csamp\u003e`标签代替 result 代码块\n- [x] `delete`\n- [x] `hr`\n- [x] `blockquote`\n- [x] `link`\n- [x] `image`\n  - [x] 支持带图片说明文字插入，居中且有文字说明\n- [x] `list`\n  - [x] 支持有序和无序列表\n  - [x] 支持多层级的列表（最大 3 层）\n- [x] `table`\n- [x] `spoiler` 参考了 reddit `\u003e! hidden text !\u003c`\n- [x] `kbd` 使用 `[[...]]` 来实现\n- [x] `katexmath` 使用`KatexMath`来实现数学公式的显示，支持行内和块两种显示方式\n\n## 使用方法\n\n### 前置要求\n\n1. PostgreSQL\n\n配置好可用的 PostgreSQL 服务，例如\n\n```\nPGHOST=localhost\nPGUSER=postgres\nPGDATABASE=nimingban\nPGPASSWORD=postgres\nPGPORT=5432\n```\n\n2. 运行环境\n\n目前只在 `node` 下进行了测试，`bun` 或者 `deno` 尚未测试，欢迎测试并提出 PR\n\n已测试 `v18.20.5` 和 `v20.17.0`\n\n### 打包流程\n\n1. Clone 项目\n\n```shell\n# clone到当前目录\n$ git clone https://github.com/xubeiyan/nimingban ./nimingban\n```\n\n2. 安装依赖\n\n假设使用 `pnpm`，其他包管理类似\n\n```shell\n$ cd nimingban\n\n# P参数只安装运行依赖\n$ pnpm i -P\n```\n\n3. 进行打包\n\n会生成在 `./nimingban/build` 文件夹内\n\n```shell\n$ pnpm build\n```\n\n4. 配置环境变量文件\n\n将 `.env.example` 文件复制为 `.env`，并修改里面的内容\n\n```shell\n$ cp .env.example .env\n\n$ nvim .env\n```\n\n修改 `IMAGE_UPLOAD_PATH` 至可用的位置，`./uploadImages` 表示`nimingban/uploadImages` 文件夹\n\n```\n# 图片上传位置\nIMAGE_UPLOAD_PATH=./uploadImages\n```\n\n5. 启动项目\n\n```shell\n$ node build/index.js\n```\n\n但实际项目中一般会有域名指向此项目，例如`https://nimingban.name.net`，需要设定 `ORIGIN`，否则提交表单会发生跨域错误\n\n```shell\n# linux 指定环境变量\n$ ORIGIN=https://nimingban.name.net node build/index.js\n```\n\n```bat\n\u003e REM windows 指定环境变量\n\u003e set ORIGIN=https://nimingban.name.net\n\u003e node build\\index.js\n```\n\n### 生产环境额外配置\n\n1. 配置 `Web` 服务器直接处理图片请求加快图像访问（以 `nginx` 为例）\n\n```conf\n# /etc/nginx/site-avaliable/nimingban.name.net\nserver {\n    ...\n\n    # 指定 /images/ 路径\n    location /images/ {\n        alias /opt/nimingban/uploadImages/;\n    }\n\n    ...\n}\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxubeiyan%2Fnimingban","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxubeiyan%2Fnimingban","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxubeiyan%2Fnimingban/lists"}