初始化网站代码

This commit is contained in:
tianyongbao
2024-09-26 11:30:36 +08:00
commit 8c35a50e60
90 changed files with 31588 additions and 0 deletions

12
.babelrc Normal file
View File

@@ -0,0 +1,12 @@
{
"presets": [
["env", {
"modules": false,
"targets": {
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
}
}],
"stage-2"
],
"plugins": ["transform-vue-jsx", "transform-runtime"]
}

9
.editorconfig Normal file
View File

@@ -0,0 +1,9 @@
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

14
.gitignore vendored Normal file
View File

@@ -0,0 +1,14 @@
.DS_Store
node_modules/
/dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln

10
.postcssrc.js Normal file
View File

@@ -0,0 +1,10 @@
// https://github.com/michael-ciniawsky/postcss-load-config
module.exports = {
"plugins": {
"postcss-import": {},
"postcss-url": {},
// to edit target browsers: use "browserslist" field in package.json
"autoprefixer": {}
}
}

121
LICENSE Normal file
View File

@@ -0,0 +1,121 @@
木兰宽松许可证, 第1版
木兰宽松许可证, 第1版
2019年8月 http://license.coscl.org.cn/MulanPSL
您对“软件”的复制、使用、修改及分发受木兰宽松许可证第1版“本许可证”的如下条款的约束
0. 定义
“软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。
“贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。
“法人实体”是指提交贡献的机构及其“关联实体”。
“关联实体”是指对“本许可证”下的一方而言控制、受控制或与其共同受控制的机构此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。
“贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。
1. 授予版权许可
每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。
2. 授予专利许可
每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括仅因您或他人修改“贡献”或其他结合而将必然会侵犯到的专利权利要求。如您或您的“关联实体”直接或间接地(包括通过代理、专利被许可人或受让人),就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。
3. 无商标许可
“本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可但您为满足第4条规定的声明义务而必须使用除外。
4. 分发限制
您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。
5. 免责声明与责任限制
“软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。
条款结束。
如何将木兰宽松许可证第1版应用到您的软件
如果您希望将木兰宽松许可证第1版应用到您的新软件为了方便接收者查阅建议您完成如下三步
1 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字;
2 请您在软件包的一级目录下创建以“LICENSE”为名的文件将整个许可证文本放入该文件中
3 请将如下声明文本放入每个源文件的头部注释中。
Copyright (c) [2019] [name of copyright holder]
[Software Name] is licensed under the Mulan PSL v1.
You can use this software according to the terms and conditions of the Mulan PSL v1.
You may obtain a copy of Mulan PSL v1 at:
http://license.coscl.org.cn/MulanPSL
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
PURPOSE.
See the Mulan PSL v1 for more details.
Mulan Permissive Software LicenseVersion 1
Mulan Permissive Software LicenseVersion 1 (Mulan PSL v1)
August 2019 http://license.coscl.org.cn/MulanPSL
Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v1 (this License) with following terms and conditions:
0. Definition
Software means the program and related documents which are comprised of those Contribution and licensed under this License.
Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License.
Legal Entity means the entity making a Contribution and all its Affiliates.
Affiliates means entities that control, or are controlled by, or are under common control with a party to this License, control means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity.
Contribution means the copyrightable work licensed by a particular Contributor under this License.
1. Grant of Copyright License
Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not.
2. Grant of Patent License
Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed, excluding of any patent claims solely be infringed by your or others modification or other combinations. If you or your Affiliates directly or indirectly (including through an agent, patent licensee or assignee, institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken.
3. No Trademark License
No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in section 4.
4. Distribution Restriction
You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software.
5. Disclaimer of Warranty and Limitation of Liability
The Software and Contribution in it are provided without warranties of any kind, either express or implied. In no event shall any Contributor or copyright holder be liable to you for any damages, including, but not limited to any direct, or indirect, special or consequential damages arising from your use or inability to use the Software or the Contribution in it, no matter how its caused or based on which legal theory, even if advised of the possibility of such damages.
End of the Terms and Conditions
How to apply the Mulan Permissive Software LicenseVersion 1 (Mulan PSL v1) to your software
To apply the Mulan PSL v1 to your work, for easy identification by recipients, you are suggested to complete following three steps:
i. Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner;
ii. Create a file named “LICENSE” which contains the whole context of this License in the first directory of your software package;
iii. Attach the statement to the appropriate annotated syntax at the beginning of each source file.
Copyright (c) [2019] [name of copyright holder]
[Software Name] is licensed under the Mulan PSL v1.
You can use this software according to the terms and conditions of the Mulan PSL v1.
You may obtain a copy of Mulan PSL v1 at:
http://license.coscl.org.cn/MulanPSL
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
PURPOSE.
See the Mulan PSL v1 for more details.

38
README.md Normal file
View File

@@ -0,0 +1,38 @@
安装说明:
npm install
npm run dev
npm run build
**此处修改为http不是https了**
http://demo.hyxdsoft.com/
![输入图片说明](https://images.gitee.com/uploads/images/2020/0514/123414_af706583_810825.png "搜狗截图20200514105808.png")
![输入图片说明](https://images.gitee.com/uploads/images/2020/0514/123329_182b3cd7_810825.png "搜狗截图20200514105710.png")
![输入图片说明](https://images.gitee.com/uploads/images/2020/0514/123248_a7b2c881_810825.png "搜狗截图20200514105648.png")
## 新版vue3 ts pinia 上线 访问地址http://demo.hyxdsoft.com/
![输入图片说明](static/1001.png)![输入图片说明](static/1002.png)![输入图片说明](static/1003.png)
![输入图片说明](static/1006.png)![输入图片说明](static/1005.png)![输入图片说明](static/1004.png)
## 智慧党建模板 访问地址http://demo.hyxdsoft.com/
![输入图片说明](static/10021.png)
![输入图片说明](static/10022.png)
![输入图片说明](static/10025.png)
![输入图片说明](static/10024.png)
![输入图片说明](static/10023.png)
## vue3+ts+pinia大气政府门户pc端 http://demo.hyxdsoft.com/
![输入图片说明](static/10031.png)
![输入图片说明](static/10032.png)
![输入图片说明](static/10034.png)
![输入图片说明](static/10033.png)
自适应模板
![输入图片说明](static/1673621785620.png)
![输入图片说明](static/100134.png)

41
build/build.js Normal file
View File

@@ -0,0 +1,41 @@
'use strict'
require('./check-versions')()
process.env.NODE_ENV = 'production'
const ora = require('ora')
const rm = require('rimraf')
const path = require('path')
const chalk = require('chalk')
const webpack = require('webpack')
const config = require('../config')
const webpackConfig = require('./webpack.prod.conf')
const spinner = ora('building for production...')
spinner.start()
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
if (err) throw err
webpack(webpackConfig, (err, stats) => {
spinner.stop()
if (err) throw err
process.stdout.write(stats.toString({
colors: true,
modules: false,
children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
chunks: false,
chunkModules: false
}) + '\n\n')
if (stats.hasErrors()) {
console.log(chalk.red(' Build failed with errors.\n'))
process.exit(1)
}
console.log(chalk.cyan(' Build complete.\n'))
console.log(chalk.yellow(
' Tip: built files are meant to be served over an HTTP server.\n' +
' Opening index.html over file:// won\'t work.\n'
))
})
})

54
build/check-versions.js Normal file
View File

@@ -0,0 +1,54 @@
'use strict'
const chalk = require('chalk')
const semver = require('semver')
const packageConfig = require('../package.json')
const shell = require('shelljs')
function exec (cmd) {
return require('child_process').execSync(cmd).toString().trim()
}
const versionRequirements = [
{
name: 'node',
currentVersion: semver.clean(process.version),
versionRequirement: packageConfig.engines.node
}
]
if (shell.which('npm')) {
versionRequirements.push({
name: 'npm',
currentVersion: exec('npm --version'),
versionRequirement: packageConfig.engines.npm
})
}
module.exports = function () {
const warnings = []
for (let i = 0; i < versionRequirements.length; i++) {
const mod = versionRequirements[i]
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
warnings.push(mod.name + ': ' +
chalk.red(mod.currentVersion) + ' should be ' +
chalk.green(mod.versionRequirement)
)
}
}
if (warnings.length) {
console.log('')
console.log(chalk.yellow('To use this template, you must update following to modules:'))
console.log()
for (let i = 0; i < warnings.length; i++) {
const warning = warnings[i]
console.log(' ' + warning)
}
console.log()
process.exit(1)
}
}

BIN
build/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

101
build/utils.js Normal file
View File

@@ -0,0 +1,101 @@
'use strict'
const path = require('path')
const config = require('../config')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const packageConfig = require('../package.json')
exports.assetsPath = function (_path) {
const assetsSubDirectory = process.env.NODE_ENV === 'production'
? config.build.assetsSubDirectory
: config.dev.assetsSubDirectory
return path.posix.join(assetsSubDirectory, _path)
}
exports.cssLoaders = function (options) {
options = options || {}
const cssLoader = {
loader: 'css-loader',
options: {
sourceMap: options.sourceMap
}
}
const postcssLoader = {
loader: 'postcss-loader',
options: {
sourceMap: options.sourceMap
}
}
// generate loader string to be used with extract text plugin
function generateLoaders (loader, loaderOptions) {
const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
if (loader) {
loaders.push({
loader: loader + '-loader',
options: Object.assign({}, loaderOptions, {
sourceMap: options.sourceMap
})
})
}
// Extract CSS when that option is specified
// (which is the case during production build)
if (options.extract) {
return ExtractTextPlugin.extract({
use: loaders,
fallback: 'vue-style-loader'
})
} else {
return ['vue-style-loader'].concat(loaders)
}
}
// https://vue-loader.vuejs.org/en/configurations/extract-css.html
return {
css: generateLoaders(),
postcss: generateLoaders(),
less: generateLoaders('less'),
sass: generateLoaders('sass', { indentedSyntax: true }),
scss: generateLoaders('sass'),
stylus: generateLoaders('stylus'),
styl: generateLoaders('stylus')
}
}
// Generate loaders for standalone style files (outside of .vue)
exports.styleLoaders = function (options) {
const output = []
const loaders = exports.cssLoaders(options)
for (const extension in loaders) {
const loader = loaders[extension]
output.push({
test: new RegExp('\\.' + extension + '$'),
use: loader
})
}
return output
}
exports.createNotifierCallback = () => {
const notifier = require('node-notifier')
return (severity, errors) => {
if (severity !== 'error') return
const error = errors[0]
const filename = error.file && error.file.split('!').pop()
notifier.notify({
title: packageConfig.name,
message: severity + ': ' + error.name,
subtitle: filename || '',
icon: path.join(__dirname, 'logo.png')
})
}
}

22
build/vue-loader.conf.js Normal file
View File

@@ -0,0 +1,22 @@
'use strict'
const utils = require('./utils')
const config = require('../config')
const isProduction = process.env.NODE_ENV === 'production'
const sourceMapEnabled = isProduction
? config.build.productionSourceMap
: config.dev.cssSourceMap
module.exports = {
loaders: utils.cssLoaders({
sourceMap: sourceMapEnabled,
extract: isProduction
}),
cssSourceMap: sourceMapEnabled,
cacheBusting: config.dev.cacheBusting,
transformToRequire: {
video: ['src', 'poster'],
source: 'src',
img: 'src',
image: 'xlink:href'
}
}

View File

@@ -0,0 +1,82 @@
'use strict'
const path = require('path')
const utils = require('./utils')
const config = require('../config')
const vueLoaderConfig = require('./vue-loader.conf')
function resolve (dir) {
return path.join(__dirname, '..', dir)
}
module.exports = {
context: path.resolve(__dirname, '../'),
entry: {
app: './src/main.js'
},
output: {
path: config.build.assetsRoot,
filename: '[name].js',
publicPath: process.env.NODE_ENV === 'production'
? config.build.assetsPublicPath
: config.dev.assetsPublicPath
},
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src'),
}
},
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader',
options: vueLoaderConfig
},
{
test: /\.js$/,
loader: 'babel-loader',
include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
},
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('media/[name].[hash:7].[ext]')
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
}
}
]
},
node: {
// prevent webpack from injecting useless setImmediate polyfill because Vue
// source contains it (although only uses it if it's native).
setImmediate: false,
// prevent webpack from injecting mocks to Node native modules
// that does not make sense for the client
dgram: 'empty',
fs: 'empty',
net: 'empty',
tls: 'empty',
child_process: 'empty'
}
}

