Compare commits

...

2 Commits

Author SHA1 Message Date
戴余标 293a193b86 本地
2 years ago
戴余标 1d5647cd81 本地版本
2 years ago

@ -8,15 +8,17 @@
公司先后获得河南省高新技术企业、国家3A信用企业、IOS9001软件产品认证等20多项荣誉奖项。拥有50余项软件著作权。 获得20余家国内媒体报道。公司自成立以来以高科技为起点以技术为核心、 以完善的售后服务为后盾,秉承稳固与发展、求实与创新的精神,已为国内外上万家企业提供了服务。 在为实现企业价值最大化的过程中, 实现了自身的价值的提升,取得了最大程度的双赢合作,并获得了社会各界的广泛赞誉和认同。 公司先后获得河南省高新技术企业、国家3A信用企业、IOS9001软件产品认证等20多项荣誉奖项。拥有50余项软件著作权。 获得20余家国内媒体报道。公司自成立以来以高科技为起点以技术为核心、 以完善的售后服务为后盾,秉承稳固与发展、求实与创新的精神,已为国内外上万家企业提供了服务。 在为实现企业价值最大化的过程中, 实现了自身的价值的提升,取得了最大程度的双赢合作,并获得了社会各界的广泛赞誉和认同。
官网地址[http://www.5kcrm.com](http://www.5kcrm.com/) 官网:[http://www.5kcrm.com](https://www.5kcrm.com/)
演示地址:(http://demo11.5kcrm.net/) 官网:[http://www.72crm.com](https://www.72crm.com/)
帐号18688888888 密码123456a
Github下载地址[https://github.com/72wukong](https://github.com/72wukong) 论坛:[http://bbs.72crm.net](https://bbs.72crm.net/)
QQ群交流群⑩群[1026560336](http:////shang.qq.com/wpa/qunwpa?idkey=13d5e5809eb9feb350336e55c8b7a00b9cb472078b09b4441222a52dd76b278e) 演示地址:[demo11.5kcrm.net](http://demo11.5kcrm.net/)(帐号18888888888 密码123456a)
码云gitee地址[码云仓库地址](https://gitee.com/wukongcrm)
QQ群交流群⑩群[486745026](https:////shang.qq.com/wpa/qunwpa?idkey=f4687b809bf63f08f707aa1c56dee8dbcb9526237c429c4532222021d65bf83c)
扫码添加小悟官方客服微信,邀您加入千人微信交流群: 扫码添加小悟官方客服微信,邀您加入千人微信交流群:
@ -27,14 +29,13 @@ QQ群交流群⑩群[1026560336](http:////shang.qq.com/wpa/qunwpa?idkey=13d5e
<img src="https://images.gitee.com/uploads/images/2019/1202/135713_d3566c6a_345098.jpeg" width="200"> <img src="https://images.gitee.com/uploads/images/2019/1202/135713_d3566c6a_345098.jpeg" width="200">
``` ```
悟空CRM采用全新的前后端分离模式本仓库代码中已集成前端vue打包后文件可免去打包操作。如需调整前端代码请单独下载前端代码 悟空CRM采用全新的前后端分离模式本仓库代码中已集成前端vue打包后文件可免去打包操作。如需调整前端代码请单独下载前端代码
``` ```
(<a href="https://gitee.com/wukongcrm/crm_pro" target="_blank">查看PHP后端仓库</a>) (<a href="https://github.com/72wukong/72crm-11.0-PHP" target="_blank">查看PHP后端仓库</a>)
#### 项目目录 #### 项目目录

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 66 KiB

@ -3,25 +3,25 @@ const path = require('path')
const utils = require('./utils') const utils = require('./utils')
const config = require('../config') const config = require('../config')
const { const {
VueLoaderPlugin VueLoaderPlugin
} = require('vue-loader') } = require('vue-loader')
const vueLoaderConfig = require('./vue-loader.conf') const vueLoaderConfig = require('./vue-loader.conf')
// el-bigdata-table babel-loader 配置 // el-bigdata-table babel-loader 配置
const fs = require('fs') const fs = require('fs')
function resolve(dir) { function resolve(dir) {
return path.join(__dirname, '..', dir) return path.join(__dirname, '..', dir)
} }
const createLintingRule = () => ({ const createLintingRule = () => ({
test: /\.(js|vue)$/, test: /\.(js|vue)$/,
loader: 'eslint-loader', loader: 'eslint-loader',
enforce: 'pre', enforce: 'pre',
include: [resolve('src'), resolve('test')], include: [resolve('src'), resolve('test')],
options: { options: {
formatter: require('eslint-friendly-formatter'), formatter: require('eslint-friendly-formatter'),
emitWarning: !config.dev.showEslintErrorsInOverlay emitWarning: !config.dev.showEslintErrorsInOverlay
} }
}) })
// el-bigdata-table babel-loader 配置 // el-bigdata-table babel-loader 配置
@ -29,90 +29,89 @@ let bigTableDirName = fs.readdirSync(resolve('node_modules')).filter(dirName =>
const bigTableDirs = bigTableDirName.map(dir => resolve(`node_modules/${dir}/src`)) const bigTableDirs = bigTableDirName.map(dir => resolve(`node_modules/${dir}/src`))
module.exports = { module.exports = {
context: path.resolve(__dirname, '../'), context: path.resolve(__dirname, '../'),
entry: { entry: {
app: ["babel-polyfill", "./src/main.js"] app: ["babel-polyfill", "./src/main.js"]
}, },
output: { output: {
path: config.build.assetsRoot, path: config.build.assetsRoot,
filename: '[name].js', filename: '[name].js',
publicPath: publicPath: process.env.NODE_ENV === 'production' ?
process.env.NODE_ENV === 'production' config.build.assetsPublicPath :
? config.build.assetsPublicPath config.dev.assetsPublicPath
: config.dev.assetsPublicPath },
}, resolve: {
resolve: { extensions: ['.js', '.vue', '.json'],
extensions: ['.js', '.vue', '.json'], alias: {
alias: { '@': resolve('src')
'@': resolve('src')
}
},
module: {
rules: [
...(config.dev.useEslint ? [createLintingRule()] : []),
{
test: /\.vue$/,
loader: 'vue-loader',
options: vueLoaderConfig
},
{
test: /\.js$/,
loader: 'babel-loader',
include: [
resolve('src'),
resolve('test'),
resolve('node_modules/webpack-dev-server/client'),
resolve('node_modules/element-ui/src'),
resolve('node_modules/element-ui/packages'),
...bigTableDirs
]
},
{
test: /\.svg$/,
loader: 'svg-sprite-loader',
include: [resolve('src/icons')],
options: {
symbolId: 'icon-[name]'
}
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
exclude: [resolve('src/icons')],
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
} }
}, },
{ module: {
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, rules: [
loader: 'url-loader', // ...(config.dev.useEslint ? [createLintingRule()] : []),
options: { {
limit: 10000, test: /\.vue$/,
name: utils.assetsPath('media/[name].[hash:7].[ext]') loader: 'vue-loader',
} options: vueLoaderConfig
}, },
{ {
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, test: /\.js$/,
loader: 'url-loader', loader: 'babel-loader',
options: { include: [
limit: 10000, resolve('src'),
name: utils.assetsPath('fonts/[name].[hash:7].[ext]') resolve('test'),
} resolve('node_modules/webpack-dev-server/client'),
} resolve('node_modules/element-ui/src'),
] resolve('node_modules/element-ui/packages'),
}, ...bigTableDirs
plugins: [new VueLoaderPlugin()], ]
node: { },
// prevent webpack from injecting useless setImmediate polyfill because Vue {
// source contains it (although only uses it if it's native). test: /\.svg$/,
setImmediate: false, loader: 'svg-sprite-loader',
// prevent webpack from injecting mocks to Node native modules include: [resolve('src/icons')],
// that does not make sense for the client options: {
dgram: 'empty', symbolId: 'icon-[name]'
fs: 'empty', }
net: 'empty', },
tls: 'empty', {
child_process: 'empty' test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
} loader: 'url-loader',
} exclude: [resolve('src/icons')],
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]')
}
}
]
},
plugins: [new VueLoaderPlugin()],
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'
}
}

@ -3,6 +3,6 @@ const merge = require('webpack-merge')
const prodEnv = require('./prod.env') const prodEnv = require('./prod.env')
module.exports = merge(prodEnv, { module.exports = merge(prodEnv, {
NODE_ENV: '"development"', NODE_ENV: '"development"',
BASE_API: '"http://localhost/"', BASE_API: '"/api/"',
}) })

@ -5,97 +5,97 @@
const path = require('path') const path = require('path')
module.exports = { module.exports = {
dev: { dev: {
// Paths // Paths
assetsSubDirectory: 'static', assetsSubDirectory: 'static',
assetsPublicPath: '/', assetsPublicPath: '/',
proxyTable: { proxyTable: {
'/api': { '/api': {
target: 'http://localhost', target: 'http://192.168.50.40:8088',
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
'^/api': '' '^/api': ''
} }
}, },
'/file': { '/file': {
target: 'http://192.168.1.116:8012/', target: 'http://192.168.50.40:8088/',
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
'^/file': '' '^/file': ''
} }
} }
}, },
// Various Dev Server settings // Various Dev Server settings
host: '0.0.0.0', // can be overwritten by process.env.HOST host: '0.0.0.0', // 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 port: 8090, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
autoOpenBrowser: false, autoOpenBrowser: false,
errorOverlay: true, errorOverlay: true,
notifyOnErrors: false, notifyOnErrors: false,
poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
// Use Eslint Loader? // Use Eslint Loader?
// If true, your code will be linted during bundling and // If true, your code will be linted during bundling and
// linting errors and warnings will be shown in the console. // linting errors and warnings will be shown in the console.
useEslint: true, useEslint: true,
// If true, eslint errors and warnings will also be shown in the error overlay // If true, eslint errors and warnings will also be shown in the error overlay
// in the browser. // in the browser.
showEslintErrorsInOverlay: false, showEslintErrorsInOverlay: false,
/** /**
* Source Maps * Source Maps
*/ */
// https://webpack.js.org/configuration/devtool/#development // https://webpack.js.org/configuration/devtool/#development
devtool: 'cheap-source-map', devtool: 'cheap-source-map',
// CSS Sourcemaps off by default because relative paths are "buggy" // CSS Sourcemaps off by default because relative paths are "buggy"
// with this option, according to the CSS-Loader README // with this option, according to the CSS-Loader README
// (https://github.com/webpack/css-loader#sourcemaps) // (https://github.com/webpack/css-loader#sourcemaps)
// In our experience, they generally work as expected, // In our experience, they generally work as expected,
// just be aware of this issue when enabling this option. // just be aware of this issue when enabling this option.
cssSourceMap: false cssSourceMap: false
}, },
build: { build: {
// Template for index.html // Template for index.html
index: path.resolve(__dirname, '../dist/index.html'), index: path.resolve(__dirname, '../dist/index.html'),
// Paths // Paths
assetsRoot: path.resolve(__dirname, '../dist'), assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static', assetsSubDirectory: 'static',
/** /**
* You can set by youself according to actual condition * You can set by youself according to actual condition
* You will need to set this if you plan to deploy your site under a sub path, * You will need to set this if you plan to deploy your site under a sub path,
* for example GitHub pages. If you plan to deploy your site to https://foo.github.io/bar/, * for example GitHub pages. If you plan to deploy your site to https://foo.github.io/bar/,
* then assetsPublicPath should be set to "/bar/". * then assetsPublicPath should be set to "/bar/".
* In most cases please use '/' !!! * In most cases please use '/' !!!
*/ */
assetsPublicPath: './', assetsPublicPath: './',
/** /**
* Source Maps * Source Maps
*/ */
productionSourceMap: false, productionSourceMap: false,
// https://webpack.js.org/configuration/devtool/#production // https://webpack.js.org/configuration/devtool/#production
devtool: 'source-map', devtool: 'source-map',
// Gzip off by default as many popular static hosts such as // Gzip off by default as many popular static hosts such as
// Surge or Netlify already gzip all static assets for you. // Surge or Netlify already gzip all static assets for you.
// Before setting to `true`, make sure to: // Before setting to `true`, make sure to:
// npm install --save-dev compression-webpack-plugin // npm install --save-dev compression-webpack-plugin
productionGzip: false, productionGzip: false,
productionGzipExtensions: ['js', 'css'], productionGzipExtensions: ['js', 'css'],
// Run the build command with an extra argument to // Run the build command with an extra argument to
// View the bundle analyzer report after build finishes: // View the bundle analyzer report after build finishes:
// `npm run build --report` // `npm run build --report`
// Set to `true` or `false` to always turn it on or off // Set to `true` or `false` to always turn it on or off
bundleAnalyzerReport: process.env.npm_config_report || false, bundleAnalyzerReport: process.env.npm_config_report || false,
// `npm run build:prod --generate_report` // `npm run build:prod --generate_report`
generateAnalyzerReport: process.env.npm_config_generate_report || false generateAnalyzerReport: process.env.npm_config_generate_report || false
} }
} }

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 66 KiB

