From 2047777abe9ce1efe30fc5cd531093d9553ed3f9 Mon Sep 17 00:00:00 2001 From: jmal Date: Tue, 9 Aug 2022 15:27:40 +0800 Subject: [PATCH] :art: update readme --- .eslintrc.js | 207 -------------------------------------------- README.md | 132 ++++++++++++---------------- README_en_US.md | 134 ++++++++++++---------------- mock/index.js | 67 -------------- mock/mock-server.js | 68 --------------- mock/table.js | 29 ------- mock/user.js | 84 ------------------ vue.config.js | 11 --- 8 files changed, 107 insertions(+), 625 deletions(-) delete mode 100644 .eslintrc.js delete mode 100644 mock/index.js delete mode 100644 mock/mock-server.js delete mode 100644 mock/table.js delete mode 100644 mock/user.js diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index e268e14..0000000 --- a/.eslintrc.js +++ /dev/null @@ -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'] -// } -// } diff --git a/README.md b/README.md index d2f7276..b08e3e6 100644 --- a/README.md +++ b/README.md @@ -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) ### 浏览器支持 diff --git a/README_en_US.md b/README_en_US.md index 298ae29..ec0a3b6 100644 --- a/README_en_US.md +++ b/README_en_US.md @@ -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 diff --git a/mock/index.js b/mock/index.js deleted file mode 100644 index 90e2ffe..0000000 --- a/mock/index.js +++ /dev/null @@ -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) -}) diff --git a/mock/mock-server.js b/mock/mock-server.js deleted file mode 100644 index 4c4cb2a..0000000 --- a/mock/mock-server.js +++ /dev/null @@ -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)) - } - } - }) -} diff --git a/mock/table.js b/mock/table.js deleted file mode 100644 index ba95f76..0000000 --- a/mock/table.js +++ /dev/null @@ -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 - } - } - } - } -] diff --git a/mock/user.js b/mock/user.js deleted file mode 100644 index f007cd9..0000000 --- a/mock/user.js +++ /dev/null @@ -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' - } - } - } -] diff --git a/vue.config.js b/vue.config.js index f74bb70..38a0190 100644 --- a/vue.config.js +++ b/vue.config.js @@ -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 = {