95
build/webpack.dev.conf.js Normal file
View File

@@ -0,0 +1,95 @@
'use strict'
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const path = require('path')
const baseWebpackConfig = require('./webpack.base.conf')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const portfinder = require('portfinder')
const HOST = process.env.HOST
const PORT = process.env.PORT && Number(process.env.PORT)
const devWebpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
},
// cheap-module-eval-source-map is faster for development
devtool: config.dev.devtool,
// these devServer options should be customized in /config/index.js
devServer: {
clientLogLevel: 'warning',
historyApiFallback: {
rewrites: [
{ from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },
],
},
hot: true,
contentBase: false, // since we use CopyWebpackPlugin.
compress: true,
host: HOST || config.dev.host,
port: PORT || config.dev.port,
open: config.dev.autoOpenBrowser,
overlay: config.dev.errorOverlay
? { warnings: false, errors: true }
: false,
publicPath: config.dev.assetsPublicPath,
proxy: config.dev.proxyTable,
quiet: true, // necessary for FriendlyErrorsPlugin
watchOptions: {
poll: config.dev.poll,
}
},
plugins: [
new webpack.DefinePlugin({
'process.env': require('../config/dev.env')
}),
new webpack.HotModuleReplacementPlugin(),
new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
new webpack.NoEmitOnErrorsPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html',
inject: true
}),
// copy custom static assets
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: config.dev.assetsSubDirectory,
ignore: ['.*']
}
])
]
})
module.exports = new Promise((resolve, reject) => {
portfinder.basePort = process.env.PORT || config.dev.port
portfinder.getPort((err, port) => {
if (err) {
reject(err)
} else {
// publish the new Port, necessary for e2e tests
process.env.PORT = port
// add port to devServer config
devWebpackConfig.devServer.port = port
// Add FriendlyErrorsPlugin
devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
compilationSuccessInfo: {
messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
},
onErrors: config.dev.notifyOnErrors
? utils.createNotifierCallback()
: undefined
}))
resolve(devWebpackConfig)
}
})
})

145
build/webpack.prod.conf.js Normal file
View File

@@ -0,0 +1,145 @@
'use strict'
const path = require('path')
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const baseWebpackConfig = require('./webpack.base.conf')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
const env = require('../config/prod.env')
const webpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({
sourceMap: config.build.productionSourceMap,
extract: true,
usePostCSS: true
})
},
devtool: config.build.productionSourceMap ? config.build.devtool : false,
output: {
path: config.build.assetsRoot,
filename: utils.assetsPath('js/[name].[chunkhash].js'),
chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
},
plugins: [
// http://vuejs.github.io/vue-loader/en/workflow/production.html
new webpack.DefinePlugin({
'process.env': env
}),
new UglifyJsPlugin({
uglifyOptions: {
compress: {
warnings: false
}
},
sourceMap: config.build.productionSourceMap,
parallel: true
}),
// extract css into its own file
new ExtractTextPlugin({
filename: utils.assetsPath('css/[name].[contenthash].css'),
// Setting the following option to `false` will not extract CSS from codesplit chunks.
// Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
// It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`,
// increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
allChunks: true,
}),
// Compress extracted CSS. We are using this plugin so that possible
// duplicated CSS from different components can be deduped.
new OptimizeCSSPlugin({
cssProcessorOptions: config.build.productionSourceMap
? { safe: true, map: { inline: false } }
: { safe: true }
}),
// generate dist index.html with correct asset hash for caching.
// you can customize output by editing /index.html
// see https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: config.build.index,
template: 'index.html',
inject: true,
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: true
// more options:
// https://github.com/kangax/html-minifier#options-quick-reference
},
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
chunksSortMode: 'dependency'
}),
// keep module.id stable when vendor modules does not change
new webpack.HashedModuleIdsPlugin(),
// enable scope hoisting
new webpack.optimize.ModuleConcatenationPlugin(),
// split vendor js into its own file
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks (module) {
// any required modules inside node_modules are extracted to vendor
return (
module.resource &&
/\.js$/.test(module.resource) &&
module.resource.indexOf(
path.join(__dirname, '../node_modules')
) === 0
)
}
}),
// extract webpack runtime and module manifest to its own file in order to
// prevent vendor hash from being updated whenever app bundle is updated
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest',
minChunks: Infinity
}),
// This instance extracts shared chunks from code splitted chunks and bundles them
// in a separate chunk, similar to the vendor chunk
// see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
new webpack.optimize.CommonsChunkPlugin({
name: 'app',
async: 'vendor-async',
children: true,
minChunks: 3
}),
// copy custom static assets
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: config.build.assetsSubDirectory,
ignore: ['.*']
}
])
]
})
if (config.build.productionGzip) {
const CompressionWebpackPlugin = require('compression-webpack-plugin')
webpackConfig.plugins.push(
new CompressionWebpackPlugin({
asset: '[path].gz[query]',
algorithm: 'gzip',
test: new RegExp(
'\\.(' +
config.build.productionGzipExtensions.join('|') +
')$'
),
threshold: 10240,
minRatio: 0.8
})
)
}
if (config.build.bundleAnalyzerReport) {
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
webpackConfig.plugins.push(new BundleAnalyzerPlugin())
}
module.exports = webpackConfig

7
config/dev.env.js Normal file
View File

@@ -0,0 +1,7 @@
'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env')
module.exports = merge(prodEnv, {
NODE_ENV: '"development"'
})

69
config/index.js Normal file
View File

@@ -0,0 +1,69 @@
'use strict'
// Template version: 1.3.1
// see http://vuejs-templates.github.io/webpack for documentation.
const path = require('path')
module.exports = {
dev: {
// Paths
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {},
// Various Dev Server settings
host: 'localhost', // can be overwritten by process.env.HOST
port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
autoOpenBrowser: false,
errorOverlay: true,
notifyOnErrors: true,
poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
/**
* Source Maps
*/
// https://webpack.js.org/configuration/devtool/#development
devtool: 'cheap-module-eval-source-map',
// If you have problems debugging vue-files in devtools,
// set this to false - it *may* help
// https://vue-loader.vuejs.org/en/options.html#cachebusting
cacheBusting: true,
cssSourceMap: true
},
build: {
// Template for index.html
index: path.resolve(__dirname, '../dist/index.html'),
// Paths
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: '/',
/**
* Source Maps
*/
productionSourceMap: true,
// https://webpack.js.org/configuration/devtool/#production
devtool: '#source-map',
// Gzip off by default as many popular static hosts such as
// Surge or Netlify already gzip all static assets for you.
// Before setting to `true`, make sure to:
// npm install --save-dev compression-webpack-plugin
productionGzip: false,
productionGzipExtensions: ['js', 'css'],
// Run the build command with an extra argument to
// View the bundle analyzer report after build finishes:
// `npm run build --report`
// Set to `true` or `false` to always turn it on or off
bundleAnalyzerReport: process.env.npm_config_report
}
}

4
config/prod.env.js Normal file
View File

@@ -0,0 +1,4 @@
'use strict'
module.exports = {
NODE_ENV: '"production"'
}

20
index.html Normal file
View File

@@ -0,0 +1,20 @@
<!DOCTYPE html>
<html lang="zh-Hans-CN">
<head>
<meta charset="utf-8"/>
<meta name="Keywords" content="记账,健康档案,负债,信用卡,储蓄卡,刷卡"/>
<meta name="Description"
content="智聪记账、健康档案管理平台、负债记账、储蓄记账、健康档案管理"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"/>
<meta name="apple-mobile-web-app-capable" content="yes"/>
<meta name="apple-mobile-web-app-status-bar-style" content="black"/>
<meta name="format-detection" content="telephone=no,email=no"/>
<meta http-equiv="x-dns-prefetch-control" content="on"/>
<link rel="dns-prefetch" href="http://www.zhichou.com"/>
<title>智聪科技——记账平台、健康档案管理</title>
</head>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

27417
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

68
package.json Normal file
View File

@@ -0,0 +1,68 @@
{
"name": "com_web",
"version": "1.0.0",
"description": "A Vue.js project",
"author": "kaka212000@163.com",
"private": true,
"scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"start": "npm run dev",
"build": "node build/build.js"
},
"dependencies": {
"jsonp": "^0.2.1",
"vue": "^2.7.15",
"vue-carousel": "^0.18.0",
"vue-droplist": "^1.0.6",
"vue-router": "^3.0.1",
"vue-template-compiler": "^2.7.15",
"vuex": "^3.3.0"
},
"devDependencies": {
"autoprefixer": "^7.1.2",
"babel-core": "^6.22.1",
"babel-helper-vue-jsx-merge-props": "^2.0.3",
"babel-loader": "^7.1.1",
"babel-plugin-syntax-jsx": "^6.18.0",
"babel-plugin-transform-runtime": "^6.22.0",
"babel-plugin-transform-vue-jsx": "^3.5.0",
"babel-preset-env": "^1.3.2",
"babel-preset-stage-2": "^6.22.0",
"chalk": "^2.0.1",
"copy-webpack-plugin": "^4.0.1",
"css-loader": "^0.28.0",
"extract-text-webpack-plugin": "^3.0.0",
"file-loader": "^1.1.4",
"friendly-errors-webpack-plugin": "^1.6.1",
"html-webpack-plugin": "^2.30.1",
"less": "^3.9.0",
"less-loader": "^5.0.0",
"node-notifier": "^5.1.2",
"optimize-css-assets-webpack-plugin": "^3.2.0",
"ora": "^1.2.0",
"portfinder": "^1.0.13",
"postcss-import": "^11.0.0",
"postcss-loader": "^2.0.8",
"postcss-url": "^7.2.1",
"rimraf": "^2.6.0",
"semver": "^5.3.0",
"shelljs": "^0.7.6",
"uglifyjs-webpack-plugin": "^1.1.1",
"url-loader": "^0.5.8",
"vue-loader": "^13.3.0",
"vue-style-loader": "^3.0.1",
"webpack": "^3.6.0",
"webpack-bundle-analyzer": "^2.9.0",
"webpack-dev-server": "^2.9.1",
"webpack-merge": "^4.1.0"
},
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
]
}

20
src/Util.js Normal file
View File

