🎨 update readme

This commit is contained in:
jmal 2022-08-09 15:27:40 +08:00
parent e354812501
commit 2047777abe
8 changed files with 107 additions and 625 deletions

View File

@ -1,207 +0,0 @@
// module.exports = {
// root: true,
// parserOptions: {
// parser: 'babel-eslint',
// sourceType: 'module'
// },
// env: {
// browser: true,
// node: true,
// es6: true,
// },
// extends: ['plugin:vue/recommended', 'eslint:recommended'],
//
// // add your custom rules here
// //it is base on https://github.com/vuejs/eslint-config-vue
// rules: {
// "vue/html-self-closing": ["error",{
// "html": {
// "void": "never",
// "normal": "any",
// "component": "any"
// },
// "svg": "always",
// "math": "always"
// }],
// "vue/max-attributes-per-line": [2, {
// "singleline": 10,
// "multiline": {
// "max": 1,
// "allowFirstLine": false
// }
// }],
// "vue/singleline-html-element-content-newline": "off",
// "vue/multiline-html-element-content-newline":"off",
// "vue/name-property-casing": ["error", "PascalCase"],
// "vue/no-v-html": "off",
// 'accessor-pairs': 2,
// 'arrow-spacing': [2, {
// 'before': true,
// 'after': true
// }],
// 'block-spacing': [2, 'always'],
// 'brace-style': [2, '1tbs', {
// 'allowSingleLine': true
// }],
// 'camelcase': [0, {
// 'properties': 'always'
// }],
// 'comma-dangle': [2, 'never'],
// 'comma-spacing': [2, {
// 'before': false,
// 'after': true
// }],
// 'comma-style': [2, 'last'],
// 'constructor-super': 2,
// 'curly': [2, 'multi-line'],
// 'dot-location': [2, 'property'],
// 'eol-last': 2,
// 'eqeqeq': ["error", "always", {"null": "ignore"}],
// 'generator-star-spacing': [2, {
// 'before': true,
// 'after': true
// }],
// 'handle-callback-err': [2, '^(err|error)$'],
// 'indent': [2, 2, {
// 'SwitchCase': 1
// }],
// 'jsx-quotes': [2, 'prefer-single'],
// 'key-spacing': [2, {
// 'beforeColon': false,
// 'afterColon': true
// }],
// 'keyword-spacing': [2, {
// 'before': true,
// 'after': true
// }],
// 'new-cap': [2, {
// 'newIsCap': true,
// 'capIsNew': false
// }],
// 'new-parens': 2,
// 'no-array-constructor': 2,
// 'no-caller': 2,
// 'no-console': 'off',
// 'no-class-assign': 2,
// 'no-cond-assign': 2,
// 'no-const-assign': 2,
// 'no-control-regex': 0,
// 'no-delete-var': 2,
// 'no-dupe-args': 2,
// 'no-dupe-class-members': 2,
// 'no-dupe-keys': 2,
// 'no-duplicate-case': 2,
// 'no-empty-character-class': 2,
// 'no-empty-pattern': 2,
// 'no-eval': 2,
// 'no-ex-assign': 2,
// 'no-extend-native': 2,
// 'no-extra-bind': 2,
// 'no-extra-boolean-cast': 2,
// 'no-extra-parens': [2, 'functions'],
// 'no-fallthrough': 2,
// 'no-floating-decimal': 2,
// 'no-func-assign': 2,
// 'no-implied-eval': 2,
// 'no-inner-declarations': [2, 'functions'],
// 'no-invalid-regexp': 2,
// 'no-irregular-whitespace': 2,
// 'no-iterator': 2,
// 'no-label-var': 2,
// 'no-labels': [2, {
// 'allowLoop': false,
// 'allowSwitch': false
// }],
// 'no-lone-blocks': 2,
// 'no-mixed-spaces-and-tabs': 2,
// 'no-multi-spaces': 2,
// 'no-multi-str': 2,
// 'no-multiple-empty-lines': [2, {
// 'max': 1
// }],
// 'no-native-reassign': 2,
// 'no-negated-in-lhs': 2,
// 'no-new-object': 2,
// 'no-new-require': 2,
// 'no-new-symbol': 2,
// 'no-new-wrappers': 2,
// 'no-obj-calls': 2,
// 'no-octal': 2,
// 'no-octal-escape': 2,
// 'no-path-concat': 2,
// 'no-proto': 2,
// 'no-redeclare': 2,
// 'no-regex-spaces': 2,
// 'no-return-assign': [2, 'except-parens'],
// 'no-self-assign': 2,
// 'no-self-compare': 2,
// 'no-sequences': 2,
// 'no-shadow-restricted-names': 2,
// 'no-spaced-func': 2,
// 'no-sparse-arrays': 2,
// 'no-this-before-super': 2,
// 'no-throw-literal': 2,
// 'no-trailing-spaces': 2,
// 'no-undef': 2,
// 'no-undef-init': 2,
// 'no-unexpected-multiline': 2,
// 'no-unmodified-loop-condition': 2,
// 'no-unneeded-ternary': [2, {
// 'defaultAssignment': false
// }],
// 'no-unreachable': 2,
// 'no-unsafe-finally': 2,
// 'no-unused-vars': [2, {
// 'vars': 'all',
// 'args': 'none'
// }],
// 'no-useless-call': 2,
// 'no-useless-computed-key': 2,
// 'no-useless-constructor': 2,
// 'no-useless-escape': 0,
// 'no-whitespace-before-property': 2,
// 'no-with': 2,
// 'one-var': [2, {
// 'initialized': 'never'
// }],
// 'operator-linebreak': [2, 'after', {
// 'overrides': {
// '?': 'before',
// ':': 'before'
// }
// }],
// 'padded-blocks': [2, 'never'],
// 'quotes': [2, 'single', {
// 'avoidEscape': true,
// 'allowTemplateLiterals': true
// }],
// 'semi': [2, 'never'],
// 'semi-spacing': [2, {
// 'before': false,
// 'after': true
// }],
// 'space-before-blocks': [2, 'always'],
// 'space-before-function-paren': [2, 'never'],
// 'space-in-parens': [2, 'never'],
// 'space-infix-ops': 2,
// 'space-unary-ops': [2, {
// 'words': true,
// 'nonwords': false
// }],
// 'spaced-comment': [2, 'always', {
// 'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
// }],
// 'template-curly-spacing': [2, 'never'],
// 'use-isnan': 2,
// 'valid-typeof': 2,
// 'wrap-iife': [2, 'any'],
// 'yield-star-spacing': [2, 'both'],
// 'yoda': [2, 'never'],
// 'prefer-const': 2,
// 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
// 'object-curly-spacing': [2, 'always', {
// objectsInObjects: false
// }],
// 'array-bracket-spacing': [2, 'never']
// }
// }

