# fnd-oj
**Repository Path**: kchnb/fnd-oj
## Basic Information
- **Project Name**: fnd-oj
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-12-27
- **Last Updated**: 2024-03-27
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
Online Judge
## ⚡️ 框架介绍
Online Judge,集成全面的系统配置,优质模板,常用组件,服务于在线做题的前台项目。
使用的技术框架: `Vue3 + Vite + Typescript + Navie UI + Express`
## 💚 特性
- [Naive UI](https://www.naiveui.com/zh-CN/os-theme):Vue3 的组件库,超过 80 个组件,全量使用 TypeScript 编写,和项目的 TypeScript 项目无缝衔接。
- [Vite](https://cn.vitejs.dev/):下一代的前端工具链,为开发提供极速响应。
- [Vue3](https://cn.vuejs.org/):易学易用,性能出色,适用场景丰富的 Web 前端框架。
- [TypeScript](https://ts.nodejs.cn/):TypeScript 是一种基于 JavaScript 构建的强类型编程语言,可为你提供任何规模的更好工具。
- [Express](https://www.expressjs.com.cn/):基于 Node.js 平台,快速、开放、极简的 Web 开发框架。
## 🎉 预览
[项目地址](http://182.92.161.222:5199) 自行注册,登录即可
## 😃 准备
- [Node.js 18.0.0](http://nodejs.org/) 和 [git](https://git-scm.com/) -项目开发环境
- [Visual Studio Code ](https://code.visualstudio.com/Download) 安装
## 🌈 开发使用
- 克隆项目源码
```
git clone https://gitee.com/kchnb/fnd-oj.git
```
- 进入项目目录
```
cd fnd-oj
```
- 安装依赖
> 注意:受国内网络环境影响,安装 npm 包比较慢,建议设置国内镜像源
```
npm config set registry https://registry.npm.taobao.org/
```
```
npm install
```
- 配置环境变量(.env 文件)
```
# 后端服务地址
VITE_SERVER_HOST=http://182.92.161.222:8086
# Node端口
VITE_NODE_SERVER_PORT=5199
# 开发环境前端服务端口
VITE_SERVER_PORT=5188
# BASEURL
VITE_BASE_URL=/server
# 当前环境
NODE_ENV=production
```
- 开发环境运行
> 注意:同时启动 vite 服务和 node 服务
```
npm run dev
```
- 编译打包
```
npm run build
```
- 生产环境启动
```
npm run start
```
- 生产环境守护进程运行
> 注意:需要安装 pm2 插件
```
pm2 start npm -- run start
```
## ✨ 开发者须知
1. **服务端服务**
- Node 端服务框架使用 [Express.js](https://expressjs.com/)。
- 代码采用 TypeScript 编写,上线之前需要编译,编译代码:`npm run build:server`,编译后的地址为:/dist/server。
- 运行模式分为:development / production 。 上线后需要制定环境变量:`NODE_ENV = "production"`
- Node 端及 Vue 端都采用 ESM,禁止使用 commonjs。即不要使用 require, package.json 中添加 ` "type": "module",` ,已强制项目采用 ESM 方式。
- 服务端环境变量暂时只能使用 .env 文件,.env.development,.env.production 及 .env.{mode} 不能读取。
2. **代理转发**
- 服务端默认开启代理转发功能,路由由/server 开头的 http 请求都会自动转发到 VITE_SERVER_HOST 变量的服务端地址,如果需要添加多个转发地址,如下修改:
```typescript
// express.ts line 20
app.use("/${你的转发开头}", proxy(process.env.OTHER_SERVER_HOST));
```
- 代理转发到的后端地址需要在环境变量中指定:`OTHER_SERVER_HOST=http://xxx`
3. **日志**
Node 端日志采用 winston + morgan 进行采集,输出包括终端和文件,文件最大保留 30 天。
4. **权限指令**
- 权限存储于 pinia 中的 account 对象中。
- 权限在 mounted 和 updated 后才会调用,即服务端返回的可能存在用户无权限看到的 dom ,所以请酌情使用。
- 调用权限采用在 dom 上使用 `v-permission:role=”auth”` 即可,表示当前 dom 需要角色 role 或者存在权限 auth 方可显示,角色优先级高于权限:超管(角色为 admin 拥有所有权限)> 角色 > 权限。
- JS 代码中可以调用 `hasPermission(auth)` 来判断当前用户是否拥有 auth 权限。
5. **路由**
- 存放于 `src/router/routes/constants.ts` 里的路由是项目包含的所有路由。
- 动态路由由后台返回菜单列表与所有路由配置进行递归查找处理,字段配置见菜单模块,由前端决定,可与后台商议。
6. **状态管理 pinia 模块的使用**
- mock 状态管理模块使用相关说明
在项目根目录的 src/store/modules 下根据功能模块划分,书写全局管理状态。
在 src/stores/modules/index.ts 文件中统一导入,并对外暴漏。
- Naive-UI 全局化配置
以状态管理的方式保存到 designSetting.ts 中,并对外暴漏修改方法,统一进行管理。默认:亮色主题,中文。自定义主题配置同样在 designSetting 中,并通过 themeOverrides 向外暴漏。
在 src/plugins/naiveComponent.ts 中使用按需引入的方式,全局引入 Naive-UI 组件,有利于 tree shaking(摇树优化),减小打包体积。
7. **Meta 支持**
在 vue2 项目中已有比较成熟的解决方案 [vue-meta](https://github.com/nuxt/vue-meta),但在 vue3 项目中 vue-meta 仍在测试阶段(官网原话,Vue3 support for vue-meta is considered in mostly-stable-alpha stage),且结合路由完成 Meta 自动注入的能力还不具备,因此本系统暂不使用。
通过路由导航守卫(src/router/guard/metainfo.ts)拦截路由信息中 Title 信息,追加到浏览器 Title 中。
## 🤖 生产配置
- 阿里云地址:`182.92.161.222`
- 服务部署地址`/www/node/fnd-oj`
## 👷 开发者
[@kouchuanhua](https://gitee.com/kchnb)