@@ -0,0 +1,20 @@
/**
* 常用函数工具类
*/
'use strict'
const userAgent = navigator.userAgent
export default class Util {
static os = {
trident: userAgent.indexOf('Trident') > -1, // IE内核
presto: userAgent.indexOf('Presto') > -1, // opera内核
webKit: userAgent.indexOf('AppleWebKit') > -1, // 苹果、谷歌内核
gecko: userAgent.indexOf('Gecko') > -1 && userAgent.indexOf('KHTML') === -1, // 火狐内核
ios: !!userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), // ios终端
android: userAgent.indexOf('Android') > -1 || userAgent.indexOf('Linux') > -1, // android终端或者uc浏览器
iPhone: userAgent.indexOf('iPhone') > -1, // 是否为iPhone
iPad: userAgent.indexOf('iPad') > -1, // 是否iPad
webApp: userAgent.indexOf('Safari') === -1, // 是否web应该程序没有头部与底部
wechat: userAgent.indexOf('MicroMessenger') > -1
}
}

19
src/assets/css/common.css Normal file
View File

@@ -0,0 +1,19 @@
/* 全局样式 */
.m-0-auto {
margin: 0 auto;
}
.m-0 {
margin: 0;
}
.m-r-5 {
margin-right: 5px;
}
.m-t-5 {
margin-top: 5px;
}
.p-0 {
padding: 0;
}
.w-100pct {
width: 100%;
}

1
src/assets/css/vivify.min.css vendored Normal file

File diff suppressed because one or more lines are too long

BIN
src/assets/img/feature1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
src/assets/img/feature2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

BIN
src/assets/img/feature3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

BIN
src/assets/img/feature4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

475
src/assets/less/normalize.less vendored Normal file
View File

@@ -0,0 +1,475 @@
// =============================================================================
// Normalize.less based on Nicolas Gallagher and Jonathan Neal's
// normalize.css v3.0.1 | MIT License | github.com/necolas/normalize.css
// =============================================================================
//
// Variables
// ====================================================================
// Base font-family
@base-font-family: sans-serif;
// The base font size
@base-font-size: 16px;
// The base line height determines the basic unit of vertical rhythm.
@base-line-height: 24px;
// Heading sizes
@h1-size: 36px;
//
// Mixins
// ====================================================================
//
// Passing in a single value will create font-sizing in
// pixels, rems as well as a proper line-height.
//
// `.font-size(24px, false);`
//
.font-size(@font-size, @line-height: true) {
@px-value: (@font-size);
@rem-value: (@font-size / @base-font-size) * 1rem;
@line-height-value: ceil(@font-size / @base-line-height) * (@base-line-height / @font-size);
font-size: ~"@{px-value}";
font-size: @rem-value;
.line-height(@boolean) when (@boolean = true) {
line-height: unit(@line-height-value);
}
.line-height(@line-height);
}
//
// 1. Set default font family to sans-serif.
// 2. Prevent iOS and IE text size adjust after device orientation change,
// without disabling user zoom.
//
html {
font-size: 100%; // 1 //
-ms-text-size-adjust: 100%; // 2 //
-webkit-text-size-adjust: 100%; // 2 //
}
//
// Remove default margin.
//
body { margin: 0; }
//
// HTML5 display definitions
// ====================================================================
//
// Correct `block` display not defined for any HTML5 element in IE 8/9.
// Correct `block` display not defined for `details` or `summary` in IE 10/11
// and Firefox.
// Correct `block` display not defined for `main` in IE 11.
//
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
menu,
main,
nav,
section,
summary { display: block; }
//
// 1. Correct `inline-block` display not defined in IE 8/9.
// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
//
audio,
canvas,
progress,
video {
display: inline-block; // 1 //
vertical-align: baseline; // 2 //
}
//
// Prevent modern browsers from displaying `audio` without controls.
// Remove excess height in iOS 5 devices.
//
audio:not([controls]) {
display: none;
height: 0;
}
//
// Address `[hidden]` styling not present in IE 8/9/10.
// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.
//
[hidden],
template { display: none; }
//
// Links
// ====================================================================
//
// Remove the gray background color from active links in IE 10.
//
a {
background-color: transparent;
//
// Improve readability of focused elements when they are also in an
// active/hover state.
//
&:focus { outline: thin dotted; }
&:active,
&:hover { outline: 0; }
}
//
// Text-level semantics
// ====================================================================
//
// Address styling not present in IE 8/9/10/11, Safari, and Chrome.
//
abbr[title] { border-bottom: 1px dotted; }
//
// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
//
b,
strong { font-weight: bold; }
//
// Address styling not present in Safari and Chrome.
//
dfn { font-style: italic; }
//
// Address variable `h1` font-size and margin within `section` and `article`
// contexts in Firefox 4+, Safari, and Chrome.
//
h1 {
.font-size(@h1-size);
margin: 0.67em 0;
}
//
// Address styling not present in IE 8/9.
//
mark {
background: #ff0;
color: #000;
}
//
// Address inconsistent and variable font size in all browsers.
//
small { font-size: 80%; }
//
// Prevent `sub` and `sup` affecting `line-height` in all browsers.
//
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sup { top: -0.5em; }
sub { bottom: -0.25em; }
//
// Embedded content
// ====================================================================
//
// Remove border when inside `a` element in IE 8/9/10.
//
img { border: 0; }
//
// Correct overflow not hidden in IE 9/10/11.
//
svg:not(:root) { overflow: hidden; }
//
// Grouping content
// ====================================================================
//
// Address margin not present in IE 8/9 and Safari.
//
figure { margin: 1em 40px; }
//
// Address differences between Firefox and other browsers.
//
hr {
box-sizing: content-box;
height: 0;
}
//
// Contain overflow in all browsers.
//
pre { overflow: auto; }
//
// Address odd `em`-unit font size rendering in all browsers.
//
code,
kbd,
pre,
samp {
font-family: monospace, monospace;
.font-size(@base-font-size);
}
//
// Forms
// ====================================================================
//
// Known limitation: by default, Chrome and Safari on OS X allow very limited
// styling of `select`, unless a `border` property is set.
//
//
// 1. Correct color not being inherited.
// Known issue: affects color of disabled elements.
// 2. Correct font properties not being inherited.
// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
//
button,
input,
optgroup,
select,
textarea {
color: inherit; // 1 //
font: inherit; // 1 //
margin: 0; // 1 //
}
//
// Address `overflow` set to `hidden` in IE 8/9/10/11.
//
button { overflow: visible; }
//
// Address inconsistent `text-transform` inheritance for `button` and `select`.
// All other form control elements do not inherit `text-transform` values.
// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
// Correct `select` style inheritance in Firefox.
//
button,
select { text-transform: none; }
//
// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
// and `video` controls.
// 2. Correct inability to style clickable `input` types in iOS.
// 3. Improve usability and consistency of cursor style between image-type
// `input` and others.
//
button,
html input[type="button"], // 1 //
input[type="reset"],
input[type="submit"] {
-webkit-appearance: button; // 2 //
cursor: pointer; // 3 //
}
//
// Re-set default cursor for disabled elements.
//
button[disabled],
html input[disabled] { cursor: default; }
//
// Remove inner padding and border in Firefox 4+.
//
button::-moz-focus-inner,
input::-moz-focus-inner {
border: 0;
padding: 0;
}
//
// Address Firefox 4+ setting `line-height` on `input` using `!important` in
// the UA stylesheet.
//
input {
line-height: normal;
//
// It's recommended that you don't attempt to style these elements.
// Firefox's implementation doesn't respect box-sizing, padding, or width.
//
// 1. Address box sizing set to `content-box` in IE 8/9/10.
// 2. Remove excess padding in IE 8/9/10.
//
&[type="checkbox"],
&[type="radio"] {
box-sizing: border-box; // 1 //
padding: 0; // 2 //
}
//
// Fix the cursor style for Chrome's increment/decrement buttons. For certain
// `font-size` values of the `input`, it causes the cursor style of the
// decrement button to change from `default` to `text`.
//
&[type="number"] {
&::-webkit-inner-spin-button,
&::-webkit-outer-spin-button { height: auto; }
}
//
// 1. Address `appearance` set to `searchfield` in Safari and Chrome.
// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.
//
&[type="search"] {
-webkit-appearance: textfield; // 1 //
box-sizing: content-box; // 2 //
//
// Remove inner padding and search cancel button in Safari and Chrome on OS X.
// Safari (but not Chrome) clips the cancel button when the search input has
// padding (and `textfield` appearance).
//
&::-webkit-search-cancel-button,
&::-webkit-search-decoration { -webkit-appearance: none; }
}
}
//
// Define consistent border, margin, and padding.
//
fieldset {
border: 1px solid #c0c0c0;
margin: 0 2px;
padding: 0.35em 0.625em 0.75em;
}
//
// 1. Correct `color` not being inherited in IE 8/9/10/11.
// 2. Remove padding so people aren't caught out if they zero out fieldsets.
//
legend {
border: 0; // 1 //
padding: 0; // 2 //
}
//
// Remove default vertical scrollbar in IE 8/9/10/11.
//
textarea { overflow: auto; }
//
// Don't inherit the `font-weight` (applied by a rule above).
// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
//
optgroup { font-weight: bold; }
//
// Tables
// ====================================================================
//
// Remove most spacing between table cells.
//
table {
border-collapse: collapse;
border-spacing: 0;
}
td,
th { padding: 0; }

BIN
src/assets/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

525
src/assets/scss/normalize.scss vendored Normal file
View File

