## Install
Fiora provides two ways to install
- [Install by source code](https://yinxin630.github.io/fiora/docs/install#how-to-run)
- [Install by docker](https://yinxin630.github.io/fiora/docs/install#running-on-the-docker)
## Change Log
You can find the Fiora changelog [on the website](https://yinxin630.github.io/fiora/docs/changelog)
## Contribution
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. Please make sure to update tests as appropriate
1. Fork it (
## Directory
|-- [.githubb] // github actions
|-- [.vscode] // vscode workspace config
|-- [bin] // server scripts
|-- [build] // webpack config
|-- [client] // web client
|-- [config] // application configs
|-- [dist] // client buid output directory
|-- [docs] // document
|-- [public] // server static resources
|-- [server] // server
|-- [test] // unit test
|-- [types] // typescript types
|-- [utils] // util functions
|-- .babelrc // babel config
|-- .eslintignore // eslint ignore list
|-- .eslintrc // eslint config
|-- .gitignore // git ignore
|-- .nodemonrc // nodemon config
|-- .prettierrc // prettier config
|-- Dockerfile // docker file
|-- LICENSE // fiora license
|-- docker-compose.yaml // docker compose config
|-- jest.*.sj // jest config
|-- package.json // npm
|-- tsconfig.json // typescript config
|-- yarn.lock // yarn
...
## Contribution
If you want to add functionality or fix bugs, please follow the process below:
1. Fork this repository and clone the fork post to the local
2. Installation dependencies `yarn install`
3. Modify the code and confirm it is bug free
4. Submit code, if eslint has reported error, please repair it and submit it again.
5. Create a pull request
================================================
FILE: packages/docs/i18n/en/docusaurus-plugin-content-docs/current/INSTALL.md
================================================
---
id: install
title: Install
sidebar_label: Install
---
## Environmental Preparation
To run Fiora, you need Node.js(recommend v14 LTS version), MongoDB and redis
- Install Node.js
- Official website
## 目录结构
|-- [.githubb] // github actions
|-- [.vscode] // vscode 工作区配置
|-- [bin] // 服务端脚本
|-- [build] // webpack 配置
|-- [client] // web 客户端
|-- [config] // 应用配置
|-- [dist] // 构建客户端输出目录
|-- [docs] // 文档
|-- [public] // 服务端静态资源
|-- [server] // 服务端
|-- [test] // 单元测试
|-- [types] // typescript 类型
|-- [utils] // 工具方法
|-- .babelrc // babel 配置
|-- .eslintignore // eslint 忽略
|-- .eslintrc // eslint 配置
|-- .gitignore // git 忽略
|-- .nodemonrc // nodemon 配置
|-- .prettierrc // prettier 配置
|-- Dockerfile // docker 文件
|-- LICENSE // fiora 许可
|-- docker-compose.yaml // docker compose 配置
|-- jest.*.sj // jest 配置
|-- package.json // npm
|-- tsconfig.json // typescript 配置
|-- yarn.lock // yarn
...
## 贡献代码
如果你想要添加功能或者修复 BUG. 请遵守下列流程.
1. fork 本仓库并克隆 fork 后的仓库到本地
2. 安装依赖 `yarn install`
3. 修改代码并确认无 bug
4. 提交代码, 如果 eslint 有报错, 请修复后再次提交
5. 创建一个 pull request
================================================
FILE: packages/docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/INSTALL.md
================================================
---
id: install
title: 安装
sidebar_label: 安装
---
## 环境准备
要运行 Fiora, 你需要 Node.js(推荐 v14 LTS 版本), MongoDB 和 redis
- 安装 Node.js
- 官网 {description}
{content}
{tagLine}
游客朋友你好, 请 action.setStatus('loginRegisterDialogVisible', true) } role="button" > 登录 后参与聊天
{member.user.username}
群组信息
修改群名称
修改群头像
功能
{selfId === creator ? ( ) : ( )}在线成员 {onlineMembers.length}
{member.user.username}
{member.browser} {member.os === 'Windows Server 2008 R2 / 7' ? 'Windows 7' : member.os}
不支持的编程语言; } const language = languagesMap[parseResult[1]] || 'text'; const rawCode = code.replace(/@language=[_a-z]+@/, ''); let size = `${rawCode.length}B`; if (rawCode.length > 1024) { size = `${Math.ceil((rawCode.length / 1024) * 100) / 100}KB`; } return ( <>
查看
{percent === undefined || percent >= 100 ? '下载' : `上传中... ${percent.toFixed(0)}%`}
); } export default React.memo(FileMessage); ================================================ FILE: packages/web/src/modules/Chat/Message/ImageMessage.tsx ================================================ import React, { useState, useCallback, useRef, MouseEvent } from 'react'; import loadable from '@loadable/component'; import { isMobile } from '@fiora/utils/ua'; import { getOSSFileUrl } from '../../../utils/uploadFile'; import Style from './Message.less'; import { CircleProgress } from '../../../components/Progress'; const ReactViewerAsync = loadable( async () => // @ts-ignore import(/* webpackChunkName: "react-viewer" */ 'react-viewer'), ); interface ImageMessageProps { src: string; loading: boolean; percent: number; } function ImageMessage(props: ImageMessageProps) { const { src, loading, percent } = props; const [viewer, toggleViewer] = useState(false); const closeViewer = useCallback(() => toggleViewer(false), []); const $container = useRef(null); let imageSrc = src; const containerWidth = isMobile ? window.innerWidth - 25 - 50 : 450; const maxWidth = containerWidth - 100 > 500 ? 500 : containerWidth - 100; const maxHeight = 200; let width = 200; let height = 200; const parseResult = /width=([0-9]+)&height=([0-9]+)/.exec(imageSrc); if (parseResult) { const natureWidth = +parseResult[1]; const naturehHeight = +parseResult[2]; let scale = 1; if (natureWidth * scale > maxWidth) { scale = maxWidth / natureWidth; } if (naturehHeight * scale > maxHeight) { scale = maxHeight / naturehHeight; } width = natureWidth * scale; height = naturehHeight * scale; imageSrc = /^(blob|data):/.test(imageSrc) ? imageSrc.split('?')[0] : getOSSFileUrl( src, `image/resize,w_${Math.floor(width)},h_${Math.floor( height, )}/quality,q_90`, ); } let className = Style.imageMessage; if (loading) { className += ` ${Style.iamgeLoading}`; } if (/huaji=true/.test(imageSrc)) { className += ` ${Style.huaji}`; } function handleImageViewerMaskClick(e: MouseEvent) { // @ts-ignore if (e.target?.tagName !== 'IMG') { closeViewer(); } } return ( <>加入
{users[i].username}
{groups[i].name}
{groups[i].members}人
没有搜索到内容, 换个关键字试试吧~
) : (用户
群组
没有搜索到内容, 换个关键字试试吧~~
) : (没有搜索到内容, 换个关键字试试吧~~
) : ({name}
{formatTime()}