├── .babelrc ├── .electron-vue ├── build.config.js ├── build.js ├── dev-client.js ├── dev-runner.js ├── webpack.main.config.js ├── webpack.renderer.config.js └── webpack.web.config.js ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── README.md ├── build └── icons │ ├── 256x256.png │ ├── icon.icns │ └── icon.ico ├── package.json ├── src ├── index.ejs ├── main │ ├── index.dev.js │ └── index.js └── renderer │ ├── App.vue │ ├── assets │ ├── default_user.jpg │ ├── error_video.jpg │ ├── icon_repeat-cycle.gif │ ├── icon_repeat-once.png │ ├── icon_repeat-random.png │ ├── info_tra.svg │ └── userbg.png │ ├── components │ ├── FileIndexPage.vue │ ├── ImagesDetailPage.vue │ ├── ImagesIndexPage.vue │ ├── IndexPage.vue │ ├── MusicIndexPage.vue │ ├── NoteIndexPage.vue │ ├── SettingIndexPage.vue │ ├── SingLoginPage.vue │ ├── VideoDetailPage.vue │ ├── VideoIndexPage.vue │ └── VideoPushPage.vue │ ├── main.js │ ├── mixins │ └── index.js │ ├── router │ └── index.js │ ├── store │ ├── index.js │ └── modules │ │ ├── file.js │ │ ├── images.js │ │ ├── index.js │ │ ├── login.js │ │ ├── main.js │ │ ├── music.js │ │ ├── note.js │ │ └── video.js │ └── tool │ ├── config.js │ ├── cookie.js │ ├── datastore.js │ ├── download.js │ ├── function.js │ └── http.js └── static ├── css ├── app.scss ├── file │ └── index.scss ├── images │ ├── detail.scss │ └── index.scss ├── index │ └── index.scss ├── music │ └── index.scss ├── note │ └── index.scss ├── reset.scss ├── setting │ └── index.scss ├── sing │ └── login.scss └── video │ ├── index.scss │ ├── play.scss │ └── push.scss ├── html └── setting.html ├── img ├── icon.ico └── preview │ ├── 1.jpg │ ├── 10.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ ├── 6.jpg │ ├── 7.jpg │ ├── 8.jpg │ └── 9.jpg └── vue ├── fonts └── ionicons.ttf ├── iview.css ├── iview.min.js └── vue.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "comments": false, 3 | "env": { 4 | "test": { 5 | "presets": [ 6 | [ 7 | "env", 8 | { 9 | "targets": { 10 | "node": 7 11 | } 12 | } 13 | ], 14 | "stage-0" 15 | ], 16 | "plugins": [ 17 | "istanbul" 18 | ] 19 | }, 20 | "main": { 21 | "presets": [ 22 | [ 23 | "env", 24 | { 25 | "targets": { 26 | "node": 7 27 | } 28 | } 29 | ], 30 | "stage-0" 31 | ] 32 | }, 33 | "renderer": { 34 | "presets": [ 35 | [ 36 | "env", 37 | { 38 | "modules": false 39 | } 40 | ], 41 | "stage-0" 42 | ] 43 | }, 44 | "web": { 45 | "presets": [ 46 | [ 47 | "env", 48 | { 49 | "modules": false 50 | } 51 | ], 52 | "stage-0" 53 | ] 54 | } 55 | }, 56 | "plugins": [ 57 | "transform-runtime" 58 | ] 59 | } -------------------------------------------------------------------------------- /.electron-vue/build.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | 3 | /** 4 | * `electron-packager` options 5 | * https://simulatedgreg.gitbooks.io/electron-vue/content/en/using-electron-packager.html 6 | */ 7 | module.exports = { 8 | arch: 'x64', 9 | asar: true, 10 | dir: path.join(__dirname, '../'), 11 | icon: path.join(__dirname, '../build/icons/icon'), 12 | ignore: /(^\/(src|test|\.[a-z]+|README|yarn|static|dist\/web))|\.gitkeep/, 13 | out: path.join(__dirname, '../build'), 14 | overwrite: true, 15 | platform: process.env.BUILD_TARGET || 'all' 16 | } 17 | -------------------------------------------------------------------------------- /.electron-vue/build.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | process.env.NODE_ENV = 'production' 4 | 5 | const { say } = require('cfonts') 6 | const chalk = require('chalk') 7 | const del = require('del') 8 | const packager = require('electron-packager') 9 | const webpack = require('webpack') 10 | const Multispinner = require('multispinner') 11 | 12 | const buildConfig = require('./build.config') 13 | const mainConfig = require('./webpack.main.config') 14 | const rendererConfig = require('./webpack.renderer.config') 15 | const webConfig = require('./webpack.web.config') 16 | 17 | const doneLog = chalk.bgGreen.white(' DONE ') + ' ' 18 | const errorLog = chalk.bgRed.white(' ERROR ') + ' ' 19 | const okayLog = chalk.bgBlue.white(' OKAY ') + ' ' 20 | const isCI = process.env.CI || false 21 | 22 | if (process.env.BUILD_TARGET === 'clean') clean() 23 | else if (process.env.BUILD_TARGET === 'web') web() 24 | else build() 25 | 26 | function clean () { 27 | del.sync(['build/*', '!build/icons', '!build/icons/icon.*']) 28 | console.log(`\n${doneLog}\n`) 29 | process.exit() 30 | } 31 | 32 | function build () { 33 | greeting() 34 | const tasks = ['main', 'renderer'] 35 | const m = new Multispinner(tasks, { 36 | preText: 'building', 37 | postText: 'process' 38 | }) 39 | 40 | let results = '' 41 | 42 | m.on('success', () => { 43 | process.stdout.write('\x1B[2J\x1B[0f') 44 | console.log(`\n\n${results}`) 45 | console.log(`${okayLog}take it away ${chalk.yellow('`electron-packager`')}\n`) 46 | bundleApp() 47 | }) 48 | 49 | pack(mainConfig).then(result => { 50 | results += result + '\n\n' 51 | m.success('main') 52 | }).catch(err => { 53 | m.error('main') 54 | console.log(`\n ${errorLog}failed to build main process`) 55 | console.error(`\n${err}\n`) 56 | process.exit(1) 57 | }) 58 | 59 | pack(rendererConfig).then(result => { 60 | results += result + '\n\n' 61 | m.success('renderer') 62 | }).catch(err => { 63 | m.error('renderer') 64 | console.log(`\n ${errorLog}failed to build renderer process`) 65 | console.error(`\n${err}\n`) 66 | process.exit(1) 67 | }) 68 | } 69 | 70 | function pack (config) { 71 | return new Promise((resolve, reject) => { 72 | webpack(config, (err, stats) => { 73 | if (err) reject(err.stack || err) 74 | else if (stats.hasErrors()) { 75 | let err = '' 76 | 77 | stats.toString({ 78 | chunks: false, 79 | colors: true 80 | }) 81 | .split(/\r?\n/) 82 | .forEach(line => { 83 | err += ` ${line}\n` 84 | }) 85 | 86 | reject(err) 87 | } else { 88 | resolve(stats.toString({ 89 | chunks: false, 90 | colors: true 91 | })) 92 | } 93 | }) 94 | }) 95 | } 96 | 97 | function bundleApp () { 98 | packager(buildConfig, (err, appPaths) => { 99 | if (err) { 100 | console.log(`\n${errorLog}${chalk.yellow('`electron-packager`')} says...\n`) 101 | console.log(err + '\n') 102 | } else { 103 | console.log(`\n${doneLog}\n`) 104 | } 105 | }) 106 | } 107 | 108 | function web () { 109 | webpack(webConfig, (err, stats) => { 110 | if (err || stats.hasErrors()) console.log(err) 111 | 112 | console.log(stats.toString({ 113 | chunks: false, 114 | colors: true 115 | })) 116 | 117 | process.exit() 118 | }) 119 | } 120 | 121 | function greeting () { 122 | const cols = process.stdout.columns 123 | let text = '' 124 | 125 | if (cols > 85) text = 'lets-build' 126 | else if (cols > 60) text = 'lets-|build' 127 | else text = false 128 | 129 | if (text && !isCI) { 130 | say(text, { 131 | colors: ['yellow'], 132 | font: 'simple3d', 133 | space: false 134 | }) 135 | } else console.log(chalk.yellow.bold('\n lets-build')) 136 | console.log() 137 | } 138 | -------------------------------------------------------------------------------- /.electron-vue/dev-client.js: -------------------------------------------------------------------------------- 1 | const hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true') 2 | 3 | hotClient.subscribe(event => { 4 | /** 5 | * Reload browser when HTMLWebpackPlugin emits a new index.html 6 | */ 7 | if (event.action === 'reload') { 8 | window.location.reload() 9 | } 10 | 11 | /** 12 | * Notify `mainWindow` when `main` process is compiling, 13 | * giving notice for an expected reload of the `electron` process 14 | */ 15 | if (event.action === 'compiling') { 16 | document.body.innerHTML += ` 17 | 30 | 31 |
32 | Compiling Main Process... 33 |
34 | ` 35 | } 36 | }) 37 | -------------------------------------------------------------------------------- /.electron-vue/dev-runner.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const chalk = require('chalk') 4 | const electron = require('electron') 5 | const path = require('path') 6 | const { say } = require('cfonts') 7 | const { spawn } = require('child_process') 8 | const webpack = require('webpack') 9 | const WebpackDevServer = require('webpack-dev-server') 10 | const webpackHotMiddleware = require('webpack-hot-middleware') 11 | 12 | const mainConfig = require('./webpack.main.config') 13 | const rendererConfig = require('./webpack.renderer.config') 14 | 15 | let electronProcess = null 16 | let manualRestart = false 17 | let hotMiddleware 18 | 19 | function logStats (proc, data) { 20 | let log = '' 21 | 22 | log += chalk.yellow.bold(`┏ ${proc} Process ${new Array((19 - proc.length) + 1).join('-')}`) 23 | log += '\n\n' 24 | 25 | if (typeof data === 'object') { 26 | data.toString({ 27 | colors: true, 28 | chunks: false 29 | }).split(/\r?\n/).forEach(line => { 30 | log += ' ' + line + '\n' 31 | }) 32 | } else { 33 | log += ` ${data}\n` 34 | } 35 | 36 | log += '\n' + chalk.yellow.bold(`┗ ${new Array(28 + 1).join('-')}`) + '\n' 37 | 38 | console.log(log) 39 | } 40 | 41 | function startRenderer () { 42 | return new Promise((resolve, reject) => { 43 | rendererConfig.entry.renderer = [path.join(__dirname, 'dev-client')].concat(rendererConfig.entry.renderer) 44 | 45 | const compiler = webpack(rendererConfig) 46 | hotMiddleware = webpackHotMiddleware(compiler, { 47 | log: false, 48 | heartbeat: 2500 49 | }) 50 | 51 | compiler.plugin('compilation', compilation => { 52 | compilation.plugin('html-webpack-plugin-after-emit', (data, cb) => { 53 | hotMiddleware.publish({ action: 'reload' }) 54 | cb() 55 | }) 56 | }) 57 | 58 | compiler.plugin('done', stats => { 59 | logStats('Renderer', stats) 60 | }) 61 | 62 | const server = new WebpackDevServer( 63 | compiler, 64 | { 65 | contentBase: path.join(__dirname, '../'), 66 | quiet: true, 67 | setup (app, ctx) { 68 | app.use(hotMiddleware) 69 | ctx.middleware.waitUntilValid(() => { 70 | resolve() 71 | }) 72 | } 73 | } 74 | ) 75 | 76 | server.listen(9080) 77 | }) 78 | } 79 | 80 | function startMain () { 81 | return new Promise((resolve, reject) => { 82 | mainConfig.entry.main = [path.join(__dirname, '../src/main/index.dev.js')].concat(mainConfig.entry.main) 83 | 84 | const compiler = webpack(mainConfig) 85 | 86 | compiler.plugin('watch-run', (compilation, done) => { 87 | logStats('Main', chalk.white.bold('compiling...')) 88 | hotMiddleware.publish({ action: 'compiling' }) 89 | done() 90 | }) 91 | 92 | compiler.watch({}, (err, stats) => { 93 | if (err) { 94 | console.log(err) 95 | return 96 | } 97 | 98 | logStats('Main', stats) 99 | 100 | if (electronProcess && electronProcess.kill) { 101 | manualRestart = true 102 | process.kill(electronProcess.pid) 103 | electronProcess = null 104 | startElectron() 105 | 106 | setTimeout(() => { 107 | manualRestart = false 108 | }, 5000) 109 | } 110 | 111 | resolve() 112 | }) 113 | }) 114 | } 115 | 116 | function startElectron () { 117 | electronProcess = spawn(electron, ['--inspect=5858', path.join(__dirname, '../dist/electron/main.js')]) 118 | 119 | electronProcess.stdout.on('data', data => { 120 | electronLog(data, 'blue') 121 | }) 122 | electronProcess.stderr.on('data', data => { 123 | electronLog(data, 'red') 124 | }) 125 | 126 | electronProcess.on('close', () => { 127 | if (!manualRestart) process.exit() 128 | }) 129 | } 130 | 131 | function electronLog (data, color) { 132 | let log = '' 133 | data = data.toString().split(/\r?\n/) 134 | data.forEach(line => { 135 | log += ` ${line}\n` 136 | }) 137 | if (/[0-9A-z]+/.test(log)) { 138 | console.log( 139 | chalk[color].bold('┏ Electron -------------------') + 140 | '\n\n' + 141 | log + 142 | chalk[color].bold('┗ ----------------------------') + 143 | '\n' 144 | ) 145 | } 146 | } 147 | 148 | function greeting () { 149 | const cols = process.stdout.columns 150 | let text = '' 151 | 152 | if (cols > 104) text = 'electron-vue' 153 | else if (cols > 76) text = 'electron-|vue' 154 | else text = false 155 | 156 | if (text) { 157 | say(text, { 158 | colors: ['yellow'], 159 | font: 'simple3d', 160 | space: false 161 | }) 162 | } else console.log(chalk.yellow.bold('\n electron-vue')) 163 | console.log(chalk.blue(' getting ready...') + '\n') 164 | } 165 | 166 | function init () { 167 | greeting() 168 | 169 | Promise.all([startRenderer(), startMain()]) 170 | .then(() => { 171 | startElectron() 172 | }) 173 | .catch(err => { 174 | console.error(err) 175 | }) 176 | } 177 | 178 | init() 179 | -------------------------------------------------------------------------------- /.electron-vue/webpack.main.config.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | process.env.BABEL_ENV = 'main' 4 | 5 | const path = require('path') 6 | const { dependencies } = require('../package.json') 7 | const webpack = require('webpack') 8 | 9 | const BabiliWebpackPlugin = require('babili-webpack-plugin') 10 | 11 | let mainConfig = { 12 | entry: { 13 | main: path.join(__dirname, '../src/main/index.js') 14 | }, 15 | externals: [ 16 | ...Object.keys(dependencies || {}) 17 | ], 18 | module: { 19 | rules: [ 20 | { 21 | test: /\.(js)$/, 22 | enforce: 'pre', 23 | exclude: /node_modules/, 24 | use: { 25 | loader: 'eslint-loader', 26 | options: { 27 | formatter: require('eslint-friendly-formatter') 28 | } 29 | } 30 | }, 31 | { 32 | test: /\.js$/, 33 | use: 'babel-loader', 34 | exclude: /node_modules/ 35 | }, 36 | { 37 | test: /\.node$/, 38 | use: 'node-loader' 39 | } 40 | ] 41 | }, 42 | node: { 43 | __dirname: process.env.NODE_ENV !== 'production', 44 | __filename: process.env.NODE_ENV !== 'production' 45 | }, 46 | output: { 47 | filename: '[name].js', 48 | libraryTarget: 'commonjs2', 49 | path: path.join(__dirname, '../dist/electron') 50 | }, 51 | plugins: [ 52 | new webpack.NoEmitOnErrorsPlugin() 53 | ], 54 | resolve: { 55 | extensions: ['.js', '.json', '.node'] 56 | }, 57 | target: 'electron-main' 58 | } 59 | 60 | /** 61 | * Adjust mainConfig for development settings 62 | */ 63 | if (process.env.NODE_ENV !== 'production') { 64 | mainConfig.plugins.push( 65 | new webpack.DefinePlugin({ 66 | '__static': `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"` 67 | }) 68 | ) 69 | } 70 | 71 | /** 72 | * Adjust mainConfig for production settings 73 | */ 74 | if (process.env.NODE_ENV === 'production') { 75 | mainConfig.plugins.push( 76 | new BabiliWebpackPlugin({ 77 | removeConsole: true, 78 | removeDebugger: true 79 | }), 80 | new webpack.DefinePlugin({ 81 | 'process.env.NODE_ENV': '"production"' 82 | }) 83 | ) 84 | } 85 | 86 | module.exports = mainConfig 87 | -------------------------------------------------------------------------------- /.electron-vue/webpack.renderer.config.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | process.env.BABEL_ENV = 'renderer' 4 | 5 | const path = require('path') 6 | const { dependencies } = require('../package.json') 7 | const webpack = require('webpack') 8 | 9 | const BabiliWebpackPlugin = require('babili-webpack-plugin') 10 | const CopyWebpackPlugin = require('copy-webpack-plugin') 11 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 12 | const HtmlWebpackPlugin = require('html-webpack-plugin') 13 | 14 | /** 15 | * List of node_modules to include in webpack bundle 16 | * 17 | * Required for specific packages like Vue UI libraries 18 | * that provide pure *.vue files that need compiling 19 | * https://simulatedgreg.gitbooks.io/electron-vue/content/en/webpack-configurations.html#white-listing-externals 20 | */ 21 | let whiteListedModules = ['vue'] 22 | 23 | let rendererConfig = { 24 | devtool: '#cheap-module-eval-source-map', 25 | entry: { 26 | renderer: path.join(__dirname, '../src/renderer/main.js') 27 | }, 28 | externals: [ 29 | ...Object.keys(dependencies || {}).filter( 30 | d => !whiteListedModules.includes(d) 31 | ) 32 | ], 33 | module: { 34 | rules: [ 35 | { 36 | test: /\.(js|vue)$/, 37 | enforce: 'pre', 38 | exclude: /node_modules/, 39 | use: { 40 | loader: 'eslint-loader', 41 | options: { 42 | formatter: require('eslint-friendly-formatter') 43 | } 44 | } 45 | }, 46 | { 47 | test: /\.css$/, 48 | use: ExtractTextPlugin.extract({ 49 | fallback: 'style-loader', 50 | use: 'css-loader' 51 | }) 52 | }, 53 | { 54 | test: /\.scss$/, 55 | use: [ 56 | { 57 | loader: 'style-loader' // creates style nodes from JS strings 58 | }, 59 | { 60 | loader: 'css-loader' // translates CSS into CommonJS 61 | }, 62 | { 63 | loader: 'sass-loader' // compiles Sass to CSS 64 | } 65 | ] 66 | }, 67 | { 68 | test: /\.html$/, 69 | use: 'vue-html-loader' 70 | }, 71 | { 72 | test: /\.js$/, 73 | use: 'babel-loader', 74 | exclude: /node_modules/ 75 | }, 76 | { 77 | test: /\.node$/, 78 | use: 'node-loader' 79 | }, 80 | { 81 | test: /\.vue$/, 82 | use: { 83 | loader: 'vue-loader', 84 | options: { 85 | extractCSS: process.env.NODE_ENV === 'production', 86 | loaders: { 87 | sass: 'vue-style-loader!css-loader!sass-loader?indentedSyntax=1', 88 | scss: 'vue-style-loader!css-loader!sass-loader' 89 | } 90 | } 91 | } 92 | }, 93 | { 94 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, 95 | use: { 96 | loader: 'url-loader', 97 | query: { 98 | limit: 10000, 99 | name: 'imgs/[name].[ext]' 100 | } 101 | } 102 | }, 103 | { 104 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, 105 | use: { 106 | loader: 'url-loader', 107 | query: { 108 | limit: 10000, 109 | name: 'fonts/[name].[ext]' 110 | } 111 | } 112 | } 113 | ] 114 | }, 115 | node: { 116 | __dirname: process.env.NODE_ENV !== 'production', 117 | __filename: process.env.NODE_ENV !== 'production' 118 | }, 119 | plugins: [ 120 | new ExtractTextPlugin('styles.css'), 121 | new HtmlWebpackPlugin({ 122 | filename: 'index.html', 123 | template: path.resolve(__dirname, '../src/index.ejs'), 124 | minify: { 125 | collapseWhitespace: true, 126 | removeAttributeQuotes: true, 127 | removeComments: true 128 | }, 129 | nodeModules: process.env.NODE_ENV !== 'production' 130 | ? path.resolve(__dirname, '../node_modules') 131 | : false 132 | }), 133 | new webpack.HotModuleReplacementPlugin(), 134 | new webpack.NoEmitOnErrorsPlugin() 135 | ], 136 | output: { 137 | filename: '[name].js', 138 | libraryTarget: 'commonjs2', 139 | path: path.join(__dirname, '../dist/electron') 140 | }, 141 | resolve: { 142 | alias: { 143 | '@': path.join(__dirname, '../src/renderer'), 144 | vue$: 'vue/dist/vue.esm.js' 145 | }, 146 | extensions: ['.js', '.vue', '.json', '.css', '.node'] 147 | }, 148 | target: 'electron-renderer' 149 | } 150 | 151 | /** 152 | * Adjust rendererConfig for development settings 153 | */ 154 | if (process.env.NODE_ENV !== 'production') { 155 | rendererConfig.plugins.push( 156 | new webpack.DefinePlugin({ 157 | __static: `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"` 158 | }) 159 | ) 160 | } 161 | 162 | /** 163 | * Adjust rendererConfig for production settings 164 | */ 165 | if (process.env.NODE_ENV === 'production') { 166 | rendererConfig.devtool = '' 167 | 168 | rendererConfig.plugins.push( 169 | new BabiliWebpackPlugin({ 170 | removeConsole: true, 171 | removeDebugger: true 172 | }), 173 | new CopyWebpackPlugin([ 174 | { 175 | from: path.join(__dirname, '../static'), 176 | to: path.join(__dirname, '../dist/electron/static'), 177 | ignore: ['.*'] 178 | } 179 | ]), 180 | new webpack.DefinePlugin({ 181 | 'process.env.NODE_ENV': '"production"' 182 | }), 183 | new webpack.LoaderOptionsPlugin({ 184 | minimize: true 185 | }) 186 | ) 187 | } 188 | 189 | module.exports = rendererConfig 190 | -------------------------------------------------------------------------------- /.electron-vue/webpack.web.config.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | process.env.BABEL_ENV = 'web' 4 | 5 | const path = require('path') 6 | const webpack = require('webpack') 7 | 8 | const BabiliWebpackPlugin = require('babili-webpack-plugin') 9 | const CopyWebpackPlugin = require('copy-webpack-plugin') 10 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 11 | const HtmlWebpackPlugin = require('html-webpack-plugin') 12 | 13 | let webConfig = { 14 | devtool: '#cheap-module-eval-source-map', 15 | entry: { 16 | web: path.join(__dirname, '../src/renderer/main.js') 17 | }, 18 | module: { 19 | rules: [ 20 | { 21 | test: /\.(js|vue)$/, 22 | enforce: 'pre', 23 | exclude: /node_modules/, 24 | use: { 25 | loader: 'eslint-loader', 26 | options: { 27 | formatter: require('eslint-friendly-formatter') 28 | } 29 | } 30 | }, 31 | { 32 | test: /\.css$/, 33 | use: ExtractTextPlugin.extract({ 34 | fallback: 'style-loader', 35 | use: 'css-loader' 36 | }) 37 | }, 38 | { 39 | test: /\.scss$/, 40 | use: [ 41 | { 42 | loader: 'style-loader' // creates style nodes from JS strings 43 | }, 44 | { 45 | loader: 'css-loader' // translates CSS into CommonJS 46 | }, 47 | { 48 | loader: 'sass-loader' // compiles Sass to CSS 49 | } 50 | ] 51 | }, 52 | { 53 | test: /\.html$/, 54 | use: 'vue-html-loader' 55 | }, 56 | { 57 | test: /\.js$/, 58 | use: 'babel-loader', 59 | include: [path.resolve(__dirname, '../src/renderer')], 60 | exclude: /node_modules/ 61 | }, 62 | { 63 | test: /\.vue$/, 64 | use: { 65 | loader: 'vue-loader', 66 | options: { 67 | extractCSS: true, 68 | loaders: { 69 | sass: 'vue-style-loader!css-loader!sass-loader?indentedSyntax=1', 70 | scss: 'vue-style-loader!css-loader!sass-loader' 71 | } 72 | } 73 | } 74 | }, 75 | { 76 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, 77 | use: { 78 | loader: 'url-loader', 79 | query: { 80 | limit: 10000, 81 | name: 'imgs/[name].[ext]' 82 | } 83 | } 84 | }, 85 | { 86 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, 87 | use: { 88 | loader: 'url-loader', 89 | query: { 90 | limit: 10000, 91 | name: 'fonts/[name].[ext]' 92 | } 93 | } 94 | } 95 | ] 96 | }, 97 | plugins: [ 98 | new ExtractTextPlugin('styles.css'), 99 | new HtmlWebpackPlugin({ 100 | filename: 'index.html', 101 | template: path.resolve(__dirname, '../src/index.ejs'), 102 | minify: { 103 | collapseWhitespace: true, 104 | removeAttributeQuotes: true, 105 | removeComments: true 106 | }, 107 | nodeModules: false 108 | }), 109 | new webpack.DefinePlugin({ 110 | 'process.env.IS_WEB': 'true' 111 | }), 112 | new webpack.HotModuleReplacementPlugin(), 113 | new webpack.NoEmitOnErrorsPlugin() 114 | ], 115 | output: { 116 | filename: '[name].js', 117 | path: path.join(__dirname, '../dist/web') 118 | }, 119 | resolve: { 120 | alias: { 121 | '@': path.join(__dirname, '../src/renderer'), 122 | vue$: 'vue/dist/vue.esm.js' 123 | }, 124 | extensions: ['.js', '.vue', '.json', '.css'] 125 | }, 126 | target: 'web' 127 | } 128 | 129 | /** 130 | * Adjust webConfig for production settings 131 | */ 132 | if (process.env.NODE_ENV === 'production') { 133 | webConfig.devtool = '' 134 | 135 | webConfig.plugins.push( 136 | new BabiliWebpackPlugin({ 137 | removeConsole: true, 138 | removeDebugger: true 139 | }), 140 | new CopyWebpackPlugin([ 141 | { 142 | from: path.join(__dirname, '../static'), 143 | to: path.join(__dirname, '../dist/web/static'), 144 | ignore: ['.*'] 145 | } 146 | ]), 147 | new webpack.DefinePlugin({ 148 | 'process.env.NODE_ENV': '"production"' 149 | }), 150 | new webpack.LoaderOptionsPlugin({ 151 | minimize: true 152 | }) 153 | ) 154 | } 155 | 156 | module.exports = webConfig 157 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | test/unit/coverage/** 2 | test/unit/*.js 3 | test/e2e/*.js 4 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | parser: 'babel-eslint', 4 | parserOptions: { 5 | sourceType: 'module' 6 | }, 7 | env: { 8 | browser: true, 9 | node: true 10 | }, 11 | extends: 'standard', 12 | globals: { 13 | __static: true 14 | }, 15 | plugins: ['html'], 16 | rules: { 17 | // allow paren-less arrow functions 18 | 'arrow-parens': 0, 19 | // allow async-await 20 | 'generator-star-spacing': 0, 21 | // allow debugger during development 22 | 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, 23 | 'space-before-function-paren': 0, 24 | 'eol-last': 0, 25 | 'no-extra-semi': 0, 26 | semi: 0, 27 | eqeqeq: 0, 28 | 'one-var': 0, 29 | 'no-undef': 0 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | dist/electron/* 3 | dist/web/* 4 | src/renderer/tool/config.js 5 | build/* 6 | !build/icons 7 | coverage 8 | node_modules/ 9 | .idea/ 10 | package-lock.json 11 | npm-debug.log 12 | npm-debug.log.* 13 | thumbs.db 14 | !.gitkeep 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 贝壳云笔记客户端 2 | 3 | > 一个基于 electron-vue 开发的云储存平台 4 | 5 | ### 运行 6 | 7 | ``` bash 8 | node -v : v12.18.2 9 | 10 | git clone https://github.com/EliseCaro/eibk_client.git 11 | 12 | cd eibk_client 13 | 14 | npm install 15 | 16 | # 运行开发模式 17 | npm run dev 18 | 19 | # 打包安装文件 20 | npm run build 21 | 22 | # 请自行配置src/renderer/tool/config.js 23 | 24 | ``` 25 | 26 | ### 服务端PHP代码 27 | 28 | [https://github.com/EliseCaro/eibk_service](https://github.com/EliseCaro/eibk_service) 29 | 30 | ### 联系本人 31 | 32 | ``` bash 33 | 34 | # QQ:1368213727 (一根小腿毛) 35 | 36 | ``` 37 | -------------------------------------------------------------------------------- /build/icons/256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EliseCaro/eibk_client/35fc05e7100f7934f990d21f7c0ee420e6d774fc/build/icons/256x256.png -------------------------------------------------------------------------------- /build/icons/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EliseCaro/eibk_client/35fc05e7100f7934f990d21f7c0ee420e6d774fc/build/icons/icon.icns -------------------------------------------------------------------------------- /build/icons/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EliseCaro/eibk_client/35fc05e7100f7934f990d21f7c0ee420e6d774fc/build/icons/icon.ico -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "eibk", 3 | "productName": "eibk", 4 | "version": "1.2.0", 5 | "author": "Yang☆YongFei", 6 | "description": "贝壳云笔记", 7 | "license": "", 8 | "main": "./dist/electron/main.js", 9 | "scripts": { 10 | "build:w32": "cross-env BUILD_TARGET=win32 node .electron-vue/build.js", 11 | "build": "node .electron-vue/build.js", 12 | "build:darwin": "cross-env BUILD_TARGET=darwin node .electron-vue/build.js", 13 | "build:linux": "cross-env BUILD_TARGET=linux node .electron-vue/build.js", 14 | "build:mas": "cross-env BUILD_TARGET=mas node .electron-vue/build.js", 15 | "build:win32": "cross-env BUILD_TARGET=win32 node .electron-vue/build.js && electron-builder --platform=win32 --arch=ia32", 16 | "build:clean": "cross-env BUILD_TARGET=clean node .electron-vue/build.js", 17 | "build:web": "cross-env BUILD_TARGET=web node .electron-vue/build.js", 18 | "dev": "node .electron-vue/dev-runner.js", 19 | "lint": "eslint --ext .js,.vue -f ./node_modules/eslint-friendly-formatter src test", 20 | "lint:fix": "eslint --ext .js,.vue -f ./node_modules/eslint-friendly-formatter --fix src test", 21 | "pack": "npm run pack:main && npm run pack:renderer", 22 | "pack:main": "cross-env NODE_ENV=production webpack --progress --colors --config .electron-vue/webpack.main.config.js", 23 | "pack:renderer": "cross-env NODE_ENV=production webpack --progress --colors --config .electron-vue/webpack.renderer.config.js", 24 | "test": "npm run unit", 25 | "unit": "karma start test/unit/karma.conf.js", 26 | "postinstall": "npm run lint:fix" 27 | }, 28 | "build": { 29 | "artifactName": "贝壳云笔记.exe", 30 | "appId": "com.bkybj.950201", 31 | "copyright": "滇ICP备14005543号-5 (C) 爱贝壳", 32 | "directories": { 33 | "output": "build" 34 | }, 35 | "nsis": { 36 | "oneClick": false, 37 | "allowToChangeInstallationDirectory": true, 38 | "installerIcon": "build/icons/icon.ico", 39 | "uninstallerIcon": "build/icons/icon.ico", 40 | "installerHeaderIcon": "build/icons/icon.ico", 41 | "createDesktopShortcut": true, 42 | "createStartMenuShortcut": true, 43 | "artifactName": "贝壳云笔记.exe", 44 | "shortcutName": "贝壳云笔记", 45 | "uninstallDisplayName": "贝壳云笔记", 46 | "perMachine": true 47 | }, 48 | "publish": [ 49 | { 50 | "provider": "generic", 51 | "url": "http://api.bkybj.com/client/exe/" 52 | } 53 | ], 54 | "files": [ 55 | "dist/electron/**/*" 56 | ], 57 | "win": { 58 | "icon": "build/icons/icon.ico" 59 | } 60 | }, 61 | "dependencies": { 62 | "axios": "^0.16.1", 63 | "electron-updater": "^4.0.6", 64 | "iview": "^2.14.1", 65 | "nedb": "^1.8.0", 66 | "node-sass": "^4.5.3", 67 | "sass-loader": "^6.0.6", 68 | "vue": "^2.3.3", 69 | "vue-electron": "^1.0.6", 70 | "vue-quill-editor": "^3.0.6", 71 | "vue-router": "^2.5.3", 72 | "vue-video-player": "^5.0.2", 73 | "vuex": "^2.3.1" 74 | }, 75 | "devDependencies": { 76 | "babel-core": "^6.22.1", 77 | "babel-eslint": "^7.0.0", 78 | "babel-loader": "^7.0.0", 79 | "babel-plugin-istanbul": "^4.1.1", 80 | "babel-plugin-transform-runtime": "^6.22.0", 81 | "babel-preset-env": "^1.3.3", 82 | "babel-preset-stage-0": "^6.5.0", 83 | "babel-register": "^6.2.0", 84 | "babili-webpack-plugin": "^0.1.1", 85 | "cfonts": "^1.1.3", 86 | "chai": "^4.0.0", 87 | "chalk": "^1.1.3", 88 | "copy-webpack-plugin": "^4.0.1", 89 | "cross-env": "^5.0.0", 90 | "css-loader": "^0.28.4", 91 | "del": "^2.2.1", 92 | "devtron": "^1.1.0", 93 | "electron": "^4.0.1", 94 | "electron-builder": "^20.19.2", 95 | "electron-debug": "^1.1.0", 96 | "electron-devtools-installer": "^2.0.1", 97 | "electron-packager": "^8.5.0", 98 | "electron-rebuild": "^1.1.3", 99 | "eslint": "^4.19.1", 100 | "eslint-config-standard": "^10.2.1", 101 | "eslint-friendly-formatter": "^3.0.0", 102 | "eslint-loader": "^1.3.0", 103 | "eslint-plugin-html": "^3.0.0", 104 | "eslint-plugin-import": "^2.3.0", 105 | "eslint-plugin-node": "^4.2.2", 106 | "eslint-plugin-promise": "^3.4.0", 107 | "eslint-plugin-standard": "^3.0.1", 108 | "extract-text-webpack-plugin": "^2.0.0-beta.4", 109 | "file-loader": "^0.11.1", 110 | "html-webpack-plugin": "^2.16.1", 111 | "inject-loader": "^3.0.0", 112 | "json-loader": "^0.5.4", 113 | "karma": "^1.3.0", 114 | "karma-chai": "^0.1.0", 115 | "karma-coverage": "^1.1.1", 116 | "karma-electron": "^5.1.1", 117 | "karma-mocha": "^1.2.0", 118 | "karma-sourcemap-loader": "^0.3.7", 119 | "karma-spec-reporter": "^0.0.31", 120 | "karma-webpack": "^2.0.1", 121 | "mocha": "^3.0.2", 122 | "multispinner": "^0.2.1", 123 | "style-loader": "^0.18.1", 124 | "url-loader": "^0.5.7", 125 | "vue-html-loader": "^1.2.2", 126 | "vue-loader": "^12.2.1", 127 | "vue-style-loader": "^3.0.1", 128 | "vue-template-compiler": "^2.3.3", 129 | "webpack": "^2.6.1", 130 | "webpack-dev-server": "^2.3.0", 131 | "webpack-hot-middleware": "^2.18.0", 132 | "webpack-merge": "^4.1.0" 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /src/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 贝壳云 6 | 7 | 8 | 9 | <% if (htmlWebpackPlugin.options.nodeModules) { %> 10 | 11 | 14 | <% } %> 15 | 16 | 17 |
18 |
19 | 20 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/main/index.dev.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is used specifically and only for development. It installs 3 | * `electron-debug` & `vue-devtools`. There shouldn't be any need to 4 | * modify this file, but it can be used to extend your development 5 | * environment. 6 | */ 7 | 8 | /* eslint-disable */ 9 | 10 | // Set environment for development 11 | process.env.NODE_ENV = 'development' 12 | 13 | // Install `electron-debug` with `devtron` 14 | require('electron-debug')({ showDevTools: true }) 15 | 16 | // Install `vue-devtools` 17 | require('electron').app.on('ready', () => { 18 | let installExtension = require('electron-devtools-installer') 19 | installExtension.default(installExtension.VUEJS_DEVTOOLS) 20 | .then(() => {}) 21 | .catch(err => { 22 | console.log('Unable to install `vue-devtools`: \n', err) 23 | }) 24 | }) 25 | 26 | // Require `main` process to boot app 27 | require('./index') 28 | -------------------------------------------------------------------------------- /src/main/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * Set `__static` path to static files in production 5 | * https://simulatedgreg.gitbooks.io/electron-vue/content/en/using-static-assets.html 6 | */ 7 | import { app, BrowserWindow, ipcMain, Tray, nativeImage } from 'electron'; 8 | if (process.env.NODE_ENV !== 'development') { 9 | global.__static = require('path').join(__dirname, '/static').replace(/\\/g, '\\\\') 10 | } 11 | var appTray = null; 12 | let mainWindow; 13 | let newWin; 14 | const winURL = process.env.NODE_ENV === 'development' 15 | ? `http://localhost:9080` 16 | : `file://${__dirname}/index.html`; 17 | 18 | function createWindow() { 19 | /** 20 | * Initial window options 21 | */ 22 | mainWindow = new BrowserWindow({ 23 | height: 800, 24 | width: 1280, 25 | minHeight: 800, 26 | minWidth: 1280, 27 | frame: false, 28 | resizable: false, 29 | titleBarStyle: 'hidden', 30 | backgroundColor: '#0E2037', 31 | show: false, 32 | skipTaskbar: false 33 | }); 34 | mainWindow.setMenuBarVisibility(false); 35 | mainWindow.loadURL(winURL); 36 | mainWindow.closeDevTools(); 37 | 38 | mainWindow.on('closed', (event) => { 39 | mainWindow = null; 40 | }); 41 | mainWindow.on('close', (event) => { 42 | mainWindow.hide(); 43 | event.preventDefault(); 44 | }); 45 | 46 | appTray = new Tray(nativeImage.createFromPath(__static + '/img/icon.ico')); 47 | appTray.setToolTip('贝壳云笔记'); 48 | appTray.on('click', function() { 49 | mainWindow.show(); 50 | }); 51 | 52 | appTray.on('right-click', function(e, b) { 53 | if (!newWin) { 54 | newWin = new BrowserWindow({ 55 | width: 210, 56 | height: 151, 57 | x: b.x + 20, 58 | y: b.y - 158, 59 | frame: false, 60 | resizable: false, 61 | parent: mainWindow, 62 | devTools: false 63 | }); 64 | newWin.loadURL(__static + `/html/setting.html`); // new.html是新开窗口的渲染进程 65 | } else { 66 | newWin.show(); 67 | } 68 | newWin.on('closed', () => { newWin = null; }); 69 | newWin.on('blur', () => { newWin.hide(); }); 70 | newWin.closeDevTools(); 71 | }); 72 | 73 | mainWindow.once('ready-to-show', () => { 74 | mainWindow.show() 75 | }) 76 | } 77 | 78 | app.on('ready', createWindow); 79 | app.on('window-all-closed', () => { 80 | if (process.platform !== 'darwin') { 81 | app.quit() 82 | } 83 | }); 84 | app.on('activate', () => { 85 | if (mainWindow === null) { 86 | createWindow(); 87 | } 88 | }); 89 | 90 | ipcMain.on('close_system', () => { 91 | mainWindow.destroy(); 92 | }); 93 | 94 | ipcMain.on('main_window', (evt, args) => { 95 | if (args === 'show') { 96 | mainWindow.show(); 97 | } else { 98 | mainWindow.hide(); 99 | } 100 | }); 101 | 102 | ipcMain.on('open_system_setting', () => { 103 | mainWindow.show(); 104 | mainWindow.webContents.send('open_system_setting', 'true') 105 | }); 106 | 107 | ipcMain.on('play_system_controller', (evt, args) => { 108 | mainWindow.webContents.send('play_system_controller', args) 109 | }); 110 | 111 | ipcMain.on('electron_play_interception_setting', (evt, args) => { 112 | if (newWin) { 113 | newWin.webContents.send('electron_play_interception', args) 114 | } 115 | }); 116 | 117 | /** 118 | * 测试使用 119 | */ 120 | ipcMain.on('open-devtools', () => { 121 | mainWindow.openDevTools(); 122 | }); 123 | /** 124 | 进程通知||下载文件 125 | **/ 126 | ipcMain.on('download', (evt, args) => { 127 | mainWindow.webContents.downloadURL(args); 128 | mainWindow.webContents.session.on('will-download', (event, item, webContents) => { 129 | item.on('updated', (event, state) => { 130 | if (state === 'interrupted') { 131 | // mainWindow.webContents.send('downStateInterrupted', item); 132 | } else if (state === 'progressing') { 133 | if (item.isPaused()) { 134 | // mainWindow.webContents.send('downStateInterrupted', item); 135 | } else { 136 | const obj = { 137 | url: item.getURL(), 138 | name: item.getFilename(), 139 | updated: item.getState(), 140 | file_size: item.getTotalBytes(), 141 | this_size: item.getReceivedBytes(), 142 | done: '', 143 | state: 'updated', 144 | percentage: 0, 145 | save_path: '' 146 | }; 147 | mainWindow.webContents.send('downStateInterrupted', JSON.stringify(obj)); 148 | } 149 | } 150 | }); 151 | item.once('done', (event, state) => { 152 | const obj = { 153 | name: item.getFilename(), 154 | state: 'done', 155 | done: state, 156 | save_path: item.getSavePath() 157 | }; 158 | event.preventDefault(); 159 | mainWindow.webContents.send('downStateDone', JSON.stringify(obj)) 160 | }) 161 | }); 162 | }); 163 | /** 164 | end 165 | */ 166 | 167 | /** 168 | * 检测更新,在你想要检查更新的时候执行,renderer事件触发后的操作自行编写 169 | */ 170 | 171 | const {autoUpdater} = require('electron-updater'); 172 | const message = { 173 | error: '0', // 检查更新出错 174 | checking: '1', // 正在检查更新 175 | updateAva: '2', // 检测到新版本,正在下载…… 176 | updateNotAva: '3'// 现在使用的就是最新版本,不用更新 177 | }; 178 | autoUpdater.on('error', function (_error) { 179 | console.log(autoUpdater.error); 180 | sendUpdateMessage(message.error) 181 | }); 182 | autoUpdater.on('checking-for-update', function () { 183 | sendUpdateMessage(message.checking) 184 | }); 185 | autoUpdater.on('update-available', function (info) { 186 | sendUpdateMessage(message.updateAva) 187 | }); 188 | autoUpdater.on('update-not-available', function (info) { 189 | sendUpdateMessage(message.updateNotAva) 190 | }); 191 | autoUpdater.on('download-progress', function (progressObj) { 192 | mainWindow.webContents.send('downloadProgress', progressObj) 193 | }); 194 | autoUpdater.on('update-downloaded', function (event, releaseNotes, releaseName, releaseDate, updateUrl, quitAndUpdate) { 195 | ipcMain.on('isUpdateNow', (e, arg) => { 196 | autoUpdater.quitAndInstall(); 197 | }); 198 | mainWindow.webContents.send('isUpdateNow') 199 | }); 200 | ipcMain.on('checkForUpdate', () => { 201 | autoUpdater.checkForUpdates(); 202 | }); 203 | 204 | function sendUpdateMessage(text) { 205 | mainWindow.webContents.send('update_message', text) 206 | } -------------------------------------------------------------------------------- /src/renderer/assets/default_user.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EliseCaro/eibk_client/35fc05e7100f7934f990d21f7c0ee420e6d774fc/src/renderer/assets/default_user.jpg -------------------------------------------------------------------------------- /src/renderer/assets/error_video.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EliseCaro/eibk_client/35fc05e7100f7934f990d21f7c0ee420e6d774fc/src/renderer/assets/error_video.jpg -------------------------------------------------------------------------------- /src/renderer/assets/icon_repeat-cycle.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EliseCaro/eibk_client/35fc05e7100f7934f990d21f7c0ee420e6d774fc/src/renderer/assets/icon_repeat-cycle.gif -------------------------------------------------------------------------------- /src/renderer/assets/icon_repeat-once.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EliseCaro/eibk_client/35fc05e7100f7934f990d21f7c0ee420e6d774fc/src/renderer/assets/icon_repeat-once.png -------------------------------------------------------------------------------- /src/renderer/assets/icon_repeat-random.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EliseCaro/eibk_client/35fc05e7100f7934f990d21f7c0ee420e6d774fc/src/renderer/assets/icon_repeat-random.png -------------------------------------------------------------------------------- /src/renderer/assets/info_tra.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | info_tra 5 | Created with Sketch Beta. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/renderer/assets/userbg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EliseCaro/eibk_client/35fc05e7100f7934f990d21f7c0ee420e6d774fc/src/renderer/assets/userbg.png -------------------------------------------------------------------------------- /src/renderer/components/FileIndexPage.vue: -------------------------------------------------------------------------------- 1 | 101 | 102 | -------------------------------------------------------------------------------- /src/renderer/components/ImagesDetailPage.vue: -------------------------------------------------------------------------------- 1 | 109 | 110 | 225 | -------------------------------------------------------------------------------- /src/renderer/components/ImagesIndexPage.vue: -------------------------------------------------------------------------------- 1 | 167 | 168 | -------------------------------------------------------------------------------- /src/renderer/components/IndexPage.vue: -------------------------------------------------------------------------------- 1 | 121 | 122 | 146 | -------------------------------------------------------------------------------- /src/renderer/components/MusicIndexPage.vue: -------------------------------------------------------------------------------- 1 | 134 | 135 | -------------------------------------------------------------------------------- /src/renderer/components/NoteIndexPage.vue: -------------------------------------------------------------------------------- 1 | 83 | 84 | -------------------------------------------------------------------------------- /src/renderer/components/SettingIndexPage.vue: -------------------------------------------------------------------------------- 1 | 89 | 90 | -------------------------------------------------------------------------------- /src/renderer/components/SingLoginPage.vue: -------------------------------------------------------------------------------- 1 | 34 | 35 | -------------------------------------------------------------------------------- /src/renderer/components/VideoDetailPage.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 85 | -------------------------------------------------------------------------------- /src/renderer/components/VideoIndexPage.vue: -------------------------------------------------------------------------------- 1 | 58 | 59 | -------------------------------------------------------------------------------- /src/renderer/components/VideoPushPage.vue: -------------------------------------------------------------------------------- 1 | 104 | 105 | -------------------------------------------------------------------------------- /src/renderer/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | import App from './App' 4 | import router from './router' 5 | import store from './store' 6 | import db from './tool/datastore' 7 | import {post} from './tool/http' 8 | import {ProcessingPic, formatDate, onError} from './tool/function'; 9 | import iView from 'iview' 10 | 11 | import '../../static/css/reset.scss' 12 | import 'iview/dist/styles/iview.css' 13 | 14 | if (!process.env.IS_WEB) Vue.use(require('vue-electron')); 15 | Vue.prototype.$db = db; 16 | Vue.prototype.$post = post; 17 | Vue.prototype.$ProcessingPic = ProcessingPic; 18 | Vue.prototype.$formatDate = formatDate; 19 | Vue.prototype.$onError = onError; 20 | Vue.config.productionTip = false; 21 | 22 | // 定义全局变量 23 | Vue.use(iView); 24 | router.beforeEach((to, from, next) => { 25 | if (to.matched.some(m => m.meta.auth)) { 26 | if (store.state.login.token === '') { 27 | next({path: '/sing/login'}); 28 | } else { 29 | next(); 30 | } 31 | } else { 32 | next(); 33 | } 34 | }); 35 | new Vue({ 36 | components: { App }, 37 | router, 38 | store, 39 | template: '' 40 | }).$mount('#app'); 41 | -------------------------------------------------------------------------------- /src/renderer/mixins/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | methods: { 3 | jump(to) { 4 | if (this.$router) { 5 | console.log(to); 6 | if (isNaN(to)) { 7 | this.$router.push(to); 8 | } else { 9 | this.$router.go(to); 10 | } 11 | } 12 | } 13 | } 14 | }; 15 | -------------------------------------------------------------------------------- /src/renderer/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | 4 | Vue.use(Router) 5 | 6 | export default new Router({ 7 | routes: [ 8 | { 9 | path: '/', 10 | name: 'IndexPage', 11 | component: require('@/components/IndexPage'), 12 | meta: {auth: true} 13 | }, 14 | 15 | { 16 | path: '/video/index', 17 | name: 'VideoIndexPage', 18 | component: require('@/components/VideoIndexPage'), 19 | meta: {auth: true} 20 | }, 21 | { 22 | path: '/video/detail', 23 | name: 'VideoDetailPage', 24 | component: require('@/components/VideoDetailPage'), 25 | meta: {auth: true} 26 | }, 27 | { 28 | path: '/video/push', 29 | name: 'VideoPushPage', 30 | component: require('@/components/VideoPushPage'), 31 | meta: {auth: true} 32 | }, 33 | 34 | { 35 | path: '/note/index', 36 | name: 'NoteIndexPage', 37 | component: require('@/components/NoteIndexPage'), 38 | meta: {auth: true} 39 | }, 40 | { 41 | path: '/file/index', 42 | name: 'FileIndexPage', 43 | component: require('@/components/FileIndexPage'), 44 | meta: {auth: true} 45 | }, 46 | { 47 | path: '/images/index', 48 | name: 'ImagesIndexPage', 49 | component: require('@/components/ImagesIndexPage'), 50 | meta: {auth: true} 51 | }, 52 | { 53 | path: '/images/detail', 54 | name: 'ImagesDetailPage', 55 | component: require('@/components/ImagesDetailPage'), 56 | meta: {auth: true} 57 | }, 58 | { 59 | path: '/music/index', 60 | name: 'MusicIndexPage', 61 | component: require('@/components/MusicIndexPage'), 62 | meta: {auth: true} 63 | }, 64 | { 65 | path: '/setting/index', 66 | name: 'SettingIndexPage', 67 | component: require('@/components/SettingIndexPage'), 68 | meta: {auth: true} 69 | }, 70 | { 71 | path: '/sing/login', 72 | name: 'SingLoginPage', 73 | component: require('@/components/SingLoginPage') 74 | }, 75 | { 76 | path: '*', 77 | redirect: '/' 78 | } 79 | ] 80 | }) 81 | -------------------------------------------------------------------------------- /src/renderer/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | 4 | import modules from './modules' 5 | 6 | Vue.use(Vuex); 7 | 8 | export default new Vuex.Store({ 9 | modules, 10 | strict: process.env.NODE_ENV !== 'production' 11 | }) -------------------------------------------------------------------------------- /src/renderer/store/modules/file.js: -------------------------------------------------------------------------------- 1 | 2 | const state = { 3 | list: {items: []} 4 | }; 5 | 6 | const mutations = { 7 | file_update_list(state, value) { state.list = value; } 8 | }; 9 | 10 | const actions = {}; 11 | 12 | export default { 13 | state, 14 | mutations, 15 | actions 16 | } -------------------------------------------------------------------------------- /src/renderer/store/modules/images.js: -------------------------------------------------------------------------------- 1 | 2 | const state = { 3 | list: {items: []}, 4 | detail: {items: []}, 5 | detail_cate: [] 6 | }; 7 | 8 | const mutations = { 9 | images_update_list(state, value) { state.list = value; }, 10 | image_update_detail(state, value) { state.detail = value; }, 11 | image_update_detail_cate(state, value) { state.detail_cate = value; } 12 | }; 13 | 14 | const actions = {}; 15 | 16 | export default { 17 | state, 18 | mutations, 19 | actions 20 | } -------------------------------------------------------------------------------- /src/renderer/store/modules/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * The file enables `@/store/index.js` to import all vuex modules 3 | * in a one-shot manner. There should not be any reason to edit this file. 4 | */ 5 | 6 | const files = require.context('.', false, /\.js$/) 7 | const modules = {} 8 | 9 | files.keys().forEach(key => { 10 | if (key === './index.js') return 11 | modules[key.replace(/(\.\/|\.js)/g, '')] = files(key).default 12 | }) 13 | 14 | export default modules 15 | -------------------------------------------------------------------------------- /src/renderer/store/modules/login.js: -------------------------------------------------------------------------------- 1 | 2 | import {getCookie, setCookie} from '../../tool/function'; 3 | 4 | const state = { 5 | token: getCookie('token') ? getCookie('token') : '', 6 | avatar: require('../../assets/default_user.jpg') 7 | }; 8 | 9 | const mutations = { 10 | login_update_avatar(state, value) { state.avatar = value; }, 11 | login_update_token(state, value) { 12 | setCookie('token', value); 13 | state.token = value; 14 | } 15 | }; 16 | 17 | const actions = {}; 18 | 19 | export default { 20 | state, 21 | mutations, 22 | actions 23 | } -------------------------------------------------------------------------------- /src/renderer/store/modules/main.js: -------------------------------------------------------------------------------- 1 | 2 | const state = { 3 | data: {comment: {items: []}}, 4 | user: {} 5 | }; 6 | 7 | const mutations = { 8 | main_update_data(state, value) { state.data = value; }, 9 | main_update_user(state, value) { state.user = value; } 10 | }; 11 | 12 | const actions = {}; 13 | 14 | export default { 15 | state, 16 | mutations, 17 | actions 18 | } -------------------------------------------------------------------------------- /src/renderer/store/modules/music.js: -------------------------------------------------------------------------------- 1 | 2 | const state = { 3 | list: { 4 | items: [] 5 | }, 6 | item: {}, 7 | play_status: { 8 | is_play: false, 9 | duration: 0, 10 | progress: 0, 11 | volume: 0, 12 | leftTime: 0, 13 | repeat_type: 'cycle' 14 | } 15 | }; 16 | 17 | const mutations = { 18 | music_update_item(state, value) { state.item = value; }, 19 | music_update_list(state, value) { state.list = value; }, 20 | music_update_items(state, value) { state.list.items = value; }, 21 | 22 | music_update_is_play(state, value) { state.play_status.is_play = value; }, 23 | music_update_duration(state, value) { state.play_status.duration = value; }, 24 | music_update_progress(state, value) { state.play_status.progress = value; }, 25 | music_update_volume(state, value) { state.play_status.volume = value; }, 26 | music_update_leftTime(state, value) { state.play_status.leftTime = value; }, 27 | music_update_repeat(state, value) { state.play_status.repeat_type = value; } 28 | 29 | }; 30 | 31 | const actions = {}; 32 | 33 | export default { 34 | state, 35 | mutations, 36 | actions 37 | } -------------------------------------------------------------------------------- /src/renderer/store/modules/note.js: -------------------------------------------------------------------------------- 1 | 2 | const state = { 3 | list: {items: []}, 4 | detail: {} 5 | }; 6 | 7 | const mutations = { 8 | note_update_list(state, value) { state.list = value; }, 9 | note_update_detail(state, value) { state.detail = value; } 10 | }; 11 | 12 | const actions = {}; 13 | 14 | export default { 15 | state, 16 | mutations, 17 | actions 18 | } -------------------------------------------------------------------------------- /src/renderer/store/modules/video.js: -------------------------------------------------------------------------------- 1 | 2 | const state = { 3 | data: {items: []}, 4 | detail: {info: {}, btn: {}}, 5 | push: { 6 | up_config: {}, 7 | lists: {} 8 | } 9 | }; 10 | 11 | const mutations = { 12 | video_update_data(state, value) { state.data = value; }, 13 | video_update_detail(state, value) { state.detail = value; }, 14 | video_update_up_config(state, value) { state.push.up_config = value; }, 15 | video_update_lists(state, value) { state.push.lists = value; } 16 | }; 17 | 18 | const actions = {}; 19 | 20 | export default { 21 | state, 22 | mutations, 23 | actions 24 | } -------------------------------------------------------------------------------- /src/renderer/tool/config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | host: 'http://api.bkybj.com', 3 | qiniuPath: 'http://static.bkybj.com/' 4 | } 5 | -------------------------------------------------------------------------------- /src/renderer/tool/cookie.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EliseCaro/eibk_client/35fc05e7100f7934f990d21f7c0ee420e6d774fc/src/renderer/tool/cookie.js -------------------------------------------------------------------------------- /src/renderer/tool/datastore.js: -------------------------------------------------------------------------------- 1 | import Datastore from 'nedb' 2 | import path from 'path' 3 | import { remote } from 'electron' 4 | 5 | export default { 6 | download: new Datastore({ 7 | autoload: true, 8 | filename: path.join(remote.app.getPath('userData'), '/download.db') 9 | }) 10 | } -------------------------------------------------------------------------------- /src/renderer/tool/download.js: -------------------------------------------------------------------------------- 1 | import { ipcRenderer, remote } from 'electron'; 2 | import db from './datastore'; 3 | let download = { 4 | /** 5 | * msg 6 | */ 7 | message: '', 8 | /** 9 | * 初始化 10 | * @param path 11 | * @returns {boolean} 12 | */ 13 | init: function (path) { 14 | if (!path) { 15 | this.message = '下载地址不合法!!!'; 16 | return false; 17 | } 18 | ipcRenderer.send('download', { 'path': path, 'savePath': this.savePath() }); 19 | ipcRenderer.on('dwo', function(event, arg) { 20 | console.log(arg); 21 | /* if (arg) { 22 | switch (arg.Type) { 23 | case 'updated': 24 | dowload.updated(arg); 25 | break; 26 | case 'done': 27 | dowload.done(arg); 28 | break; 29 | } 30 | } */ 31 | }); 32 | }, 33 | /** 34 | * 下载中处理 35 | */ 36 | updated: function (o) { 37 | db.dow.findOne({ 38 | ETag: o.ETag, 39 | Filename: o.Filename 40 | }, (_, ret) => { 41 | if (ret) { 42 | db.dow.update({ 43 | ETag: o.ETag, 44 | Filename: o.Filename 45 | }, {$set: o}); 46 | } else { 47 | db.dow.insert(o); 48 | } 49 | }); 50 | }, 51 | /** 52 | * 下载完成或失败处理 53 | */ 54 | done: function (o) { 55 | db.dow.update({ 56 | ETag: o.ETag, 57 | Filename: o.Filename 58 | }, {$set: { 59 | 'Type': o.Type, 60 | 'State': o.State 61 | }}, (_, ret) => { 62 | if (ret) { 63 | console.log(o.Filename + '下载完成!!!'); 64 | } 65 | }); 66 | }, 67 | /** 68 | * 获取保存路径 69 | */ 70 | savePath: function () { 71 | let savePath = localStorage.getItem('dowSavePath'); 72 | if (!savePath || this.readdir(savePath)) { 73 | remote.dialog.showOpenDialog({ 74 | defaultPath: '../', 75 | properties: ['openDirectory'], 76 | filters: [{name: 'All', extensions: ['*']}] 77 | }, function (res) { 78 | savePath = res[0]; 79 | localStorage.setItem('dowSavePath', savePath); 80 | return localStorage.getItem('dowSavePath'); 81 | }); 82 | } else { 83 | return savePath; 84 | } 85 | }, 86 | /** 87 | * 暂停下载 88 | */ 89 | pause: function(ETag) { 90 | ipcRenderer.send('download_pause', {'ETag': ETag}); 91 | }, 92 | /** 93 | * 恢复暂停的下载 94 | */ 95 | resume: function (ETag) { 96 | ipcRenderer.send('download_resume', {'ETag': ETag}); 97 | }, 98 | /** 99 | * 取消下载不可恢复 100 | */ 101 | cancel: function (ETag) { 102 | console.log('download_cancel'); 103 | ipcRenderer.send('download_cancel', {'ETag': ETag}); 104 | }, 105 | /** 106 | * 读取文件夹 107 | */ 108 | readdir: function (path) { 109 | require('fs').readdir(path, function(err, files) { 110 | if (err) { 111 | return false; 112 | } else { 113 | return files; 114 | } 115 | }); 116 | } 117 | 118 | }; 119 | export default download; -------------------------------------------------------------------------------- /src/renderer/tool/function.js: -------------------------------------------------------------------------------- 1 | 2 | import { Notice } from 'iview'; 3 | import config from './config' 4 | 5 | export function ProcessingPic(name, string) { 6 | if (!name) { 7 | return require('../assets/error_video.jpg'); 8 | } 9 | if (string) { 10 | return config.qiniuPath + name + string; 11 | } else { 12 | return config.qiniuPath + name 13 | } 14 | } 15 | 16 | export function getImg(src, maxWidth, maxHeight, func) { 17 | let image = new Image(); 18 | image.src = src; 19 | image.onload = function () { 20 | // 用于设定图片的宽度和高度 21 | var tempWidth; 22 | var tempHeight; 23 | // 原图片宽高比例 大于 指定的宽高比例,这就说明了原图片的宽度必然 > 高度 24 | if (image.width / image.height >= maxWidth / maxHeight) { 25 | if (image.width > maxWidth) { 26 | tempWidth = maxWidth; 27 | // 按原图片的比例进行缩放 28 | tempHeight = (image.height * maxWidth) / image.width; 29 | } else { 30 | // 按原图片的大小进行缩放 31 | tempWidth = image.width; 32 | tempHeight = image.height; 33 | } 34 | } else { // 原图片的高度必然 > 宽度 35 | if (image.height > maxHeight) { 36 | tempHeight = maxHeight; 37 | // 按原图片的比例进行缩放 38 | tempWidth = (image.width * maxHeight) / image.height; 39 | } else { 40 | // 按原图片的大小进行缩放 41 | tempWidth = image.width; 42 | tempHeight = image.height; 43 | } 44 | } 45 | func({ 46 | width: tempWidth, 47 | height: tempHeight 48 | }) 49 | } 50 | } 51 | 52 | export function randomRange(under, over) { 53 | return Math.ceil(Math.random() * (over - under) + under); 54 | } 55 | 56 | export function onError(name) { 57 | let path = require('../assets/' + name); 58 | let str = 'this.src="' + path + '"'; 59 | return str 60 | } 61 | export function formatDate(now, fmt) { 62 | var date = new Date(parseInt(now + '000')); 63 | var Y = date.getFullYear() + '-'; 64 | var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'; 65 | var D = date.getDate() + ' '; 66 | var h = date.getHours() + ':'; 67 | var m = date.getMinutes() + ':'; 68 | var s = date.getSeconds(); 69 | return (fmt === 'Y-m-d') ? Y + M + D : Y + M + D + h + m + s; 70 | } 71 | 72 | export function NoticeInfo(title, content) { 73 | Notice.info({ 74 | title: title || '', 75 | desc: content || '' 76 | }); 77 | } 78 | 79 | export function NoticeWarning(title, content) { 80 | Notice.warning({ 81 | title: title || '', 82 | desc: content || '' 83 | }); 84 | } 85 | 86 | export function NoticeSuccess(title, content) { 87 | Notice.success({ 88 | title: title || '', 89 | desc: content || '' 90 | }); 91 | } 92 | 93 | export function NoticeError(title, content) { 94 | Notice.error({ 95 | title: title || '', 96 | desc: content || '' 97 | }); 98 | } 99 | 100 | export function getCookie(key) { 101 | return localStorage.getItem(key); 102 | } 103 | 104 | export function setCookie(key, val) { 105 | return localStorage.setItem(key, val); 106 | } 107 | 108 | export function deleteCookie(key) { 109 | return localStorage.removeItem(key) 110 | } 111 | -------------------------------------------------------------------------------- /src/renderer/tool/http.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import Qs from 'qs'; 3 | import {LoadingBar} from 'iview'; 4 | import config from './config' 5 | import router from '../router' 6 | import store from '../store' 7 | 8 | axios.defaults.timeout = 50000; 9 | axios.defaults.baseURL = config.host; 10 | LoadingBar.config({ 11 | color: '#0EAE81', 12 | failedColor: '#0EAE81', 13 | height: 2 14 | }); 15 | axios.interceptors.request.use( 16 | config => { 17 | config.data = Qs.stringify(config.data); 18 | config.headers = { 19 | 'Content-Type': 'application/x-www-form-urlencoded' 20 | }; 21 | config.params = config.params || {}; 22 | if (store.state.login.token) { 23 | config.params = {'token': store.state.login.token} 24 | } 25 | config.params.is_client = 1; 26 | return config; 27 | } 28 | ); 29 | 30 | axios.interceptors.response.use( 31 | response => { 32 | if (parseInt(response.data.code) === 2) { 33 | store.commit('login_update_token', ''); 34 | router.push({ 35 | path: '/sing/login', 36 | querry: {redirect: router.currentRoute.fullPath} 37 | }) 38 | } 39 | return response; 40 | }, 41 | error => { 42 | return Promise.reject(error) 43 | } 44 | ); 45 | 46 | /** 47 | * 封装get方法 48 | * @param url 49 | * @param data 50 | * @returns {Promise} 51 | */ 52 | 53 | export function fetch(url, params = {}) { 54 | return new Promise((resolve, reject) => { 55 | axios.get(url, { 56 | params: params 57 | }) 58 | .then(response => { 59 | resolve(response.data); 60 | }) 61 | .catch(err => { 62 | reject(err) 63 | }) 64 | }) 65 | } 66 | 67 | /** 68 | * 封装post请求 69 | * @param url 70 | * @param data 71 | * @returns {Promise} 72 | */ 73 | 74 | export function post(url, data = {}) { 75 | return new Promise((resolve, reject) => { 76 | LoadingBar.start(); 77 | axios.post(url, data).then(response => { 78 | LoadingBar.finish(); 79 | resolve(response.data); 80 | LoadingBar.error(); 81 | }, err => { 82 | reject(err) 83 | }) 84 | }) 85 | } 86 | 87 | /** 88 | * 封装patch请求 89 | * @param url 90 | * @param data 91 | * @returns {Promise} 92 | */ 93 | 94 | export function patch(url, data = {}) { 95 | return new Promise((resolve, reject) => { 96 | axios.patch(url, data) 97 | .then(response => { 98 | resolve(response.data); 99 | }, err => { 100 | reject(err) 101 | }) 102 | }) 103 | } 104 | 105 | /** 106 | * 封装put请求 107 | * @param url 108 | * @param data 109 | * @returns {Promise} 110 | */ 111 | 112 | export function put(url, data = {}) { 113 | return new Promise((resolve, reject) => { 114 | axios.put(url, data) 115 | .then(response => { 116 | resolve(response.data); 117 | }, err => { 118 | reject(err) 119 | }) 120 | }) 121 | } -------------------------------------------------------------------------------- /static/css/app.scss: -------------------------------------------------------------------------------- 1 | #app{ 2 | height: 100%; 3 | font-family: "PingFang SC","Hiragino Sans GB","Helvetica Neue",Helvetica,"Microsoft YaHei","微软雅黑",Arial,sans-serif; 4 | background-position: center; 5 | background-size: cover; 6 | background-repeat: no-repeat; 7 | background-image: url("~@/assets/userbg.png"); 8 | } 9 | *{ 10 | -moz-user-select: none; /*mozilar*/ 11 | -webkit-user-select: none; /*webkit*/ 12 | -ms-user-select: none; /*IE*/ 13 | user-select: none; 14 | } 15 | .ivu-loading-bar{ 16 | /* top: 63px;*/ 17 | } 18 | 19 | .app_bg{ 20 | position: absolute; 21 | width: 100%; 22 | height:800px ; 23 | background-position: center; 24 | background-size: cover; 25 | background-repeat: no-repeat; 26 | } 27 | /** 28 | 主体结构 29 | */ 30 | .app_left{ 31 | height: 800px; 32 | background-color: rgba(19,71,111,.8); 33 | width: 240px; 34 | } 35 | 36 | .app_header{ 37 | background-color: rgba(19,71,111,.6); 38 | width: 1040px; 39 | padding: 0; 40 | -webkit-app-region: drag; 41 | } 42 | .app_content{ 43 | width: 1040px; 44 | background: none; 45 | } 46 | .app_right{ 47 | position: absolute; 48 | right: 0; 49 | background: #ffffff; 50 | border-left: 1px solid #eeeeee; 51 | /* background: -webkit-linear-gradient(left,#eff,#fff); 52 | background: -o-linear-gradient(right,#eff,#fff); 53 | background: linear-gradient(to right,#eff,#fff);*/ 54 | height: 800px; 55 | .app_right_tables{ 56 | .ivu-tabs-bar{ 57 | border-bottom: 0; 58 | margin-bottom: 0; 59 | } 60 | .ivu-tabs-tab{ 61 | width: 115px; 62 | margin-right: 0 !important; 63 | border: 0 !important; 64 | text-align: center; 65 | border-radius: 0 !important; 66 | } 67 | .ivu-tabs-tab-active{ 68 | background: #3363A4 !important; 69 | color: #ffffff !important; 70 | } 71 | .app_right_tables_dow_init:hover{ 72 | /* background: #DEF2FE;*/ 73 | background: -webkit-linear-gradient(left,#DEF2FE,#fff); 74 | background: -o-linear-gradient(right,#DEF2FE,#fff); 75 | background: linear-gradient(to right,#DEF2FE,#fff); 76 | } 77 | .app_right_tables_dow_init{ 78 | /*border-bottom:1px solid #ddd;*/ 79 | cursor: pointer; 80 | padding: 5px 8px; 81 | overflow: hidden; 82 | .app_right_tables_dow_init_text{ 83 | float: left; 84 | font-size: 11px; 85 | line-height: 18px; 86 | width: 78%; 87 | } 88 | .app_right_tables_dow_init_i{ 89 | float: right; 90 | width: 47px; 91 | line-height: 20px; 92 | text-align: center; 93 | i{ 94 | padding-top: 4px; 95 | padding-right: 5px; 96 | cursor: pointer; 97 | } 98 | :nth-child(1){ 99 | padding-top: 0; 100 | margin-top: -5px; 101 | } 102 | } 103 | 104 | } 105 | } 106 | } 107 | /** 108 | end 109 | */ 110 | 111 | /** 112 | 头部四个按钮 113 | */ 114 | .app_left_top{ 115 | height: 64px; 116 | padding: 0 20px; 117 | background: rgba(18,39,60,.5); 118 | -webkit-app-region: drag; 119 | } 120 | .app_left_top_init{ 121 | line-height: 64px; 122 | text-align: center; 123 | color: #fff; 124 | font-size: 30px; 125 | -webkit-app-region: no-drag; 126 | } 127 | .app_left_top_init .ivu-avatar{ 128 | background: none; 129 | border:1px solid #ffffff; 130 | font-size: 17px; 131 | margin-top: -6.5px; 132 | width: 32px; 133 | height: 32px; 134 | line-height: 32px; 135 | cursor: pointer; 136 | } 137 | .app_left_top_init .ivu-avatar i{ 138 | margin-top: -8px; 139 | } 140 | 141 | /** 142 | end 143 | */ 144 | 145 | /** 146 | 头像部分 147 | */ 148 | .up_upload_avatar_obj{ 149 | width: 100px; 150 | height: 150px; 151 | margin: auto; 152 | cursor: pointer; 153 | } 154 | .app_avatar_box span{ 155 | width: 100px; 156 | height: 100px; 157 | border-radius: 50%; 158 | margin: auto; 159 | display: block; 160 | margin-top: 50px; 161 | } 162 | .app_avatar_box_nickname{ 163 | margin-top: 8px; 164 | line-height: 30px; 165 | font-size: 16px; 166 | color: #ffffff; 167 | text-align: center; 168 | padding-bottom: 18px; 169 | border-bottom: 1px solid #3E628D; 170 | } 171 | /** 172 | end 173 | */ 174 | 175 | /** 176 | 菜单样式 177 | */ 178 | .app_menu_box{ 179 | background: none; 180 | z-index: 1; 181 | } 182 | .app_menu_box .ivu-menu{ 183 | color: #ffffff; 184 | } 185 | .app_menu_box.ivu-menu-vertical .ivu-menu-item{ 186 | border-bottom:1px solid #3E628D; 187 | } 188 | .app_menu_box.ivu-menu-vertical .ivu-menu-submenu-title{ 189 | border-bottom:1px solid #3E628D; 190 | } 191 | .app_menu_box.ivu-menu-vertical.ivu-menu-light:after{ 192 | width: 0; 193 | } 194 | .app_menu_box.ivu-menu-vertical .ivu-menu-item-active:not(.ivu-menu-submenu) { 195 | color: #07A285; 196 | border-right: 2px solid #07A285; 197 | z-index: 2; 198 | background: rgba(0,0,0,0.2); 199 | } 200 | .app_menu_box.ivu-menu-vertical .ivu-menu-item:hover, .ivu-menu-vertical .ivu-menu-submenu-title:hover { 201 | background: none; 202 | color: #07A285; 203 | } 204 | /** 205 | end 206 | */ 207 | 208 | 209 | /** 210 | 头部右边开始 211 | */ 212 | .index_input{ 213 | width: 250px; 214 | float: left; 215 | margin: 15px 0 0 15px; 216 | -webkit-app-region: no-drag; 217 | } 218 | .index_top_dow_icon{ 219 | float: left; 220 | -webkit-app-region: no-drag; 221 | width: 81px; 222 | height: 100%; 223 | margin-left:104px; 224 | font-size: 25px; 225 | text-align: center; 226 | color: #ffffff; 227 | } 228 | .index_input input{ 229 | background: rgba(18,39,60,.5); 230 | border: 0; 231 | color: #00a988; 232 | outline:none !important; 233 | } 234 | .index_input .ivu-input:focus,.index_input .ivu-input:hover{ 235 | border: 0 !important; 236 | -webkit-box-shadow:none; 237 | box-shadow:none; 238 | } 239 | .index_input .ivu-btn:focus,.index_input .ivu-btn:hover{ 240 | -webkit-box-shadow:none; 241 | box-shadow:none; 242 | } 243 | .index_input .ivu-input-group-prepend{ 244 | background: rgba(18,39,60,.5); 245 | border: 0; 246 | border-radius: 14px; 247 | } 248 | .index_input .ivu-input-group-append{ 249 | background: rgba(18,39,60,.5); 250 | border: 0; 251 | color: #00a988; 252 | border-radius: 14px; 253 | } 254 | .index_input .ivu-input-group-append button{ 255 | font-size: 15px; 256 | } 257 | .index_input .ivu-input-group-prepend .ivu-select-placeholder,.index_input .ivu-input-group-prepend .ivu-select-arrow,.index_input .ivu-input-group-prepend .ivu-select-selected-value{ 258 | color: #00a988; 259 | } 260 | .index_header_right{ 261 | float: right; 262 | height: 15px; 263 | margin-top: 23.5px; 264 | margin-right: 17px; 265 | width: 45px; 266 | overflow: hidden; 267 | color: #ffffff; 268 | line-height: 16px; 269 | text-align: center; 270 | font-size: 9px; 271 | } 272 | .index_header_right_close{ 273 | background: #C81212; 274 | border-radius: 50%; 275 | width: 15px; 276 | height: 15px; 277 | float: left; 278 | cursor: pointer; 279 | -webkit-app-region: no-drag; 280 | } 281 | .index_header_right_mini{ 282 | background: #0eae81; 283 | border-radius: 50%; 284 | width: 15px; 285 | height: 15px; 286 | float: left; 287 | margin-right: 15px; 288 | cursor: pointer; 289 | font-weight: 700; 290 | -webkit-app-region: no-drag; 291 | } 292 | 293 | 294 | .music-volume-container:hover .volume-high-progress{ 295 | opacity: 1; 296 | } 297 | 298 | 299 | .music_mini{ 300 | float: left; 301 | height: 64px; 302 | color: #ffffff; 303 | text-align: center; 304 | font-size: 20px; 305 | margin-left: 20px; 306 | -webkit-animation: fadeinL 0.5s ease-in forwards; 307 | -webkit-app-region: no-drag; 308 | margin-right: 180px; 309 | 310 | i{ 311 | cursor: pointer; 312 | } 313 | .music_mini_p{ 314 | float: left; 315 | line-height: 64px; 316 | } 317 | .music_mini_p_cover{ 318 | float: left; 319 | margin-top: 7px; 320 | margin-left: 10px; 321 | background-size: cover; 322 | overflow: hidden; 323 | border-radius: 50%; 324 | } 325 | .music_mini_n{ 326 | float: left; 327 | margin-left: 10px; 328 | line-height: 64px; 329 | } 330 | .music_mini_p_right{ 331 | height: 64px; 332 | float: left; 333 | margin-left: 20px; 334 | width: 200px; 335 | text-align: left; 336 | .music_mini_p_right_title{ 337 | line-height: 17px; 338 | margin-top: 10px; 339 | font-size: 14px; 340 | -o-text-overflow: ellipsis; 341 | text-overflow: ellipsis; 342 | white-space: nowrap; 343 | display: block; 344 | 345 | } 346 | .music_mini_p_right_icon{ 347 | position: relative; 348 | .music-volume-container{ 349 | position: absolute; 350 | top: 4px; 351 | left: 0; 352 | cursor: pointer; 353 | } 354 | line-height: 27px; 355 | i{ 356 | font-size: 18px; 357 | margin-right: 5px; 358 | } 359 | i:nth-child(2){ 360 | margin-left: 76px; 361 | } 362 | i:nth-child(3){ 363 | margin-left: 76px; 364 | } 365 | .icon { 366 | display: inline-block; 367 | width: 18px; 368 | height: 18px; 369 | background-size:cover; 370 | background-position: center; 371 | margin-left: 3px; 372 | } 373 | .icon.repeat-cycle { 374 | background-image: url(~@/assets/icon_repeat-cycle.gif); 375 | } 376 | .icon.repeat-once { 377 | background-image: url(~@/assets/icon_repeat-once.png); 378 | } 379 | .icon.repeat-random { 380 | background-image: url(~@/assets/icon_repeat-random.png); 381 | } 382 | } 383 | .music_mini_p_right_progress{ 384 | line-height: 3px; 385 | .music_mini-high-progress{ 386 | cursor: pointer; 387 | } 388 | .ivu-progress-bg{ 389 | background: #0eae81; 390 | } 391 | } 392 | } 393 | } 394 | 395 | 396 | /**主题动画*/ 397 | .fade-enter-active, .fade-leave-active {transition: opacity .2s;} 398 | .fade-enter, .fade-leave-to{opacity: 0;} 399 | /**往下掉动画*/ 400 | .bounceInDown-enter-active, .bounceInDown-leave-active {-webkit-animation: bounceinT 1s ease-in forwards;} 401 | .bounceInDown-enter, .bounceInDown-leave-to{opacity: 0;} 402 | @keyframes bounceInDown{ 403 | 0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)} 404 | 60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)} 405 | 75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)} 406 | 90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)} 407 | 100%{-webkit-transform:none;transform:none} 408 | } 409 | /* 弹入-从左 */ 410 | @-webkit-keyframes bounceinL{ 411 | 0%{opacity:0;-webkit-transform:translateX(-100px);} 412 | 60%{opacity:1;-webkit-transform:translateX(30px);} 413 | 80%{-webkit-transform:translateX(-10px);} 414 | 100%{-webkit-transform:translateX(0);} 415 | } 416 | @-moz-keyframes bounceinL{ 417 | 0%{opacity:0;-moz-transform:translateX(-100px);} 418 | 60%{opacity:1;-moz-transform:translateX(30px);} 419 | 80%{-moz-transform:translateX(-10px);} 420 | 100%{-moz-transform:translateX(0);} 421 | } 422 | @-ms-keyframes bounceinL{ 423 | 0%{opacity:0;-ms-transform:translateX(-100px);} 424 | 60%{opacity:1;-ms-transform:translateX(30px);} 425 | 80%{-ms-transform:translateX(-10px);} 426 | 100%{-ms-transform:translateX(0);} 427 | } 428 | @keyframes bounceinL{ 429 | 0%{opacity:0;transform:translateX(-100px);} 430 | 60%{opacity:1;transform:translateX(30px);} 431 | 80%{transform:translateX(-10px);} 432 | 100%{transform:translateX(0);} 433 | } 434 | /* 弹入-从上 */ 435 | @-webkit-keyframes bounceinT{ 436 | 0%{opacity:0;-webkit-transform:translateY(-100px);} 437 | 60%{opacity:1;-webkit-transform:translateY(30px);} 438 | 80%{-webkit-transform:translateY(-10px);} 439 | 100%{-webkit-transform:translateY(0);} 440 | } 441 | @-moz-keyframes bounceinT{ 442 | 0%{opacity:0;-moz-transform:translateY(-100px);} 443 | 60%{opacity:1;-moz-transform:translateY(30px);} 444 | 80%{-moz-transform:translateY(-10px);} 445 | 100%{-moz-transform:translateY(0);} 446 | } 447 | @-ms-keyframes bounceinT{ 448 | 0%{opacity:0;-ms-transform:translateY(-100px);} 449 | 60%{opacity:1;-ms-transform:translateY(30px);} 450 | 80%{-ms-transform:translateY(-10px);} 451 | 100%{-ms-transform:translateY(0);} 452 | } 453 | @keyframes bounceinT{ 454 | 0%{opacity:0;transform:translateY(-100px);} 455 | 60%{opacity:1;transform:translateY(30px);} 456 | 80%{transform:translateY(-10px);} 457 | 100%{transform:translateY(0);} 458 | } 459 | /* 淡出-向左 */ 460 | @-webkit-keyframes fadeinL{ 461 | 0%{opacity:0;-webkit-transform:translateX(-100px);} 462 | 100%{opacity:1;-webkit-transform:translateX(0);} 463 | } 464 | @-moz-keyframes fadeinL{ 465 | 0%{opacity:0;-moz-transform:translateX(-100px);} 466 | 100%{opacity:1;-moz-transform:translateX(0);} 467 | } 468 | @-ms-keyframes fadeinL{ 469 | 0%{opacity:0;-ms-transform:translateX(-100px);} 470 | 100%{opacity:1;-ms-transform:translateX(0);} 471 | } 472 | @keyframes fadeinL{ 473 | 0%{opacity:0;transform:translateX(-100px);} 474 | 100%{opacity:1;transform:translateX(0);} 475 | } 476 | /**从右到左*/ 477 | .slide-fade-enter-active {transition: all .2s ease;} 478 | .slide-fade-leave-active {transition: all .2s ease;} 479 | .slide-fade-enter, .slide-fade-leave-to{transform: translateX(230px);opacity: 1;} 480 | 481 | 482 | 483 | -------------------------------------------------------------------------------- /static/css/file/index.scss: -------------------------------------------------------------------------------- 1 | .file_index{ 2 | background: #fff; 3 | border-radius: 5px; 4 | margin: 15px; 5 | padding: 12px; 6 | padding-top: 5px; 7 | height: 705px; 8 | } 9 | 10 | .file_index_list_box .ivu-col-span-4{ 11 | padding-top: .9vw; 12 | cursor: pointer; 13 | } 14 | .file_index_list_box .ivu-col-span-4 .ivu-card{ 15 | height: 135px; 16 | } 17 | .file_index_list_page{ 18 | padding:15px; 19 | text-align: center; 20 | position: absolute; 21 | width: 100%; 22 | font-size: 12px; 23 | } 24 | .file_index_list_init_icon{ 25 | font-size: 50px; 26 | margin-bottom: 10px; 27 | } 28 | .file_index_list_init_font{ 29 | font-size: 12px; 30 | line-height: 18px; 31 | } 32 | 33 | .file_up_center_modal{ 34 | display: flex; 35 | align-items: center; 36 | justify-content: center; 37 | .file_up_center_modal_body_left{ 38 | height: 100%; 39 | cursor: pointer; 40 | background: -webkit-linear-gradient(#49e6fd,#4fabf7); 41 | background: -o-linear-gradient(#49e6fd,#4fabf7); 42 | background: -webkit-gradient(linear,left top,left bottom,from(#49e6fd),to(#4fabf7)); 43 | background: linear-gradient(#49e6fd,#4fabf7); 44 | color: #ffffff; 45 | .file_up_center_modal_body_left_upload_file,.file_up_center_modal_body_left_upload_file .ivu-upload{ 46 | background: none; 47 | } 48 | } 49 | .file_up_center_modal_body_right { 50 | padding-left: 25px; 51 | textarea{ 52 | border-radius: 4px; 53 | height: 5vw; 54 | background: hsla(0,0%,100%,0); 55 | outline: none; 56 | resize: none; 57 | margin-top: 1vw; 58 | width: 90%; 59 | } 60 | .file-mag-select_open { 61 | border-radius: 4px; 62 | padding-top: 9px; 63 | margin-bottom: 17px; 64 | width: 90%; 65 | } 66 | .file-mag-select_title { 67 | line-height: 26px; 68 | text-align: left; 69 | color: #888; 70 | } 71 | 72 | 73 | } 74 | 75 | .ivu-modal{ 76 | width: 600px !important; 77 | top: 0; 78 | } 79 | .file_up_center_modal_body_left_btn{ 80 | width: 255px; 81 | height: 70px; 82 | border:1px solid #fff; 83 | margin: 73px auto; 84 | margin-top: 65px; 85 | margin-left: 21px; 86 | border-radius: 3px; 87 | padding: 5px 0; 88 | i{ 89 | display: block; 90 | font-size: 55px; 91 | margin: auto; 92 | float: left; 93 | padding-top: 0; 94 | padding-left: 24px; 95 | } 96 | div{ 97 | float: right; 98 | width: 180px; 99 | h3{ 100 | font-size: 20px; 101 | line-height: 35px; 102 | text-align: center; 103 | } 104 | p{ 105 | font-size: 13px; 106 | line-height: 22px; 107 | text-align: center; 108 | } 109 | } 110 | } 111 | .ivu-modal-body{ 112 | padding: 0; 113 | width: 600px; 114 | height: 210px; 115 | } 116 | .ivu-modal-content{ 117 | border-radius: 3px; 118 | overflow: hidden; 119 | } 120 | .ivu-modal-footer{ 121 | display: none; 122 | } 123 | } 124 | 125 | .file_index_list_box_card{ 126 | position: relative; 127 | .file_index_list_box_card_fix{ 128 | position: absolute; 129 | background: #ffffff; 130 | top: 0; 131 | left: 0; 132 | height: 133px; 133 | width: 100%; 134 | opacity:0; 135 | display: block; 136 | transition: opacity 0.3s linear; 137 | padding-top: 35px; 138 | p{ 139 | text-align: center; 140 | line-height: 25px; 141 | margin-bottom: 8px; 142 | font-size: 12px; 143 | button{ 144 | padding: 3px 15px; 145 | background: #ffffff; 146 | } 147 | } 148 | } 149 | .ivu-card-body:hover .file_index_list_box_card_fix{ 150 | opacity:1; 151 | } 152 | } 153 | 154 | /** 155 | 编辑box 156 | */ 157 | .file_edit_center_modal{ 158 | display: flex; 159 | align-items: center; 160 | justify-content: center; 161 | .file_edit_center_modal_body{ 162 | height: 240px; 163 | padding: 15px; 164 | textarea{ 165 | border-radius: 4px; 166 | background: hsla(0,0%,100%,0); 167 | outline: none; 168 | resize: none; 169 | width: 100%; 170 | height:75px; 171 | 172 | } 173 | input{ 174 | margin: 10px auto; 175 | } 176 | } 177 | .ivu-modal{ 178 | top: 0; 179 | width: 380px !important; 180 | } 181 | .ivu-modal-body{ 182 | padding: 0; 183 | } 184 | .ivu-modal-footer{ 185 | display: none; 186 | } 187 | } -------------------------------------------------------------------------------- /static/css/images/detail.scss: -------------------------------------------------------------------------------- 1 | .images_detail{ 2 | margin: 15px; 3 | height: 705px; 4 | } 5 | .images_detail_header{ 6 | margin: 0 !important; 7 | } 8 | .images_detail_header_left,.images_detail_header_right{ 9 | border-radius: 6px; 10 | height: 228px; 11 | } 12 | .images_detail_header_left{ 13 | background-color: #fff; 14 | background-position: 50%; 15 | background-size: cover; 16 | padding: 0 !important; 17 | } 18 | .images_detail_header_left h1,.images_detail_header_left h2{ 19 | font-family: \\534E\6587\5B8B\4F53; 20 | color: #fff; 21 | font-weight: 100; 22 | text-align: center; 23 | } 24 | .images_detail_header_left h1{ 25 | font-size: 33px; 26 | margin-top: 30px; 27 | } 28 | .images_detail_header_left h2{ 29 | font-size: 25px; 30 | margin-top: 10px; 31 | margin-bottom: 10px; 32 | } 33 | .icon_list{ 34 | text-align: center; 35 | .ivu-poptip-body{ 36 | text-align: left; 37 | } 38 | } 39 | .icon_list i{ 40 | margin-left: 5px; 41 | cursor: pointer; 42 | color: #fff; 43 | margin-bottom: 10px; 44 | font-size: 23px; 45 | } 46 | .icon_list i:nth-child(1){ 47 | margin-left: 0; 48 | } 49 | .images_detail_header_left p{ 50 | color: #fff; 51 | font-size: 12px; 52 | text-align: center; 53 | padding: 0 15px; 54 | line-height: 18px; 55 | } 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | .images_detail_header_right{ 67 | margin-left: 10px; 68 | background-color: rgba(255, 255, 255, 0.9); 69 | border-radius: 6px; 70 | padding: 10px; 71 | padding-top: 5px; 72 | padding-right: 0; 73 | padding-left: 9px; 74 | } 75 | .images_detail_header_right .ivu-upload-drag{ 76 | background-color: #fbfbfb; 77 | border: 1px dashed #d9d9d9; 78 | } 79 | .images_detail_header_right-upload-list{ 80 | display: inline-block; 81 | width: 92px; 82 | height: 100px; 83 | text-align: center; 84 | line-height: 60px; 85 | /*border: 1px solid transparent;*/ 86 | border-radius: 4px; 87 | overflow: hidden; 88 | background: #fff; 89 | position: relative; 90 | margin-right: 10px; 91 | margin-top: 5px; 92 | padding: 6px; 93 | border: 1px solid #d9d9d9; 94 | } 95 | .images_detail_header_right-upload-list:nth-child(6n+6){ 96 | margin-right: 0; 97 | } 98 | .images_detail_header_right-upload-list:nth-child(11n+11){ 99 | margin-right: 6px; 100 | } 101 | .images_detail_header_right-upload-list img{ 102 | width: 100%; 103 | height: 100%; 104 | } 105 | .images_detail_header_right-upload-list-upload-list-cover{ 106 | display: none; 107 | position: absolute; 108 | top: 0; 109 | bottom: 0; 110 | left: 0; 111 | right: 0; 112 | background: rgba(0,0,0,.6); 113 | padding-top: 20px; 114 | } 115 | .images_detail_header_right-upload-list:hover .images_detail_header_right-upload-list-upload-list-cover{ 116 | display: block; 117 | } 118 | .images_detail_header_right-upload-list-upload-list-cover i{ 119 | color: #fff; 120 | font-size: 20px; 121 | cursor: pointer; 122 | margin: 0 2px; 123 | } 124 | 125 | 126 | /** 127 | 下面部分 128 | */ 129 | .images_detail_box{ 130 | background-color: rgba(255, 255, 255, 0.9); 131 | margin:0; 132 | height: 458px; 133 | border-radius: 6px; 134 | margin-top: 17px; 135 | padding: 10px 13px 0 13px; 136 | } 137 | .images_detail_list_init:hover .images_detail_list_init_foucs{ 138 | opacity: 1; 139 | } 140 | .images_detail_list_init{ 141 | cursor: pointer; 142 | height: 175px; 143 | margin-top: 10px; 144 | position: relative; 145 | .images_detail_list_init_foucs{ 146 | position: absolute; 147 | width: 157px; 148 | margin-left: 4px; 149 | height: 100%; 150 | background: rgba(0, 0, 0, 0.5); 151 | top: 0; 152 | left: 0; 153 | color: #ffffff; 154 | text-align: center; 155 | font-size: 25px; 156 | padding-top: 80px; 157 | opacity:0; 158 | display: block; 159 | transition: opacity 0.3s linear; 160 | i{ 161 | margin-right: 5px; 162 | } 163 | i:nth-child(1){ 164 | margin-right: 7px; 165 | } 166 | i:nth-child(2){ 167 | font-size: 22px; 168 | } 169 | } 170 | } 171 | .images_detail_list_init img{ 172 | width: 100%; 173 | height: 100%; 174 | } 175 | .images_detail_list_page{ 176 | text-align: center; 177 | position: absolute; 178 | width: 100%; 179 | font-size: 12px; 180 | bottom: 20px; 181 | } 182 | 183 | 184 | .browse_edit_center_modal{ 185 | display: flex; 186 | align-items: center; 187 | justify-content: center; 188 | .ivu-modal{ 189 | top: 0; 190 | width: auto !important; 191 | } 192 | .browse_edit_center_modal_body:hover .browse_edit_center_modal_btn{ 193 | opacity:1; 194 | } 195 | .browse_edit_center_modal_body{ 196 | max-height: 650px; 197 | max-width: 960px; 198 | overflow: hidden; 199 | position: relative; 200 | .browse_edit_center_modal_btn{ 201 | position: absolute; 202 | top:50%; 203 | width: 100%; 204 | padding: 0 30px; 205 | overflow: hidden; 206 | margin-top: -35px; 207 | opacity:0; 208 | display: block; 209 | transition: opacity 0.3s linear; 210 | i{ 211 | font-size: 70px; 212 | color: #ffffff; 213 | cursor: pointer; 214 | } 215 | .l{ 216 | float: left; 217 | } 218 | .r{ 219 | float: right; 220 | } 221 | } 222 | } 223 | .ivu-modal-body{ 224 | padding: 0; 225 | line-height: unset; 226 | } 227 | .ivu-modal-content{ 228 | overflow: hidden; 229 | } 230 | .ivu-modal-footer{ 231 | display: none; 232 | } 233 | } 234 | 235 | /** 236 | 编辑box 237 | */ 238 | .images_edit_center_modal{ 239 | display: flex; 240 | align-items: center; 241 | justify-content: center; 242 | .images_edit_center_modal_body{ 243 | height: 240px; 244 | padding: 15px; 245 | textarea{ 246 | border-radius: 4px; 247 | background: hsla(0,0%,100%,0); 248 | outline: none; 249 | resize: none; 250 | width: 100%; 251 | height:75px; 252 | 253 | } 254 | input{ 255 | margin: 10px auto; 256 | } 257 | } 258 | .ivu-modal{ 259 | top: 0; 260 | width: 380px !important; 261 | } 262 | .ivu-modal-body{ 263 | padding: 0; 264 | } 265 | .ivu-modal-footer{ 266 | display: none; 267 | } 268 | } 269 | -------------------------------------------------------------------------------- /static/css/images/index.scss: -------------------------------------------------------------------------------- 1 | .images_index{ 2 | background: #fff; 3 | border-radius: 5px; 4 | margin: 15px; 5 | padding: 12px; 6 | padding-top: 5px; 7 | height: 705px; 8 | } 9 | .images_index_header{ 10 | margin-top: 50px; 11 | } 12 | .images_index_header h3{ 13 | text-align: center; 14 | font-size: 35px; 15 | font-weight: 100; 16 | } 17 | .images_index_header p { 18 | color: #878787; 19 | font-size: 12px; 20 | text-align: center; 21 | text-indent: 10vw; 22 | line-height: 30px; 23 | } 24 | 25 | .images_index_list_page{ 26 | padding:15px; 27 | padding-top: 28px; 28 | text-align: center; 29 | position: absolute; 30 | width: 100%; 31 | font-size: 12px; 32 | } 33 | 34 | .pic-details-image-wrapper{ 35 | /* border:1px solid red;*/ 36 | position: relative; 37 | width: 94%; 38 | margin: auto; 39 | margin-top: 30px; 40 | } 41 | .pic-details-image-wrapper_init{ 42 | height: 231.2px; 43 | position: relative; 44 | cursor: pointer; 45 | } 46 | .pic-details-image-wrapper_init_avt{ 47 | display: block; 48 | z-index: 1; 49 | position: absolute; 50 | left: 50%; 51 | top: 50%; 52 | width: 100px; 53 | height: 100px; 54 | margin: -50px 0 0 -50px; 55 | -webkit-border-image: initial; 56 | -o-border-image: initial; 57 | border-image: initial; 58 | overflow: hidden; 59 | } 60 | .pic-details-image-wrapper_init_avt img { 61 | width: 100%; 62 | border-radius: 50%; 63 | border: 2px solid #fff; 64 | height: 100%; 65 | } 66 | .pic-details-image-wrapper_init_bg { 67 | display: block; 68 | height: 100%; 69 | width: 100%; 70 | background-size: cover; 71 | background-position: 50%; 72 | opacity: .25; 73 | } 74 | .pic-details-image-wrapper_init_recommend-infobox { 75 | position: relative; 76 | height: 50%; 77 | width: 100%; 78 | background: #fafafa; 79 | -webkit-box-sizing: border-box; 80 | box-sizing: border-box; 81 | overflow: hidden; 82 | } 83 | .text_left { 84 | text-align: left; 85 | padding: 2px 8px 0 16px; 86 | } 87 | .text_right { 88 | text-align: right; 89 | padding: 2px 16px 0 8px; 90 | } 91 | .pic-details-image-wrapper_init_recommend-data { 92 | font-size: 25px; 93 | color: #aaa; 94 | font-weight: 400; 95 | line-height: 40px; 96 | } 97 | .pic-details-image-wrapper_init_recommend-infobox h2 { 98 | color: rgba(0,0,0,.85); 99 | font-weight: 100; 100 | font-size: 15px; 101 | padding-bottom: 5px; 102 | } 103 | .pic-details-image-wrapper_init_recommend-infobox p{ 104 | font-size: 11px; 105 | line-height: 16px; 106 | } 107 | .info-tra-left, .info-tra-right { 108 | z-index: 1; 109 | position: absolute; 110 | width: 14px; 111 | height: 28px; 112 | } 113 | .info-tra-left { 114 | top: 21%; 115 | left: -14px; 116 | background: url(~@/assets/info_tra.svg) no-repeat; 117 | background-position: 0 0; 118 | } 119 | .info-tra-right { 120 | top: 74%; 121 | right: -14px; 122 | background: url(~@/assets/info_tra.svg) no-repeat; 123 | background-position: 0 -51px; 124 | } 125 | .rotateXz90{ 126 | -webkit-transform: rotate(90deg); 127 | -moz-transform: rotate(90deg); 128 | -o-transform: rotate(90deg); 129 | -ms-transform: rotate(90deg); 130 | transform: rotate(90deg); 131 | } 132 | 133 | .rotateXz180{ 134 | -webkit-transform: rotate(270deg); 135 | -moz-transform: rotate(270deg); 136 | -o-transform: rotate(270deg); 137 | -ms-transform: rotate(270deg); 138 | transform: rotate(270deg); 139 | width: 100%; 140 | height: 100%; 141 | display: block; 142 | } 143 | 144 | 145 | .images_up_center_modal{ 146 | display: flex; 147 | align-items: center; 148 | justify-content: center; 149 | .ivu-modal-footer{ 150 | display: none; 151 | } 152 | .ivu-modal-body{ 153 | padding: 0; 154 | } 155 | .ivu-modal{ 156 | width: 490px !important; 157 | top: 0; 158 | } 159 | 160 | .images_up_center_modal_body_left{ 161 | height: 180px; 162 | .images_up_center_modal_body_left_btn{ 163 | background: -webkit-linear-gradient(#49e6fd,#4fabf7); 164 | background: -o-linear-gradient(#49e6fd,#4fabf7); 165 | background: -webkit-gradient(linear,left top,left bottom,from(#49e6fd),to(#4fabf7)); 166 | background: linear-gradient(#49e6fd,#4fabf7); 167 | background-position: center; 168 | background-size: cover; 169 | color: #ffffff; 170 | height:180px; 171 | i{ 172 | font-size: 80px; 173 | padding-top: 30px; 174 | } 175 | p{ 176 | font-size: 20px; 177 | line-height: 30px; 178 | text-align: center; 179 | } 180 | } 181 | } 182 | .images_up_center_modal_body_right { 183 | padding-left: 15px; 184 | textarea{ 185 | border-radius: 4px; 186 | height: 55px; 187 | background: hsla(0,0%,100%,0); 188 | outline: none; 189 | resize: none; 190 | margin-top:8px; 191 | width: 95%; 192 | } 193 | input { 194 | margin-top: 5px; 195 | margin-bottom: 5px; 196 | width: 95%; 197 | } 198 | .ivu-select{ 199 | width: 95%; 200 | margin-bottom: 6px; 201 | } 202 | .images-mag-select_title { 203 | line-height: 26px; 204 | text-align: left; 205 | color: #888; 206 | } 207 | 208 | 209 | } 210 | } -------------------------------------------------------------------------------- /static/css/index/index.scss: -------------------------------------------------------------------------------- 1 | .index_left_title { 2 | background: hsla(0,0%,100%,.6); 3 | text-align: right; 4 | } 5 | .index_left_title .ivu-col-span-6{ 6 | padding: 15px 0; 7 | width: 20%; 8 | } 9 | .index_left_title_init { 10 | cursor: pointer; 11 | border-left: 1px solid #fff; 12 | } 13 | .index_left_title .ivu-col-span-6:nth-child(1) .index_left_title_init{ 14 | border-left: 0; 15 | } 16 | .index_left_title .index_left_title_init_p1 { 17 | font-size: 40px; 18 | width: 68%; 19 | line-height: 67px; 20 | } 21 | .index_left_title .index_left_title_init_p2 { 22 | color: #00a988; 23 | width: 68%; 24 | font-size: 15px; 25 | margin-top: -8px; 26 | } 27 | /** 28 | 音乐 29 | */ 30 | .index_left_music { 31 | background: hsla(0,0%,100%,.6); 32 | width: 95%; 33 | margin: 20px auto; 34 | border-radius: 5px; 35 | border: none; 36 | 37 | } 38 | .index_left_music .ivu-card-body{ 39 | padding: 0; 40 | } 41 | .index_user_content_title{ 42 | height: 45px; 43 | width: 100%; 44 | border-bottom: 1px solid #cfebf9; 45 | } 46 | .index_user_content_title_span{ 47 | line-height: 45px; 48 | text-align: center; 49 | margin-left: 20px; 50 | font-size: 15px; 51 | font-weight: 500; 52 | } 53 | .index_user_content_title_span i{ 54 | margin-right: 1px; 55 | font-size: 19px; 56 | } 57 | .index_left_music_box{ 58 | 59 | } 60 | .index_left_music_init { 61 | padding: 15px 0; 62 | cursor: pointer; 63 | } 64 | .index_left_music_init img { 65 | display: block; 66 | border-radius: 50%; 67 | width: 80px; 68 | height: 80px; 69 | margin: auto; 70 | } 71 | .index_left_music_init p { 72 | text-align: center; 73 | line-height: 30px; 74 | overflow: hidden; 75 | white-space: nowrap; 76 | text-overflow: ellipsis; 77 | width: 85%; 78 | margin: auto; 79 | } 80 | /** 81 | 相册 82 | */ 83 | .index_left_button_box{ 84 | width: 95%; 85 | border-radius: 5px; 86 | margin: auto; 87 | overflow: hidden; 88 | } 89 | .index_left_button_box_left{ 90 | padding-right: 10px; 91 | } 92 | .index_left_button_box_left_box, .index_left_button_box_right_box { 93 | background: hsla(0,0%,100%,.6); 94 | border-radius: 5px; 95 | overflow: hidden; 96 | } 97 | .index_left_button_photos{ 98 | 99 | } 100 | .index_left_button_photos_max { 101 | cursor: pointer; 102 | position: relative; 103 | height: 170px; 104 | } 105 | .index_left_button_photos_max_bg { 106 | display: block; 107 | height: 100%; 108 | width: 100%; 109 | background-size: cover; 110 | background-position: 50%; 111 | opacity: .25; 112 | } 113 | .index_left_button_photos_max_avt { 114 | display: block; 115 | z-index: 1; 116 | position: absolute; 117 | left: 50%; 118 | top: 50%; 119 | width: 6vw; 120 | height: 6vw; 121 | margin: -3vw 0 0 -3vw; 122 | -webkit-border-image: initial; 123 | -o-border-image: initial; 124 | border-image: initial; 125 | overflow: hidden; 126 | } 127 | .index_left_button_photos_max_avt img { 128 | width: 100%; 129 | border-radius: 50%; 130 | border: 2px solid #fff; 131 | height: 100%; 132 | } 133 | .index_left_button_photos_right { 134 | position: relative; 135 | } 136 | .index_left_button_photos_right_top { 137 | padding: 10px 15px; 138 | height: 85px; 139 | background: hsla(0,0%,98%,.7); 140 | } 141 | .index_left_button_photos .ant-row:first-child .index_left_button_photos_right .index_left_button_photos_right_top:nth-child(1), .index_left_button_photos .ant-row:nth-child(2) .index_left_button_photos_right .index_left_button_photos_right_top:first-child { 142 | padding: 20px 15px 0; 143 | } 144 | .index_left_button_photos_right_top p:first-child { 145 | font-size: 1.2rem; 146 | color: #aaa; 147 | font-weight: 100; 148 | line-height: 40px; 149 | } 150 | .index_left_button_photos_right_top p:nth-child(2) { 151 | color: rgba(0,0,0,.85); 152 | font-weight: 100; 153 | font-size: 15px; 154 | padding-bottom: .1vw; 155 | } 156 | .index_left_button_photos_right_top_left_icon { 157 | top: 30%; 158 | left: -14px; 159 | z-index: 1; 160 | position: absolute; 161 | width: 14px; 162 | height: 28px; 163 | background: url(~@/assets/info_tra.svg) no-repeat; 164 | background-position: 0 0; 165 | } 166 | .index_left_button_photos_right_top_list{} 167 | .index_left_button_photos_right_top_list img { 168 | width: 100%; 169 | height: 100%; 170 | display: block; 171 | margin: auto; 172 | } 173 | .index_left_button_photos_right_top_list .ivu-col:nth-child(1) img{ 174 | padding-right: 1px; 175 | } 176 | .index_left_button_photos_right_top_list .ivu-col:nth-child(2) img{ 177 | padding-left: 1px; 178 | } 179 | /*第二个*/ 180 | .index_left_button_photos .ivu-row:nth-child(2) .index_left_button_photos_right { 181 | text-align: right; 182 | } 183 | .index_left_button_photos .ivu-row:nth-child(2) .index_left_button_photos_right .index_left_button_photos_right_top_left_icon { 184 | top: 67%; 185 | right: 0; 186 | left: 180px; 187 | z-index: 1; 188 | position: absolute; 189 | width: 14px; 190 | height: 28px; 191 | background: url(~@/assets/info_tra.svg) no-repeat; 192 | background-position: 0 -51px; 193 | } 194 | /** 195 | 评论 196 | */ 197 | .index_left_button_box_right { 198 | padding-left: 10px; 199 | } 200 | .index_comment_init { 201 | width: 100%; 202 | overflow: hidden; 203 | padding: 15px 10px 10px; 204 | border-bottom: 1px solid #fff; 205 | } 206 | .index_comment_init_avatar { 207 | float: left; 208 | height: 50px; 209 | width: 50px; 210 | line-height: 47px; 211 | text-align: center; 212 | font-size: 27px; 213 | font-style: italic; 214 | border: 1px solid #fff; 215 | -webkit-border-image: initial; 216 | -o-border-image: initial; 217 | border-image: initial; 218 | border-radius: 100%; 219 | overflow: hidden; 220 | } 221 | .index_comment_init_avatar img { 222 | width: 100%; 223 | height: 100%; 224 | } 225 | .index_comment_init_right { 226 | float: left; 227 | width: 525px; 228 | padding-left: 10px; 229 | } 230 | .index_comment_init_right_nickname { 231 | line-height: 24px; 232 | font-weight: 600; 233 | font-size: 13px; 234 | } 235 | .index_comment_init_right_nickname span { 236 | color: #b2b5b7; 237 | font-size: 13px; 238 | margin-left: 10px; 239 | } 240 | .index_comment_init_right_content { 241 | line-height: 20px; 242 | font-size: 12px; 243 | display: block; 244 | min-height: 40px; 245 | max-height: 40px; 246 | overflow: hidden; 247 | /* white-space: nowrap; 248 | text-overflow: ellipsis;*/ 249 | 250 | } 251 | .index_comment_init_right_content img{ 252 | width: 20px; 253 | height: 20px; 254 | margin-left: 5px; 255 | } 256 | .index_comment_page{ 257 | height: 69px; 258 | text-align: center; 259 | padding-top: 18px; 260 | } 261 | .index_comment_page .ivu-page-item-jump-next,.index_comment_page .ivu-page-item-jump-prev{ 262 | background: #ffffff; 263 | } -------------------------------------------------------------------------------- /static/css/music/index.scss: -------------------------------------------------------------------------------- 1 | .music_index{ 2 | margin: 18px; 3 | height: 705px; 4 | .ivu-spin{ 5 | background-color: rgba(0,0,0,.3) 6 | } 7 | } 8 | .music_index_header{ 9 | 10 | } 11 | 12 | /** 13 | 播放器 14 | */ 15 | .music_index_header_left{ 16 | padding: 0 !important; 17 | } 18 | .music_index_header_left_music{ 19 | border-radius: 5px; 20 | background-color: hsla(0,0%,100%,.9); 21 | margin-right: 8px; 22 | height: 166px; 23 | } 24 | .music_index_header_left_music_left{ 25 | padding: 23px 12px 10px 20px; 26 | } 27 | .music_index_header_left_music_right{ 28 | cursor: pointer; 29 | } 30 | .music_index_header_left_music_right img{ 31 | width: 132px; 32 | height: 132px; 33 | border-radius: 50%; 34 | display: block; 35 | margin-top: 17px; 36 | margin-left: 8px; 37 | } 38 | .music_index_header_left_music_left_title{ 39 | font-size: 21px; 40 | font-weight: 400; 41 | color: #030303; 42 | overflow: hidden; 43 | text-overflow:ellipsis; 44 | white-space: nowrap; 45 | } 46 | .music_index_header_left_music_left_auth{ 47 | font-size: 15px; 48 | font-weight: 400; 49 | line-height: 1.2; 50 | margin-top: 7px; 51 | color: #4a4a4a; 52 | overflow: hidden; 53 | text-overflow:ellipsis; 54 | white-space: nowrap; 55 | } 56 | .music-left_progress{ 57 | margin: 15.5px 0 0; 58 | background-size: 371px; 59 | } 60 | .music-progress_top { 61 | bottom: 10px; 62 | height: 18px; 63 | line-height: 13px; 64 | font-size: 11px; 65 | font-weight: 400; 66 | color: #9b9b9b; 67 | width: 100%; 68 | } 69 | .music-progress_time { 70 | color: #9b9b9b; 71 | font-weight: 400; 72 | margin-right: 10px; 73 | display: block; 74 | width: 40px; 75 | line-height: 18px; 76 | float: left; 77 | font-size: 14px; 78 | } 79 | .music-volume-container:hover .volume-high-progress{ 80 | opacity: 1; 81 | } 82 | .music-volume-container { 83 | position: relative; 84 | left: 20px; 85 | float: left; 86 | overflow: hidden; 87 | line-height: 18px; 88 | font-size: 18px; 89 | width: 70px; 90 | .volume-high-progress{ 91 | top: 0; 92 | right: 0; 93 | position: absolute; 94 | left: 20px; 95 | opacity:0; 96 | transition: opacity 0.3s linear; 97 | width: 49px; 98 | cursor: pointer; 99 | .ivu-progress-inner{ 100 | background: #ddd; 101 | .ivu-progress-bg{ 102 | background: rgb(170, 170, 170); 103 | } 104 | } 105 | } 106 | } 107 | .music-progress-icon { 108 | float: right; 109 | font-size: 18px; 110 | cursor: pointer; 111 | } 112 | .music-progress-icon i{ 113 | margin-right: 3px; 114 | } 115 | .music-progress-icon i:nth-child(1){ 116 | font-size: 17px; 117 | } 118 | .music-progress-icon i:nth-child(3){ 119 | /*margin-right:10px;*/ 120 | } 121 | .music-left_progress_init{ 122 | top: -3px; 123 | cursor: pointer; 124 | } 125 | .music-left_progress_init .ivu-progress-inner { 126 | background-color: #dedede!important; 127 | } 128 | .music-left_progress_init .ivu-progress-inner .ivu-progress-bg{ 129 | background-color:#22B14C; 130 | } 131 | .music-left_btn i { 132 | margin-right: 20px; 133 | cursor: pointer; 134 | font-size: 23px; 135 | } 136 | .music-left_btn i:nth-child(1) { 137 | font-size: 25px; 138 | } 139 | .music-left_btn i:nth-child(2) { 140 | margin-right: 180px; 141 | } 142 | .music-left_btn i:last-child { 143 | margin-right: 0; 144 | text-align: right; 145 | } 146 | 147 | .music-left_btn .icon { 148 | display: inline-block; 149 | width: 20px; 150 | height: 20px; 151 | background-size:cover; 152 | background-position: center; 153 | } 154 | .icon.repeat-cycle { 155 | background-image: url(~@/assets/icon_repeat-cycle.gif); 156 | } 157 | .icon.repeat-once { 158 | background-image: url(~@/assets/icon_repeat-once.png); 159 | } 160 | .icon.repeat-random { 161 | background-image: url(~@/assets/icon_repeat-random.png); 162 | } 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | /*头部右侧*/ 183 | .music_index_header_right{ 184 | padding: 0 !important; 185 | } 186 | .music_index_header_right_box{ 187 | border-radius: 5px; 188 | background-color: hsla(0,0%,100%,.9); 189 | margin-left: 8px; 190 | height: 166px; 191 | } 192 | .music_index_header_right_box_input_{ 193 | border-bottom:1px dashed #4A9EF6; 194 | height: 53px; 195 | padding-top: 10px; 196 | } 197 | .music_index_header_right_box_input_box{ 198 | width: 285px; 199 | height: 32px; 200 | margin:auto; 201 | } 202 | .music_index_header_right_box_Carousel_{ 203 | position: relative; 204 | } 205 | .music_index_header_right_box_Carousel_init{ 206 | 207 | } 208 | .music_index_header_right_box_Carousel_init img{ 209 | width: 71px; 210 | height: 71px; 211 | border-radius: 50%; 212 | display: block; 213 | margin: 5px auto; 214 | 215 | } 216 | 217 | .music_index_header_right_box_Carousel_init h2:nth-child(2){ 218 | font-size: 12px; 219 | font-weight: 100; 220 | text-align: center; 221 | color: #000; 222 | width: 100%; 223 | display: block; 224 | line-height: 15px; 225 | overflow: hidden; 226 | text-overflow:ellipsis; 227 | white-space: nowrap; 228 | } 229 | .music_index_header_right_box_Carousel_init h2:nth-child(3){ 230 | font-size: 11px; 231 | color: #acacac; 232 | text-align: center; 233 | width: 100%; 234 | display: block; 235 | line-height: 15px; 236 | overflow: hidden; 237 | text-overflow:ellipsis; 238 | white-space: nowrap; 239 | } 240 | 241 | /* 242 | 下部分列表*/ 243 | .music_index_list{ 244 | border-radius: 5px; 245 | background-color: hsla(0,0%,100%,.9); 246 | height: 515px; 247 | margin:20px 0 0 0 !important; 248 | } 249 | .music_index_list img{ 250 | width: 95px; 251 | height: 95px; 252 | border-radius: 50%; 253 | display: block; 254 | margin: 5px auto; 255 | } 256 | .music_index_list_init{ 257 | margin-top: 10px; 258 | cursor: pointer; 259 | } 260 | .music_index_list_init h2:nth-child(2){ 261 | font-size: 13px; 262 | font-weight: 100; 263 | text-align: center; 264 | color: #000; 265 | width: 100%; 266 | display: block; 267 | line-height: 20px; 268 | overflow: hidden; 269 | text-overflow:ellipsis; 270 | white-space: nowrap; 271 | } 272 | .music_index_list_init h2:nth-child(3){ 273 | font-size: 12px; 274 | color: #acacac; 275 | text-align: center; 276 | width: 100%; 277 | display: block; 278 | line-height: 15px; 279 | overflow: hidden; 280 | text-overflow:ellipsis; 281 | white-space: nowrap; 282 | } 283 | .music_index_list_page{ 284 | text-align: center; 285 | position: absolute; 286 | width: 100%; 287 | font-size: 12px; 288 | bottom: 15px; 289 | } 290 | .on_search_page{ 291 | text-align: center; 292 | position: absolute; 293 | width: 100%; 294 | bottom: 10px; 295 | font-size: 12px; 296 | } 297 | .on_search_page_box{ 298 | .ivu-select-dropdown{ 299 | padding-bottom: 40px; 300 | } 301 | } -------------------------------------------------------------------------------- /static/css/note/index.scss: -------------------------------------------------------------------------------- 1 | .note_left{ 2 | 3 | } 4 | .note_left_box{ 5 | border-radius: 10px; 6 | margin-right: 20px; 7 | overflow: hidden; 8 | } 9 | .note_left_box_init{ 10 | background-color: hsla(0,0%,100%,.7); 11 | position: relative; 12 | } 13 | .note_left_box_add_icon{ 14 | position: absolute; 15 | width: 50px; 16 | height: 50px; 17 | right: 0; 18 | top: 0; 19 | line-height: 44px; 20 | text-align: center; 21 | font-size: 21px; 22 | cursor: pointer; 23 | } 24 | .note_left_box_desc_{ 25 | font-size: 11px; 26 | } 27 | .note_left_box_title{ 28 | line-height: 45px; 29 | text-align: center; 30 | margin-left: 20px; 31 | font-size: 14px; 32 | font-weight: 500; 33 | } 34 | .note_left_box .ivu-card:first-child { 35 | margin-top: 2px; 36 | } 37 | .note_left_box .ivu-card{ 38 | background: none; 39 | background-color: hsla(0,0%,100%,.7); 40 | padding: 6px 0; 41 | border-radius: 0; 42 | margin-bottom: 2px; 43 | height: 8.85vw; 44 | position: relative; 45 | } 46 | .note_left_box .ivu-card-head { 47 | height: 25px; 48 | line-height: 25px; 49 | padding: 0 11px !important; 50 | background: none; 51 | /*border: 0;*/ 52 | font-size: 13px; 53 | font-weight: bold; 54 | } 55 | .note_left_box .ivu-card-body{ 56 | padding: 5px 11px 0; 57 | } 58 | .note_left_box .ivu-card-body div .note_left_box_desc_:nth-child(1){ 59 | line-height: 18px; 60 | font-size: 11px; 61 | } 62 | .note_left_box .ivu-card-body div p:nth-child(2){ 63 | line-height: 20px; 64 | text-align: right; 65 | position: absolute; 66 | font-size: 13px; 67 | width: 93%; 68 | bottom: 3px; 69 | font-weight: 100; 70 | } 71 | .note_left_page{ 72 | text-align: center; 73 | font-size: 15px; 74 | font-weight: 500; 75 | margin-left: 0; 76 | line-height: 2.8vw; 77 | padding: 1vw 0; 78 | } 79 | .note_left_int_title{ 80 | position: relative; 81 | } 82 | .note_left_int_title_text{ 83 | overflow: hidden; 84 | text-overflow:ellipsis; 85 | white-space: nowrap; 86 | width: 71%; 87 | } 88 | .note_left_int_title_icon{ 89 | position: absolute; 90 | right: 0; 91 | top: 2px; 92 | overflow: hidden; 93 | } 94 | .note_left_int_title_icon div{ 95 | border-radius: 50%; 96 | width: 20px; 97 | height: 20px; 98 | border:1px solid #aaa; 99 | float: left; 100 | line-height: 20px; 101 | text-align: center; 102 | margin-right: 6px; 103 | font-size: 12px; 104 | cursor: pointer; 105 | color: #aaa; 106 | } 107 | .note_left_int_title_icon div:nth-last-child(1){ 108 | margin-right: 0; 109 | } 110 | .note_left_int_title_icon div:nth-last-child(2){ 111 | font-size: 14px; 112 | } 113 | .note_left_int_title_icon div:nth-last-child(3){ 114 | font-size: 11px; 115 | } 116 | /** 117 | 右边部分 118 | */ 119 | .ql-toolbar{ 120 | padding: 9.5px; 121 | border-bottom: none; 122 | background-color: hsla(0,0%,100%,.7); 123 | border-radius: 10px; 124 | } 125 | .ql-container{ 126 | background-color: hsla(0,0%,100%,.7); 127 | border: 0; 128 | border-radius: 10px; 129 | margin-top: 10px; 130 | height: 608px; 131 | } 132 | .edit_upload_img { 133 | display: none; 134 | } -------------------------------------------------------------------------------- /static/css/reset.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Eric Meyer's Reset CSS v2.0 (http://meyerweb.com/eric/tools/css/reset/) 3 | * http://cssreset.com 4 | */ 5 | html, body, div, span, applet, object, iframe, 6 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 7 | a, abbr, acronym, address, big, cite, code, 8 | del, dfn, em, img, ins, kbd, q, s, samp, 9 | small, strike, strong, sub, sup, tt, var, 10 | b, u, i, center, 11 | dl, dt, dd, ol, ul, li, 12 | fieldset, form, label, legend, 13 | table, caption, tbody, tfoot, thead, tr, th, td, 14 | article, aside, canvas, details, embed, 15 | figure, figcaption, footer, header, 16 | menu, nav, output, ruby, section, summary, 17 | time, mark, audio, video, input { 18 | margin: 0; 19 | padding: 0; 20 | border: 0; 21 | font-size: 100%; 22 | font-weight: normal; 23 | vertical-align: baseline; 24 | } 25 | 26 | /* HTML5 display-role reset for older browsers */ 27 | article, aside, details, figcaption, figure, 28 | footer, header, menu, nav, section { 29 | display: block; 30 | } 31 | 32 | body { 33 | line-height: 1; 34 | } 35 | 36 | blockquote, q { 37 | quotes: none; 38 | } 39 | 40 | blockquote:before, blockquote:after, 41 | q:before, q:after { 42 | content: none; 43 | } 44 | 45 | table { 46 | border-collapse: collapse; 47 | border-spacing: 0; 48 | } 49 | 50 | /* custom */ 51 | a,a:link,a:visited,a:active { 52 | color: #7e8c8d; 53 | text-decoration: none; 54 | -webkit-backface-visibility: hidden; 55 | } 56 | 57 | li { 58 | list-style: none; 59 | } 60 | ::-webkit-scrollbar { 61 | width: 1px; 62 | height: 5px; 63 | } 64 | 65 | ::-webkit-scrollbar-track-piece { 66 | background-color: rgba(0, 0, 0, 0.2); 67 | -webkit-border-radius: 6px; 68 | } 69 | 70 | ::-webkit-scrollbar-thumb:vertical { 71 | height: 5px; 72 | background-color: rgba(125, 125, 125, 0.7); 73 | -webkit-border-radius: 6px; 74 | } 75 | 76 | ::-webkit-scrollbar-thumb:horizontal { 77 | width: 5px; 78 | background-color: rgba(125, 125, 125, 0.7); 79 | -webkit-border-radius: 6px; 80 | } 81 | 82 | html, body { 83 | width: 100%; 84 | height: 100%; 85 | overflow: hidden; 86 | } 87 | 88 | body { 89 | -webkit-text-size-adjust: none; 90 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 91 | } 92 | 93 | @media screen and(min-width: 769px) { 94 | html, body { 95 | width: 100%; 96 | margin: 0 auto; 97 | } 98 | 99 | body{ 100 | box-shadow: 0 0 30px gray; 101 | } 102 | } -------------------------------------------------------------------------------- /static/css/setting/index.scss: -------------------------------------------------------------------------------- 1 | .setting_index{ 2 | margin: 30px; 3 | height: 678px; 4 | } 5 | .setting_index_box{ 6 | margin:0 !important; 7 | } 8 | 9 | 10 | 11 | .setting_index_left{ 12 | height: 675px; 13 | background-color: hsla(0,0%,100%,.9); 14 | border-radius: 6px; 15 | padding: 0 !important; 16 | } 17 | .setting_index_left input,.setting_index_left textarea{ 18 | margin: 10px auto; 19 | display: block; 20 | width: 85%; 21 | outline:none; 22 | resize:none; 23 | } 24 | .setting_index_left_btn{ 25 | text-align: center; 26 | line-height: 50px; 27 | } 28 | 29 | 30 | 31 | 32 | .setting_index_right{ 33 | margin-left: 37px; 34 | width: 67%; 35 | padding: 0 !important; 36 | } 37 | .personalIndex_right_open_api{ 38 | background-color: hsla(0,0%,100%,.9); 39 | border-radius: 6px; 40 | } 41 | .personalIndex_right_open_api .ivu-col-span-8 { 42 | border-right: 1px dashed #d9d9d9; 43 | line-height: 100px; 44 | text-align: center; 45 | font-size: 18px; 46 | } 47 | .personalIndex_right_open_api .ivu-col-span-16 { 48 | padding: 10px; 49 | padding-left: 30px; 50 | line-height: 40px; 51 | text-align: left; 52 | } 53 | .personalIndex_right_open_api .ivu-col-span-16 p { 54 | text-align: left; 55 | font-size: 15px; 56 | color: #adbcd9; 57 | } 58 | .personalIndex_right_open_api .ivu-col-span-16 p span { 59 | font-size: 12px; 60 | background-color: #eee; 61 | border-radius: 4px; 62 | margin-left: 14px; 63 | padding: 5px 15px; 64 | } 65 | 66 | /** 67 | 最后部分 68 | */ 69 | .personalIndex_right_bg { 70 | height: 532px; 71 | margin-top: 40px; 72 | background-color: hsla(0,0%,100%,.9); 73 | border-radius: 6px; 74 | } 75 | .personalIndex_right_bg_img{ 76 | width: 100%; 77 | height: 120px; 78 | border-radius: 4px; 79 | cursor: pointer; 80 | } 81 | .personalIndex_right_bg_list{ 82 | padding: 0 13px; 83 | } 84 | .personalIndex_right_bg_list_init{ 85 | margin-top: 10px; 86 | } 87 | .setting_index_list_page{ 88 | padding-top:23px; 89 | text-align: center; 90 | position: absolute; 91 | width: 100%; 92 | font-size: 12px; 93 | } 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | .modalBG_center_modal{ 102 | display: flex; 103 | align-items: center; 104 | justify-content: center; 105 | .ivu-modal{ 106 | top: 0; 107 | width: auto !important; 108 | } 109 | .ivu-modal-body{ 110 | padding: 0; 111 | width: 710px; 112 | height: 500px; 113 | border-radius: 4px; 114 | overflow: hidden; 115 | } 116 | .ivu-modal-footer{ 117 | display: none; 118 | } 119 | .modalBG_body{ 120 | background-position: 50%; 121 | background-repeat: no-repeat; 122 | background-size: cover; 123 | height: 100%; 124 | } 125 | .personalIndex_modal_bg_msk { 126 | background-color: hsla(0,0%,100%,.7); 127 | width: 100%; 128 | height: 100%; 129 | } 130 | .personalIndex_modal_bg_o{ 131 | padding-top: 50px; 132 | position: absolute; 133 | left: 0; 134 | top: 0; 135 | width: 100%; 136 | height: 100%; 137 | } 138 | .personalIndex_modal_bg_b { 139 | width: 500px; 140 | height: 300px; 141 | margin: auto; 142 | border-radius: 5px; 143 | overflow: hidden; 144 | } 145 | .personalIndex_modal_bg_b img { 146 | left: 0; 147 | top: 0; 148 | width: 100%; 149 | height: 100%; 150 | } 151 | .personalIndex_modal_bg_button { 152 | text-align: center; 153 | padding: 0 0 20px; 154 | } 155 | .personalIndex_modal_bg_button p { 156 | font-size: 15px; 157 | color: #171717; 158 | line-height: 46px; 159 | text-align: center; 160 | } 161 | .personalIndex_modal_bg_button button{ 162 | padding: 4px 12px; 163 | } 164 | .personalIndex_modal_bg_button button:nth-child(2) { 165 | margin-right: 10px; 166 | } 167 | .personalIndex_modal_bg_close { 168 | width: 35px; 169 | height: 35px; 170 | border-radius: 50%; 171 | margin: auto; 172 | border: 2px solid #fff; 173 | color: #fff; 174 | text-align: center; 175 | line-height: 35px; 176 | font-size: 20px; 177 | cursor: pointer; 178 | } 179 | } 180 | .ivu-modal-mask{ 181 | background-color: rgba(55,55,55,.5); 182 | } 183 | 184 | -------------------------------------------------------------------------------- /static/css/sing/login.scss: -------------------------------------------------------------------------------- 1 | .login_box_header_{ 2 | height: 30px; 3 | position: absolute; 4 | right: 0; 5 | padding-top: 15px; 6 | padding-right: 15px; 7 | width: 60px; 8 | overflow: hidden; 9 | color: #ffffff; 10 | line-height: 16px; 11 | text-align: center; 12 | font-size: 9px; 13 | } 14 | .sing_login{ 15 | height: 800px; 16 | -webkit-app-region: drag; 17 | } 18 | .login_box_box_{ 19 | width: 350px; 20 | height: 500px; 21 | background: hsla(0,0%,100%,.7); 22 | border-radius: 5px; 23 | position: absolute; 24 | margin-top: -250px; 25 | top: 50%; 26 | margin-left: -175px; 27 | left: 50%; 28 | -webkit-app-region: no-drag; 29 | } 30 | .login_box_avatar{ 31 | width: 180px; 32 | margin: auto; 33 | padding-top: 50px; 34 | margin-bottom: 20px; 35 | } 36 | .login_box_avatar img{ 37 | width: 120px; 38 | height: 120px; 39 | display: block; 40 | margin: auto; 41 | border-radius: 100%; 42 | } 43 | .login_box_avatar p{ 44 | line-height: 50px; 45 | width: 100%; 46 | text-align: center; 47 | font-size: 18px; 48 | font-weight: 600; 49 | font-family: SimSun; 50 | margin-top: 10px; 51 | } 52 | .login_box_input{ 53 | width: 78%; 54 | height: 37px; 55 | margin: auto; 56 | border-radius: 7px; 57 | background: #7f9aad; 58 | margin-bottom: 15px; 59 | } 60 | .login_box_input i{ 61 | color: #fff; 62 | height: 24px; 63 | display: block; 64 | float: left; 65 | width: 30px; 66 | margin-top: 6px; 67 | font-style: normal; 68 | vertical-align: baseline; 69 | text-align: center; 70 | text-transform: none; 71 | line-height: 1; 72 | text-rendering: optimizeLegibility; 73 | -webkit-font-smoothing: antialiased; 74 | font-size: 23px; 75 | } 76 | .login_box_input input{ 77 | border-radius: 0; 78 | width: 240px; 79 | background: #7f9aad; 80 | border: 0; 81 | border-left: 1px solid #fff; 82 | margin-top: 7px; 83 | outline: none!important; 84 | padding-left: 8px; 85 | font-size: 14px; 86 | height: 23px; 87 | color: #fff; 88 | display: block; 89 | float: left; 90 | } 91 | .login_box_input input::-webkit-input-placeholder { 92 | color: #ffffff; 93 | } 94 | .login_box_btn{ 95 | background: #112232; 96 | line-height: 37px; 97 | color: #fff; 98 | font-size: 15px; 99 | cursor: pointer; 100 | text-align: center; 101 | width: 78%; 102 | height: 37px; 103 | margin: auto; 104 | border-radius: 7px; 105 | margin-bottom: 15px; 106 | } 107 | .login_box_btn_text{ 108 | text-align: center; 109 | bottom: 10px; 110 | width: 100%; 111 | line-height: 18px; 112 | color: #999; 113 | position: absolute; 114 | font-size: 12px; 115 | } -------------------------------------------------------------------------------- /static/css/video/index.scss: -------------------------------------------------------------------------------- 1 | .video_index{ 2 | background: #fff; 3 | border-radius: 5px; 4 | margin: 15px; 5 | height: 705px; 6 | } 7 | .video_index_list_box .ivu-col-span-6{ 8 | padding-top: 10px; 9 | cursor: pointer; 10 | } 11 | .video_index_list_box{ 12 | padding: 12px; 13 | padding-top: 0; 14 | } 15 | .video_index_list_page{ 16 | padding:7px; 17 | text-align: center; 18 | position: absolute; 19 | width: 100%; 20 | font-size: 12px; 21 | } 22 | .video_index_list_box .ivu-col-span-6 .ivu-card{ 23 | height: 138px; 24 | } 25 | .video_index_list_init_images{ 26 | position: relative; 27 | height: 138px; 28 | border-radius: 4px; 29 | overflow: hidden; 30 | } 31 | .video_index_list_init_img{ 32 | width: 100%; 33 | height: 100%; 34 | } 35 | .video_index_list_box .ivu-card-body{ 36 | padding: 0; 37 | } 38 | 39 | .video_index_list_init_font{ 40 | padding: 0 10px; 41 | line-height: 17px; 42 | } 43 | .video_index_list_init_foucs{ 44 | width: 100%; 45 | height: 138px; 46 | background-color:rgba(000,000,000,0.5); 47 | position: absolute; 48 | top: 0; 49 | left: 0; 50 | color: #ffffff; 51 | opacity:0; 52 | display: block; 53 | transition: opacity 0.3s linear; 54 | } 55 | .video_index_list_init_images:hover .video_index_list_init_foucs{ 56 | opacity:1; 57 | } 58 | .video_index_list_init_images:hover .video_index_list_init_botton_font{ 59 | display: none; 60 | } 61 | .video_index_list_init_botton_font{ 62 | position: absolute; 63 | bottom: 0; 64 | background-color:rgba(000,000,000,0.5); 65 | width: 100%; 66 | padding: 8px; 67 | color: #ffffff; 68 | font-size: 12px; 69 | overflow: hidden; 70 | white-space: nowrap; 71 | text-overflow: ellipsis; 72 | margin: auto; 73 | } 74 | 75 | 76 | 77 | /** 78 | 编辑box 79 | */ 80 | .video_edit_center_modal{ 81 | display: flex; 82 | align-items: center; 83 | justify-content: center; 84 | .video_edit_center_modal_body{ 85 | height: 240px; 86 | padding: 15px; 87 | textarea{ 88 | border-radius: 4px; 89 | background: hsla(0,0%,100%,0); 90 | outline: none; 91 | resize: none; 92 | width: 100%; 93 | height:75px; 94 | 95 | } 96 | input{ 97 | margin: 10px auto; 98 | } 99 | } 100 | .ivu-modal{ 101 | top: 0; 102 | width: 380px !important; 103 | } 104 | .ivu-modal-body{ 105 | padding: 0; 106 | } 107 | .ivu-modal-footer{ 108 | display: none; 109 | } 110 | } -------------------------------------------------------------------------------- /static/css/video/play.scss: -------------------------------------------------------------------------------- 1 | .del_video_play_box{ 2 | overflow: hidden; 3 | height: 735px; 4 | } 5 | .del_videoIndex_title { 6 | width: 95%; 7 | text-align: center; 8 | margin: 40px auto; 9 | margin-bottom: 20px; 10 | color: #fff; 11 | } 12 | .del_videoIndex_title h1 { 13 | font-size: 1.8rem; 14 | font-weight: 100; 15 | line-height: 3.5vw; 16 | color: rgb(255, 255, 255); 17 | } 18 | .del_videoIndex_title p { 19 | font-size: 12px; 20 | text-indent: 10vw; 21 | line-height: 20px; 22 | } 23 | .del_videoIndex_btn_left, .del_videoIndex_btn_right { 24 | position: absolute; 25 | top: 50%; 26 | margin-top: -25px; 27 | font-size: 98px; 28 | color: #fff; 29 | cursor: pointer; 30 | } 31 | .del_videoIndex_box { 32 | position: relative; 33 | width: 85%; 34 | margin: auto; 35 | border-radius: 8px; 36 | overflow: hidden; 37 | height: 520px; 38 | margin-top: 60px; 39 | } 40 | .del_videoIndex_box .vjs-poster{ 41 | background-position: 0 0; 42 | background-size: cover; 43 | } -------------------------------------------------------------------------------- /static/css/video/push.scss: -------------------------------------------------------------------------------- 1 | .video_push_top{ 2 | background: hsla(0,0%,100%,.2); 3 | padding: 30px; 4 | margin: 2%; 5 | width: 96%; 6 | } 7 | .video_push_top_left{ 8 | height: 360px; 9 | border: 1px dashed #999; 10 | background: hsla(0,0%,100%,.5); 11 | } 12 | .video_push_top_left .ivu-upload{ 13 | background: none; 14 | } 15 | .video_push_top_left_text{ 16 | position: absolute; 17 | margin: auto; 18 | width: 100%; 19 | bottom: 21px; 20 | text-align: center; 21 | color: #777; 22 | font-size: 15px; 23 | font-weight: 400; 24 | } 25 | .video_push_top_left_btn_box{ 26 | width: 273px; 27 | height: 70px; 28 | margin: auto; 29 | color: #fff; 30 | border-radius: 3px; 31 | background-color: rgba(160,131,242,.6); 32 | } 33 | .video_push_top_left_btn_box_i{ 34 | float: left; 35 | display: block; 36 | width: 90px; 37 | font-size: 51px; 38 | text-align: center; 39 | padding-top: 12px; 40 | padding-left: 40px; 41 | } 42 | .video_push_top_left_btn_box_text{ 43 | float: left; 44 | width: 160px; 45 | } 46 | .video_push_top_left_btn_box_text p:first-child { 47 | font-size: 20px; 48 | line-height: 37px; 49 | font-weight: 500; 50 | margin-top: 4px; 51 | } 52 | .video_push_top_left_btn_box_text p:nth-child(2) { 53 | line-height: 20px; 54 | font-size: 15px; 55 | } 56 | .video_push_top_left_box_text{ 57 | margin-top: 20px; 58 | font-size: 14px; 59 | font-weight: 400; 60 | } 61 | .video_push_ul_box{ 62 | width: 100%; 63 | position: relative; 64 | margin-top: 110px; 65 | margin-bottom: 142px; 66 | } 67 | /** 68 | 右边input 69 | */ 70 | .video_push_top_right{ 71 | padding-left: 2vw; 72 | background: hsla(0,0%,100%,.9); 73 | } 74 | .video_push_top_right_desc{ 75 | border-radius: 4px; 76 | width: 92%; 77 | background: hsla(0,0%,100%,0); 78 | outline: none; 79 | resize: none; 80 | margin-top: 2vw; 81 | } 82 | .video_push_top_right_btn{ 83 | padding-top: 1vw; 84 | margin-bottom: 1.5vw; 85 | border-radius: 4px; 86 | width: 92%; 87 | } 88 | .video_push_top_right_btn_title{ 89 | line-height: 26px; 90 | text-align: left; 91 | color: #888; 92 | margin-bottom: .3vw; 93 | font-size: 14px; 94 | } 95 | .video_push_top_right_btn_1{ 96 | background: hsla(0,0%,100%,0); 97 | outline: none; 98 | resize: none; 99 | margin-bottom: 1vw; 100 | } 101 | .video_push_top_right_btn_status{ 102 | width: 100%; 103 | } 104 | /** 105 | 走马灯 106 | */ 107 | .video_push_btn_box{ 108 | height: 274px; 109 | padding: 0 2%; 110 | background: hsla(0,0%,100%,.9); 111 | } 112 | .video_push_btn{ 113 | margin-top: 1%; 114 | } 115 | .video_push_btn .ivu-row .ivu-col .ivu-card-body{ 116 | padding: 0; 117 | cursor: pointer; 118 | } 119 | .video_push_btn .ivu-row .ivu-col .ivu-card-body img{ 120 | width: 100%; 121 | height: 120px; 122 | display: block; 123 | } 124 | .video_push_btn_titleBox{ 125 | display: block; 126 | padding: 5px; 127 | height: 70px; 128 | overflow: hidden; 129 | } 130 | .video_push_btn_titleBox h3{ 131 | display: -webkit-box; 132 | -webkit-box-orient: vertical; 133 | overflow: hidden; 134 | line-height: 26px; 135 | } 136 | .video_push_btn_titleBox p{ 137 | /*margin-top: 5px;*/ 138 | color: #999; 139 | font-size: 12px; 140 | line-height: 18px; 141 | } -------------------------------------------------------------------------------- /static/html/setting.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 85 | 86 | 87 |
88 |
89 | 90 |
91 | 92 |
93 | 94 |
95 | 96 |
97 |
98 | 99 |
100 | 101 |
102 | 103 |
104 |
105 |
106 | 系统设置 107 |
108 |
109 | 关闭系统 110 |
111 |
112 | 132 | 133 | -------------------------------------------------------------------------------- /static/img/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EliseCaro/eibk_client/35fc05e7100f7934f990d21f7c0ee420e6d774fc/static/img/icon.ico -------------------------------------------------------------------------------- /static/img/preview/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EliseCaro/eibk_client/35fc05e7100f7934f990d21f7c0ee420e6d774fc/static/img/preview/1.jpg -------------------------------------------------------------------------------- /static/img/preview/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EliseCaro/eibk_client/35fc05e7100f7934f990d21f7c0ee420e6d774fc/static/img/preview/10.jpg -------------------------------------------------------------------------------- /static/img/preview/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EliseCaro/eibk_client/35fc05e7100f7934f990d21f7c0ee420e6d774fc/static/img/preview/2.jpg -------------------------------------------------------------------------------- /static/img/preview/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EliseCaro/eibk_client/35fc05e7100f7934f990d21f7c0ee420e6d774fc/static/img/preview/3.jpg -------------------------------------------------------------------------------- /static/img/preview/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EliseCaro/eibk_client/35fc05e7100f7934f990d21f7c0ee420e6d774fc/static/img/preview/4.jpg -------------------------------------------------------------------------------- /static/img/preview/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EliseCaro/eibk_client/35fc05e7100f7934f990d21f7c0ee420e6d774fc/static/img/preview/5.jpg -------------------------------------------------------------------------------- /static/img/preview/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EliseCaro/eibk_client/35fc05e7100f7934f990d21f7c0ee420e6d774fc/static/img/preview/6.jpg -------------------------------------------------------------------------------- /static/img/preview/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EliseCaro/eibk_client/35fc05e7100f7934f990d21f7c0ee420e6d774fc/static/img/preview/7.jpg -------------------------------------------------------------------------------- /static/img/preview/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EliseCaro/eibk_client/35fc05e7100f7934f990d21f7c0ee420e6d774fc/static/img/preview/8.jpg -------------------------------------------------------------------------------- /static/img/preview/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EliseCaro/eibk_client/35fc05e7100f7934f990d21f7c0ee420e6d774fc/static/img/preview/9.jpg -------------------------------------------------------------------------------- /static/vue/fonts/ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EliseCaro/eibk_client/35fc05e7100f7934f990d21f7c0ee420e6d774fc/static/vue/fonts/ionicons.ttf --------------------------------------------------------------------------------