@@ -0,0 +1,525 @@
// =============================================================================
// Normalize.scss based on Nicolas Gallagher and Jonathan Neal's
// normalize.css v2.1.3 | MIT License | git.io/normalize
// =============================================================================
// =============================================================================
// Normalize.scss settings
// =============================================================================
// Set to true if you want to add support for IE6 and IE7
// Notice: setting to true might render some elements
// slightly differently than when set to false
$legacy_support_for_ie: false !default; // Used also in Compass
// Set the default font family here so you don't have to override it later
$normalized_font_family: sans-serif !default;
$normalize_headings: true !default;
$h1_font_size: 2em !default;
$h2_font_size: 1.5em !default;
$h3_font_size: 1.17em !default;
$h4_font_size: 1em !default;
$h5_font_size: 0.83em !default;
$h6_font_size: 0.75em !default;
$h1_margin: 0.67em 0 !default;
$h2_margin: 0.83em 0 !default;
$h3_margin: 1em 0 !default;
$h4_margin: 1.33em 0 !default;
$h5_margin: 1.67em 0 !default;
$h6_margin: 2.33em 0 !default;
$background: #fff !default;
$color: #000 !default;
// =============================================================================
// HTML5 display definitions
// =============================================================================
// Corrects block display not defined in IE6/7/8/9 & FF3
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
nav,
section,
summary {
display: block;
}
// Corrects inline-block display not defined in IE6/7/8/9 & FF3
audio,
canvas,
video {
display: inline-block;
@if $legacy_support_for_ie {
*display: inline;
*zoom: 1;
}
}
// 1. Prevents modern browsers from displaying 'audio' without controls
// 2. Remove excess height in iOS5 devices
audio:not([controls]) {
display: none; // 1
height: 0; // 2
}
//
// Address `[hidden]` styling not present in IE 8/9.
// Hide the `template` element in IE, Safari, and Firefox < 22.
//
[hidden], template {
display: none;
}
// =============================================================================
// Base
// =============================================================================
// 1. Corrects text resizing oddly in IE6/7 when body font-size is set using em units
// http://clagnut.com/blog/348/#c790
// 2. Prevents iOS text size adjust after orientation change, without disabling user zoom
// www.456bereastreet.com/archive/201012/controlling_text_size_in_safari_for_ios_without_disabling_user_zoom/
html {
@if $legacy_support_for_ie {
font-size: 100%; // 1
}
background: $background;
color: $color;
-webkit-text-size-adjust: 100%; // 2
-ms-text-size-adjust: 100%; // 2
}
// Addresses font-family inconsistency between 'textarea' and other form elements.
html,
button,
input,
select,
textarea {
font-family: $normalized_font_family;
}
// Addresses margins handled incorrectly in IE6/7
body {
margin: 0;
}
// =============================================================================
// Links
// =============================================================================
// 1. Remove the gray background color from active links in IE 10.
// 2. Addresses outline displayed oddly in Chrome
// 3. Improves readability when focused and also mouse hovered in all browsers
// people.opera.com/patrickl/experiments/keyboard/test
a {
// 1
background: transparent;
// 2
&:focus {
outline: thin dotted;
}
// 3
&:hover,
&:active {
outline: 0;
}
}
// =============================================================================
// Typography
// =============================================================================
// Addresses font sizes and margins set differently in IE6/7
// Addresses font sizes within 'section' and 'article' in FF4+, Chrome, S5
@if $normalize_headings == true {
h1 {
font-size: $h1_font_size;
margin: $h1_margin;
}
h2 {
font-size: $h2_font_size;
margin: $h2_margin;
}
h3 {
font-size: $h3_font_size;
margin: $h3_margin;
}
h4 {
font-size: $h4_font_size;
margin: $h4_margin;
}
h5 {
font-size: $h5_font_size;
margin: $h5_margin;
}
h6 {
font-size: $h6_font_size;
margin: $h6_margin;
}
}
// Addresses styling not present in IE 8/9, S5, Chrome
abbr[title] {
border-bottom: 1px dotted;
}
// Addresses style set to 'bolder' in FF3+, S4/5, Chrome
b,
strong {
font-weight: bold;
}
@if $legacy_support_for_ie {
blockquote {
margin: 1em 40px;
}
}
// Addresses styling not present in S5, Chrome
dfn {
font-style: italic;
}
// Addresses styling not present in IE6/7/8/9
mark {
background: #ff0;
color: #000;
}
// Addresses margins set differently in IE6/7
@if $legacy_support_for_ie {
p,
pre {
margin: 1em 0;
}
}
// Corrects font family set oddly in IE6, S4/5, Chrome
// en.wikipedia.org/wiki/User:Davidgothberg/Test59
code,
kbd,
pre,
samp {
font-family: monospace, serif;
@if $legacy_support_for_ie {
_font-family: 'courier new', monospace;
}
font-size: 1em;
}
// Improves readability of pre-formatted text in all browsers
pre {
white-space: pre;
white-space: pre-wrap;
word-wrap: break-word;
}
// Set consistent quote types.
q {
quotes: "\201C" "\201D" "\2018" "\2019";
}
// 1. Addresses CSS quotes not supported in IE6/7
// 2. Addresses quote property not supported in S4
// 1
@if $legacy_support_for_ie {
q {
quotes: none;
}
}
// 2
q {
&:before,
&:after {
content: '';
content: none;
}
}
// Address inconsistent and variable font size in all browsers.
small {
font-size: 80%;
}
// Prevents sub and sup affecting line-height in all browsers
// gist.github.com/413930
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sup {
top: -0.5em;
}
sub {
bottom: -0.25em;
}
// =============================================================================
// Lists
// =============================================================================
// Addresses margins set differently in IE6/7
@if $legacy_support_for_ie {
dl,
menu,
ol,
ul {
margin: 1em 0;
}
}
@if $legacy_support_for_ie {
dd {
margin: 0 0 0 40px;
}
}
// Addresses paddings set differently in IE6/7
@if $legacy_support_for_ie {
menu,
ol,
ul {
padding: 0 0 0 40px;
}
}
// Corrects list images handled incorrectly in IE7
nav {
ul,
ol {
@if $legacy_support_for_ie {
list-style-image: none;
}
}
}
// =============================================================================
// Embedded content
// =============================================================================
// 1. Removes border when inside 'a' element in IE6/7/8/9, FF3
// 2. Improves image quality when scaled in IE7
// code.flickr.com/blog/2008/11/12/on-ui-quality-the-little-things-client-side-image-resizing/
img {
border: 0; // 1
@if $legacy_support_for_ie {
-ms-interpolation-mode: bicubic; // 2
}
}
// Corrects overflow displayed oddly in IE9
svg:not(:root) {
overflow: hidden;
}
// =============================================================================
// Figures
// =============================================================================
// Addresses margin not present in IE6/7/8/9, S5, O11
figure {
margin: 0;
}
// =============================================================================
// Forms
// =============================================================================
// Corrects margin displayed oddly in IE6/7
@if $legacy_support_for_ie {
form {
margin: 0;
}
}
// Define consistent border, margin, and padding
fieldset {
border: 1px solid #c0c0c0;
margin: 0 2px;
padding: 0.35em 0.625em 0.75em;
}
// 1. Corrects color not being inherited in IE6/7/8/9
// 2. Remove padding so people aren't caught out if they zero out fieldsets.
// 3. Corrects text not wrapping in FF3
// 4. Corrects alignment displayed oddly in IE6/7
legend {
border: 0; // 1
padding: 0; // 2
white-space: normal; // 3
@if $legacy_support_for_ie {
*margin-left: -7px; // 4
}
}
// 1. Correct font family not being inherited in all browsers.
// 2. Corrects font size not being inherited in all browsers
// 3. Addresses margins set differently in IE6/7, FF3+, S5, Chrome
// 4. Improves appearance and consistency in all browsers
button,
input,
select,
textarea {
font-family: inherit; // 1
font-size: 100%; // 2
margin: 0; // 3
vertical-align: baseline; // 4
@if $legacy_support_for_ie {
*vertical-align: middle; // 4
}
}
// Addresses FF3/4 setting line-height on 'input' using !important in the UA stylesheet
button, input {
line-height: normal;
}
// Address inconsistent `text-transform` inheritance for `button` and `select`.
// All other form control elements do not inherit `text-transform` values.
// Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+.
// Correct `select` style inheritance in Firefox 4+ and Opera.
button,
select {
text-transform: none;
}
// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
// and `video` controls
// 2. Corrects inability to style clickable 'input' types in iOS
// 3. Improves usability and consistency of cursor style between image-type
// 'input' and others
// 4. Removes inner spacing in IE7 without affecting normal text inputs
// Known issue: inner spacing remains in IE6
button,
html input[type="button"], // 1
input[type="reset"],
input[type="submit"] {
-webkit-appearance: button; // 2
cursor: pointer; // 3
@if $legacy_support_for_ie {
*overflow: visible; // 4
}
}
// Re-set default cursor for disabled elements
button[disabled],
input[disabled] {
cursor: default;
}
// Removes inner padding and border in FF3+
// www.sitepen.com/blog/2008/05/14/the-devils-in-the-details-fixing-dojos-toolbar-buttons/
button, input {
&::-moz-focus-inner {
border: 0;
padding: 0;
}
}
// 1. Removes default vertical scrollbar in IE6/7/8/9
// 2. Improves readability and alignment in all browsers
textarea {
overflow: auto; // 1
vertical-align: top; // 2
}
// =============================================================================
// Tables
// =============================================================================
// Remove most spacing between table cells
table {
border-collapse: collapse;
border-spacing: 0;
}
input {
// 1. Addresses appearance set to searchfield in S5, Chrome
// 2. Addresses box-sizing set to border-box in S5, Chrome (include -moz to future-proof)
&[type="search"] {
-webkit-appearance: textfield; // 1
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box; // 2
box-sizing: content-box;
// Remove inner padding and search cancel button in Safari 5 and Chrome
// on OS X.
&::-webkit-search-cancel-button,
&::-webkit-search-decoration {
-webkit-appearance: none;
}
}
// 1. Address box sizing set to `content-box` in IE 8/9/10.
// 2. Remove excess padding in IE 8/9/10.
// 3. Removes excess padding in IE7
// Known issue: excess padding remains in IE6
&[type="checkbox"],
&[type="radio"] {
box-sizing: border-box; // 1
padding: 0; // 2
@if $legacy_support_for_ie {
*height: 13px; // 3
*width: 13px; // 3
}
}
}

6
src/components/App.vue Normal file
View File

@@ -0,0 +1,6 @@
<template>
<router-view></router-view>
</template>
<script>
export default {}
</script>

15
src/components/Button.vue Normal file
View File

@@ -0,0 +1,15 @@
<template>
<button class="zui-button" @click="onClick">
<slot></slot>
</button>
</template>
<script>
import './less/button.less'
export default {
methods: {
onClick (e) {
this.$emit('click', e)
}
}
}
</script>

151
src/components/CaseLogo.vue Normal file
View File

@@ -0,0 +1,151 @@
<template>
<!-- <img alt="zhichou" class="zui-logo" :src="src" @click="onClick"/> -->
<img alt="zhichou" class="zui-logo" :src="src" />
</template>
<script>
import './less/logo.less'
import case1 from './img/case1.png'
import case2 from './img/case2.png'
import case3 from './img/case3.png'
import case4 from './img/case4.png'
import case5 from './img/case5.png'
import case6 from './img/case6.png'
import case7 from './img/case7.png'
import case8 from './img/case8.png'
import case9 from './img/case9.png'
import case10 from './img/case10.png'
import case11 from './img/case11.png'
import case12 from './img/case12.png'
import case13 from './img/case13.png'
import case14 from './img/case14.png'
import case15 from './img/case15.png'
import mcase1 from './img/mcase1.png'
import mcase2 from './img/mcase2.png'
import mcase3 from './img/mcase3.png'
import mcase4 from './img/mcase4.png'
import mcase5 from './img/mcase5.png'
import mcase6 from './img/mcase6.png'
import mcase7 from './img/mcase7.png'
import mcase8 from './img/mcase8.png'
import mcase9 from './img/mcase9.png'
import mcase10 from './img/mcase10.png'
import mcase11 from './img/mcase11.png'
import mcase12 from './img/mcase12.png'
import mcase13 from './img/mcase13.png'
import mcase14 from './img/mcase14.png'
import mcase15 from './img/mcase15.png'
export default {
name: 'CaseLogo',
props: {
type: {
default: 'case1'
},
href: {
default: '/'
}
},
computed: {
src: function () {
if (this.type === 'case1') {
return case1
}
if (this.type === 'case2') {
return case2
}
if (this.type === 'case3') {
return case3
}
if (this.type === 'case4') {
return case4
}
if (this.type === 'case5') {
return case5
}
if (this.type === 'case6') {
return case6
}
if (this.type === 'case7') {
return case7
}
if (this.type === 'case8') {
return case8
}
if (this.type === 'case9') {
return case9
}
if (this.type === 'case10') {
return case10
}
if (this.type === 'case11') {
return case11
}
if (this.type === 'case12') {
return case12
}
if (this.type === 'case13') {
return case13
}
if (this.type === 'case14') {
return case14
}
if (this.type === 'case15') {
return case15
}
if (this.type === 'mcase1') {
return mcase1
}
if (this.type === 'mcase2') {
return mcase2
}
if (this.type === 'mcase3') {
return mcase3
}
if (this.type === 'mcase4') {
return mcase4
}
if (this.type === 'mcase5') {
return mcase5
}
if (this.type === 'mcase6') {
return mcase6
}
if (this.type === 'mcase7') {
return mcase7
}
if (this.type === 'mcase8') {
return mcase8
}
if (this.type === 'mcase9') {
return mcase9
}
if (this.type === 'mcase10') {
return mcase10
}
if (this.type === 'mcase11') {
return mcase11
}
if (this.type === 'mcase12') {
return mcase12
}
if (this.type === 'mcase13') {
return mcase13
}
if (this.type === 'mcase14') {
return mcase14
}
if (this.type === 'mcase15') {
return mcase15
}
}
},
methods: {
onClick: function (e) {
location.assign(this.href)
}
}
}
</script>

