├── .babelrc ├── .editorconfig ├── .gitignore ├── .postcssrc.js ├── README.md ├── build ├── build.js ├── check-versions.js ├── logo.png ├── package.json ├── utils.js ├── vue-loader.conf.js ├── webpack.base.conf.js ├── webpack.dev.conf.js └── webpack.prod.conf.js ├── config ├── dev.env.js ├── index.js └── prod.env.js ├── index.html ├── package.json ├── src ├── App.vue ├── assets │ └── logo.png ├── iconfont │ ├── iconfont.css │ ├── iconfont.eot │ ├── iconfont.js │ ├── iconfont.svg │ ├── iconfont.ttf │ └── iconfont.woff ├── main.js ├── pages │ ├── HelloWorld.vue │ ├── add.vue │ ├── ceshi.vue │ ├── complete.vue │ ├── footer.vue │ ├── header.vue │ └── index.vue ├── router │ └── index.js ├── style │ ├── rem.js │ └── style.css └── vuex │ ├── actions.js │ ├── index.js │ ├── mutations.js │ ├── state.js │ └── type.js └── static └── .gitkeep /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "modules": false, 5 | "targets": { 6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] 7 | } 8 | }], 9 | "stage-2" 10 | ], 11 | "plugins": ["transform-vue-jsx", "transform-runtime"] 12 | } 13 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | /dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Editor directories and files 9 | .idea 10 | .vscode 11 | *.suo 12 | *.ntvs* 13 | *.njsproj 14 | *.sln 15 | -------------------------------------------------------------------------------- /.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | "postcss-import": {}, 6 | "postcss-url": {}, 7 | // to edit target browsers: use "browserslist" field in package.json 8 | "autoprefixer": {} 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 基于vue2.0+vuex+localStorage写的记事本 2 | 3 | ## 写在前面 4 | 5 | > 这个demo虽然功能少,但是其知识点很精华 基本上vuex知识点大部分都在这里面了,麻雀虽小 五脏俱全 6 | 7 | > 如果你觉的对你有帮助帮忙点个star谢谢 感谢大佬! 8 | 9 | > 前端交流群740625675 10 | 11 | 12 | 13 | ## 代码预览 14 | 15 | > vuex官方文档 https://vuex.vuejs.org/ 我觉的官方文档说明很详细
16 | 17 | > localStorage用来本地储存 18 | 19 | ```bash 20 | const state={ 21 | home:localStorage["home"]?JSON.parse(localStorage["home"]): [], 22 | item:localStorage["item"]?JSON.parse(localStorage["item"]): [], 23 | } 24 | 25 | export default state 26 | ``` 27 | 28 | ```bash 29 | const mutations={ 30 | 31 | [types.SET_SHIXIANG](state,data){ 32 | state.home.push(data) 33 | localStorage.setItem("home",JSON.stringify(state.home)); 34 | }, 35 | 36 | [types.SET_YES](state,data){ 37 | state.item.push(data) 38 | localStorage.setItem("item",JSON.stringify(state.item)); 39 | } 40 | } 41 | 42 | export default mutations 43 | 44 | ``` 45 | 46 | 47 | ```bash 48 | const actions={ 49 | setOrder ({commit}, data) { 50 | commit('SET_SHIXIANG', data); 51 | }, 52 | setYes({commit},data){ 53 | commit('SET_YES',data) 54 | } 55 | } 56 | 57 | export default actions 58 | 59 | ``` 60 | 61 | ## 项目截图 62 | 63 | 64 | 65 | 66 | 67 | ## 项目运行 68 | 69 | ``` bash 70 | # install dependencies 71 | npm install 72 | 73 | # serve with hot reload at localhost:8080 74 | npm run dev 75 | 76 | # build for production with minification 77 | npm run build 78 | ``` 79 | 80 | ## 写在最后 81 | 前端实习生一枚,做的不好,还望大佬嘴下留情 轻喷 大佬我想要个star 82 | 83 | 84 | -------------------------------------------------------------------------------- /build/build.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | require('./check-versions')() 3 | 4 | process.env.NODE_ENV = 'production' 5 | 6 | const ora = require('ora') 7 | const rm = require('rimraf') 8 | const path = require('path') 9 | const chalk = require('chalk') 10 | const webpack = require('webpack') 11 | const config = require('../config') 12 | const webpackConfig = require('./webpack.prod.conf') 13 | 14 | const spinner = ora('building for production...') 15 | spinner.start() 16 | 17 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { 18 | if (err) throw err 19 | webpack(webpackConfig, (err, stats) => { 20 | spinner.stop() 21 | if (err) throw err 22 | process.stdout.write(stats.toString({ 23 | colors: true, 24 | modules: false, 25 | children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build. 26 | chunks: false, 27 | chunkModules: false 28 | }) + '\n\n') 29 | 30 | if (stats.hasErrors()) { 31 | console.log(chalk.red(' Build failed with errors.\n')) 32 | process.exit(1) 33 | } 34 | 35 | console.log(chalk.cyan(' Build complete.\n')) 36 | console.log(chalk.yellow( 37 | ' Tip: built files are meant to be served over an HTTP server.\n' + 38 | ' Opening index.html over file:// won\'t work.\n' 39 | )) 40 | }) 41 | }) 42 | -------------------------------------------------------------------------------- /build/check-versions.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const chalk = require('chalk') 3 | const semver = require('semver') 4 | const packageConfig = require('../package.json') 5 | const shell = require('shelljs') 6 | 7 | function exec (cmd) { 8 | return require('child_process').execSync(cmd).toString().trim() 9 | } 10 | 11 | const versionRequirements = [ 12 | { 13 | name: 'node', 14 | currentVersion: semver.clean(process.version), 15 | versionRequirement: packageConfig.engines.node 16 | } 17 | ] 18 | 19 | if (shell.which('npm')) { 20 | versionRequirements.push({ 21 | name: 'npm', 22 | currentVersion: exec('npm --version'), 23 | versionRequirement: packageConfig.engines.npm 24 | }) 25 | } 26 | 27 | module.exports = function () { 28 | const warnings = [] 29 | 30 | for (let i = 0; i < versionRequirements.length; i++) { 31 | const mod = versionRequirements[i] 32 | 33 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { 34 | warnings.push(mod.name + ': ' + 35 | chalk.red(mod.currentVersion) + ' should be ' + 36 | chalk.green(mod.versionRequirement) 37 | ) 38 | } 39 | } 40 | 41 | if (warnings.length) { 42 | console.log('') 43 | console.log(chalk.yellow('To use this template, you must update following to modules:')) 44 | console.log() 45 | 46 | for (let i = 0; i < warnings.length; i++) { 47 | const warning = warnings[i] 48 | console.log(' ' + warning) 49 | } 50 | 51 | console.log() 52 | process.exit(1) 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /build/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mynameisfwk/vue-Todo-list/3d8796f078fae784d7e337999d91cc2265a60aa6/build/logo.png -------------------------------------------------------------------------------- /build/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "vuex": "^3.0.1" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /build/utils.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const config = require('../config') 4 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 5 | const packageConfig = require('../package.json') 6 | 7 | exports.assetsPath = function (_path) { 8 | const assetsSubDirectory = process.env.NODE_ENV === 'production' 9 | ? config.build.assetsSubDirectory 10 | : config.dev.assetsSubDirectory 11 | 12 | return path.posix.join(assetsSubDirectory, _path) 13 | } 14 | 15 | exports.cssLoaders = function (options) { 16 | options = options || {} 17 | 18 | const cssLoader = { 19 | loader: 'css-loader', 20 | options: { 21 | sourceMap: options.sourceMap 22 | } 23 | } 24 | 25 | const postcssLoader = { 26 | loader: 'postcss-loader', 27 | options: { 28 | sourceMap: options.sourceMap 29 | } 30 | } 31 | 32 | // generate loader string to be used with extract text plugin 33 | function generateLoaders (loader, loaderOptions) { 34 | const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader] 35 | 36 | if (loader) { 37 | loaders.push({ 38 | loader: loader + '-loader', 39 | options: Object.assign({}, loaderOptions, { 40 | sourceMap: options.sourceMap 41 | }) 42 | }) 43 | } 44 | 45 | // Extract CSS when that option is specified 46 | // (which is the case during production build) 47 | if (options.extract) { 48 | return ExtractTextPlugin.extract({ 49 | use: loaders, 50 | fallback: 'vue-style-loader' 51 | }) 52 | } else { 53 | return ['vue-style-loader'].concat(loaders) 54 | } 55 | } 56 | 57 | // https://vue-loader.vuejs.org/en/configurations/extract-css.html 58 | return { 59 | css: generateLoaders(), 60 | postcss: generateLoaders(), 61 | less: generateLoaders('less'), 62 | sass: generateLoaders('sass', { indentedSyntax: true }), 63 | scss: generateLoaders('sass'), 64 | stylus: generateLoaders('stylus'), 65 | styl: generateLoaders('stylus') 66 | } 67 | } 68 | 69 | // Generate loaders for standalone style files (outside of .vue) 70 | exports.styleLoaders = function (options) { 71 | const output = [] 72 | const loaders = exports.cssLoaders(options) 73 | 74 | for (const extension in loaders) { 75 | const loader = loaders[extension] 76 | output.push({ 77 | test: new RegExp('\\.' + extension + '$'), 78 | use: loader 79 | }) 80 | } 81 | 82 | return output 83 | } 84 | 85 | exports.createNotifierCallback = () => { 86 | const notifier = require('node-notifier') 87 | 88 | return (severity, errors) => { 89 | if (severity !== 'error') return 90 | 91 | const error = errors[0] 92 | const filename = error.file && error.file.split('!').pop() 93 | 94 | notifier.notify({ 95 | title: packageConfig.name, 96 | message: severity + ': ' + error.name, 97 | subtitle: filename || '', 98 | icon: path.join(__dirname, 'logo.png') 99 | }) 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /build/vue-loader.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const config = require('../config') 4 | const isProduction = process.env.NODE_ENV === 'production' 5 | const sourceMapEnabled = isProduction 6 | ? config.build.productionSourceMap 7 | : config.dev.cssSourceMap 8 | 9 | module.exports = { 10 | loaders: utils.cssLoaders({ 11 | sourceMap: sourceMapEnabled, 12 | extract: isProduction 13 | }), 14 | cssSourceMap: sourceMapEnabled, 15 | cacheBusting: config.dev.cacheBusting, 16 | transformToRequire: { 17 | video: ['src', 'poster'], 18 | source: 'src', 19 | img: 'src', 20 | image: 'xlink:href' 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /build/webpack.base.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const utils = require('./utils') 4 | const config = require('../config') 5 | const vueLoaderConfig = require('./vue-loader.conf') 6 | 7 | function resolve (dir) { 8 | return path.join(__dirname, '..', dir) 9 | } 10 | 11 | 12 | 13 | module.exports = { 14 | context: path.resolve(__dirname, '../'), 15 | entry: { 16 | app: './src/main.js' 17 | }, 18 | output: { 19 | path: config.build.assetsRoot, 20 | filename: '[name].js', 21 | publicPath: process.env.NODE_ENV === 'production' 22 | ? config.build.assetsPublicPath 23 | : config.dev.assetsPublicPath 24 | }, 25 | resolve: { 26 | extensions: ['.js', '.vue', '.json'], 27 | alias: { 28 | 'vue$': 'vue/dist/vue.esm.js', 29 | '@': resolve('src'), 30 | } 31 | }, 32 | module: { 33 | rules: [ 34 | { 35 | test: /\.vue$/, 36 | loader: 'vue-loader', 37 | options: vueLoaderConfig 38 | }, 39 | { 40 | test: /\.js$/, 41 | loader: 'babel-loader', 42 | include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')] 43 | }, 44 | { 45 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, 46 | loader: 'url-loader', 47 | options: { 48 | limit: 10000, 49 | name: utils.assetsPath('img/[name].[hash:7].[ext]') 50 | } 51 | }, 52 | { 53 | test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, 54 | loader: 'url-loader', 55 | options: { 56 | limit: 10000, 57 | name: utils.assetsPath('media/[name].[hash:7].[ext]') 58 | } 59 | }, 60 | { 61 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, 62 | loader: 'url-loader', 63 | options: { 64 | limit: 10000, 65 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]') 66 | } 67 | } 68 | ] 69 | }, 70 | node: { 71 | // prevent webpack from injecting useless setImmediate polyfill because Vue 72 | // source contains it (although only uses it if it's native). 73 | setImmediate: false, 74 | // prevent webpack from injecting mocks to Node native modules 75 | // that does not make sense for the client 76 | dgram: 'empty', 77 | fs: 'empty', 78 | net: 'empty', 79 | tls: 'empty', 80 | child_process: 'empty' 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /build/webpack.dev.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const webpack = require('webpack') 4 | const config = require('../config') 5 | const merge = require('webpack-merge') 6 | const path = require('path') 7 | const baseWebpackConfig = require('./webpack.base.conf') 8 | const CopyWebpackPlugin = require('copy-webpack-plugin') 9 | const HtmlWebpackPlugin = require('html-webpack-plugin') 10 | const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') 11 | const portfinder = require('portfinder') 12 | 13 | const HOST = process.env.HOST 14 | const PORT = process.env.PORT && Number(process.env.PORT) 15 | 16 | const devWebpackConfig = merge(baseWebpackConfig, { 17 | module: { 18 | rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }) 19 | }, 20 | // cheap-module-eval-source-map is faster for development 21 | devtool: config.dev.devtool, 22 | 23 | // these devServer options should be customized in /config/index.js 24 | devServer: { 25 | clientLogLevel: 'warning', 26 | historyApiFallback: { 27 | rewrites: [ 28 | { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') }, 29 | ], 30 | }, 31 | hot: true, 32 | contentBase: false, // since we use CopyWebpackPlugin. 33 | compress: true, 34 | host: HOST || config.dev.host, 35 | port: PORT || config.dev.port, 36 | open: config.dev.autoOpenBrowser, 37 | overlay: config.dev.errorOverlay 38 | ? { warnings: false, errors: true } 39 | : false, 40 | publicPath: config.dev.assetsPublicPath, 41 | proxy: config.dev.proxyTable, 42 | quiet: true, // necessary for FriendlyErrorsPlugin 43 | watchOptions: { 44 | poll: config.dev.poll, 45 | } 46 | }, 47 | plugins: [ 48 | new webpack.DefinePlugin({ 49 | 'process.env': require('../config/dev.env') 50 | }), 51 | new webpack.HotModuleReplacementPlugin(), 52 | new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update. 53 | new webpack.NoEmitOnErrorsPlugin(), 54 | // https://github.com/ampedandwired/html-webpack-plugin 55 | new HtmlWebpackPlugin({ 56 | filename: 'index.html', 57 | template: 'index.html', 58 | inject: true 59 | }), 60 | // copy custom static assets 61 | new CopyWebpackPlugin([ 62 | { 63 | from: path.resolve(__dirname, '../static'), 64 | to: config.dev.assetsSubDirectory, 65 | ignore: ['.*'] 66 | } 67 | ]) 68 | ] 69 | }) 70 | 71 | module.exports = new Promise((resolve, reject) => { 72 | portfinder.basePort = process.env.PORT || config.dev.port 73 | portfinder.getPort((err, port) => { 74 | if (err) { 75 | reject(err) 76 | } else { 77 | // publish the new Port, necessary for e2e tests 78 | process.env.PORT = port 79 | // add port to devServer config 80 | devWebpackConfig.devServer.port = port 81 | 82 | // Add FriendlyErrorsPlugin 83 | devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({ 84 | compilationSuccessInfo: { 85 | messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`], 86 | }, 87 | onErrors: config.dev.notifyOnErrors 88 | ? utils.createNotifierCallback() 89 | : undefined 90 | })) 91 | 92 | resolve(devWebpackConfig) 93 | } 94 | }) 95 | }) 96 | -------------------------------------------------------------------------------- /build/webpack.prod.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const utils = require('./utils') 4 | const webpack = require('webpack') 5 | const config = require('../config') 6 | const merge = require('webpack-merge') 7 | const baseWebpackConfig = require('./webpack.base.conf') 8 | const CopyWebpackPlugin = require('copy-webpack-plugin') 9 | const HtmlWebpackPlugin = require('html-webpack-plugin') 10 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 11 | const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') 12 | const UglifyJsPlugin = require('uglifyjs-webpack-plugin') 13 | 14 | const env = require('../config/prod.env') 15 | 16 | const webpackConfig = merge(baseWebpackConfig, { 17 | module: { 18 | rules: utils.styleLoaders({ 19 | sourceMap: config.build.productionSourceMap, 20 | extract: true, 21 | usePostCSS: true 22 | }) 23 | }, 24 | devtool: config.build.productionSourceMap ? config.build.devtool : false, 25 | output: { 26 | path: config.build.assetsRoot, 27 | filename: utils.assetsPath('js/[name].[chunkhash].js'), 28 | chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') 29 | }, 30 | plugins: [ 31 | // http://vuejs.github.io/vue-loader/en/workflow/production.html 32 | new webpack.DefinePlugin({ 33 | 'process.env': env 34 | }), 35 | new UglifyJsPlugin({ 36 | uglifyOptions: { 37 | compress: { 38 | warnings: false 39 | } 40 | }, 41 | sourceMap: config.build.productionSourceMap, 42 | parallel: true 43 | }), 44 | // extract css into its own file 45 | new ExtractTextPlugin({ 46 | filename: utils.assetsPath('css/[name].[contenthash].css'), 47 | // Setting the following option to `false` will not extract CSS from codesplit chunks. 48 | // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack. 49 | // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`, 50 | // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110 51 | allChunks: true, 52 | }), 53 | // Compress extracted CSS. We are using this plugin so that possible 54 | // duplicated CSS from different components can be deduped. 55 | new OptimizeCSSPlugin({ 56 | cssProcessorOptions: config.build.productionSourceMap 57 | ? { safe: true, map: { inline: false } } 58 | : { safe: true } 59 | }), 60 | // generate dist index.html with correct asset hash for caching. 61 | // you can customize output by editing /index.html 62 | // see https://github.com/ampedandwired/html-webpack-plugin 63 | new HtmlWebpackPlugin({ 64 | filename: config.build.index, 65 | template: 'index.html', 66 | inject: true, 67 | minify: { 68 | removeComments: true, 69 | collapseWhitespace: true, 70 | removeAttributeQuotes: true 71 | // more options: 72 | // https://github.com/kangax/html-minifier#options-quick-reference 73 | }, 74 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin 75 | chunksSortMode: 'dependency' 76 | }), 77 | // keep module.id stable when vendor modules does not change 78 | new webpack.HashedModuleIdsPlugin(), 79 | // enable scope hoisting 80 | new webpack.optimize.ModuleConcatenationPlugin(), 81 | // split vendor js into its own file 82 | new webpack.optimize.CommonsChunkPlugin({ 83 | name: 'vendor', 84 | minChunks (module) { 85 | // any required modules inside node_modules are extracted to vendor 86 | return ( 87 | module.resource && 88 | /\.js$/.test(module.resource) && 89 | module.resource.indexOf( 90 | path.join(__dirname, '../node_modules') 91 | ) === 0 92 | ) 93 | } 94 | }), 95 | // extract webpack runtime and module manifest to its own file in order to 96 | // prevent vendor hash from being updated whenever app bundle is updated 97 | new webpack.optimize.CommonsChunkPlugin({ 98 | name: 'manifest', 99 | minChunks: Infinity 100 | }), 101 | // This instance extracts shared chunks from code splitted chunks and bundles them 102 | // in a separate chunk, similar to the vendor chunk 103 | // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk 104 | new webpack.optimize.CommonsChunkPlugin({ 105 | name: 'app', 106 | async: 'vendor-async', 107 | children: true, 108 | minChunks: 3 109 | }), 110 | 111 | // copy custom static assets 112 | new CopyWebpackPlugin([ 113 | { 114 | from: path.resolve(__dirname, '../static'), 115 | to: config.build.assetsSubDirectory, 116 | ignore: ['.*'] 117 | } 118 | ]) 119 | ] 120 | }) 121 | 122 | if (config.build.productionGzip) { 123 | const CompressionWebpackPlugin = require('compression-webpack-plugin') 124 | 125 | webpackConfig.plugins.push( 126 | new CompressionWebpackPlugin({ 127 | asset: '[path].gz[query]', 128 | algorithm: 'gzip', 129 | test: new RegExp( 130 | '\\.(' + 131 | config.build.productionGzipExtensions.join('|') + 132 | ')$' 133 | ), 134 | threshold: 10240, 135 | minRatio: 0.8 136 | }) 137 | ) 138 | } 139 | 140 | if (config.build.bundleAnalyzerReport) { 141 | const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin 142 | webpackConfig.plugins.push(new BundleAnalyzerPlugin()) 143 | } 144 | 145 | module.exports = webpackConfig 146 | -------------------------------------------------------------------------------- /config/dev.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const prodEnv = require('./prod.env') 4 | 5 | module.exports = merge(prodEnv, { 6 | NODE_ENV: '"development"' 7 | }) 8 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | // Template version: 1.3.1 3 | // see http://vuejs-templates.github.io/webpack for documentation. 4 | 5 | const path = require('path') 6 | 7 | module.exports = { 8 | dev: { 9 | 10 | // Paths 11 | assetsSubDirectory: 'static', 12 | assetsPublicPath: '/', 13 | proxyTable: {}, 14 | 15 | // Various Dev Server settings 16 | host: 'localhost', // can be overwritten by process.env.HOST 17 | port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined 18 | autoOpenBrowser: false, 19 | errorOverlay: true, 20 | notifyOnErrors: true, 21 | poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- 22 | 23 | 24 | /** 25 | * Source Maps 26 | */ 27 | 28 | // https://webpack.js.org/configuration/devtool/#development 29 | devtool: 'cheap-module-eval-source-map', 30 | 31 | // If you have problems debugging vue-files in devtools, 32 | // set this to false - it *may* help 33 | // https://vue-loader.vuejs.org/en/options.html#cachebusting 34 | cacheBusting: true, 35 | 36 | cssSourceMap: true 37 | }, 38 | 39 | build: { 40 | // Template for index.html 41 | index: path.resolve(__dirname, '../dist/index.html'), 42 | 43 | // Paths 44 | assetsRoot: path.resolve(__dirname, '../dist'), 45 | assetsSubDirectory: 'static', 46 | assetsPublicPath: './', 47 | 48 | /** 49 | * Source Maps 50 | */ 51 | 52 | productionSourceMap: true, 53 | // https://webpack.js.org/configuration/devtool/#production 54 | devtool: '#source-map', 55 | 56 | // Gzip off by default as many popular static hosts such as 57 | // Surge or Netlify already gzip all static assets for you. 58 | // Before setting to `true`, make sure to: 59 | // npm install --save-dev compression-webpack-plugin 60 | productionGzip: false, 61 | productionGzipExtensions: ['js', 'css'], 62 | 63 | // Run the build command with an extra argument to 64 | // View the bundle analyzer report after build finishes: 65 | // `npm run build --report` 66 | // Set to `true` or `false` to always turn it on or off 67 | bundleAnalyzerReport: process.env.npm_config_report 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /config/prod.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | module.exports = { 3 | NODE_ENV: '"production"' 4 | } 5 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | app 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "app", 3 | "version": "1.0.0", 4 | "description": "A Vue.js project", 5 | "author": "Mynameisfwk <2239657654@qq.com>", 6 | "private": true, 7 | "scripts": { 8 | "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", 9 | "start": "npm run dev", 10 | "build": "node build/build.js" 11 | }, 12 | "dependencies": { 13 | "better-scroll": "^1.11.1", 14 | "mint-ui": "^2.2.13", 15 | "vue": "^2.5.16", 16 | "vue-router": "^3.0.1", 17 | "vuex": "^3.0.1" 18 | }, 19 | "devDependencies": { 20 | "autoprefixer": "^7.1.2", 21 | "babel-core": "^6.22.1", 22 | "babel-helper-vue-jsx-merge-props": "^2.0.3", 23 | "babel-loader": "^7.1.1", 24 | "babel-plugin-syntax-jsx": "^6.18.0", 25 | "babel-plugin-transform-runtime": "^6.22.0", 26 | "babel-plugin-transform-vue-jsx": "^3.5.0", 27 | "babel-preset-env": "^1.3.2", 28 | "babel-preset-stage-2": "^6.22.0", 29 | "chalk": "^2.0.1", 30 | "copy-webpack-plugin": "^4.0.1", 31 | "css-loader": "^0.28.0", 32 | "extract-text-webpack-plugin": "^3.0.0", 33 | "file-loader": "^1.1.4", 34 | "friendly-errors-webpack-plugin": "^1.6.1", 35 | "html-webpack-plugin": "^2.30.1", 36 | "node-notifier": "^5.1.2", 37 | "optimize-css-assets-webpack-plugin": "^3.2.0", 38 | "ora": "^1.2.0", 39 | "portfinder": "^1.0.13", 40 | "postcss-import": "^11.0.0", 41 | "postcss-loader": "^2.0.8", 42 | "postcss-url": "^7.2.1", 43 | "rimraf": "^2.6.0", 44 | "semver": "^5.3.0", 45 | "shelljs": "^0.7.6", 46 | "uglifyjs-webpack-plugin": "^1.1.1", 47 | "url-loader": "^0.5.8", 48 | "vue-loader": "^13.3.0", 49 | "vue-style-loader": "^3.0.1", 50 | "vue-template-compiler": "^2.5.2", 51 | "webpack": "^3.6.0", 52 | "webpack-bundle-analyzer": "^2.9.0", 53 | "webpack-dev-server": "^2.9.1", 54 | "webpack-merge": "^4.1.0" 55 | }, 56 | "engines": { 57 | "node": ">= 6.0.0", 58 | "npm": ">= 3.0.0" 59 | }, 60 | "browserslist": [ 61 | "> 1%", 62 | "last 2 versions", 63 | "not ie <= 8" 64 | ] 65 | } 66 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 13 | 14 | 21 | -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mynameisfwk/vue-Todo-list/3d8796f078fae784d7e337999d91cc2265a60aa6/src/assets/logo.png -------------------------------------------------------------------------------- /src/iconfont/iconfont.css: -------------------------------------------------------------------------------- 1 | 2 | @font-face {font-family: "iconfont"; 3 | src: url('iconfont.eot?t=1527598658354'); /* IE9*/ 4 | src: url('iconfont.eot?t=1527598658354#iefix') format('embedded-opentype'), /* IE6-IE8 */ 5 | url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'), 6 | url('iconfont.ttf?t=1527598658354') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ 7 | url('iconfont.svg?t=1527598658354#iconfont') format('svg'); /* iOS 4.1- */ 8 | } 9 | 10 | .iconfont { 11 | font-family:"iconfont" !important; 12 | font-size:16px; 13 | font-style:normal; 14 | -webkit-font-smoothing: antialiased; 15 | -moz-osx-font-smoothing: grayscale; 16 | } 17 | 18 | .icon-sousuo:before { content: "\e600"; } 19 | 20 | .icon-dianpu:before { content: "\e601"; } 21 | 22 | .icon-huiyuanqia:before { content: "\e602"; } 23 | 24 | .icon-xiugaioryijian:before { content: "\e603"; } 25 | 26 | .icon-shoucangxuanzhong:before { content: "\e604"; } 27 | 28 | .icon-shoucang:before { content: "\e607"; } 29 | 30 | .icon-quanbudingdan:before { content: "\e608"; } 31 | 32 | .icon-dianzan:before { content: "\e625"; } 33 | 34 | .icon-app:before { content: "\e605"; } 35 | 36 | .icon-browser:before { content: "\e606"; } 37 | 38 | .icon-form:before { content: "\e6a2"; } 39 | 40 | .icon-cart:before { content: "\e609"; } 41 | 42 | .icon-home:before { content: "\e60a"; } 43 | 44 | .icon-mine:before { content: "\e60b"; } 45 | 46 | .icon-31daifahuo:before { content: "\e60c"; } 47 | 48 | .icon-31daifukuan:before { content: "\e60d"; } 49 | 50 | .icon-31daishouhuo:before { content: "\e60e"; } 51 | 52 | .icon-31daipingjia:before { content: "\e60f"; } 53 | 54 | .icon-tuikuantuihuo:before { content: "\e610"; } 55 | 56 | .icon-zhongtumoshi:before { content: "\e611"; } 57 | 58 | .icon-xuanzekuangmoren:before { content: "\e6c1"; } 59 | 60 | .icon-shanchu:before { content: "\e614"; } 61 | 62 | .icon-gouwuchetianjia:before { content: "\e640"; } 63 | 64 | .icon-shouhuodizhi:before { content: "\e64f"; } 65 | 66 | .icon-wodefankui:before { content: "\e657"; } 67 | 68 | .icon-yijianfankui:before { content: "\e664"; } 69 | 70 | .icon-shanchu3:before { content: "\e68f"; } 71 | 72 | .icon-bianji:before { content: "\e62c"; } 73 | 74 | .icon-huishouzhan7:before { content: "\e717"; } 75 | 76 | .icon-fenlei-copy:before { content: "\e6be"; } 77 | 78 | .icon-chenggong:before { content: "\e61e"; } 79 | 80 | .icon-xuanzekuangxuanzhong:before { content: "\e678"; } 81 | 82 | .icon-bangzhuguanyuwomen:before { content: "\e649"; } 83 | 84 | .icon-cancel-1-copy:before { content: "\e61b"; } 85 | 86 | .icon-chenggong1:before { content: "\e613"; } 87 | 88 | .icon-wodedaifahuo3dtouchshangpinxiangqing:before { content: "\e669"; } 89 | 90 | .icon-lajitong:before { content: "\e62a"; } 91 | 92 | .icon-shangpin:before { content: "\e67b"; } 93 | 94 | .icon-zhifu:before { content: "\e655"; } 95 | 96 | .icon-gouwu:before { content: "\e68c"; } 97 | 98 | .icon-faxian:before { content: "\e627"; } 99 | 100 | .icon-vivo:before { content: "\e82e"; } 101 | 102 | .icon-discover:before { content: "\e64d"; } 103 | 104 | .icon-shouye1:before { content: "\e61c"; } 105 | 106 | .icon-yunshuzhongwuliu-xianxing:before { content: "\e882"; } 107 | 108 | .icon-baoguofahuo-xianxing:before { content: "\e884"; } 109 | 110 | .icon-shezhi-xianxing:before { content: "\e8b7"; } 111 | 112 | .icon-shouquan:before { content: "\e6c4"; } 113 | 114 | .icon-dianzan1:before { content: "\e628"; } 115 | 116 | .icon-share_icon:before { content: "\e662"; } 117 | 118 | .icon-dongtaixuanzhong:before { content: "\e665"; } 119 | 120 | .icon-tijiao:before { content: "\e616"; } 121 | 122 | .icon-VIVO:before { content: "\e9a1"; } 123 | 124 | .icon-warning:before { content: "\e62e"; } 125 | 126 | .icon-daibanrenwu:before { content: "\e65c"; } 127 | 128 | .icon-youjiantou:before { content: "\e619"; } 129 | 130 | .icon-zuojiantou:before { content: "\e61a"; } 131 | 132 | .icon-gouwuche:before { content: "\e626"; } 133 | 134 | .icon-dingdan:before { content: "\e635"; } 135 | 136 | .icon-wode:before { content: "\e653"; } 137 | 138 | .icon-shanchu1:before { content: "\e663"; } 139 | 140 | .icon-qijiandian:before { content: "\e641"; } 141 | 142 | .icon-shanchu2:before { content: "\e615"; } 143 | 144 | .icon-shouye2:before { content: "\e621"; } 145 | 146 | .icon-shouye:before { content: "\e634"; } 147 | 148 | .icon-wo:before { content: "\e639"; } 149 | 150 | .icon-shangchao:before { content: "\e643"; } 151 | 152 | .icon-wancheng:before { content: "\e62d"; } 153 | 154 | .icon-changyonggoupiaorenshanchu:before { content: "\e645"; } 155 | 156 | .icon-praise:before { content: "\e629"; } 157 | 158 | .icon-dongtai:before { content: "\e622"; } 159 | 160 | .icon-shouye_xuanzhong:before { content: "\e66b"; } 161 | 162 | .icon-collection:before { content: "\e612"; } 163 | 164 | .icon-jia:before { content: "\e666"; } 165 | 166 | .icon-wode-:before { content: "\e6a8"; } 167 | 168 | .icon-gouwuche-xuanzhong:before { content: "\e64e"; } 169 | 170 | .icon-icon--:before { content: "\e71c"; } 171 | 172 | .icon-fenleixuanzhong:before { content: "\e624"; } 173 | 174 | .icon-tubiaolunkuo-:before { content: "\e61f"; } 175 | 176 | .icon-tubiaolunkuo-1:before { content: "\e620"; } 177 | 178 | .icon-qingdan:before { content: "\e62b"; } 179 | 180 | .icon-fenlei3:before { content: "\e61d"; } 181 | 182 | .icon-dingdanquxiao:before { content: "\e617"; } 183 | 184 | .icon-jia1:before { content: "\e685"; } 185 | 186 | .icon-shoucangxuanzhong1:before { content: "\e623"; } 187 | 188 | .icon-zy_peisong:before { content: "\e618"; } 189 | 190 | -------------------------------------------------------------------------------- /src/iconfont/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mynameisfwk/vue-Todo-list/3d8796f078fae784d7e337999d91cc2265a60aa6/src/iconfont/iconfont.eot -------------------------------------------------------------------------------- /src/iconfont/iconfont.js: -------------------------------------------------------------------------------- 1 | (function(window){var svgSprite='';var script=function(){var scripts=document.getElementsByTagName("script");return scripts[scripts.length-1]}();var shouldInjectCss=script.getAttribute("data-injectcss");var ready=function(fn){if(document.addEventListener){if(~["complete","loaded","interactive"].indexOf(document.readyState)){setTimeout(fn,0)}else{var loadFn=function(){document.removeEventListener("DOMContentLoaded",loadFn,false);fn()};document.addEventListener("DOMContentLoaded",loadFn,false)}}else if(document.attachEvent){IEContentLoaded(window,fn)}function IEContentLoaded(w,fn){var d=w.document,done=false,init=function(){if(!done){done=true;fn()}};var polling=function(){try{d.documentElement.doScroll("left")}catch(e){setTimeout(polling,50);return}init()};polling();d.onreadystatechange=function(){if(d.readyState=="complete"){d.onreadystatechange=null;init()}}}};var before=function(el,target){target.parentNode.insertBefore(el,target)};var prepend=function(el,target){if(target.firstChild){before(el,target.firstChild)}else{target.appendChild(el)}};function appendSvg(){var div,svg;div=document.createElement("div");div.innerHTML=svgSprite;svgSprite=null;svg=div.getElementsByTagName("svg")[0];if(svg){svg.setAttribute("aria-hidden","true");svg.style.position="absolute";svg.style.width=0;svg.style.height=0;svg.style.overflow="hidden";prepend(svg,document.body)}}if(shouldInjectCss&&!window.__iconfont__svg__cssinject__){window.__iconfont__svg__cssinject__=true;try{document.write("")}catch(e){console&&console.log(e)}}ready(appendSvg)})(window) -------------------------------------------------------------------------------- /src/iconfont/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mynameisfwk/vue-Todo-list/3d8796f078fae784d7e337999d91cc2265a60aa6/src/iconfont/iconfont.ttf -------------------------------------------------------------------------------- /src/iconfont/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mynameisfwk/vue-Todo-list/3d8796f078fae784d7e337999d91cc2265a60aa6/src/iconfont/iconfont.woff -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | // The Vue build version to load with the `import` command 2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 3 | import Vue from 'vue' 4 | import App from './App' 5 | import router from './router' 6 | import vuex from 'vuex' 7 | import store from './vuex/index' 8 | Vue.use(vuex) 9 | 10 | 11 | import Mint from 'mint-ui'; 12 | import 'mint-ui/lib/style.css' 13 | Vue.use(Mint); 14 | 15 | Vue.config.productionTip = false 16 | 17 | /* eslint-disable no-new */ 18 | new Vue({ 19 | el: '#app', 20 | router, 21 | store, 22 | components: { App }, 23 | template: '' 24 | }) 25 | -------------------------------------------------------------------------------- /src/pages/HelloWorld.vue: -------------------------------------------------------------------------------- 1 | 85 | 86 | 96 | 97 | 98 | 114 | -------------------------------------------------------------------------------- /src/pages/add.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 56 | 57 | 58 | 90 | -------------------------------------------------------------------------------- /src/pages/ceshi.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 17 | 18 | 19 | 43 | 44 | 58 | 59 | -------------------------------------------------------------------------------- /src/pages/complete.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /src/pages/footer.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 18 | 19 | 58 | 59 | -------------------------------------------------------------------------------- /src/pages/header.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | 16 | 17 | -------------------------------------------------------------------------------- /src/pages/index.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 59 | 60 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | import HelloWorld from '@/pages/HelloWorld' 4 | import index from '@/pages/index' 5 | import add from '@/pages/add' 6 | import ceshi from '@/pages/ceshi' 7 | import complete from '@/pages/complete' 8 | Vue.use(Router) 9 | 10 | export default new Router({ 11 | routes: [ 12 | { 13 | path: '/', 14 | name: 'ceshi', 15 | component: ceshi 16 | }, 17 | { 18 | path: '/index', 19 | name: 'index', 20 | component: index 21 | }, 22 | { 23 | path: '/HelloWorld', 24 | name: 'HelloWorld', 25 | component: HelloWorld 26 | }, 27 | { 28 | path:'/add', 29 | name:'add', 30 | component:add 31 | }, 32 | { 33 | path:'/complete', 34 | name:'complete', 35 | component:complete 36 | } 37 | ] 38 | }) 39 | -------------------------------------------------------------------------------- /src/style/rem.js: -------------------------------------------------------------------------------- 1 | (function flexible (window, document) { 2 | var docEl = document.documentElement 3 | var dpr = window.devicePixelRatio || 1 4 | 5 | // adjust body font size 6 | function setBodyFontSize () { 7 | if (document.body) { 8 | document.body.style.fontSize = (12 * dpr) + 'px' 9 | } 10 | else { 11 | document.addEventListener('DOMContentLoaded', setBodyFontSize) 12 | } 13 | } 14 | setBodyFontSize(); 15 | 16 | // set 1rem = viewWidth / 10 17 | function setRemUnit () { 18 | var rem = docEl.clientWidth / 10 19 | docEl.style.fontSize = rem + 'px' 20 | } 21 | 22 | setRemUnit() 23 | 24 | // reset rem unit on page resize 25 | window.addEventListener('resize', setRemUnit) 26 | window.addEventListener('pageshow', function (e) { 27 | if (e.persisted) { 28 | setRemUnit() 29 | } 30 | }) 31 | 32 | // detect 0.5px supports 33 | if (dpr >= 2) { 34 | var fakeBody = document.createElement('body') 35 | var testElement = document.createElement('div') 36 | testElement.style.border = '.5px solid transparent' 37 | fakeBody.appendChild(testElement) 38 | docEl.appendChild(fakeBody) 39 | if (testElement.offsetHeight === 1) { 40 | docEl.classList.add('hairlines') 41 | } 42 | docEl.removeChild(fakeBody) 43 | } 44 | }(window, document)) -------------------------------------------------------------------------------- /src/style/style.css: -------------------------------------------------------------------------------- 1 | body,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,html,input,li,ol,p,select,td,textarea,th,ul{margin:0;padding:0} 2 | *{box-sizing:border-box;list-style:none} 3 | body,html{min-height:100%;font-size:50px} 4 | body{font-family:"microsoft yahei,HanHei SC,PingHei,PingFang SC,STHeitiSC-Light,Helvetica Neue,Helvetica,Arial,sans-serif";font-size:14px;color:#333} 5 | h1,h2,h3,h4,h5,h6{font-weight:400} 6 | ol,ul{list-style:none} 7 | img{border:0;vertical-align:middle} 8 | a{text-decoration:none;color:#232323} 9 | table{border-collapse:collapse;table-layout:fixed} 10 | input,textarea{outline:0;border:0} 11 | textarea{resize:none;overflow:auto} 12 | .clearfix{zoom:1} 13 | .clearfix:after{content:".";width:0;height:0;visibility:hidden;display:block;clear:both;overflow:hidden} 14 | .fl{float:left} 15 | .fr{float:right} 16 | .tl{text-align:left} 17 | .tc{text-align:center} 18 | .tr{text-align:right} 19 | .ellipse{overflow:hidden;text-overflow:ellipsis;white-space:nowrap} 20 | .inline{display:inline-block} 21 | /* .container{padding-top: 1.45rem} */ 22 | -------------------------------------------------------------------------------- /src/vuex/actions.js: -------------------------------------------------------------------------------- 1 | const actions={ 2 | setOrder ({commit}, data) { 3 | commit('SET_SHIXIANG', data); 4 | }, 5 | setYes({commit},data){ 6 | commit('SET_YES',data) 7 | } 8 | } 9 | 10 | export default actions -------------------------------------------------------------------------------- /src/vuex/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | import state from './state' 4 | import mutations from './mutations' 5 | import actions from './actions'; 6 | 7 | Vue.use(Vuex) 8 | 9 | export default new Vuex.Store({ 10 | state, 11 | mutations, 12 | actions 13 | }) -------------------------------------------------------------------------------- /src/vuex/mutations.js: -------------------------------------------------------------------------------- 1 | import state from './state' 2 | import * as types from './type.js' 3 | const mutations={ 4 | //事项 5 | [types.SET_SHIXIANG](state,data){ 6 | state.home.push(data) 7 | localStorage.setItem("home",JSON.stringify(state.home)); 8 | }, 9 | //完成 10 | [types.SET_YES](state,data){ 11 | state.item.push(data) 12 | localStorage.setItem("item",JSON.stringify(state.item)); 13 | } 14 | } 15 | 16 | export default mutations -------------------------------------------------------------------------------- /src/vuex/state.js: -------------------------------------------------------------------------------- 1 | const state={ 2 | home:localStorage["home"]?JSON.parse(localStorage["home"]): [], 3 | item:localStorage["item"]?JSON.parse(localStorage["item"]): [], 4 | } 5 | 6 | export default state -------------------------------------------------------------------------------- /src/vuex/type.js: -------------------------------------------------------------------------------- 1 | 2 | export const SET_SHIXIANG = 'SET_SHIXIANG' //事项 3 | export const SET_YES='SET_YES' //完成 -------------------------------------------------------------------------------- /static/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mynameisfwk/vue-Todo-list/3d8796f078fae784d7e337999d91cc2265a60aa6/static/.gitkeep --------------------------------------------------------------------------------