diff --git a/.gitignore b/.gitignore
index 73d39e40f359b33a77b2f3a3e31d9f10c5ce908e..4e6fd26a67188f7473934c538cb8209a60ac2cba 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,7 +22,6 @@ target/
### NetBeans ###
nbproject/private/
-build/
nbbuild/
dist/
nbdist/
diff --git a/README.md b/README.md
index f819a0f5e823684f76e2726f568ed01e48db4921..cccc48085e066a93c6a79590b4e8a04875a8168c 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 菜鸡论坛
+# 私人论坛
### Backend 后端
- Spring Boot 2.1.4
diff --git a/fstackforum-vue/.babelrc b/fstackforum-vue/.babelrc
new file mode 100644
index 0000000000000000000000000000000000000000..3a280ba34b3db923e95e8317b2ee192e012b444b
--- /dev/null
+++ b/fstackforum-vue/.babelrc
@@ -0,0 +1,12 @@
+{
+ "presets": [
+ ["env", {
+ "modules": false,
+ "targets": {
+ "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
+ }
+ }],
+ "stage-2"
+ ],
+ "plugins": ["transform-vue-jsx", "transform-runtime"]
+}
diff --git a/fstackforum-vue/.editorconfig b/fstackforum-vue/.editorconfig
new file mode 100644
index 0000000000000000000000000000000000000000..9d08a1a828a3bd2d60de3952744df29f9add27fa
--- /dev/null
+++ b/fstackforum-vue/.editorconfig
@@ -0,0 +1,9 @@
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
diff --git a/fstackforum-vue/.gitignore b/fstackforum-vue/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..541a820f6c59178661b11167ef8b683afdd678c7
--- /dev/null
+++ b/fstackforum-vue/.gitignore
@@ -0,0 +1,14 @@
+.DS_Store
+node_modules/
+/dist/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
diff --git a/fstackforum-vue/.postcssrc.js b/fstackforum-vue/.postcssrc.js
new file mode 100644
index 0000000000000000000000000000000000000000..eee3e92d7fa6cc132a69a8018b1eb0fa1fdbd56c
--- /dev/null
+++ b/fstackforum-vue/.postcssrc.js
@@ -0,0 +1,10 @@
+// https://github.com/michael-ciniawsky/postcss-load-config
+
+module.exports = {
+ "plugins": {
+ "postcss-import": {},
+ "postcss-url": {},
+ // to edit target browsers: use "browserslist" field in package.json
+ "autoprefixer": {}
+ }
+}
diff --git a/fstackforum-vue/README.md b/fstackforum-vue/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..1d7ea7d1de8961671d226aed021d39c23bcf5f21
--- /dev/null
+++ b/fstackforum-vue/README.md
@@ -0,0 +1,21 @@
+# fstackforum-vue
+
+> A Vue.js project
+
+## Build Setup
+
+``` bash
+# install dependencies
+npm install
+
+# serve with hot reload at localhost:8080
+npm run dev
+
+# build for production with minification
+npm run build
+
+# build for production and view the bundle analyzer report
+npm run build --report
+```
+
+For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).
diff --git a/fstackforum-vue/build/build.js b/fstackforum-vue/build/build.js
new file mode 100644
index 0000000000000000000000000000000000000000..8f2ad8ad496a6a0cfba4ea7f90a7b8a3f1f30d6c
--- /dev/null
+++ b/fstackforum-vue/build/build.js
@@ -0,0 +1,41 @@
+'use strict'
+require('./check-versions')()
+
+process.env.NODE_ENV = 'production'
+
+const ora = require('ora')
+const rm = require('rimraf')
+const path = require('path')
+const chalk = require('chalk')
+const webpack = require('webpack')
+const config = require('../config')
+const webpackConfig = require('./webpack.prod.conf')
+
+const spinner = ora('building for production...')
+spinner.start()
+
+rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
+ if (err) throw err
+ webpack(webpackConfig, (err, stats) => {
+ spinner.stop()
+ if (err) throw err
+ process.stdout.write(stats.toString({
+ colors: true,
+ modules: false,
+ children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
+ chunks: false,
+ chunkModules: false
+ }) + '\n\n')
+
+ if (stats.hasErrors()) {
+ console.log(chalk.red(' Build failed with errors.\n'))
+ process.exit(1)
+ }
+
+ console.log(chalk.cyan(' Build complete.\n'))
+ console.log(chalk.yellow(
+ ' Tip: built files are meant to be served over an HTTP server.\n' +
+ ' Opening index.html over file:// won\'t work.\n'
+ ))
+ })
+})
diff --git a/fstackforum-vue/build/check-versions.js b/fstackforum-vue/build/check-versions.js
new file mode 100644
index 0000000000000000000000000000000000000000..3ef972a08dd51db2cf6c1b5d7f145a5149463e12
--- /dev/null
+++ b/fstackforum-vue/build/check-versions.js
@@ -0,0 +1,54 @@
+'use strict'
+const chalk = require('chalk')
+const semver = require('semver')
+const packageConfig = require('../package.json')
+const shell = require('shelljs')
+
+function exec (cmd) {
+ return require('child_process').execSync(cmd).toString().trim()
+}
+
+const versionRequirements = [
+ {
+ name: 'node',
+ currentVersion: semver.clean(process.version),
+ versionRequirement: packageConfig.engines.node
+ }
+]
+
+if (shell.which('npm')) {
+ versionRequirements.push({
+ name: 'npm',
+ currentVersion: exec('npm --version'),
+ versionRequirement: packageConfig.engines.npm
+ })
+}
+
+module.exports = function () {
+ const warnings = []
+
+ for (let i = 0; i < versionRequirements.length; i++) {
+ const mod = versionRequirements[i]
+
+ if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
+ warnings.push(mod.name + ': ' +
+ chalk.red(mod.currentVersion) + ' should be ' +
+ chalk.green(mod.versionRequirement)
+ )
+ }
+ }
+
+ if (warnings.length) {
+ console.log('')
+ console.log(chalk.yellow('To use this template, you must update following to modules:'))
+ console.log()
+
+ for (let i = 0; i < warnings.length; i++) {
+ const warning = warnings[i]
+ console.log(' ' + warning)
+ }
+
+ console.log()
+ process.exit(1)
+ }
+}
diff --git a/fstackforum-vue/build/logo.png b/fstackforum-vue/build/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..f3d2503fc2a44b5053b0837ebea6e87a2d339a43
Binary files /dev/null and b/fstackforum-vue/build/logo.png differ
diff --git a/fstackforum-vue/build/utils.js b/fstackforum-vue/build/utils.js
new file mode 100644
index 0000000000000000000000000000000000000000..e534fb0fd6284c53c3ec997bda2822300edd08a3
--- /dev/null
+++ b/fstackforum-vue/build/utils.js
@@ -0,0 +1,101 @@
+'use strict'
+const path = require('path')
+const config = require('../config')
+const ExtractTextPlugin = require('extract-text-webpack-plugin')
+const packageConfig = require('../package.json')
+
+exports.assetsPath = function (_path) {
+ const assetsSubDirectory = process.env.NODE_ENV === 'production'
+ ? config.build.assetsSubDirectory
+ : config.dev.assetsSubDirectory
+
+ return path.posix.join(assetsSubDirectory, _path)
+}
+
+exports.cssLoaders = function (options) {
+ options = options || {}
+
+ const cssLoader = {
+ loader: 'css-loader',
+ options: {
+ sourceMap: options.sourceMap
+ }
+ }
+
+ const postcssLoader = {
+ loader: 'postcss-loader',
+ options: {
+ sourceMap: options.sourceMap
+ }
+ }
+
+ // generate loader string to be used with extract text plugin
+ function generateLoaders (loader, loaderOptions) {
+ const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
+
+ if (loader) {
+ loaders.push({
+ loader: loader + '-loader',
+ options: Object.assign({}, loaderOptions, {
+ sourceMap: options.sourceMap
+ })
+ })
+ }
+
+ // Extract CSS when that option is specified
+ // (which is the case during production build)
+ if (options.extract) {
+ return ExtractTextPlugin.extract({
+ use: loaders,
+ fallback: 'vue-style-loader'
+ })
+ } else {
+ return ['vue-style-loader'].concat(loaders)
+ }
+ }
+
+ // https://vue-loader.vuejs.org/en/configurations/extract-css.html
+ return {
+ css: generateLoaders(),
+ postcss: generateLoaders(),
+ less: generateLoaders('less'),
+ sass: generateLoaders('sass', { indentedSyntax: true }),
+ scss: generateLoaders('sass'),
+ stylus: generateLoaders('stylus'),
+ styl: generateLoaders('stylus')
+ }
+}
+
+// Generate loaders for standalone style files (outside of .vue)
+exports.styleLoaders = function (options) {
+ const output = []
+ const loaders = exports.cssLoaders(options)
+
+ for (const extension in loaders) {
+ const loader = loaders[extension]
+ output.push({
+ test: new RegExp('\\.' + extension + '$'),
+ use: loader
+ })
+ }
+
+ return output
+}
+
+exports.createNotifierCallback = () => {
+ const notifier = require('node-notifier')
+
+ return (severity, errors) => {
+ if (severity !== 'error') return
+
+ const error = errors[0]
+ const filename = error.file && error.file.split('!').pop()
+
+ notifier.notify({
+ title: packageConfig.name,
+ message: severity + ': ' + error.name,
+ subtitle: filename || '',
+ icon: path.join(__dirname, 'logo.png')
+ })
+ }
+}
diff --git a/fstackforum-vue/build/vue-loader.conf.js b/fstackforum-vue/build/vue-loader.conf.js
new file mode 100644
index 0000000000000000000000000000000000000000..33ed58bc0afcb7e28e81762dea765aca5d47b801
--- /dev/null
+++ b/fstackforum-vue/build/vue-loader.conf.js
@@ -0,0 +1,22 @@
+'use strict'
+const utils = require('./utils')
+const config = require('../config')
+const isProduction = process.env.NODE_ENV === 'production'
+const sourceMapEnabled = isProduction
+ ? config.build.productionSourceMap
+ : config.dev.cssSourceMap
+
+module.exports = {
+ loaders: utils.cssLoaders({
+ sourceMap: sourceMapEnabled,
+ extract: isProduction
+ }),
+ cssSourceMap: sourceMapEnabled,
+ cacheBusting: config.dev.cacheBusting,
+ transformToRequire: {
+ video: ['src', 'poster'],
+ source: 'src',
+ img: 'src',
+ image: 'xlink:href'
+ }
+}
diff --git a/fstackforum-vue/build/webpack.base.conf.js b/fstackforum-vue/build/webpack.base.conf.js
new file mode 100644
index 0000000000000000000000000000000000000000..a07e683600beeef0d00784cd78da1dc557d996a9
--- /dev/null
+++ b/fstackforum-vue/build/webpack.base.conf.js
@@ -0,0 +1,82 @@
+'use strict'
+const path = require('path')
+const utils = require('./utils')
+const config = require('../config')
+const vueLoaderConfig = require('./vue-loader.conf')
+
+function resolve (dir) {
+ return path.join(__dirname, '..', dir)
+}
+
+
+
+module.exports = {
+ context: path.resolve(__dirname, '../'),
+ entry: {
+ app: './src/main.js'
+ },
+ output: {
+ path: config.build.assetsRoot,
+ filename: '[name].js',
+ publicPath: process.env.NODE_ENV === 'production'
+ ? config.build.assetsPublicPath
+ : config.dev.assetsPublicPath
+ },
+ resolve: {
+ extensions: ['.js', '.vue', '.json'],
+ alias: {
+ 'vue$': 'vue/dist/vue.esm.js',
+ '@': resolve('src'),
+ }
+ },
+ module: {
+ rules: [
+ {
+ test: /\.vue$/,
+ loader: 'vue-loader',
+ options: vueLoaderConfig
+ },
+ {
+ test: /\.js$/,
+ loader: 'babel-loader',
+ include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
+ },
+ {
+ test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
+ loader: 'url-loader',
+ options: {
+ limit: 10000,
+ name: utils.assetsPath('img/[name].[hash:7].[ext]')
+ }
+ },
+ {
+ test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
+ loader: 'url-loader',
+ options: {
+ limit: 10000,
+ name: utils.assetsPath('media/[name].[hash:7].[ext]')
+ }
+ },
+ {
+ test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
+ loader: 'url-loader',
+ options: {
+ limit: 10000,
+ name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
+ }
+ }
+ ]
+ },
+ node: {
+ // prevent webpack from injecting useless setImmediate polyfill because Vue
+ // source contains it (although only uses it if it's native).
+ setImmediate: false,
+ // prevent webpack from injecting mocks to Node native modules
+ // that does not make sense for the client
+ dgram: 'empty',
+ fs: 'empty',
+ net: 'empty',
+ tls: 'empty',
+ child_process: 'empty'
+ }
+}
diff --git a/fstackforum-vue/build/webpack.dev.conf.js b/fstackforum-vue/build/webpack.dev.conf.js
new file mode 100755
index 0000000000000000000000000000000000000000..070ae221f3f3fda5e43ac6ec7c53dd29574d504d
--- /dev/null
+++ b/fstackforum-vue/build/webpack.dev.conf.js
@@ -0,0 +1,95 @@
+'use strict'
+const utils = require('./utils')
+const webpack = require('webpack')
+const config = require('../config')
+const merge = require('webpack-merge')
+const path = require('path')
+const baseWebpackConfig = require('./webpack.base.conf')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
+const portfinder = require('portfinder')
+
+const HOST = process.env.HOST
+const PORT = process.env.PORT && Number(process.env.PORT)
+
+const devWebpackConfig = merge(baseWebpackConfig, {
+ module: {
+ rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
+ },
+ // cheap-module-eval-source-map is faster for development
+ devtool: config.dev.devtool,
+
+ // these devServer options should be customized in /config/index.js
+ devServer: {
+ clientLogLevel: 'warning',
+ historyApiFallback: {
+ rewrites: [
+ { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },
+ ],
+ },
+ hot: true,
+ contentBase: false, // since we use CopyWebpackPlugin.
+ compress: true,
+ host: HOST || config.dev.host,
+ port: PORT || config.dev.port,
+ open: config.dev.autoOpenBrowser,
+ overlay: config.dev.errorOverlay
+ ? { warnings: false, errors: true }
+ : false,
+ publicPath: config.dev.assetsPublicPath,
+ proxy: config.dev.proxyTable,
+ quiet: true, // necessary for FriendlyErrorsPlugin
+ watchOptions: {
+ poll: config.dev.poll,
+ }
+ },
+ plugins: [
+ new webpack.DefinePlugin({
+ 'process.env': require('../config/dev.env')
+ }),
+ new webpack.HotModuleReplacementPlugin(),
+ new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
+ new webpack.NoEmitOnErrorsPlugin(),
+ // https://github.com/ampedandwired/html-webpack-plugin
+ new HtmlWebpackPlugin({
+ filename: 'index.html',
+ template: 'index.html',
+ inject: true
+ }),
+ // copy custom static assets
+ new CopyWebpackPlugin([
+ {
+ from: path.resolve(__dirname, '../static'),
+ to: config.dev.assetsSubDirectory,
+ ignore: ['.*']
+ }
+ ])
+ ]
+})
+
+module.exports = new Promise((resolve, reject) => {
+ portfinder.basePort = process.env.PORT || config.dev.port
+ portfinder.getPort((err, port) => {
+ if (err) {
+ reject(err)
+ } else {
+ // publish the new Port, necessary for e2e tests
+ process.env.PORT = port
+ // add port to devServer config
+ devWebpackConfig.devServer.port = port
+
+ // Add FriendlyErrorsPlugin
+ devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
+ compilationSuccessInfo: {
+ messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
+ },
+ onErrors: config.dev.notifyOnErrors
+ ? utils.createNotifierCallback()
+ : undefined
+ }))
+
+ resolve(devWebpackConfig)
+ }
+ })
+})
diff --git a/fstackforum-vue/build/webpack.prod.conf.js b/fstackforum-vue/build/webpack.prod.conf.js
new file mode 100644
index 0000000000000000000000000000000000000000..d9f99f65a5dbd8c8e69561b73168440c461f2a1e
--- /dev/null
+++ b/fstackforum-vue/build/webpack.prod.conf.js
@@ -0,0 +1,145 @@
+'use strict'
+const path = require('path')
+const utils = require('./utils')
+const webpack = require('webpack')
+const config = require('../config')
+const merge = require('webpack-merge')
+const baseWebpackConfig = require('./webpack.base.conf')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const ExtractTextPlugin = require('extract-text-webpack-plugin')
+const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
+const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
+
+const env = require('../config/prod.env')
+
+const webpackConfig = merge(baseWebpackConfig, {
+ module: {
+ rules: utils.styleLoaders({
+ sourceMap: config.build.productionSourceMap,
+ extract: true,
+ usePostCSS: true
+ })
+ },
+ devtool: config.build.productionSourceMap ? config.build.devtool : false,
+ output: {
+ path: config.build.assetsRoot,
+ filename: utils.assetsPath('js/[name].[chunkhash].js'),
+ chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
+ },
+ plugins: [
+ // http://vuejs.github.io/vue-loader/en/workflow/production.html
+ new webpack.DefinePlugin({
+ 'process.env': env
+ }),
+ new UglifyJsPlugin({
+ uglifyOptions: {
+ compress: {
+ warnings: false
+ }
+ },
+ sourceMap: config.build.productionSourceMap,
+ parallel: true
+ }),
+ // extract css into its own file
+ new ExtractTextPlugin({
+ filename: utils.assetsPath('css/[name].[contenthash].css'),
+ // Setting the following option to `false` will not extract CSS from codesplit chunks.
+ // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
+ // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`,
+ // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
+ allChunks: true,
+ }),
+ // Compress extracted CSS. We are using this plugin so that possible
+ // duplicated CSS from different components can be deduped.
+ new OptimizeCSSPlugin({
+ cssProcessorOptions: config.build.productionSourceMap
+ ? { safe: true, map: { inline: false } }
+ : { safe: true }
+ }),
+ // generate dist index.html with correct asset hash for caching.
+ // you can customize output by editing /index.html
+ // see https://github.com/ampedandwired/html-webpack-plugin
+ new HtmlWebpackPlugin({
+ filename: config.build.index,
+ template: 'index.html',
+ inject: true,
+ minify: {
+ removeComments: true,
+ collapseWhitespace: true,
+ removeAttributeQuotes: true
+ // more options:
+ // https://github.com/kangax/html-minifier#options-quick-reference
+ },
+ // necessary to consistently work with multiple chunks via CommonsChunkPlugin
+ chunksSortMode: 'dependency'
+ }),
+ // keep module.id stable when vendor modules does not change
+ new webpack.HashedModuleIdsPlugin(),
+ // enable scope hoisting
+ new webpack.optimize.ModuleConcatenationPlugin(),
+ // split vendor js into its own file
+ new webpack.optimize.CommonsChunkPlugin({
+ name: 'vendor',
+ minChunks (module) {
+ // any required modules inside node_modules are extracted to vendor
+ return (
+ module.resource &&
+ /\.js$/.test(module.resource) &&
+ module.resource.indexOf(
+ path.join(__dirname, '../node_modules')
+ ) === 0
+ )
+ }
+ }),
+ // extract webpack runtime and module manifest to its own file in order to
+ // prevent vendor hash from being updated whenever app bundle is updated
+ new webpack.optimize.CommonsChunkPlugin({
+ name: 'manifest',
+ minChunks: Infinity
+ }),
+ // This instance extracts shared chunks from code splitted chunks and bundles them
+ // in a separate chunk, similar to the vendor chunk
+ // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
+ new webpack.optimize.CommonsChunkPlugin({
+ name: 'app',
+ async: 'vendor-async',
+ children: true,
+ minChunks: 3
+ }),
+
+ // copy custom static assets
+ new CopyWebpackPlugin([
+ {
+ from: path.resolve(__dirname, '../static'),
+ to: config.build.assetsSubDirectory,
+ ignore: ['.*']
+ }
+ ])
+ ]
+})
+
+if (config.build.productionGzip) {
+ const CompressionWebpackPlugin = require('compression-webpack-plugin')
+
+ webpackConfig.plugins.push(
+ new CompressionWebpackPlugin({
+ asset: '[path].gz[query]',
+ algorithm: 'gzip',
+ test: new RegExp(
+ '\\.(' +
+ config.build.productionGzipExtensions.join('|') +
+ ')$'
+ ),
+ threshold: 10240,
+ minRatio: 0.8
+ })
+ )
+}
+
+if (config.build.bundleAnalyzerReport) {
+ const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
+ webpackConfig.plugins.push(new BundleAnalyzerPlugin())
+}
+
+module.exports = webpackConfig
diff --git a/fstackforum-vue/config/dev.env.js b/fstackforum-vue/config/dev.env.js
new file mode 100644
index 0000000000000000000000000000000000000000..1e22973ae71e949faa15f7a8ab392786918fb22d
--- /dev/null
+++ b/fstackforum-vue/config/dev.env.js
@@ -0,0 +1,7 @@
+'use strict'
+const merge = require('webpack-merge')
+const prodEnv = require('./prod.env')
+
+module.exports = merge(prodEnv, {
+ NODE_ENV: '"development"'
+})
diff --git a/fstackforum-vue/config/index.js b/fstackforum-vue/config/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..c5eded7f81ab3b7f3c6fb54e0c86bcf7adeab944
--- /dev/null
+++ b/fstackforum-vue/config/index.js
@@ -0,0 +1,69 @@
+'use strict'
+// Template version: 1.3.1
+// see http://vuejs-templates.github.io/webpack for documentation.
+
+const path = require('path')
+
+module.exports = {
+ dev: {
+
+ // Paths
+ assetsSubDirectory: 'static',
+ assetsPublicPath: '/',
+ proxyTable: {},
+
+ // Various Dev Server settings
+ host: 'localhost', // can be overwritten by process.env.HOST
+ port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
+ autoOpenBrowser: false,
+ errorOverlay: true,
+ notifyOnErrors: true,
+ poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
+
+
+ /**
+ * Source Maps
+ */
+
+ // https://webpack.js.org/configuration/devtool/#development
+ devtool: 'cheap-module-eval-source-map',
+
+ // If you have problems debugging vue-files in devtools,
+ // set this to false - it *may* help
+ // https://vue-loader.vuejs.org/en/options.html#cachebusting
+ cacheBusting: true,
+
+ cssSourceMap: true
+ },
+
+ build: {
+ // Template for index.html
+ index: path.resolve(__dirname, '../dist/index.html'),
+
+ // Paths
+ assetsRoot: path.resolve(__dirname, '../dist'),
+ assetsSubDirectory: 'static',
+ assetsPublicPath: '/',
+
+ /**
+ * Source Maps
+ */
+
+ productionSourceMap: true,
+ // https://webpack.js.org/configuration/devtool/#production
+ devtool: '#source-map',
+
+ // Gzip off by default as many popular static hosts such as
+ // Surge or Netlify already gzip all static assets for you.
+ // Before setting to `true`, make sure to:
+ // npm install --save-dev compression-webpack-plugin
+ productionGzip: false,
+ productionGzipExtensions: ['js', 'css'],
+
+ // Run the build command with an extra argument to
+ // View the bundle analyzer report after build finishes:
+ // `npm run build --report`
+ // Set to `true` or `false` to always turn it on or off
+ bundleAnalyzerReport: process.env.npm_config_report
+ }
+}
diff --git a/fstackforum-vue/config/prod.env.js b/fstackforum-vue/config/prod.env.js
new file mode 100644
index 0000000000000000000000000000000000000000..a6f997616eff680e4b2d437e7f31de2cadbfa1de
--- /dev/null
+++ b/fstackforum-vue/config/prod.env.js
@@ -0,0 +1,4 @@
+'use strict'
+module.exports = {
+ NODE_ENV: '"production"'
+}
diff --git a/fstackforum-vue/index.html b/fstackforum-vue/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..13d368eeb49aa3cb94a13e459784956e535c0760
--- /dev/null
+++ b/fstackforum-vue/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+ fstackforum-vue
+
+
+
+
+
+
diff --git a/fstackforum-vue/package.json b/fstackforum-vue/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..d8c1ae969797cbca4c29c8553f58d5271ced07c5
--- /dev/null
+++ b/fstackforum-vue/package.json
@@ -0,0 +1,63 @@
+{
+ "name": "fstackforum-vue",
+ "version": "1.0.0",
+ "description": "A Vue.js project",
+ "author": "Miles <1010933988@qq.com>",
+ "private": true,
+ "scripts": {
+ "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
+ "start": "npm run dev",
+ "build": "node build/build.js"
+ },
+ "dependencies": {
+ "vue": "^2.5.2",
+ "vue-axios": "^2.1.4",
+ "vue-router": "^3.0.1"
+ },
+ "devDependencies": {
+ "autoprefixer": "^7.1.2",
+ "babel-core": "^6.22.1",
+ "babel-helper-vue-jsx-merge-props": "^2.0.3",
+ "babel-loader": "^7.1.1",
+ "babel-plugin-syntax-jsx": "^6.18.0",
+ "babel-plugin-transform-runtime": "^6.22.0",
+ "babel-plugin-transform-vue-jsx": "^3.5.0",
+ "babel-preset-env": "^1.3.2",
+ "babel-preset-stage-2": "^6.22.0",
+ "chalk": "^2.0.1",
+ "copy-webpack-plugin": "^4.0.1",
+ "css-loader": "^0.28.0",
+ "extract-text-webpack-plugin": "^3.0.0",
+ "file-loader": "^1.1.4",
+ "friendly-errors-webpack-plugin": "^1.6.1",
+ "html-webpack-plugin": "^2.30.1",
+ "node-notifier": "^5.1.2",
+ "optimize-css-assets-webpack-plugin": "^3.2.0",
+ "ora": "^1.2.0",
+ "portfinder": "^1.0.13",
+ "postcss-import": "^11.0.0",
+ "postcss-loader": "^2.0.8",
+ "postcss-url": "^7.2.1",
+ "rimraf": "^2.6.0",
+ "semver": "^5.3.0",
+ "shelljs": "^0.7.6",
+ "uglifyjs-webpack-plugin": "^1.1.1",
+ "url-loader": "^0.5.8",
+ "vue-loader": "^13.3.0",
+ "vue-style-loader": "^3.0.1",
+ "vue-template-compiler": "^2.5.2",
+ "webpack": "^3.6.0",
+ "webpack-bundle-analyzer": "^2.9.0",
+ "webpack-dev-server": "^2.9.1",
+ "webpack-merge": "^4.1.0"
+ },
+ "engines": {
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
+ },
+ "browserslist": [
+ "> 1%",
+ "last 2 versions",
+ "not ie <= 8"
+ ]
+}
diff --git a/fstackforum-vue/src/App.vue b/fstackforum-vue/src/App.vue
new file mode 100644
index 0000000000000000000000000000000000000000..d74c648e1586c443cc1f9afd4235260074da0109
--- /dev/null
+++ b/fstackforum-vue/src/App.vue
@@ -0,0 +1,23 @@
+
+
+