View File

@@ -0,0 +1,10 @@
<template>
<div class="customer-case">
<slot></slot>
</div>
</template>
<script>
import './less/customer-case.less'
export default {
}
</script>

17
src/components/Footer.vue Normal file
View File

@@ -0,0 +1,17 @@
<template>
<footer class="zui-footer">
<div class="links">
2024 © 智聪科技 Copyright
<a href="https://beian.miit.gov.cn/" target="_blank"> 鲁ICP备2024118666号-1</a>
</div>
<p class="copy-right">
<br>
</p>
</footer>
</template>
<script>
import './less/footer.less'
export default {}
</script>

View File

@@ -0,0 +1,15 @@
<template>
<div class="zui-form-item">
<label class="zui-form-label">{{label}}</label>
<slot></slot>
</div>
</template>
<script>
export default {
props: {
label: {
default: ''
}
}
}
</script>

17
src/components/Header.vue Normal file
View File

@@ -0,0 +1,17 @@
<template>
<header class="zui-header">
<slot></slot>
</header>
</template>
<script>
import './less/header.less'
import Logo from './Logo'
export default {
props: {
logoType: {
default: 'zhichou'
}
},
components: {Logo}
}
</script>

10
src/components/Label.vue Normal file
View File

@@ -0,0 +1,10 @@
<template>
<label class="zui-label">
<slot></slot>
<span class="zui-label-triangle"></span>
</label>
</template>
<script>
import './less/label.less'
export default {}
</script>

View File

@@ -0,0 +1,15 @@
<template>
<div class="zui-loading">
<div class="zui-loading-content">
<div class="zui-loading-dot white"></div>
<div class="zui-loading-dot"></div>
<div class="zui-loading-dot"></div>
<div class="zui-loading-dot"></div>
<div class="zui-loading-dot"></div>
</div>
</div>
</template>
<script>
import './less/loading.less'
export default {}
</script>

56
src/components/Logo.vue Normal file
View File

@@ -0,0 +1,56 @@
<template>
<img alt="xiaoyanyun" class="zui-logo" :src="src" @click="onClick"/>
</template>
<script>
import './less/logo.less'
import logo from './img/logo.png'
import zlogo from './img/zlogo.png'
import hrLogo from './img/hr-logo.png'
import plusLogo from './img/plus-logo.png'
import mlogo from './img/m-logo.png'
import mhrLogo from './img/m-hr-logo.png'
import mplusLogo from './img/m-plus-logo.png'
export default {
name: 'Logo',
props: {
type: {
default: 'xiaoyanyun'
},
href: {
default: '/'
}
},
computed: {
src: function () {
if (this.type === 'xiaoyanyun') {
return logo
}
if (this.type === 'zhongtai') {
return zlogo
}
if (this.type === 'mzhichou') {
return mlogo
}
if (this.type === 'hr') {
return hrLogo
}
if (this.type === 'mhr') {
return mhrLogo
}
if (this.type === 'plus') {
return plusLogo
}
if (this.type === 'mplus') {
return mplusLogo
}
}
},
methods: {
onClick: function (e) {
if(this.type==="xiaoyanyun"){
location.assign(this.href)
}
}
}
}
</script>

38
src/components/Page.vue Normal file
View File

@@ -0,0 +1,38 @@
<template>
<div :class="cls">
<slot></slot>
<zui-toast v-if="toastText!==''">
{{toastText}}
</zui-toast>
<zui-loading v-if="loadingVisible"/>
</div>
</template>
<script>
import './less/page.less'
import '../assets/css/vivify.min.css'
import ZuiToast from './Toast'
import ZuiLoading from './Loading'
import Util from '../Util'
export default {
props: {
title: '智聪'
},
components: {
ZuiToast,
ZuiLoading
},
computed: {
cls () {
const cls = (Util.os.android || Util.os.iPhone) ? '' : 'min-1200'
return 'zui-page ' + cls
},
toastText () {
return this.$store.state.toastText
},
loadingVisible () {
return this.$store.state.loadingVisible
}
}
}
</script>

9
src/components/Toast.vue Normal file
View File

@@ -0,0 +1,9 @@
<template>
<div class="zui-toast">
<slot></slot>
</div>
</template>
<script>
import './less/toast.less'
export default {}
</script>

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

BIN
src/components/img/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

View File

View File

@@ -0,0 +1,11 @@
@import "./mixin";
.@{prefix}-button{
color: #fff;
font-size: 14px;
line-height: 50px;
border-radius: 6px;
background: #F7931E;
min-width: 190px;
.cursor();
}

View File

@@ -0,0 +1,126 @@
.customer-case {
margin: 0 auto;
max-width: 1120px;
padding: 90px 0 100px 0;
h2 {
color: #F7931E;
font-size: 40px;
text-align: center;
}
p {
color: #808080;
font-size: 20px;
text-align: center;
margin-top: 15px;
}
.customer-case-carousel {
margin-top: 35px;
.customer-case-carousel-item {
float: left;
max-width: 540px;
min-height: 320px;
margin: 10px;
padding: 20px 0;
background: #DEF0EF;
border: 2px dashed #6AC2B5;
position: relative;
&:after {
clear: both;
content: '';
display: table;
}
h3 {
font-size: 30px;
text-align: center;
margin: 0 50px;
padding: 0 0 10px 0;
border-bottom: 3px solid #6AC2B5;
}
h5{
color: #808080;
font-size: 20px;
text-align: center;
font-weight: normal;
margin-top: 10px;
}
.labels{
position: relative;
.zui-label {
top: -5px;
left: 20px;
display: block;
min-width: 116px;
position: absolute;
&:nth-child(2){
top: 50px;
}
}
p {
color: #000;
font-size: 25px;
text-align: left;
padding: 0 30px 0 165px;
margin-top: 20px;
}
}
}
}
}
@media (max-width: 420px) {
.customer-case{
max-width: 100%;
padding: 25px 10px;
h2{
font-size:24px;
}
p{
font-size: 12px;
margin-top: 10px;
}
.customer-case-carousel{
margin-top: 25px;
.customer-case-carousel-item{
margin: 10px 0;
padding: 10px 0;
min-width: 100%;
min-height: auto;
h3{
font-size: 16px;
margin: 0 20px;
}
h5{
font-size: 12px;
}
.labels{
.zui-label{
top: -5px;
left: 20px;
font-size: 12px;
min-width: 85px;
&:nth-child(2){
top: 30px;
}
}
p{
font-size: 14px;
margin: 10px 0 0 0;
padding: 0 20px 0 125px;
}
}
}
.VueCarousel-pagination{
.VueCarousel-dot-container{
.VueCarousel-dot{
margin-top: 0!important;
padding: 5px!important;
.VueCarousel-dot-inner{
width: 8px!important;
height: 8px!important;
}
}
}
}
}
}
}

View File

@@ -0,0 +1,38 @@
.zui-flag {
padding: 20px 20px 0 20px;
width: 170px;
margin-bottom: 85px;
background: #32ADC6;
position: relative;
.zui-flag-border{
color: #fff;
font-size: 14px;
line-height: 40px;
width: 130px;
height: 117px;
border-top: 3px solid #fff;
border-left: 3px solid #fff;
border-right: 3px solid #fff;
display: inline-block;
}
.zui-label-triangle {
width: 0;
height: 0;
border-left: 85px solid transparent;
border-right: 85px solid transparent;
border-top: 80px solid #32ADC6;
bottom: -80px;
left: 0;
position: absolute;
}
.zui-label-small-triangle {
width: 0;
height: 0;
border-left: 85px solid transparent;
border-right: 85px solid transparent;
border-top: 80px solid #32ADC6;
bottom: -80px;
left: 0;
position: absolute;
}
}

View File

@@ -0,0 +1,56 @@
@import './mixin';
.@{prefix}-footer {
width: 100%;
min-height: 125px;
background: #646464;
padding: 40px 0 0 0;
.links {
color: #fff;
font-size: 16px;
text-align: center;
a {
color: #fff;
&:after {
content: '|';
margin: 0 10px;
}
&:last-child:after {
content: '';
}
&:hover {
color: #35A3BA;
&:after {
color: #fff;
}
}
}
br {
display: none;
}
}
.copy-right {
color: #fff;
font-size: 12px;
text-align: center;
margin: 8px 0 0 0;
padding-bottom: 10px;
}
}
@media (max-width: 420px) {
.@{prefix}-footer {
.links {
a {
margin: 0 5px;
font-size: 12px;
&:after {
content: none;
}
}
br {
display: block;
}
}
}
}

View File

@@ -0,0 +1,57 @@
.zui-form {
.zui-form-item {
font-size: 0;
margin: 15px 0;
.zui-form-label {
font-size: 16px;
min-width: 95px;
text-align: right;
display: inline-block;
padding: 10px 30px 10px 0;
}
.zui-form-input{
min-width: 610px;
font-size: 16px;
line-height: 50px;
padding: 0 10px;
border: 1px solid #B3B3B3;
background: #F2F2F2;
&:focus{
border-color: #F7931E;
}
}
.zui-button{
min-width: 610px;
}
}
}
@media (max-width: 420px) {
.zui-form{
padding: 20px;
.zui-form-item{
margin: 10px 0;
position: relative;
.zui-form-label{
padding: 0;
text-align: left;
line-height: 25px;
top: 2px;
left: 5px;
position: absolute;
}
.zui-form-input{
width: 100%;
min-width: 100px;
line-height: 25px;
padding-left: 75px;
text-align: right;
}
.zui-button{
margin: 0;
width: 100%;
min-width: 100px;
line-height: 30px;
}
}
}
}

View File

@@ -0,0 +1,80 @@
@import "./mixin.less";
.@{prefix}-header {
width: 100%;
height: 100px;
.float-clear;
.@{prefix}-logo{
width: 160px;
height: 100px;
margin: 0 0 0 20px;
float: left;
}
.@{prefix}-logo-text{
float: left;
height: 100px;
color: #36A4BB;
font-size: 16px;
padding-top: 28px;
margin: 0 0 0 10px;
}
.@{prefix}-button{
float: right;
line-height: 40px;
background: #236579;
margin: 30px 30px 0 0;
min-width: 100px;
border-radius: 10px;
}
.@{prefix}-rightcol{
display: none;
}
.@{prefix}-logo-line {
width: 1px;
height: 45px;
top: 30px;
left: 10px;
float: left;
position: relative;
background: #32adc6;
}
}
@media (max-width: 420px) {
.@{prefix}-header{
height: 60px;
.zui-logo{
height: 60px;
width: 100px;
margin: 0 0 0 10px;
}
.@{prefix}-logo-text{
padding-top: 14px;
font-size: 12px;
height: 60px;
}
.@{prefix}-button{
display: none;
}
.@{prefix}-rightcol{
display: flex;
float: right;
line-height: 30px;
margin: 15px 10px 0 0;
min-width: 50px;
font-weight: bold;
color: #32adc6;
}
.@{prefix}-logo-line {
width: 1px;
height: 30px;
background: #32adc6;
display: inline-block;
position: relative;
top: 15px;
left: 5px;
}
}
}

View File