132
README.md
View File

@ -19,91 +19,65 @@ JmalCloud 是一款私有云存储网盘项目,能够简单安全管理您的
![image1](https://www.jmal.top/api/file/jmal/jmalcloud/releases/%E6%88%AA%E5%B1%8F%20191.png?shareKey=601b697575858bec45c457a3&o=preview)
### 部署
下面两种方式二选一
### 部署方式一:[docker部署](https://blog.jmal.top/s/docker-jmalcloud) (推荐)
#### 1.拉取镜像
`docker pull registry.cn-guangzhou.aliyuncs.com/jmalcloud/jmalcloud:latest`
#### 2.运行
`docker run --restart=always --name jmalcloud -p 7070:80 -p 7071:8080 -p 7072:8088 -v /Users/jmal/temp/jmalcloud-docker/files/:/jmalcloud/files/ -v /Users/jmal/temp/jmalcloud-docker/db/:/data/db/ -d registry.cn-guangzhou.aliyuncs.com/jmalcloud/jmalcloud:latest`
**以下两种启动方式二选一, 推荐使用[docker-compose](https://docs.docker.com/compose//)**
> docker run 方式启动
```shell
docker run \
--restart=always \
--name jmalcloud \
-p 7070:80 \
-p 7071:8080 \
-p 7072:8088 \
-p 27018:27017 \
-v /Users/jmal/temp/jmalcloud-docker/files/:/jmalcloud/files/ \
-v /Users/jmal/temp/jmalcloud-docker/db/:/data/db/ \
-d registry.cn-guangzhou.aliyuncs.com/jmalcloud/jmalcloud:latest
```
启动参数说明 :
暴露端口 :
`80` : 网盘入口
`8080` : 博客入口
`8088` : 网盘服务入口
磁盘映射 :
> docker-compose 方式启动
编辑docker-compose.yml文件
```yaml
version: "3.5"
services:
jmalcloud:
image: registry.cn-guangzhou.aliyuncs.com/jmalcloud/jmalcloud:latest
container_name: jmalcloud
volumes:
- /Users/jmal/temp/jmalcloud-docker/files/:/jmalcloud/files/
- /Users/jmal/temp/jmalcloud-docker/db/:/data/db/
ports:
- "7070:80"
- "7071:8080"
- "7072:8088"
- "27018:27017"
```
启动:在docker-compose.yml文件目录下运行以下命令
```shell
docker-compse up -d
```
> 启动参数
Port :
`7070` : 网盘入口
`7071` : 博客入口
`7072` : 网盘api入口, 例如:http://localhost:7072/public/doc.html
`27018` : MongoDB
Volume :
`/jmalcloud/files/` : 网盘文件存储目录
`/data/db/` : mongodb数据存储目录
```
#### 3.访问 7070 端口试试看 出现创建管理员的界面说明部署成功
### 部署方式二
#### 1.环境准备
- nginx 1.18+
- mongodb 4.0+
- jdk 1.8+
#### 2.下载网盘界面程序,并配置nginx
去[这里](https://github.com/jamebal/jmal-cloud-view/releases)下载最新的版本,选择dist.tar下载
下载后解压到某个地方
nginx配置如下: (只需要修改两个地方)
```nginx
server {
listen 80;
# 1.这里填写你的ip地址,或域名
server_name xxx;
# 2.这填写为dist.tar解压后的路径
root xxx;
client_max_body_size 50m;
client_body_buffer_size 512k;
location /api/ {
proxy_pass http://localhost:8088/;
proxy_set_header Host $proxy_host;
proxy_set_header X-real-ip $remote_addr;
}
location / {
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /mq/ {
proxy_pass http://localhost:8088/mq/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_connect_timeout 60s;
proxy_read_timeout 500s;
proxy_send_timeout 500s;
}
location ~ \.(eot|otf|ttf|woff|woff2|svg)$ {
add_header Access-Control-Allow-Origin *;
}
}
```
#### 3.下载网盘服务程序
去[这里](https://github.com/jamebal/jmal-cloud-server/releases)下载最新的jar包
启动(需要提前安装jdk,mongodb环境)
`java -jar clouddisk-2.0-exec.jar --spring.profiles.active=prod --file.rootDir=xxx`
其中`file.rootDir`为网盘文件真实的存储的位置
#### 4.访问
在浏览器里直接输入你的IP或域名即可
> 访问试试看
启动后等待40秒左右,访问7070端口看到如下界面,说明部署成功
![](https://www.jmal.top/api/file/jmal/Image/Document/2021-03/20210301%E6%88%AA%E5%B1%8F%20144.png)
### 浏览器支持

View File

@ -19,92 +19,66 @@ Some screenshots:
![image1](https://www.jmal.top/api/file/jmal/jmalcloud/releases/%E6%88%AA%E5%B1%8F%20191.png?shareKey=601b697575858bec45c457a3&o=preview)
### Deployment
Choose one of the following two ways
### Deployment method one: [docker deployment](https://blog.jmal.top/s/docker-jmalcloud) (recommended)
#### 1. Pull image
`docker pull registry.cn-guangzhou.aliyuncs.com/jmalcloud/jmalcloud:latest`
#### 2. Run
`docker run --restart=always --name jmalcloud -p 7070:80 -p 7071:8080 -p 7072:8088 -v /Users/jmal/temp/jmalcloud-docker/files/:/ jmalcloud/files/ -v /Users/jmal/temp/jmalcloud-docker/db/:/data/db/ -d registry.cn-guangzhou.aliyuncs.com/jmalcloud/jmalcloud: latest`
### deploy
**Either of the following two startup methods is recommended[docker-compose](https://docs.docker.com/compose//)**
> docker run
```shell
docker run \
--restart=always \
--name jmalcloud \
-p 7070:80 \
-p 7071:8080 \
-p 7072:8088 \
-p 27018:27017 \
-v /Users/jmal/temp/jmalcloud-docker/files/:/jmalcloud/files/ \
-v /Users/jmal/temp/jmalcloud-docker/db/:/data/db/ \
-d registry.cn-guangzhou.aliyuncs.com/jmalcloud/jmalcloud:latest
```
Start parameters description :
Expose port :
`80` : Web portal
`8080` : Blog entry
`8088` : Netdisk service entry
Disk mapping :
> docker-compose
docker-compose.yml
```yaml
version: "3.5"
services:
jmalcloud:
image: registry.cn-guangzhou.aliyuncs.com/jmalcloud/jmalcloud:latest
container_name: jmalcloud
volumes:
- /Users/jmal/temp/jmalcloud-docker/files/:/jmalcloud/files/
- /Users/jmal/temp/jmalcloud-docker/db/:/data/db/
ports:
- "7070:80"
- "7071:8080"
- "7072:8088"
- "27018:27017"
```
Start: Run the following command in the docker-compose.yml file directory
```shell
docker-compse up -d
```
> Start-up parameters
Port :
`7070` : Web portal
`7071` : Blog portal
`7072` : Web api portal, 例如:http://localhost:7072/public/doc.html
`27018` : MongoDB
Volume :
`/jmalcloud/files/` : Netdisk file storage directory
`/data/db/` : mongodb data storage directory
```
#### 3. Visit port 7070 and try it. The interface of creating administrator appears to indicate successful deployment
### Deployment method 2
#### 1.Environmental Preparation
- nginx 1.18+
- mongodb 4.0+
- jdk 1.8+
#### 2.Download the web interface program and configure nginx
Go to[here](https://github.com/jamebal/jmal-cloud-view/releases)Download the latest version, select dist.tar to download
Download and unpack it somewhere
The nginx configuration is as follows: (only two places need to be modified)
```nginx
server {
listen 80;
# 1.Here fill in your ip address, or domain name
server_name xxx;
# 2.This is the path to the extracted dist.tar
root xxx;
client_max_body_size 50m;
client_body_buffer_size 512k;
location /api/ {
proxy_pass http://localhost:8088/;
proxy_set_header Host $proxy_host;
proxy_set_header X-real-ip $remote_addr;
}
location / {
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /mq/ {
proxy_pass http://localhost:8088/mq/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_connect_timeout 60s;
proxy_read_timeout 500s;
proxy_send_timeout 500s;
}
location ~ \.(eot|otf|ttf|woff|woff2|svg)$ {
add_header Access-Control-Allow-Origin *;
}
}
```
#### 3.Download the netdisk service program
Go to[here](https://github.com/jamebal/jmal-cloud-server/releases)Download the latest jar packages
Start (need to install jdk, mongodb environment in advance)
`java -jar clouddisk-2.0-exec.jar --spring.profiles.active=prod --file.rootDir=xxx`
where `file.rootDir` is the real storage location of the netdisk file
#### 4.access
Just type your IP or domain name directly into your browser
> Try visiting
Wait for about 40 seconds after startup, access port 7070 and see the following screen, indicating successful deployment
![](https://www.jmal.top/api/file/jmal/Image/Document/2021-03/20210301%E6%88%AA%E5%B1%8F%20144.png)
### Browser Support

View File

@ -1,67 +0,0 @@
import Mock from 'mockjs'
import { param2Obj } from '../src/utils'
import user from './user'
import table from './table'
const mocks = [
...user,
...table
]
// for front mock
// please use it cautiously, it will redefine XMLHttpRequest,
// which will cause many of your third-party libraries to be invalidated(like progress event).
export function mockXHR() {
// mock patch
// https://github.com/nuysoft/Mock/issues/300
Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send
Mock.XHR.prototype.send = function() {
if (this.custom.xhr) {
this.custom.xhr.withCredentials = this.withCredentials || false
if (this.responseType) {
this.custom.xhr.responseType = this.responseType
}
}
this.proxy_send(...arguments)
}
function XHR2ExpressReqWrap(respond) {
return function(options) {
let result = null
if (respond instanceof Function) {
const { body, type, url } = options
// https://expressjs.com/en/4x/api.html#req
result = respond({
method: type,
body: JSON.parse(body),
query: param2Obj(url)
})
} else {
result = respond
}
return Mock.mock(result)
}
}
for (const i of mocks) {
Mock.mock(new RegExp(i.url), i.type || 'get', XHR2ExpressReqWrap(i.response))
}
}
// for mock server
const responseFake = (url, type, respond) => {
return {
url: new RegExp(`${process.env.VUE_APP_BASE_API}${url}`),
type: type || 'get',
response(req, res) {
console.log('request invoke:' + req.path)
res.json(Mock.mock(respond instanceof Function ? respond(req, res) : respond))
}
}
}
export default mocks.map(route => {
return responseFake(route.url, route.type, route.response)
})

View File

@ -1,68 +0,0 @@
const chokidar = require('chokidar')
const bodyParser = require('body-parser')
const chalk = require('chalk')
const path = require('path')
const mockDir = path.join(process.cwd(), 'mock')
function registerRoutes(app) {
let mockLastIndex
const { default: mocks } = require('./index.js')
for (const mock of mocks) {
app[mock.type](mock.url, mock.response)
mockLastIndex = app._router.stack.length
}
const mockRoutesLength = Object.keys(mocks).length
return {
mockRoutesLength: mockRoutesLength,
mockStartIndex: mockLastIndex - mockRoutesLength
}
}
function unregisterRoutes() {
Object.keys(require.cache).forEach(i => {
if (i.includes(mockDir)) {
delete require.cache[require.resolve(i)]
}
})
}
module.exports = app => {
// es6 polyfill
require('@babel/register')
// parse app.body
// https://expressjs.com/en/4x/api.html#req.body
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({
extended: true
}))
const mockRoutes = registerRoutes(app)
var mockRoutesLength = mockRoutes.mockRoutesLength
var mockStartIndex = mockRoutes.mockStartIndex
// watch files, hot reload mock server
chokidar.watch(mockDir, {
ignored: /mock-server/,
ignoreInitial: true
}).on('all', (event, path) => {
if (event === 'change' || event === 'add') {
try {
// remove mock routes stack
app._router.stack.splice(mockStartIndex, mockRoutesLength)
// clear routes cache
unregisterRoutes()
const mockRoutes = registerRoutes(app)
mockRoutesLength = mockRoutes.mockRoutesLength
mockStartIndex = mockRoutes.mockStartIndex
console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`))
} catch (error) {
console.log(chalk.redBright(error))
}
}
})
}

View File

@ -1,29 +0,0 @@
import Mock from 'mockjs'
const data = Mock.mock({
'items|30': [{
id: '@id',
title: '@sentence(10, 20)',
'status|1': ['published', 'draft', 'deleted'],
author: 'name',
display_time: '@datetime',
pageviews: '@integer(300, 5000)'
}]
})
export default [
{
url: '/vue-admin-template/table/list',
type: 'get',
response: config => {
const items = data.items
return {
code: 20000,
data: {
total: items.length,
items: items
}
}
}
}
]

View File

@ -1,84 +0,0 @@
const tokens = {
admin: {
token: 'admin-token'
},
editor: {
token: 'editor-token'
}
}
const users = {
'admin-token': {
roles: ['admin'],
introduction: 'I am a super administrator',
avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
name: 'Super Admin'
},
'editor-token': {
roles: ['editor'],
introduction: 'I am an editor',
avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
name: 'Normal Editor'
}
}
export default [
// user login
{
url: '/vue-admin-template/user/login',
type: 'post',
response: config => {
const { username } = config.body
const token = tokens[username]
// mock error
if (!token) {
return {
code: 60204,
message: 'Account and password are incorrect.'
}
}
return {
code: 20000,
data: token
}
}
},
// get user info
{
url: '/vue-admin-template/user/info\.*',
type: 'get',
response: config => {
const { token } = config.query
const info = users[token]
// mock error
if (!info) {
return {
code: 50008,
message: 'Login failed, unable to get user details.'
}
}
return {
code: 20000,
data: info
}
}
},
// user logout
{
url: '/vue-admin-template/user/logout',
type: 'post',
response: _ => {
return {
code: 20000,
data: 'success'
}
}
}
]

View File

@ -19,17 +19,6 @@ const port = process.env.port || process.env.npm_config_port || 9528 // dev port
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin')
// let monacoLanguages = []
// const modulesFiles = require.context("monaco-languages/release/dev/", true, /\.js$/)
// modulesFiles.keys().reduce((modules, modulePath) => {
// const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, "$1");
// if(moduleName.indexOf('contribution') === -1){
// monacoLanguages.push(moduleName.replace(/([/][^/]+)$/, ""))
// }
// // const value = modulesFiles(modulePath);
// // modules[moduleName] = value.default;
// // return modules;
// }, {});
module.exports = {