+
+
+
+
+
+
+
diff --git a/fstackforum-vue/src/assets/logo.png b/fstackforum-vue/src/assets/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..f3d2503fc2a44b5053b0837ebea6e87a2d339a43
Binary files /dev/null and b/fstackforum-vue/src/assets/logo.png differ
diff --git a/fstackforum-vue/src/axios.js b/fstackforum-vue/src/axios.js
new file mode 100644
index 0000000000000000000000000000000000000000..70eb8e2044ee026ee7f8f16362365afd4ab1e4f3
--- /dev/null
+++ b/fstackforum-vue/src/axios.js
@@ -0,0 +1,8 @@
+import axios from "axios";
+
+
+axios.defaults.timeout=60000;
+axios.defaults.headers.post["Content-type"]="application/json";
+
+
+export default axios
\ No newline at end of file
diff --git a/fstackforum-vue/src/components/HelloWorld.vue b/fstackforum-vue/src/components/HelloWorld.vue
new file mode 100644
index 0000000000000000000000000000000000000000..374ab880df97bcee3a73a719255921d1bef045ea
--- /dev/null
+++ b/fstackforum-vue/src/components/HelloWorld.vue
@@ -0,0 +1,27 @@
+
+
+
{{ info }}
+
+
+
+
+
+
+
diff --git a/fstackforum-vue/src/main.js b/fstackforum-vue/src/main.js
new file mode 100644
index 0000000000000000000000000000000000000000..41360a63f568e0d2df02b16b856eb1de3985ad1f
--- /dev/null
+++ b/fstackforum-vue/src/main.js
@@ -0,0 +1,17 @@
+// The Vue build version to load with the `import` command
+// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
+import Vue from 'vue'
+import App from './App'
+import router from './router'
+import axios from './axios'
+import VueAxios from "vue-axios";
+
+Vue.config.productionTip = false
+Vue.use(VueAxios ,axios);
+/* eslint-disable no-new */
+new Vue({
+ el: '#app',
+ router,
+ components: { App },
+ template: ''
+})
diff --git a/fstackforum-vue/src/router/index.js b/fstackforum-vue/src/router/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..5fa7f9d3191e33ac45048462ca4ad9a582a76e73
--- /dev/null
+++ b/fstackforum-vue/src/router/index.js
@@ -0,0 +1,15 @@
+import Vue from 'vue'
+import Router from 'vue-router'
+import HelloWorld from '@/components/HelloWorld'
+
+Vue.use(Router)
+
+export default new Router({
+ routes: [
+ {
+ path: '/',
+ name: 'HelloWorld',
+ component: HelloWorld
+ }
+ ]
+})
diff --git a/fstackforum-vue/static/.gitkeep b/fstackforum-vue/static/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/pom.xml b/pom.xml
index ce399ffa54b9de2ed267f4fbb98dfd09fe1413ef..5b29ebff524c7b2fd64de9958e3198a4ed003999 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,11 +1,11 @@
-
+
4.0.0
com.fstack
FStackForum
- 0.0.1-SNAPSHOT
+ 1.0.0
jar
FStackForum
@@ -23,7 +23,7 @@
UTF-8
1.8
1.16.14
- 3.0.4.RELEASE
+ 3.0.4.RELEASE
8.0.15
1.3.2
1.2.3
@@ -31,6 +31,7 @@
4.5.8
1.2.57
27.1-jre
+ 2.9.2
@@ -49,7 +50,13 @@
spring-boot-starter-mail
-
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
+
org.springframework.boot
spring-boot-starter-thymeleaf
@@ -67,8 +74,8 @@
org.thymeleaf.extras
- thymeleaf-extras-springsecurity4
- ${springsecurity4.version}
+ thymeleaf-extras-springsecurity5
+ ${springsecurity5.version}
@@ -120,6 +127,16 @@
guava
${guava.version}
+
+ io.springfox
+ springfox-swagger2
+ ${swagger.version}
+
+
+ io.springfox
+ springfox-swagger-ui
+ ${swagger.version}
+
diff --git a/src/main/java/com/fstack/common/ApiResponse.java b/src/main/java/com/fstack/common/ApiResponse.java
index 59fe5680b62fbcc5bccf864f2ecd1b2fa5a7c244..1e33b3de87ff8eea67a9a1dbad3b9553bc50561c 100644
--- a/src/main/java/com/fstack/common/ApiResponse.java
+++ b/src/main/java/com/fstack/common/ApiResponse.java
@@ -27,7 +27,7 @@ public class ApiResponse {
public ApiResponse() {
this.setSuccess(true);
- this.setCode(200);
+ this.setCode(ResultCode.SUCCESS.code());
this.setMsg("成功!");
}
@@ -46,18 +46,15 @@ public class ApiResponse {
public static ApiResponse toSuccess(Object data) {
- return new ApiResponse(true, 200, "success", data);
+ return new ApiResponse(true, ResultCode.SUCCESS.code(), "success", data);
}
public static ApiResponse toNotFound() {
- return new ApiResponse(false, 404, "NotFound");
- }
-
- public static ApiResponse toPermissions(){
- return new ApiResponse(false, 6,"对不起,您没有没有权限");
+ return new ApiResponse(false, ResultCode.NOT_FOUND.code(), "NotFound");
}
public static ApiResponse toException(String msg) {
- return new ApiResponse(false, 404, msg);
+ return new ApiResponse(false, ResultCode.INTERNAL_SERVER_ERROR.code(), msg);
}
+
}
diff --git a/src/main/java/com/fstack/common/Page.java b/src/main/java/com/fstack/common/Page.java
index caaee41c03c8859be3d980d6f856d9046c844d87..7eca211f5733b8f037f3938380218eec506465bb 100644
--- a/src/main/java/com/fstack/common/Page.java
+++ b/src/main/java/com/fstack/common/Page.java
@@ -3,9 +3,13 @@ package com.fstack.common;
import com.google.common.collect.Lists;
import lombok.Data;
-import java.util.ArrayList;
import java.util.List;
+/**
+ * 数据分页
+ *
+ * @param
+ */
@Data
public class Page {
@@ -44,13 +48,6 @@ public class Page {
*/
private Boolean hasCount;
- /***************************************************单独的一个类对象转为分页数据 调用这个****************************************/
- public static Page singleObjectToPage(Object object) {
- List