@@ -0,0 +1,35 @@
.zui-label {
color: #fff;
font-size: 14px;
line-height: 40px;
text-align: center;
padding: 0 20px;
margin-right: 20px;
background: #6AC2B5;
position: relative;
display: inline-block;
.zui-label-triangle {
width: 0;
height: 0;
border-top: 20px solid transparent;
border-left: 20px solid #6AC2B5;
border-bottom: 20px solid transparent;
right: -20px;
top: 0;
position: absolute;
}
}
@media (max-width: 420px) {
.zui-label{
line-height: 25px;
padding: 0 10px;
min-width: 85px;
.zui-label-triangle{
border-top: 11px solid transparent;
border-left: 12px solid #6AC2B5;
border-bottom: 15px solid transparent;
right: -11px;
}
}
}

View File

@@ -0,0 +1,151 @@
@import './mixin';
.@{prefix}-loading {
top: 0;
bottom: 0;
left: 0;
right: 0;
z-index: 1;
width: 3em;
height: 3em;
margin: auto;
position: fixed;
-webkit-animation: rotate .8s linear infinite;
-moz-animation: rotate .8s linear infinite;
-o-animation: rotate .8s linear infinite;
animation: rotate .8s linear infinite;
.@{prefix}-loading-content{
.@{prefix}-loading-dot{
position: absolute;
margin: auto;
width: 1em;
height: 1em;
border-radius: 100%;
-webkit-transition: all .8s ease;
-moz-transition: all .8s ease;
-o-transition: all .8s ease;
transition: all .8s ease;
&.white {
top: 0;
bottom: 0;
left: 0;
right: 0;
background: white;
opacity: 0;
-webkit-animation: flash .8s linear infinite;
-moz-animation: flash .8s linear infinite;
-o-animation: flash .8s linear infinite;
animation: flash .8s linear infinite;
}
&:nth-child(2) {
top: 0;
bottom: 0;
left: 0;
background: #FF4444;
-webkit-animation: dotsY .8s linear infinite;
-moz-animation: dotsY .8s linear infinite;
-o-animation: dotsY .8s linear infinite;
animation: dotsY .8s linear infinite;
}
&:nth-child(3) {
left: 0;
right: 0;
top: 0;
background: #FFBB33;
-webkit-animation: dotsX .8s linear infinite;
-moz-animation: dotsX .8s linear infinite;
-o-animation: dotsX .8s linear infinite;
animation: dotsX .8s linear infinite;
}
&:nth-child(4) {
top: 0;
bottom: 0;
right: 0;
background: #99CC00;
-webkit-animation: dotsY .8s linear infinite;
-moz-animation: dotsY .8s linear infinite;
-o-animation: dotsY .8s linear infinite;
animation: dotsY .8s linear infinite;
}
&:nth-child(5) {
left: 0;
right: 0;
bottom: 0;
background: #33B5E5;
-webkit-animation: dotsX .8s linear infinite;
-moz-animation: dotsX .8s linear infinite;
-o-animation: dotsX .8s linear infinite;
animation: dotsX .8s linear infinite;
}
}
@keyframes rotate {
0% {
-webkit-transform: rotate(0);
-moz-transform: rotate(0);
-o-transform: rotate(0);
transform: rotate(0);
}
10% {
width: 3em;
height: 3em;
}
66% {
width: 1em;
height: 1em;
}
100% {
-webkit-transform: rotate(360deg);
-moz-transform: rotate(360deg);
-o-transform: rotate(360deg);
transform: rotate(360deg);
width: 3em;
height: 3em;
}
}
@keyframes dotsY {
66% {
opacity: .1;
width: 1em;
}
77% {
opacity: 1;
width: 0;
}
}
@keyframes dotsX {
66% {
opacity: .1;
height: 1em;
}
77% {
opacity: 1;
height: 0;
}
}
@keyframes flash {
33% {
opacity: 0;
border-radius: 0%;
}
55% {
opacity: .6;
border-radius: 100%;
}
66% {
opacity: 0;
}
}
}
}

View File

@@ -0,0 +1,5 @@
.zui-logo {
width: 150px;
height: 52px;
cursor: pointer;
}

View File