838
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -23,6 +23,7 @@
"@tinymce/tinymce-vue": "^3.2.0", "@tinymce/tinymce-vue": "^3.2.0",
"axios": "0.18.0", "axios": "0.18.0",
"babel-polyfill": "^6.26.0", "babel-polyfill": "^6.26.0",
"chalk": "^5.2.0",
"clipboard": "^2.0.4", "clipboard": "^2.0.4",
"echarts": "^4.3.0", "echarts": "^4.3.0",
"el-bigdata-table": "^1.0.32", "el-bigdata-table": "^1.0.32",
@ -66,7 +67,6 @@
"babel-plugin-transform-vue-jsx": "3.7.0", "babel-plugin-transform-vue-jsx": "3.7.0",
"babel-preset-env": "1.7.0", "babel-preset-env": "1.7.0",
"babel-preset-stage-2": "6.24.1", "babel-preset-stage-2": "6.24.1",
"chalk": "2.4.1",
"copy-webpack-plugin": "4.5.2", "copy-webpack-plugin": "4.5.2",
"css-loader": "1.0.0", "css-loader": "1.0.0",
"eslint": "4.19.1", "eslint": "4.19.1",

@ -434,6 +434,20 @@ export function crmCustomerReceiveAPI(data) {
}) })
} }
/**
* 客户领取公海客户审批
* @param {*} data
*/
export function crmCheckCustomerReceiveAPI(data) {
return request({
url: 'crm/customerPool/checkCustomerReveive',
method: 'post',
data: data,
headers: {
'Content-Type': 'application/json;charset=UTF-8'
}
})
}
/** /**
* 客户下联系人 * 客户下联系人
* @param {*} data * @param {*} data

@ -197,6 +197,50 @@ export function crmMessageCheckInvoiceAPI(data) {
}) })
} }
/**
* 待审核商机
* @param {*} data
*/
export function crmMessageCheckBusinessAPI(data) {
return request({
url: 'crm/message/checkBusiness',
method: 'post',
data: data,
headers: {
'Content-Type': 'application/json;charset=UTF-8'
}
})
}
/**
* 新商机
* @param {*} data
*/
export function crmMessageNewBusinessAPI(data) {
return request({
url: 'crm/message/newBusiness',
method: 'post',
data: data,
headers: {
'Content-Type': 'application/json;charset=UTF-8'
}
})
}
/**
* 客户捞取审批待办事项提醒
* @param {*} data
*/
export function crmMessageCheckCustomerCheckAPI(data) {
return request({
url: 'crm/message/checkCustomerCheck',
method: 'post',
data: data,
headers: {
'Content-Type': 'application/json;charset=UTF-8'
}
})
}
/** /**
* 全部标为已处理接口 * 全部标为已处理接口
* @param {*} data * @param {*} data

@ -127,6 +127,37 @@ export function crmExamineReceivablesAuditAPI(data) {
} }
}) })
} }
/**
* 进行商机
*/
export function crmExamineBusinessAuditAPI(data) {
// const url = data.type === 'revoke' ? 'crm/receivables/revokeCheck' : 'crm/receivables/check'
const url = 'crm/business/check'
return request({
url,
method: 'post',
data: data,
headers: {
'Content-Type': 'application/json;charset=UTF-8'
}
})
}
/**
* 进行客户
*/
export function crmExamineCheckCustomerAuditAPI(data) {
// const url = data.type === 'revoke' ? 'crm/receivables/revokeCheck' : 'crm/receivables/check'
const url = 'crm/customerPool/checkCustomerReveive'
return request({
url,
method: 'post',
data: data,
headers: {
'Content-Type': 'application/json;charset=UTF-8'
}
})
}
/** /**
* 查询审批记录 * 查询审批记录

Before

Width:  |  Height:  |  Size: 476 KiB

After

Width:  |  Height:  |  Size: 476 KiB

Before

Width:  |  Height:  |  Size: 160 KiB

After

Width:  |  Height:  |  Size: 160 KiB

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 71 KiB

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 67 KiB

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Before

Width:  |  Height:  |  Size: 286 KiB

After

Width:  |  Height:  |  Size: 286 KiB

Before

Width:  |  Height:  |  Size: 286 KiB

After

Width:  |  Height:  |  Size: 286 KiB

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save