@@ -0,0 +1,280 @@
.transform(@t) {
-webkit-transform: @t;
transform: @t;
}
.transform-origin(@to) {
-webkit-transform-origin: @to;
transform-origin: @to;
}
.transition(@value) {
-webkit-transition: @value;
}
.hairline-top(@color) {
&:before {
content: '';
position: absolute;
left: 0;
top: 0;
bottom: auto;
right: auto;
height: 2px;
width: 100%;
background-color: transparent;
border-top: 1px solid @color;
display: block;
z-index: 15;
.transform-origin(50% 0%);
html.pixel-ratio-2 & {
.transform(scaleY(0.5));
}
html.pixel-ratio-3 & {
.transform(scaleY(0.33));
}
html.pixel-ratio-4 & {
.transform(scaleY(0.25));
}
}
}
.hairline-left(@color) {
&:before {
content: '';
position: absolute;
left: 0;
top: 0;
bottom: auto;
right: auto;
width: 1px;
height: 100%;
background-color: @color;
display: block;
z-index: 15;
.transform-origin(0% 50%);
html.pixel-ratio-2 & {
.transform(scaleX(0.5));
}
html.pixel-ratio-3 & {
.transform(scaleX(0.33));
}
html.pixel-ratio-4 & {
.transform(scaleX(0.25));
}
}
}
.hairline-bottom(@color, @left:0) {
&:after {
content: '';
position: absolute;
left: @left;
bottom: 0;
right: auto;
top: auto;
height: 2px;
width: 100%;
background-color: transparent;
border-bottom: 1px solid @color;
display: block;
z-index: 15;
.transform-origin(50% 100%);
html.pixel-ratio-2 & {
.transform(scaleY(0.5));
}
html.pixel-ratio-3 & {
.transform(scaleY(0.33));
}
html.pixel-ratio-4 & {
.transform(scaleY(0.25));
}
}
}
.hairline-right(@color) {
&:after {
content: '';
position: absolute;
right: 0;
top: 0;
left: auto;
bottom: auto;
width: 1px;
height: 100%;
background-color: @color;
display: block;
z-index: 15;
.transform-origin(100% 50%);
html.pixel-ratio-2 & {
.transform(scaleX(0.5));
}
html.pixel-ratio-3 & {
.transform(scaleX(0.33));
}
html.pixel-ratio-4 & {
.transform(scaleX(0.25));
}
}
}
// For right and bottom
.hairline-remove-right-bottom {
&:after {
display: none;
}
}
// For left and top
.hairline-remove-left-top {
&:before {
display: none;
}
}
// Encoded SVG Background
.encoded-svg-background(@svg) {
@url: `encodeURIComponent(@{svg})`;
background-image: url("data:image/svg+xml;charset=utf-8,@{url}");
}
.align-self(@as) {
-ms-flex-item-align: @as;
-webkit-align-self: @as;
align-self: @as;
}
.ellipsis() {
width: auto;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.backgroundSize(@width,@height) {
-webkit-background-size: @width @height;
}
.display-box() {
display: flex;
}
.flex-direction(@direction: row) {
flex-direction: @direction;
}
.flex-wrap(@wrap: nowrap) {
flex-wrap: @wrap;
}
.flex-justify(@justify: flex-start) {
justify-content: @justify;
}
.box-align(@align: center) {
align-items: @align;
}
.box-align-content(@alignContent: stretch) {
align-content: @alignContent;
}
.box-flex(@scale: 1) {
flex: @scale;
}
.border-radius(@radius: 0) {
border-top-left-radius: @radius;
border-top-right-radius: @radius;
border-bottom-left-radius: @radius;
border-bottom-right-radius: @radius;
-webkit-background-clip: padding-box;
}
.background(@start: #ffffff, @end: #000000) {
background: @end;
background-image: -webkit-gradient(linear, left top, left bottom, from(@start), to(@end)); /* Saf4+, Chrome */
background-image: linear-gradient(@start, @end);
}
.border-1px-bottom(@color: #d2d2d2) {
background: left bottom repeat-x;
background-image: -webkit-gradient(linear, left top, left bottom, color-stop(.5, transparent), color-stop(.5, @color), to(@color));
background-image: linear-gradient(left top, left bottom, color-stop(.5, transparent), color-stop(.5, @color), to(@color));
-webkit-background-size: 100% 1px;
background-size: 100% 1px;
}
.border-1px-top(@color: #d2d2d2) {
background: left top repeat-x;
background-image: -webkit-gradient(linear, left top, left bottom, from(@color), color-stop(.5, @color), color-stop(.5, transparent));
background-image: linear-gradient(left top, left bottom, from(@color), color-stop(.5, @color), color-stop(.5, transparent));
-webkit-background-size: 100% 1px;
background-size: 100% 1px;
}
.border-1px-both(@color: #d2d2d2) {
background-position: left top, left bottom;
background-repeat: repeat-x, repeat-x;
background-image: -webkit-gradient(linear, left top, left bottom, from(@color), color-stop(.5, @color), color-stop(.5, transparent)), -webkit-gradient(linear, left top, left bottom, color-stop(.5, transparent), color-stop(.5, @color), to(@color));
background-image: linear-gradient(left top, left bottom, from(@color), color-stop(.5, @color), color-stop(.5, transparent)), linear-gradient(left top, left bottom, color-stop(.5, transparent), color-stop(.5, @color), to(@color));
-webkit-background-size: 100% 1px, 100% 1px;
background-size: 100% 1px, 100% 1px;
}
.border-1px-scale(@color: #d2d2d2) {
position: relative;
&:before {
content: '';
position: absolute;
bottom: -1px;
left: 0px;
right: 0px;
border-bottom: 1px solid @color;
-webkit-transform: scaleY(.5);
-webkit-transform-origin: 0px 0px;
}
}
.box-sizing(@sizing: border-box) {
-webkit-box-sizing: @sizing;
}
.box-shadow(@value) {
-webkit-box-shadow: @value;
}
.box-shadow(@value1, @value2) {
-webkit-box-shadow: @value1, @value2;
}
.ellipsis(@w:auto) {
width: @w;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
word-wrap: normal;
}
.float-clear() {
&:after {
visibility: hidden;
display: block;
font-size: 0px;
content: ' ';
clear: both;
height: 0px;
}
}
.cursor() {
cursor: pointer;
}
.overflow-scroll() {
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
}
@colorMain: #6ac2b6;
@prefix: zui;

View File

@@ -0,0 +1,20 @@
@import './reset.less';
.zui-page {
width: 100%;
min-height: 100%;
margin: 0 auto;
font-family: "微软雅黑", "Helvetica Neue", Helvetica, Arial, sans-serif;
&.min-1200 {
min-width: 1200px;
}
a:hover {
color: #35A3BA;
text-decoration: underline;
}
.clear:after {
content: '';
display: table;
clear: both;
}
}

View File

@@ -0,0 +1,84 @@
* {
margin: 0;
padding: 0;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-o-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
html {
-ms-touch-action: none;
}
html, body {
-webkit-text-size-adjust: none;
margin: 0;
height: 100%;
font-size: 14px !important;
::-webkit-scrollbar {
width: 0;
}
}
ul,
ol {
list-style: none;
}
a {
color: #32ADC6;
text-decoration: none;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
button {
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
input, button, textarea {
-webkit-appearance: none;
appearance: none;
border: none;
outline: none;
}
input:active, textarea:active, select:active {
border: none;
}
input, textarea, select {
font-size: 14px;
}
img {
border: none;
}
input::-webkit-input-placeholder, textarea::-webkit-input-placeholder {
/* WebKit browsers */
color: #999;
}
input:-moz-placeholder, textarea:-moz-placeholder {
/* Mozilla Firefox 4 to 18 */
color: #999;
}
input::-moz-placeholder, textarea::-moz-placeholder {
/* Mozilla Firefox 19+ */
color: #999;
}
input:-ms-input-placeholder, textarea:-ms-input-placeholder {
/* Internet Explorer 10+ */
color: #999;
}
/*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/
::-webkit-scrollbar {
width: 0;
height: 0;
}

View File

@@ -0,0 +1,23 @@
@import "./mixin";
.@{prefix}-toast{
top: 50%;
left: 50%;
width: 250px;
padding: 20px;
position: fixed;
color: #fff;
font-size: 16px;
text-align: center;
border-radius: 10px;
background: rgba(0,0,0,.7);
animation: toastScaleIn .2s ease forwards;
@keyframes toastScaleIn {
0%{
transform: scale(.8, .8) translate(-50%, -50%);
}
100%{
transform: scale(1, 1) translate(-50%, -50%);
}
}
}

View File

@@ -0,0 +1,44 @@
$color-blue: #26a2ff;
$color-white: #fff;
$color-grey: #d9d9d9;
$border-color: #c8c8cd;
$success-color: #4caf50;
$error-color: #f44336;
$warning-color: #ffc107;
/* Cell Component */
$cell-value-color: #888;
/* Header Component */
$header-height: 40px;
/* Button Component */
$button-default-color: #656b79;
$button-default-background-color: #f6f8fa;
$button-default-plain-color: #5a5a5a;
$button-default-box-shadow: 0 0 1px #b8bbbf;
$button-primary-color: #fff;
$button-primary-background-color: #26a2ff;
$button-danger-color: #fff;
$button-danger-background-color: #ef4f4f;
/* Tab Item Component */
$tab-item-font-size: 12px;
/* Tabbar Component */
$tabbar-background-color: #fafafa;
$tabbar-tab-item-selected-background-color: #eaeaea;
$tabbar-tab-item-selected-color: $color-blue;
/* Navbar Component */
$navbar-background-color: #fafafa;
$tabbar-tab-item-selected-background-color: #eaeaea;
/* Checklist Component */
$checklist-title-color: #888;
/* Radio Component */
$radio-title-color: #888;
/* z-index */
$z-index-normal: 1;

12
src/main.js Normal file
View File

@@ -0,0 +1,12 @@
import Vue from 'vue'
import store from './store'
import router from './router'
import App from './components/App'
new Vue({
router,
store,
template: '<App/>',
components: { App }
}).$mount('#app')

29
src/router/index.js Normal file
View File

@@ -0,0 +1,29 @@
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
const HomePage = () => import('../views/HomePage')
const router = new VueRouter({
mode: 'history',
base: __dirname,
routes: [{
path: '/',
component: HomePage
},
{
path: '/callus',
component: () => import('@/views/callus'),
hidden: true
},
{
path: '/resource',
component: () => import('@/views/resource'),
hidden: true
}
]
});
export default router;

View File

@@ -0,0 +1,81 @@
'use strict'
import jsonp from 'jsonp'
import store from '../store'
const buildQuery = (data) => {
let query = ''
for (let i in data) {
let queryItem = ''
if (Object.prototype.toString.call(data[i]) === '[object Array]') {
queryItem = data[i].map((item, key) => {
return i + '[' + key + ']=' + item
}).join('&')
} else {
queryItem = i + '=' + encodeURIComponent(data[i])
}
query += queryItem + '&'
}
return query.substr(0, query.length - 1)
}
const buildUrl = (path, data) => {
const protocol = location.href.indexOf('https') === -1 ? 'http://' : 'https://'
const host = path.indexOf('//') === -1 ? protocol + process.env.API_HOST + '/' : ''
const query = data ? '?' + buildQuery(data) : ''
return host + path + query
}
const beforeSend = (data) => {
if (data && data.loading === false) {
store.commit('loading', false)
} else {
store.commit('loading', true)
window.ajaxnum = (window.ajaxnum || 0) + 1
}
}
const afterSend = (data) => {
store.commit('loading', false)
window.ajaxnum = (window.ajaxnum || 0) + 1
}
const onStatusError = (res) => {
if (res.status === 40001) {
store.commit('requireLogin')
return false
}
store.commit('toast', res.message || '请求错误, 请稍候重试')
}
const onRequestError = (err) => {
store.commit('requestError', err)
}
export default class BaseService {
/**
* send jsonp request
* @param url
* @param data
* @param onSuccess
* @param onError
*/
static jsonp = (url, data, onSuccess, onError) => {
beforeSend(data)
jsonp(buildUrl(url, data), {
timeout: 10000
}, (err, res) => {
afterSend(res)
if (err != null) {
onRequestError(err)
return false
}
if (res.status !== 0 && res.status !== 40006 && res.status !== 80001) {
onStatusError(res)
return false
}
onSuccess && onSuccess(res)
})
}
}

View File

@@ -0,0 +1,7 @@
import BaseService from './BaseService'
export default class FeedbackService {
static create = (data, success) => {
BaseService.jsonp('feedback/create', data, success)
}
}

View File

@@ -0,0 +1,7 @@
import BaseService from './BaseService'
export default class UserService {
static feedback = (data, success) => {
BaseService.jsonp('user/feedback', data, success)
}
}

28
src/store/index.js Normal file
View File

@@ -0,0 +1,28 @@
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
toastText: '',
loadingVisible: false
},
mutations: {
increment (state) {
state.count++
},
toast (state, text) {
state.toastText = text
setTimeout(() => {
state.toastText = ''
}, 2000)
},
loading (state, loadingVisible) {
state.loadingVisible = loadingVisible
},
requireLogin (state) {
const host = process.env.NODE_ENV === 'development' ? 'wxtest.zhichou.com' : 'wx.zhichou.com'
location.assign('http://' + host + '/#/me/login?rurl=' + encodeURIComponent(location.href))
}
}
})

168
src/views/HomePage.vue Normal file
View File

@@ -0,0 +1,168 @@
<template>
<page class="home-page">
<zui-header>
<logo type="xiaoyanyun" href="/"></logo>
<h4 class="zui-logo-text">
|&nbsp;&nbsp;记账专家
<br/>|&nbsp;&nbsp;健康帮手
</h4>
<div class="zui-rightcol" @click="openMenu" style="color: #0b8ba5;">目录</div>
<drop-list :config="configData" ref="droplist"></drop-list>
<zui-button @click="onButtonClick('callus')">联系我们</zui-button>
<zui-button @click="onButtonClick('resource')">资料下载</zui-button>
<zui-button @click="onButtonClick('health')">健康档案</zui-button>
<zui-button @click="onButtonClick('invest')">记账平台</zui-button>
<zui-button @click="onButtonClick('home')">首页</zui-button>
</zui-header>
<div class="banner vivify fadeIn">
<h1 class="vivify popIn">
<span class="br"></span>科学记账量入为出健康档案守护未来
</h1>
<h3 class="vivify popIn">技术引领服务为基础科技为核心</h3>
</div>
<div class="nav clear">
<a class="zhichou vivify popIn">
<div class="watermark blue">记账</div>
<logo type="zhongtai"></logo>
<logo class="mobile" type="mzhichou"></logo>
<h3>解决个人记账难题</h3>
<h4>好用·易用·终生免费>></h4>
</a>
<a class="hr vivify popIn delay-200">
<div class="watermark green">服务</div>
<logo type="hr"></logo>
<logo class="mobile" type="mhr"></logo>
<h3>健康档案管理专家</h3>
<h4>专业·准确·高效>></h4>
</a>
<a class="plus vivify popIn delay-400">
<div class="watermark blue">使用</div>
<logo type="plus"></logo>
<logo class="mobile" type="mplus"></logo>
<h3>保障平台无间断运营</h3>
<h4>后顾无忧·持续创新>></h4>
</a>
</div>
<div class="service">
<h1>
您身边的资产记账专家健康档案好帮手
</h1>
<h3>
专业高效满足您的记账需求健康记录
</h3>
<h4>
无需下载永久免费
</h4>
</div>
<div class="features">
<ul>
<li>
<img :src="feature1"/>
<h4>记账管理</h4>
<p>为您提供最专业的记账服务</p>
</li>
<li>
<img :src="feature2"/>
<h4>健康档案</h4>
<p>满足健康档案记录迫切需求</p>
</li>
<li>
<img :src="feature3"/>
<h4>专业团队</h4>
<p>专业的研发团队系统可靠</p>
</li>
<li>
<img :src="feature4"/>
<h4>产品服务</h4>
<p>为您提供24小时不间断服务</p>
</li>
</ul>
</div>
<!-- <div class="customer-case-logo">
<img :src="companyLogo"/>
<img class="mobile" :src="mcompanyLogo"/>
</div> -->
<div class="apply-hr">
<h2>
智聪科技优享服务
</h2>
<h4>
提供个人记账健康档案系统解决方案
</h4>
</div>
<zui-footer/>
</page>
</template>
<script>
import './less/home-page.less'
import Logo from '../components/Logo'
import Page from '../components/Page'
import ZuiHeader from '../components/Header'
import ZuiFooter from '../components/Footer'
import ZuiButton from '../components/Button'
import feature1 from '../assets/img/feature1.png'
import feature2 from '../assets/img/feature2.png'
import feature3 from '../assets/img/feature3.png'
import feature4 from '../assets/img/feature4.png'
import Util from '../Util'
import DropList from 'vue-droplist'
export default{
components: {Page, Logo, ZuiHeader, ZuiFooter,ZuiButton,DropList},
data () {
return {
feature1: feature1,
feature2: feature2,
feature3: feature3,
feature4: feature4,
carouselPerPage: (Util.os.android || Util.os.iPhone) ? 1 : 2,
configData : {
position: { // 设置显示位置position
top: '60px',
right: '15px',
bottom: '',
left: ''
},
width: '40%', // 设置宽度
list: [ // 设置下拉列表数据和对应的点击事件
{text: '首页', action: this.gocallus},
{text: '记账平台', action: this.goinvest},
{text: '健康档案', action: this.gohealth},
{text: '资料下载', action: this.goresource},
{text: '联系我们', action: this.gocallus}
]
}
}
},
methods: {
onButtonClick: function (e) {
if(e=="callus"){
this.$router.push({path:'/callus'})
}else if(e=="invest"){
window.open("http://152.136.151.187:8080/admin/", '_blank');
}else if(e=="health"){
window.open("http://152.136.151.187:81/intc/login", '_blank');
}else if(e=="resource"){
this.$router.push({path:'/resource'})
}else{
this.$router.push({path:'/'})
}
},
openMenu: function () {
this.$refs.droplist.show()
},
gocallus: function () {
this.$router.push({path:'/'})
},
goinvest: function () {
window.open("http://152.136.151.187:82/#/", '_blank');
},
goresource: function () {
this.$router.push({path:'/resource'})
},
gohealth: function () {
window.open("http://152.136.151.187:81/#/", '_blank');
},
}
}
</script>

114
src/views/callus.vue Normal file
View File

@@ -0,0 +1,114 @@
<template>
<page class="home-page">
<zui-header>
<logo type="xiaoyanyun" href="/"></logo>
<h4 class="zui-logo-text">
|&nbsp;&nbsp;记账专家
<br/>|&nbsp;&nbsp;健康帮手
</h4>
<div class="zui-rightcol" @click="openMenu" style="color: #0b8ba5;">目录</div>
<drop-list :config="configData" ref="droplist"></drop-list>
<zui-button @click="onButtonClick('callus')">联系我们</zui-button>
<zui-button @click="onButtonClick('resource')">资料下载</zui-button>
<zui-button @click="onButtonClick('health')">健康档案</zui-button>
<zui-button @click="onButtonClick('invest')">记账平台</zui-button>
<zui-button @click="onButtonClick('home')">首页</zui-button>
</zui-header>
<div class="service">
<h1>
联系我们->注册账号->免费使用
</h1>
<h3>
专业高效满足您的记账需求健康记录
</h3>
</div>
<div class="features">
<ul>
<li>
<img :src="feature1"/>
<h4>联系方式</h4>
<p>17753252359</p>
</li>
<li>
<img :src="feature2"/>
<h4>微信</h4>
<p>intcqd</p>
</li>
</ul>
</div>
<zui-footer/>
</page>
</template>
<script>
import './less/home-page.less'
import Logo from '../components/Logo'
import Page from '../components/Page'
import ZuiHeader from '../components/Header'
import ZuiFooter from '../components/Footer'
import ZuiButton from '../components/Button'
import feature1 from '../assets/img/feature1.png'
import feature2 from '../assets/img/feature2.png'
import feature3 from '../assets/img/feature3.png'
import feature4 from '../assets/img/feature4.png'
import Util from '../Util'
import DropList from 'vue-droplist'
export default{
components: {Page, Logo, ZuiHeader, ZuiFooter,ZuiButton,DropList},
data () {
return {
feature1: feature1,
feature2: feature2,
feature3: feature3,
feature4: feature4,
carouselPerPage: (Util.os.android || Util.os.iPhone) ? 1 : 2,
configData : {
position: { // 设置显示位置position
top: '60px',
right: '15px',
bottom: '',
left: ''
},
width: '40%', // 设置宽度
list: [ // 设置下拉列表数据和对应的点击事件
{text: '首页', action: this.gocallus},
{text: '记账平台', action: this.goinvest},
{text: '健康档案', action: this.gohealth},
{text: '资料下载', action: this.goresource},
{text: '联系我们', action: this.gocallus}
]
}
}
},
methods: {
onButtonClick: function (e) {
if(e=="callus"){
this.$router.push({path:'/callus'})
}else if(e=="invest"){
window.open("http://152.136.151.187:8080/admin/", '_blank');
}else if(e=="health"){
window.open("http://152.136.151.187:81/intc/login", '_blank');
}else if(e=="resource"){
this.$router.push({path:'/resource'})
}else{
this.$router.push({path:'/'})
}
},
openMenu: function () {
this.$refs.droplist.show()
},
gocallus: function () {
this.$router.push({path:'/'})
},
goinvest: function () {
window.open("http://152.136.151.187:82/#/", '_blank');
},
goresource: function () {
this.$router.push({path:'/resource'})
},
gohealth: function () {
window.open("http://152.136.151.187:81/#/", '_blank');
},
}
}
</script>

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

BIN
src/views/img/feature10.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

BIN
src/views/img/feature11.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

BIN
src/views/img/feature12.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
src/views/img/feature13.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

BIN
src/views/img/feature14.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
src/views/img/feature8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

BIN
src/views/img/feature9.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

View File

@@ -0,0 +1,283 @@
.home-page {
.banner {
text-align: center;
padding: 180px 20px;
background: url('../img/zhichou-banner.jpg') center no-repeat;
background-size: cover;
position: relative;
overflow: hidden;
img {
top: 0;
left: 0;
right: 0;
width: 100%;
height: auto;
margin: 0 auto;
position: absolute;
}
h1 {
color: #fff;
font-size: 42px;
margin: 0;
}
h3 {
color: #fff;
font-size: 24px;
margin-top: 28px;
}
}
.nav {
padding-left: 0;
list-style: none;
max-width: 1065px;
margin: 20px auto 0 auto;
a {
float: left;
margin: 17px;
width: 320px;
color: #32ADC6;
text-align: center;
display: block;
padding: 60px 0 40px 0;
border: 1px solid #32ADC6;
position: relative;
&:hover {
text-decoration: none;
.watermark {
color: #fff !important;
}
.zui-logo {
display: none;
}
.zui-logo.mobile {
display: block;
}
}
&.zhichou:hover {
color: #fff;
background: #35A3BA;
}
&.hr:hover {
color: #fff;
background: #6AC2B5;
}
&.plus:hover {
color: #fff;
background: #35A3BA;
}
.watermark {
top: 0;
left: 0;
opacity: .1;
font-size: 70px;
line-height: 70px;
position: absolute;
&.blue {
color: #35A3BA;
}
&.green {
color: #00d6b2;
}
}
.zui-logo {
display: block;
margin: 0 auto;
}
.zui-logo.mobile {
display: none;
}
h3 {
font-size: 24px;
margin-top: 15px;
}
p {
font-size: 18px;
margin-top: 14px;
}
&.hr {
color: #6AC2B5;
border-bolor: #6AC2B5;
}
&.plus {
color: #35A3BA;
border-color: #35A3BA;
}
}
}
.join-zhichou {
color: #32ADC6;
font-size: 16px;
text-align: center;
width: 100%;
display: block;
margin: 30px 0 165px 0;
}
.service {
padding: 72px 0;
text-align: center;
h1 {
color: #6AC2B5;
font-size: 52px;
line-height: 70px;
}
h3 {
color: #000;
font-size: 40px;
margin-top: 15px;
}
h4 {
font-size: 29px;
line-height: 32px;
font-weight: normal;
margin-top: 40px;
}
}
.apply-hr {
color: #fff;
text-align: center;
background: #6AC2B5;
padding: 49px 0 50px 0;
h2 {
font-size: 39px;
}
h4 {
font-size: 29px;
font-weight: normal;
margin-top: 20px;
}
}
.features {
background: #DEF0EF;
padding: 50px 0;
ul{
max-width: 500px;
margin: 0 auto;
li {
margin-top: 20px;
padding: 10px 0 10px 100px;
position: relative;
img {
width: 60px;
top: 15px;
left: 0;
position: absolute;
}
h4 {
font-size: 25px;
font-weight: bold;
}
p {
font-size: 25px;
font-weight: normal;
}
}
}
}
}
@media (max-width: 420px) {
.home-page {
.banner {
padding: 80px 20px;
h1 {
font-size: 24px;
.br {
display: block;
}
}
h3 {
font-size: 12px;
}
}
.nav {
margin: 35px auto 0 auto;
a {
float: none;
width: 270px;
margin: 25px auto;
padding: 32px 20px;
&.zhichou {
color: #fff;
background: #32ADC6;
}
&.hr {
color: #fff;
background: #6AC2B5;
}
&.plus {
color: #fff;
background: #236579;
}
.watermark {
color: #fff !important;
}
.zui-logo {
width: 110px;
display: none;
}
.zui-logo.mobile {
display: block;
}
h3 {
font-size: 16px;
margin-top: 10px;
}
h4 {
font-size: 12px;
}
}
}
.join-zhichou {
margin: 0 0 30px 0;
}
.service{
padding: 36px 0;
h1{
font-size: 24px;
line-height: 35px;
}
h3{
font-size: 18px;
}
h4{
font-size: 14px;
line-height: 24px;
margin-top: 20px;
}
}
.features{
padding: 32px 0;
ul{
max-width: 300px;
li{
margin-top: 0;
padding-left: 55px;
img{
width: 35px;
}
h4{
font-size: 18px;
}
p{
font-size: 14px;
}
}
}
}
.apply-hr{
padding: 25px 0;
h2{
font-size: 20px;
}
h4{
font-size: 14px;
margin-top: 5px;
}
}
.apply-hr-form{
padding: 20px 0;
}
}
}

121
src/views/resource.vue Normal file
View File

@@ -0,0 +1,121 @@
<template>
<page class="home-page">
<zui-header>
<logo type="xiaoyanyun" href="/"></logo>
<h4 class="zui-logo-text">
|&nbsp;&nbsp;记账专家
<br/>|&nbsp;&nbsp;健康帮手
</h4>
<div class="zui-rightcol" @click="openMenu" style="color: #0b8ba5;">目录</div>
<drop-list :config="configData" ref="droplist"></drop-list>
<zui-button @click="onButtonClick('callus')">联系我们</zui-button>
<zui-button @click="onButtonClick('resource')">资料下载</zui-button>
<zui-button @click="onButtonClick('health')">健康档案</zui-button>
<zui-button @click="onButtonClick('invest')">记账平台</zui-button>
<zui-button @click="onButtonClick('home')">首页</zui-button>
</zui-header>
<div class="service">
<h1>
资料下载->系统介绍->使用手册
</h1>
<h3>
专业高效满足您的记账需求健康记录
</h3>
</div>
<div class="features">
<ul>
<li>
<img :src="feature3"/>
<h4>记账平台</h4>
<p>
<a href="/" target="_blank">系统介绍</a>&nbsp;&nbsp;
<a href="/" target="_blank">使用手册下载</a>
</p>
</li>
<li>
<img :src="feature4"/>
<h4>健康档案</h4>
<p>
<a href="/" target="_blank">系统介绍</a>&nbsp;&nbsp;
<a href="/" target="_blank">使用手册下载</a>
</p>
</li>
</ul>
</div>
<zui-footer/>
</page>
</template>
<script>
import './less/home-page.less'
import Logo from '../components/Logo'
import Page from '../components/Page'
import ZuiHeader from '../components/Header'
import ZuiFooter from '../components/Footer'
import ZuiButton from '../components/Button'
import feature1 from '../assets/img/feature1.png'
import feature2 from '../assets/img/feature2.png'
import feature3 from '../assets/img/feature3.png'
import feature4 from '../assets/img/feature4.png'
import Util from '../Util'
import DropList from 'vue-droplist'
export default{
components: {Page, Logo, ZuiHeader, ZuiFooter,ZuiButton,DropList},
data () {
return {
feature1: feature1,
feature2: feature2,
feature3: feature3,
feature4: feature4,
carouselPerPage: (Util.os.android || Util.os.iPhone) ? 1 : 2,
configData : {
position: { // 设置显示位置position
top: '60px',
right: '15px',
bottom: '',
left: ''
},
width: '40%', // 设置宽度
list: [ // 设置下拉列表数据和对应的点击事件
{text: '首页', action: this.gocallus},
{text: '首页', action: this.gocallus},
{text: '记账平台', action: this.goinvest},
{text: '健康档案', action: this.gohealth},
{text: '资料下载', action: this.goresource},
{text: '联系我们', action: this.gocallus}
]
}
}
},
methods: {
onButtonClick: function (e) {
if(e=="callus"){
this.$router.push({path:'/callus'})
}else if(e=="invest"){
window.open("http://152.136.151.187:8080/admin/", '_blank');
}else if(e=="health"){
window.open("http://152.136.151.187:81/intc/login", '_blank');
}else if(e=="resource"){
this.$router.push({path:'/resource'})
}else{
this.$router.push({path:'/'})
}
},
openMenu: function () {
this.$refs.droplist.show()
},
gocallus: function () {
this.$router.push({path:'/callus'})
},
goinvest: function () {
window.open("http://152.136.151.187:82/#/", '_blank');
},
goresource: function () {
this.$router.push({path:'/resource'})
},
gohealth: function () {
window.open("http://152.136.151.187:89/#/", '_blank');
},
}
}
</script>

0
static/.gitkeep Normal file
View File