Compare commits

...

9 Commits

Author SHA1 Message Date
qsh 2b7d3ddf77 题库图片 8 months ago
zcx 767ec44bba 题库图片替换 8 months ago
zcx 779b6c9eba 题库图片修改 8 months ago
qsh c66b8f227e 图库 8 months ago
zcx fc92668bd1 bug 10 months ago
zcx 8813f57c9b bug 11 months ago
zcx 9eeefde0fb 关键话术 11 months ago
zcx f6c6002eda bug 11 months ago
zcx ecc49ec019 利润配置 12 months ago
  1. 4
      .env.development
  2. 4
      .env.production
  3. 4
      .env.staging
  4. 8
      package.json
  5. BIN
      public/favicon.ico
  6. BIN
      public/favicon1.ico
  7. BIN
      public/logo.png
  8. 13
      src/api/question.js
  9. 8
      src/api/sch/classType.js
  10. 77
      src/api/system/skill.js
  11. BIN
      src/assets/logo/logo.png
  12. BIN
      src/assets/logo/logo1.png
  13. BIN
      src/assets/logo/logo2.png
  14. 2
      src/layout/components/Sidebar/Logo.vue
  15. 2
      src/views/index.vue
  16. 2
      src/views/login.vue
  17. 55
      src/views/question/components/QuestionAddForm.vue
  18. 61
      src/views/question/components/QuestionForm.vue
  19. 22
      src/views/question/index.vue
  20. 2
      src/views/register.vue
  21. 155
      src/views/sch/classType/components/ProfitSettingDialog.vue
  22. 153
      src/views/sch/classType/index.vue
  23. 8
      src/views/sch/place/index.vue
  24. 11
      src/views/system/dictData/index.vue
  25. 226
      src/views/system/skill/index.vue
  26. 39
      src/views/zs/clue/ClueForm/index.vue
  27. 2
      src/views/zs/clue/components/DYClueFormDialog.vue
  28. 5
      src/views/zs/clue/components/SearchForm.vue
  29. 90
      src/views/zs/clue/components/SkillDialog.vue
  30. 14
      src/views/zs/clue/index.vue
  31. 2
      src/views/zs/sign/components/SearchForm.vue
  32. 32
      src/views/zs/sign/components/SignFormDialog.vue
  33. 14
      vue.config.js

@ -6,12 +6,12 @@
# @Description: # @Description:
### ###
# 页面标题 # 页面标题
VUE_APP_TITLE = 莳松管理系统 VUE_APP_TITLE = 寻驾招生管理系统
# 开发环境配置 # 开发环境配置
ENV = 'development' ENV = 'development'
# 莳松管理系统/开发环境 # 寻驾招生管理系统/开发环境
VUE_APP_BASE_API = '/dev-api' VUE_APP_BASE_API = '/dev-api'
JWL_API = '' JWL_API = ''

@ -1,8 +1,8 @@
# 页面标题 # 页面标题
VUE_APP_TITLE = 莳松管理系统 VUE_APP_TITLE = 寻驾招生管理系统
# 生产环境配置 # 生产环境配置
ENV = 'production' ENV = 'production'
# 莳松管理系统/生产环境 # 寻驾招生管理系统/生产环境
VUE_APP_BASE_API = '/duima' VUE_APP_BASE_API = '/duima'

@ -1,10 +1,10 @@
# 页面标题 # 页面标题
VUE_APP_TITLE = 莳松管理系统 VUE_APP_TITLE = 寻驾招生管理系统
NODE_ENV = production NODE_ENV = production
# 测试环境配置 # 测试环境配置
ENV = 'staging' ENV = 'staging'
# 莳松管理系统/测试环境 # 寻驾招生管理系统/测试环境
VUE_APP_BASE_API = '/stage-api' VUE_APP_BASE_API = '/stage-api'

@ -1,8 +1,8 @@
{ {
"name": "river", "name": "river",
"version": "1.0.0", "version": "1.0.0",
"description": "莳松管理系统", "description": "寻驾招生管理系统",
"author": "莳松", "author": "寻驾招生",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
"dev": "vue-cli-service serve", "dev": "vue-cli-service serve",
@ -59,7 +59,8 @@
"vue-meta": "2.4.0", "vue-meta": "2.4.0",
"vue-router": "3.4.9", "vue-router": "3.4.9",
"vuedraggable": "2.24.3", "vuedraggable": "2.24.3",
"vuex": "3.6.0" "vuex": "3.6.0",
"webpack-dev-server": "^3.10.3"
}, },
"devDependencies": { "devDependencies": {
"@vue/cli-plugin-babel": "4.4.6", "@vue/cli-plugin-babel": "4.4.6",
@ -72,6 +73,7 @@
"connect": "3.6.6", "connect": "3.6.6",
"eslint": "7.15.0", "eslint": "7.15.0",
"eslint-plugin-vue": "7.2.0", "eslint-plugin-vue": "7.2.0",
"html-webpack-plugin": "^5.6.0",
"lint-staged": "10.5.3", "lint-staged": "10.5.3",
"runjs": "4.4.2", "runjs": "4.4.2",
"sass": "1.32.13", "sass": "1.32.13",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 106 KiB

@ -10,7 +10,7 @@ import request from '@/utils/request';
// 获取首页统计信息 // 获取首页统计信息
export function searchQuestion(param) { export function searchQuestion(param) {
return request({ return request({
url: '/driver-api/tdQuestion/duima/list', url: '/xunjia/tdQuestion/duima/list',
method: 'get', method: 'get',
params: param params: param
}); });
@ -18,7 +18,7 @@ export function searchQuestion(param) {
export function updateQuestion(data) { export function updateQuestion(data) {
return request({ return request({
url: '/driver-api/tdQuestion/duima/update', url: '/xunjia/tdQuestion/duima/update',
method: 'put', method: 'put',
data: data data: data
}); });
@ -26,10 +26,17 @@ export function updateQuestion(data) {
export function addQuestion(data) { export function addQuestion(data) {
return request({ return request({
url: '/driver-api/tdQuestion/duima/add', url: '/xunjia/tdQuestion/duima/add',
method: 'put', method: 'put',
data: data data: data
}); });
} }
export function uploadFile(data) {
return request({
url: '/xunjia/applet/tiku/question/upload',
method: 'post',
data: data
});
}

@ -51,3 +51,11 @@ export function cloneClassType(data) {
data: data data: data
}); });
} }
export function batchUpdateProfit(data) {
return request({
url: '/sch/classType/profit',
method: 'post',
data: data
});
}

@ -0,0 +1,77 @@
/*
* @Author: riverQiu
* @Date: 2023-10-14 00:31:37
* @LastEditors: riverQiu
* @LastEditTime: 2023-10-15 00:37:52
* @Description:
*/
import request from '@/utils/request'
// 分页查询关键话术列表
export function pageSkill(query) {
return request({
url: '/system/skill/page',
method: 'get',
params: query
})
}
// 查询关键话术列表
export function listSkill(query) {
return request({
url: '/system/skill/list',
method: 'get',
params: query
})
}
// 查询关键话术详细
export function getSkill(skillId) {
return request({
url: '/system/skill/' + skillId,
method: 'get'
})
}
export function getSkillKey() {
return request({
url: '/system/skill/key',
method: 'get'
})
}
// 新增关键话术
export function addSkill(data) {
return request({
url: '/system/skill',
method: 'post',
data: data
})
}
// 修改关键话术
export function updateSkill(data) {
return request({
url: '/system/skill',
method: 'put',
data: data
})
}
// 删除关键话术
export function delSkill(skillId) {
return request({
url: '/system/skill/' + skillId,
method: 'delete'
})
}
// 审核关键话术
export function checkSkill(data) {
return request({
url: '/system/skill/check',
method: 'put',
data: data
})
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 137 KiB

@ -27,7 +27,7 @@ export default {
}, },
data() { data() {
return { return {
title: '莳松管理系统', title: '寻驾招生管理系统',
logo: logoImg logo: logoImg
}; };
}, },

@ -399,7 +399,7 @@ export default {
.card-panel-description { .card-panel-description {
float: right; float: right;
font-weight: bold; font-weight: bold;
margin: 26px; margin: 26px 0px;
margin-left: 0px; margin-left: 0px;
.card-panel-text { .card-panel-text {

@ -1,7 +1,7 @@
<template> <template>
<div class="login"> <div class="login">
<div class="login-form"> <div class="login-form">
<h3 class="title">莳松管理系统</h3> <h3 class="title">寻驾招生管理系统</h3>
<el-tabs v-model="activeName" type="card"> <el-tabs v-model="activeName" type="card">
<el-tab-pane label="微信扫码" name="wx" style="height:200px"> <el-tab-pane label="微信扫码" name="wx" style="height:200px">
<wxlogin v-if="!code && activeName === 'wx'" appid="wx203f734baa9c9845" :scope="'snsapi_login'" :theme="'black'" redirect_uri="https://xueche.ahduima.com/login" :href="href"> <wxlogin v-if="!code && activeName === 'wx'" appid="wx203f734baa9c9845" :scope="'snsapi_login'" :theme="'black'" redirect_uri="https://xueche.ahduima.com/login" :href="href">

@ -1,7 +1,14 @@
<template> <template>
<el-dialog title="试题" :close-on-click-modal="false" append-to-body :visible.sync="visible" width="900px" @close="closeDialog"> <el-dialog title="试题" :close-on-click-modal="false" append-to-body :visible.sync="visible" width="900px" @close="closeDialog">
<div> <div>
<el-form ref="dialogForm" :model="dialogForm" :rules="dataRule" label-position="left" @keyup.enter.native="dialogFormSubmit()"> <el-form
ref="dialogForm"
:model="dialogForm"
:rules="dataRule"
label-width="80px"
label-position="left"
@keyup.enter.native="dialogFormSubmit()"
>
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="题目" prop="question"> <el-form-item label="题目" prop="question">
@ -9,7 +16,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="选项A" prop="question"> <el-form-item label="选项A" prop="question">
<el-input v-model="dialogForm.chooseA" maxlength="200" placeholder="请输入" clearable /> <el-input v-model="dialogForm.chooseA" maxlength="200" placeholder="请输入" clearable />
@ -21,7 +28,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="选项C" prop="question"> <el-form-item label="选项C" prop="question">
<el-input v-model="dialogForm.chooseC" maxlength="200" placeholder="请输入" clearable /> <el-input v-model="dialogForm.chooseC" maxlength="200" placeholder="请输入" clearable />
@ -33,7 +40,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="选项E" prop="question"> <el-form-item label="选项E" prop="question">
<el-input v-model="dialogForm.chooseE" maxlength="200" placeholder="请输入" clearable /> <el-input v-model="dialogForm.chooseE" maxlength="200" placeholder="请输入" clearable />
@ -45,7 +52,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="选项G" prop="question"> <el-form-item label="选项G" prop="question">
<el-input v-model="dialogForm.chooseG" maxlength="200" placeholder="请输入" clearable /> <el-input v-model="dialogForm.chooseG" maxlength="200" placeholder="请输入" clearable />
@ -63,11 +70,11 @@
<el-col :span="24"> <el-col :span="24">
<el-form-item label="科目" prop="subject"> <el-form-item label="科目" prop="subject">
<span v-if="dialogForm.subject == 1">科一</span> <span v-if="dialogForm.subject == 1">科一</span>
<span v-if="dialogForm.subject == 4">科四</span> <span v-else-if="dialogForm.subject == 4">科四</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row :gutter="20">
<el-col :span="8"> <el-col :span="8">
<el-form-item label="精选500题" prop="isVip"> <el-form-item label="精选500题" prop="isVip">
<el-radio-group v-model="dialogForm.isVip" size="small"> <el-radio-group v-model="dialogForm.isVip" size="small">
@ -132,11 +139,25 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20">
<el-form-item label="题目图片" prop="imageUrl">
<el-upload
action="#"
accept=".png,.jpg,.jpeg,.gif"
:limit="1"
:http-request="handleImport"
:on-exceed="handleExceed"
:show-file-list="false"
>
<img v-if="dialogForm.imageUrl" :src="dialogForm.imageUrl" style="width: 200px;">
<i v-else class="el-icon-plus" />
</el-upload>
</el-form-item>
</el-row>
</el-form> </el-form>
</div> </div>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button plain @click="(visible=false)">取消</el-button> <el-button plain @click="visible = false">取消</el-button>
<el-button v-jclick type="primary" :disabled="!canSubmit" @click="dialogFormSubmit()">确定</el-button> <el-button v-jclick type="primary" :disabled="!canSubmit" @click="dialogFormSubmit()">确定</el-button>
</span> </span>
</el-dialog> </el-dialog>
@ -197,7 +218,7 @@ export default {
dialogFormSubmit() { dialogFormSubmit() {
this.$refs.dialogForm.validate((valid) => { this.$refs.dialogForm.validate((valid) => {
if (valid) { if (valid) {
updateQuestion(this.dialogForm).then(response => { addQuestion(this.dialogForm).then((response) => {
if (response.code == 200) { if (response.code == 200) {
this.$modal.msgSuccess('修改成功'); this.$modal.msgSuccess('修改成功');
// this.visible = true; // this.visible = true;
@ -205,6 +226,20 @@ export default {
}); });
} }
}); });
},
handleImport(opt) {
const data = new FormData();
data.append('file', opt.file);
//
// api.upload(data).then(resp => {
// if (resp.code == 200) {
// this.$modal.msgSuccess('');
// this.dialogForm.imageUrl = resp.data;
// }
// });
},
handleExceed(files) {
this.handleImport({ file: files[0] });
} }
} }
}; };

@ -6,21 +6,40 @@
<el-col :span="24"> <el-col :span="24">
<el-form-item label="题目" prop="question"> <el-form-item label="题目" prop="question">
<div>{{ dialogForm.question }}</div> <div>{{ dialogForm.question }}</div>
<img v-if="dialogForm.imageUrl" :src="dialogForm.imageUrl" width="100" alt=""> <img v-if="dialogForm.imageUrl" :src="dialogForm.imageUrl" width="200" alt="" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row>
<el-form-item label="替换图片">
<el-upload
action="#"
accept=".png,.jpg,.jpeg,.gif"
:limit="1"
:http-request="handleImport"
:on-exceed="handleExceed"
:show-file-list="false"
>
<img v-if="dialogForm.imageUrl" :src="dialogForm.imageUrl" style="width: 300px" />
<i v-else class="el-icon-plus" />
</el-upload>
</el-form-item>
</el-row>
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="选项" prop="question"> <el-form-item label="选项" prop="question">
<span v-if="dialogForm.chooseA">A:{{ dialogForm.chooseA }}<span> <span v-if="dialogForm.chooseA"
>A:{{ dialogForm.chooseA
}}<span>
<span v-if="dialogForm.chooseB">B:{{ dialogForm.chooseB }} </span> <span v-if="dialogForm.chooseB">B:{{ dialogForm.chooseB }} </span>
<span v-if="dialogForm.chooseC">C:{{ dialogForm.chooseC }} </span> <span v-if="dialogForm.chooseC">C:{{ dialogForm.chooseC }} </span>
<span v-if="dialogForm.chooseD">D:{{ dialogForm.chooseD }}</span> <span v-if="dialogForm.chooseD">D:{{ dialogForm.chooseD }}</span>
<span v-if="dialogForm.chooseE">E:{{ dialogForm.chooseE }}</span> <span v-if="dialogForm.chooseE">E:{{ dialogForm.chooseE }}</span>
<span v-if="dialogForm.chooseF">F:{{ dialogForm.chooseF }}</span> <span v-if="dialogForm.chooseF">F:{{ dialogForm.chooseF }}</span>
<span v-if="dialogForm.chooseG">G:{{ dialogForm.chooseG }}</span> <span v-if="dialogForm.chooseG">G:{{ dialogForm.chooseG }}</span>
</span></span></el-form-item> </span></span
></el-form-item
>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
@ -104,18 +123,17 @@
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
</div> </div>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button plain @click="(visible = false)">取消</el-button> <el-button plain @click="visible = false">取消</el-button>
<el-button v-jclick type="primary" :disabled="!canSubmit" @click="dialogFormSubmit()">确定</el-button> <el-button v-jclick type="primary" :disabled="!canSubmit" @click="dialogFormSubmit()">确定</el-button>
</span> </span>
</el-dialog> </el-dialog>
</template> </template>
<script> <script>
import { updateQuestion } from '@/api/question'; import { updateQuestion, uploadFile } from '@/api/question';
// import axios from 'axios';
export default { export default {
data() { data() {
return { return {
@ -146,6 +164,7 @@ export default {
// this.$refs['dialogForm'].resetFields(); // this.$refs['dialogForm'].resetFields();
if (info) { if (info) {
this.dialogForm = this.deepClone(info); this.dialogForm = this.deepClone(info);
this.fileUrl = info.imageUrl;
} }
}); });
}, },
@ -168,7 +187,7 @@ export default {
dialogFormSubmit() { dialogFormSubmit() {
this.$refs.dialogForm.validate((valid) => { this.$refs.dialogForm.validate((valid) => {
if (valid) { if (valid) {
updateQuestion(this.dialogForm).then(response => { updateQuestion(this.dialogForm).then((response) => {
if (response.code == 200) { if (response.code == 200) {
this.$modal.msgSuccess('修改成功'); this.$modal.msgSuccess('修改成功');
this.$emit('update'); this.$emit('update');
@ -177,6 +196,32 @@ export default {
}); });
} }
}); });
},
handleImport(opt) {
const data = new FormData();
data.append('file', opt.file);
// axios({
// method: 'post',
// url: 'http://xj.ahduima.com/xunjia/tiku/question/upload',
// data: data
// }).then((resp) => {
// console.log(resp.data);
// if (resp.data.code == 200) {
// this.$modal.msgSuccess('');
// this.dialogForm.imageUrl = resp.data.msg;
// }
// console.log(this.dialogForm)
// });
//
uploadFile(data).then(resp => {
if (resp.code == 200) {
this.$modal.msgSuccess('文件上传成功');
this.dialogForm.imageUrl = resp.msg;
}
});
},
handleExceed(files) {
this.handleImport({ file: files[0] });
} }
} }
}; };

@ -16,6 +16,9 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-row> </el-row>
<el-form-item>
<el-checkbox v-model="queryParams.isWatermark" :label="true">是否有水印</el-checkbox>
</el-form-item>
<el-form-item label="题目"> <el-form-item label="题目">
<el-input v-model="queryParams.question" placeholder="请输入题目" clearable style="width: 400px" @keyup.enter.native="handleQuery" /> <el-input v-model="queryParams.question" placeholder="请输入题目" clearable style="width: 400px" @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
@ -23,7 +26,6 @@
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
<el-button type="primary" icon="el-icon-plus" @click="handleAdd">新增</el-button> <el-button type="primary" icon="el-icon-plus" @click="handleAdd">新增</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -58,6 +60,11 @@
{{ row.carTypeId == 1001 ? '小车' : '摩托车' }} {{ row.carTypeId == 1001 ? '小车' : '摩托车' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="图片" align="center" min-width="200">
<template slot-scope="{ row }">
<img :src="row.imageUrl" alt="" width="80px" srcset="">
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-download" @click="handleEdit(scope.row)">编辑</el-button> <el-button size="mini" type="text" icon="el-icon-download" @click="handleEdit(scope.row)">编辑</el-button>
@ -68,7 +75,6 @@
<!-- <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" /> --> <!-- <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" /> -->
<QuestionForm v-if="dialogVisible" ref="dialogForm" :dialog-visible="dialogVisible" @update="getList" /> <QuestionForm v-if="dialogVisible" ref="dialogForm" :dialog-visible="dialogVisible" @update="getList" />
<QuestionAddForm v-if="dialogAddVisible" ref="dialogAddForm" :dialog-visible="dialogAddVisible" @update="getList" /> <QuestionAddForm v-if="dialogAddVisible" ref="dialogAddForm" :dialog-visible="dialogAddVisible" @update="getList" />
</div> </div>
</template> </template>
@ -80,7 +86,8 @@ import QuestionAddForm from './components/QuestionAddForm.vue';
export default { export default {
name: 'Question', name: 'Question',
components: { components: {
QuestionForm, QuestionAddForm QuestionForm,
QuestionAddForm
}, },
data() { data() {
return { return {
@ -106,7 +113,7 @@ export default {
/** 查询文件列表 */ /** 查询文件列表 */
getList() { getList() {
this.loading = true; this.loading = true;
searchQuestion(this.queryParams).then(response => { searchQuestion(this.queryParams).then((response) => {
this.tableList = response.data; this.tableList = response.data;
// this.total = response.total; // this.total = response.total;
this.loading = false; this.loading = false;
@ -115,7 +122,7 @@ export default {
/** 搜索按钮操作 */ /** 搜索按钮操作 */
handleQuery() { handleQuery() {
if (this.queryParams.question) { if (this.queryParams.question || (this.queryParams.isWatermark != undefined && this.queryParams.isWatermark)) {
this.getList(); this.getList();
} else { } else {
this.$modal.msgWarning('请输入题目 '); this.$modal.msgWarning('请输入题目 ');
@ -135,7 +142,10 @@ export default {
handleAdd(item) { handleAdd(item) {
this.dialogAddVisible = true; this.dialogAddVisible = true;
this.$nextTick(() => { this.$nextTick(() => {
this.$refs.dialogAddForm.init(item); this.$refs.dialogAddForm.init({
subject: this.queryParams.subject,
carTypeId: this.queryParams.carTypeId
});
}); });
} }
} }

@ -1,7 +1,7 @@
<template> <template>
<div class="register"> <div class="register">
<el-form ref="registerForm" :model="registerForm" :rules="registerRules" class="register-form"> <el-form ref="registerForm" :model="registerForm" :rules="registerRules" class="register-form">
<h3 class="title">莳松管理系统</h3> <h3 class="title">寻驾招生管理系统</h3>
<el-form-item prop="username"> <el-form-item prop="username">
<el-input v-model="registerForm.username" type="text" auto-complete="off" placeholder="账号"> <el-input v-model="registerForm.username" type="text" auto-complete="off" placeholder="账号">
<svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" /> <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />

@ -0,0 +1,155 @@
<template>
<el-dialog title="利润配置" :close-on-click-modal="false" append-to-body :visible.sync="visible" width="600px"
@close="closeDialog">
<div>
<el-form ref="dialogForm" :model="dialogForm" :rules="dataRule" label-position="top">
<el-form-item label="利润类型" prop="profitType">
<el-radio-group v-model="dialogForm.profitType" @change="profitTypeChange">
<el-radio :label="1">底价</el-radio>
<el-radio :label="2">比例</el-radio>
<el-radio :label="3">固定</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="利润参数" prop="profitParam">
<el-input v-show="dialogForm.profitType != 3" v-model="dialogForm.profitParam" maxlength="100"
placeholder="请输入" clearable />
<div v-show="dialogForm.profitType == 3" style="text-align: center;">
<el-table :data="dialogForm.profitParamVOList" stripe border>
<el-table-column label="下限" >
<template slot-scope="scope">
<el-form-item :prop="'profitParamVOList.' + scope.$index + '.min'" :rules="dataRule['min']">
<el-input v-model="scope.row.min" placeholder="请输入" clearable type="number" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="上限" >
<template slot-scope="scope">
<el-form-item :prop="'profitParamVOList.' + scope.$index + '.max'" :rules="dataRule['max']">
<el-input v-model="scope.row.max" placeholder="请输入" clearable type="number" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="利润" >
<template slot-scope="scope">
<el-form-item :prop="'profitParamVOList.' + scope.$index + '.profit'" :rules="dataRule['profit']">
<el-input v-model="scope.row.profit" placeholder="请输入" clearable type="number" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="130">
<template slot-scope="scope">
<el-button @click="handleProfitParamDelete(scope.$index)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-button plain @click="handleAddProfitParam">新增</el-button>
</div>
</el-form-item>
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<el-button plain @click="(visible = false)">取消</el-button>
<el-button v-jclick type="primary" :disabled="!canSubmit" @click="dialogFormSubmit()">确定</el-button>
</span>
</el-dialog>
</template>
<script>
import { batchUpdateProfit } from '@/api/sch/classType';
export default {
name: 'ProfitSettingDialog',
data() {
return {
visible: false,
canSubmit: true,
dialogForm: {
typeIds: undefined,
profitType: 1,
profitParam: undefined,
remark: undefined,
profitParamVOList: [{
min: 0,
max: undefined,
profit: undefined
}]
},
dataRule: {
profitType: [{ required: true, message: '利润类型不能为空', trigger: 'blur' }],
min: [{ required: true, message: '上限不能为空', trigger: 'blur' }],
max: [{ required: true, message: '下限不能为空', trigger: 'blur' }],
profit: [{ required: true, message: '利润不能为空', trigger: 'blur' }]
}
};
},
methods: {
init(info = undefined) {
// debugger
this.visible = true;
this.canSubmit = true;
this.$nextTick(() => {
this.resetDialogForm();
this.$refs['dialogForm'].resetFields();
if (info) {
this.dialogForm = { ...this.dialogForm, ...info };
}
});
},
resetDialogForm() {
this.dialogForm = {
typeIds: undefined,
profitType: 1,
profitParam: undefined,
remark: undefined,
profitParamVOList: []
};
},
closeDialog() {
this.$emit('update:dialogVisible', false);
},
handleAddProfitParam() {
this.dialogForm.profitParamVOList.push({
min: 0,
max: undefined,
profit: undefined
});
},
handleProfitParamDelete(index) {
console.log(index);
this.dialogForm.profitParamVOList.splice(index, 1);
},
profitTypeChange(type) {
if (type == 3) {
this.dialogForm.profitParamVOList.push({
min: 0,
max: undefined,
profit: undefined
});
} else {
this.$set(this.dialogForm, "profitParamVOList", []);
}
},
//
dialogFormSubmit() {
this.$refs.dialogForm.validate((valid) => {
if (valid) {
this.canSubmit = false;
//
batchUpdateProfit(this.dialogForm)
.then((resp) => {
this.canSubmit = true;
if (resp.code == 200) {
this.$message.success('保存成功');
this.$emit('refreshDataList');
this.visible = false;
}
})
.catch(() => {
this.canSubmit = true;
});
}
});
}
}
};
</script>

@ -3,39 +3,50 @@
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="6"> <el-col :span="6">
<div class="head-container"> <div class="head-container">
<el-input v-model="searchName" placeholder="请输入驾校名称" clearable prefix-icon="el-icon-search" style="margin-bottom: 20px" /> <el-input v-model="searchName" placeholder="请输入驾校名称" clearable prefix-icon="el-icon-search"
style="margin-bottom: 20px" />
</div> </div>
<div class="head-container" style="max-height: 700px;overflow-y: auto"> <div class="head-container" style="max-height: 700px;overflow-y: auto">
<el-tree ref="tree" :data="schoolOption.filter(item => item.label.includes(searchName))" accordion node-key="id" :default-expanded-keys="selectNodes.map(item => item.id)" @node-click="handleNodeClick" /> <el-tree ref="tree" :data="schoolOption.filter(item => item.label.includes(searchName))" accordion node-key="id"
:default-expanded-keys="selectNodes.map(item => item.id)" @node-click="handleNodeClick" />
</div> </div>
</el-col> </el-col>
<el-col :span="18"> <el-col :span="18">
<el-row :gutter="20"> <el-row :gutter="20">
<el-form ref="queryForm" :model="queryParams" :inline="true"> <el-form ref="queryForm" :model="queryParams" :inline="true">
<el-form-item> <el-form-item>
<el-input v-model="queryParams.typeName" placeholder="请输入班型名称" clearable style="width: 240px" @keyup.enter.native="handleQuery" /> <el-input v-model="queryParams.typeName" placeholder="请输入班型名称" clearable style="width: 240px"
@keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-select v-model="queryParams.licenseType" clearable placeholder="选择驾照类型"> <el-select v-model="queryParams.licenseType" clearable placeholder="选择驾照类型">
<el-option v-for="item in licenseTypeOption" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue" /> <el-option v-for="item in licenseTypeOption" :key="item.dictValue" :label="item.dictLabel"
:value="item.dictValue" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-select v-model="queryParams.status" placeholder="班型状态" clearable> <el-select v-model="queryParams.status" placeholder="班型状态" clearable>
<el-option v-for="dict in statusOptions" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue" /> <el-option v-for="dict in statusOptions" :key="dict.dictValue" :label="dict.dictLabel"
:value="dict.dictValue" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button> <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
<el-button v-hasPermi="['sch:classType:add']" type="primary" icon="el-icon-plus" @click="handleAdd">新增</el-button> <el-button v-hasPermi="['sch:classType:add']" type="primary" icon="el-icon-plus"
<el-button v-hasPermi="['sch:classType:remove']" type="danger" icon="el-icon-delete" :disabled="multiple" @click="handleDelete">删除</el-button> @click="handleAdd">新增</el-button>
<el-button v-hasPermi="['sch:classType:clone']" type="primary" icon="el-icon-copy" :disabled="multiple" @click="handleClone">克隆</el-button> <el-button v-hasPermi="['sch:classType:remove']" type="danger" icon="el-icon-delete" :disabled="multiple"
@click="handleDelete">删除</el-button>
<el-button v-hasPermi="['sch:classType:clone']" type="primary" icon="el-icon-copy" :disabled="multiple"
@click="handleClone">克隆</el-button>
<el-button v-hasPermi="['sch:classType:profit']" type="primary" :disabled="multiple"
@click="handleProfit()">利润配置</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-row> </el-row>
<el-table v-loading="loading.tableLoading" :data="tableDataList" stripe border @selection-change="handleSelectionChange"> <el-table v-loading="loading.tableLoading" :data="tableDataList" stripe border
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" /> <el-table-column type="selection" width="50" align="center" />
<el-table-column type="index" width="50" /> <el-table-column type="index" width="50" />
@ -47,6 +58,14 @@
<el-table-column label="报价" prop="currentPrice" width="60" /> <el-table-column label="报价" prop="currentPrice" width="60" />
<el-table-column label="底价" prop="minPrice" width="60" /> <el-table-column label="底价" prop="minPrice" width="60" />
<el-table-column label="描述" prop="description" min-width="200" show-overflow-tooltip /> <el-table-column label="描述" prop="description" min-width="200" show-overflow-tooltip />
<el-table-column label="利润类型" prop="profitType" min-width="100">
<template slot-scope="scope">
<span v-if="scope.row.profitType == 1">底价</span>
<span v-else-if="scope.row.profitType == 2">比例</span>
<span v-else>固定</span>
</template>
</el-table-column>
<el-table-column label="利润参数" prop="profitParamShow" min-width="200" show-overflow-tooltip />
<el-table-column label="状态" prop="status" :formatter="statusFormat" width="80" /> <el-table-column label="状态" prop="status" :formatter="statusFormat" width="80" />
<el-table-column label="创建时间" width="160"> <el-table-column label="创建时间" width="160">
<template slot-scope="scope"> <template slot-scope="scope">
@ -55,18 +74,20 @@
</el-table-column> </el-table-column>
<el-table-column label="操作" fixed="right" width="130"> <el-table-column label="操作" fixed="right" width="130">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button v-hasPermi="['sch:classType:edit']" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)">修改</el-button> <el-button v-hasPermi="['sch:classType:edit']" type="text" icon="el-icon-edit"
<el-button v-hasPermi="['sch:classType:remove']" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)">删除</el-button> @click="handleUpdate(scope.row)">修改</el-button>
<el-button v-hasPermi="['sch:classType:remove']" type="text" icon="el-icon-delete"
@click="handleDelete(scope.row)">删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getPageList" /> <pagination :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
@pagination="getPageList" />
</el-col> </el-col>
</el-row> </el-row>
<el-dialog title="班型设置" :visible.sync="modalVisible" width="500px" append-to-body :close-on-click-modal="false"> <el-dialog title="班型设置" :visible.sync="modalVisible" width="600px" append-to-body :close-on-click-modal="false">
<el-form ref="modalForm" :model="modalForm" :rules="modalRules" label-width="80px"> <el-form ref="modalForm" :model="modalForm" :rules="modalRules" label-width="80px">
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
@ -90,7 +111,8 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="驾照类型" prop="licenseType"> <el-form-item label="驾照类型" prop="licenseType">
<el-select v-model="modalForm.licenseType" placeholder="选择驾照类型"> <el-select v-model="modalForm.licenseType" placeholder="选择驾照类型">
<el-option v-for="item in licenseTypeOption" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue" /> <el-option v-for="item in licenseTypeOption" :key="item.dictValue" :label="item.dictLabel"
:value="item.dictValue" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -140,11 +162,56 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="状态" prop="currentPrice"> <el-form-item label="状态" prop="currentPrice">
<el-radio-group v-model="modalForm.status"> <el-radio-group v-model="modalForm.status">
<el-radio v-for="dict in statusOptions" :key="dict.dictValue" :label="dict.dictValue">{{ dict.dictLabel }}</el-radio> <el-radio v-for="dict in statusOptions" :key="dict.dictValue" :label="dict.dictValue">{{ dict.dictLabel
}}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row>
<el-form-item label="利润类型" prop="profitType">
<el-radio-group v-model="modalForm.profitType" @change="profitTypeChange">
<el-radio :label="1">底价</el-radio>
<el-radio :label="2">比例</el-radio>
<el-radio :label="3">固定</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="利润参数" prop="profitParam">
<el-input v-show="modalForm.profitType != 3" v-model="modalForm.profitParam" maxlength="100" placeholder="请输入"
clearable />
<div v-show="modalForm.profitType == 3" style="text-align: center;">
<el-table :data="modalForm.profitParamVOList" stripe border>
<el-table-column label="下限">
<template slot-scope="scope">
<el-form-item :prop="'profitParamVOList.' + scope.$index + '.min'" :rules="modalRules['min']">
<el-input v-model="scope.row.min" placeholder="请输入" clearable type="number" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="上限">
<template slot-scope="scope">
<el-form-item :prop="'profitParamVOList.' + scope.$index + '.max'" :rules="modalRules['max']">
<el-input v-model="scope.row.max" placeholder="请输入" clearable type="number" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="利润">
<template slot-scope="scope">
<el-form-item :prop="'profitParamVOList.' + scope.$index + '.profit'" :rules="modalRules['profit']">
<el-input v-model="scope.row.profit" placeholder="请输入" clearable type="number" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="130">
<template slot-scope="scope">
<el-button @click="handleProfitParamDelete(scope.$index)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-button plain @click="handleAddProfitParam">新增</el-button>
</div>
</el-form-item>
</el-row>
<!-- <el-row> <!-- <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="是否克隆到场地" prop="currentPrice"> <el-form-item label="是否克隆到场地" prop="currentPrice">
@ -158,7 +225,8 @@
</el-row> --> </el-row> -->
<el-row> <el-row>
<el-form-item label="描述" prop="description"> <el-form-item label="描述" prop="description">
<el-input v-model="modalForm.description" type="textarea" :autosize="{ minRows: 2, maxRows: 4 }" placeholder="请输入描述" /> <el-input v-model="modalForm.description" type="textarea" :autosize="{ minRows: 2, maxRows: 4 }"
placeholder="请输入描述" />
</el-form-item> </el-form-item>
</el-row> </el-row>
</el-form> </el-form>
@ -185,6 +253,9 @@
<el-button @click="cloneOpen = false"> </el-button> <el-button @click="cloneOpen = false"> </el-button>
</div> </div>
</el-dialog> </el-dialog>
<!-- 利润配置表 -->
<ProfitSettingDialog ref="ProfitSettingDialog" @refreshDataList="getPageList" />
</div> </div>
</template> </template>
@ -192,9 +263,13 @@
import { getClassTypeTableList, updateClassType, insertClassType, deleteClassType, cloneClassType } from '@/api/sch/classType'; import { getClassTypeTableList, updateClassType, insertClassType, deleteClassType, cloneClassType } from '@/api/sch/classType';
import { validateMoney } from '@/utils/validate'; import { validateMoney } from '@/utils/validate';
import { getMapData } from '@/api/sch/place'; import { getMapData } from '@/api/sch/place';
import ProfitSettingDialog from './components/ProfitSettingDialog.vue';
export default { export default {
name: 'Classtype', name: 'Classtype',
components: {
ProfitSettingDialog
},
data() { data() {
return { return {
searchName: '', searchName: '',
@ -238,7 +313,10 @@ export default {
required: true, required: true,
message: '场地不为空', message: '场地不为空',
trigger: 'change' trigger: 'change'
} },
min: [{ required: true, message: '上限不能为空', trigger: 'blur' }],
max: [{ required: true, message: '下限不能为空', trigger: 'blur' }],
profit: [{ required: true, message: '利润不能为空', trigger: 'blur' }]
}, },
schoolOption: [], schoolOption: [],
placeOption: [], placeOption: [],
@ -316,7 +394,7 @@ export default {
// //
handleAdd() { handleAdd() {
if (this.selectNodes.length < 1) { if (this.selectNodes.length < 1) {
this.msgError('请选择左侧驾校或场地'); this.$message.error('请选择左侧驾校或场地');
return; return;
} }
this.resetForm('modalForm'); this.resetForm('modalForm');
@ -335,7 +413,10 @@ export default {
orderMinPrice: undefined, orderMinPrice: undefined,
enterMinPrice: undefined, enterMinPrice: undefined,
companyMinPrice: undefined, companyMinPrice: undefined,
employeeMinPrice: undefined employeeMinPrice: undefined,
profitType: 1,
profitParam: undefined,
profitParamVOList: []
}; };
if (this.selectNodes.length > 1) { if (this.selectNodes.length > 1) {
@ -463,6 +544,38 @@ export default {
}); });
} }
}); });
},
//
handleProfit() {
const item = {
typeIds: this.ids,
profitType: 1,
profitParam: undefined
};
this.$nextTick(() => {
this.$refs.ProfitSettingDialog.init(item);
});
},
handleAddProfitParam() {
this.modalForm.profitParamVOList.push({
min: 0,
max: undefined,
profit: undefined
});
},
handleProfitParamDelete(index) {
console.log(index);
this.modalForm.profitParamVOList.splice(index, 1);
},
profitTypeChange(type) {
this.$set(this.modalForm, "profitParamVOList", []);
if (type == 3) {
this.modalForm.profitParamVOList.push({
min: 0,
max: undefined,
profit: undefined
});
}
} }
} }
}; };

@ -7,10 +7,13 @@
</el-input> </el-input>
<div class="asider" :class="showSchool ? '' : 'hidden-school'"> <div class="asider" :class="showSchool ? '' : 'hidden-school'">
<el-card class="box-card" :body-style="{ flex: 1, 'overflow-y': 'scroll', padding: 0 }"> <el-card class="box-card" :body-style="{ flex: 1, 'overflow-y': 'scroll', padding: 0 }">
<div style="margin:10px;">
<el-input v-model="searchValue" placeholder="请输入驾校名" ></el-input>
</div>
<div slot="header" class="clearfix"> <div slot="header" class="clearfix">
<div class="map-card-title">驾校列表</div> <div class="map-card-title">驾校列表</div>
</div> </div>
<div v-for="school in schoolList" :key="school.schoolId" style="margin:10px;" :class="currentdeptId == school.schoolId ? 'actived-school' : ''"> <div v-for="school in schoolList.filter(item => (searchValue == undefined || item.schoolName.includes(searchValue)))" :key="school.schoolId" style="margin:10px;" :class="currentdeptId == school.schoolId ? 'actived-school' : ''">
<el-card :body-style="{ padding: '10px' }"> <el-card :body-style="{ padding: '10px' }">
<div slot="header" class="clearfix"> <div slot="header" class="clearfix">
<div class="map-card-title">{{ school.schoolName }}</div> <div class="map-card-title">{{ school.schoolName }}</div>
@ -186,7 +189,8 @@ export default {
schoolList: [], schoolList: [],
currentdeptId: undefined, currentdeptId: undefined,
placeMarkerList: [], placeMarkerList: [],
areaOptions: [] areaOptions: [],
searchValue: undefined
}; };
}, },
computed: { computed: {

@ -19,7 +19,7 @@
</template> </template>
</el-row> </el-row>
<el-table v-loading="loading" :data="dataList" @selection-change="handleSelectionChange" size="mini"> <el-table v-loading="loading" :data="dataList" size="mini">
<el-table-column label="字典标签" align="center" prop="dictLabel" /> <el-table-column label="字典标签" align="center" prop="dictLabel" />
<!-- <el-table-column label="字典编码" align="center" prop="dictValue" /> --> <!-- <el-table-column label="字典编码" align="center" prop="dictValue" /> -->
<el-table-column label="字典排序" align="center" prop="dictSort" /> <el-table-column label="字典排序" align="center" prop="dictSort" />
@ -275,11 +275,12 @@ export default {
}, },
// //
handleStatusChange(row) { handleStatusChange(row) {
debugger
console.log(row)
let text = row.status === true ? "启用" : "停用"; let text = row.status === true ? "启用" : "停用";
this.$modal this.$modal.confirm('确认要"' + text + '""' + row.dictLabel + '"标签吗?').
.confirm('确认要"' + text + '""' + row.dictLabel + '"标签吗?') then(function () {
.then(function () { return changeDictDataStatus(dictCodes);
return changeDictDataStatus(row.dictCode, row.status);
}) })
.then((resp) => { .then((resp) => {
if (resp.code == 200) { if (resp.code == 200) {

@ -0,0 +1,226 @@
<template>
<div class="app-container">
<el-form v-show="showSearch" ref="queryForm" :model="queryParams" size="small" :inline="true" label-width="68px">
<el-form-item label="问题" prop="question">
<el-input v-model="queryParams.question" placeholder="请输入关键词" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button v-hasPermi="['system:skill:add']" type="primary" plain icon="el-icon-plus" size="mini"
@click="handleAdd">新增</el-button>
</el-col>
<right-toolbar :show-search.sync="showSearch" @queryTable="getList" />
</el-row>
<el-table v-loading="loading" :data="skillList" @selection-change="handleSelectionChange">
<el-table-column type="index" width="55" align="center" />
<el-table-column label="问题" align="center" prop="question" />
<el-table-column label="答案" align="center" prop="content" >
<template slot-scope="scope">
<p v-html="scope.row.content"></p>
</template>
</el-table-column>
<el-table-column label="关键词" align="center" prop="skillKey" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button v-hasPermi="['system:skill:edit']" size="mini" type="text" icon="el-icon-edit"
@click="handleUpdate(scope.row)">修改</el-button>
<el-button v-hasPermi="['system:skill:remove']" size="mini" type="text" icon="el-icon-delete"
@click="handleDelete(scope.row)">删除</el-button>
<el-button v-if="scope.row.status == 1" v-hasPermi="['system:skill:check']" size="mini" type="text" icon="el-icon-edit"
@click="handleUpdate(scope.row)">审核</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
@pagination="getList" />
<!-- 添加或修改关键话术对话框 -->
<el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="问题" prop="question">
<el-input v-model="form.question" placeholder="请输入" />
</el-form-item>
<el-form-item label="关键词">
<el-select v-model="form.keyList" placeholder="请选择" style="width: 100%;" multiple>
<el-option v-for="dict in dict.type.dm_skill_key" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="答案" prop="content">
<editor v-model="form.content" :min-height="192" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button v-if="form.status == 0 || form.status == 3 " type="primary" @click="submitForm(0)"> </el-button>
<el-button v-if="form.status == 0 || form.status == 3 " type="primary" @click="submitForm(1)"> </el-button>
<el-button v-if="form.status == 1 " type="primary" @click="checkSkill(2)"> </el-button>
<el-button v-if="form.status == 1 " type="primary" @click="checkSkill(3)"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { pageSkill,listSkill, getSkill, delSkill, addSkill, updateSkill,checkSkill } from '@/api/system/skill';
export default {
name: 'Skill',
dicts: ['dm_skill_key'],
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
skillList: [],
//
title: '',
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
deptId: null,
question: null,
content: null,
},
//
form: {},
//
rules: {
question: [{ required: true, message: '关键词不能为空', trigger: 'blur' }],
content: [{ required: true, message: '话术内容不能为空', trigger: 'blur' }]
},
skillOptions:[]
};
},
created() {
this.getList();
},
methods: {
/** 查询关键话术列表 */
getList() {
this.loading = true;
pageSkill(this.queryParams).then(response => {
this.skillList = response.rows;
this.total = response.total;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
skillId: null,
deptId: null,
skillKey: null,
content: null,
status: 0,
keyList: []
};
this.resetForm('form');
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm('queryForm');
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.skillId);
this.single = selection.length !== 1;
this.multiple = !selection.length;
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = '关键话术';
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const skillId = row.skillId || this.ids;
getSkill(skillId).then(response => {
this.form = response.data;
this.open = true;
this.title = '关键话术';
});
},
/** 提交按钮 */
submitForm(status) {
this.form.status = status;
this.$refs['form'].validate(valid => {
if (valid) {
if (this.form.skillId != null) {
updateSkill(this.form).then(response => {
this.$modal.msgSuccess('操作成功');
this.open = false;
this.getList();
});
} else {
addSkill(this.form).then(response => {
this.$modal.msgSuccess('操作成功');
this.open = false;
this.getList();
});
}
}
});
},
checkSkill(status){
checkSkill({skillId : this.form.skillId, status : status}).then(resp => {
this.$modal.msgSuccess('操作成功');
this.open = false;
this.getList();
});
},
/** 删除按钮操作 */
handleDelete(row) {
const skillIds = row.skillId || this.ids;
this.$modal.confirm('是否确认删除关键话术编号为"' + skillIds + '"的数据项?').then(function () {
return delSkill(skillIds);
}).then(() => {
this.getList();
this.$modal.msgSuccess('删除成功');
}).catch(() => { });
},
/** 导出按钮操作 */
handleExport() {
this.download('system/skill/export', {
...this.queryParams
}, `skill_${new Date().getTime()}.xlsx`);
}
}
};
</script>

@ -30,6 +30,9 @@
<!-- :disabled="!canSubmit" --> <!-- :disabled="!canSubmit" -->
<el-button class="footer_button" :disabled="!canSubmit" type="primary" @click="clueSubmit"> </el-button> <el-button class="footer_button" :disabled="!canSubmit" type="primary" @click="clueSubmit"> </el-button>
<el-button class="footer_button" @click="toBackClue"> </el-button> <el-button class="footer_button" @click="toBackClue"> </el-button>
<el-button class="footer_button" v-if="!clueForm.state" v-hasPermi="['zs:clue:discard']" type="primary" @click="handleDiscard()">释放</el-button>
<el-button type="primary" @click="handleSkill">关键话术</el-button>
</div> </div>
</div> </div>
<el-divider /> <el-divider />
@ -44,7 +47,7 @@
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="线索来源" prop="source"> <el-form-item label="线索来源" prop="source">
<el-select style="width: 100%;" v-model="clueForm.source" placeholder="请选择" clearable> <el-select style="width: 100%;" v-model="clueForm.source" placeholder="请选择" clearable filterable>
<el-option v-for="dict in sourceOptions" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue" /> <el-option v-for="dict in sourceOptions" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue" />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -159,22 +162,25 @@
<MapDialog v-if="mapDialogVisible" ref="mapDialog" :dialog-visible="mapDialogVisible" @handleMapDialogPoint="handleMapDialogPoint" /> <MapDialog v-if="mapDialogVisible" ref="mapDialog" :dialog-visible="mapDialogVisible" @handleMapDialogPoint="handleMapDialogPoint" />
<SkillDialog ref="SkillDialog"/>
</div> </div>
</template> </template>
<script> <script>
import { getClueInfo, getConsultRecord, addClue, updateClue, } from '@/api/zs/clue' import { getClueInfo, getConsultRecord, addClue, updateClue, discardClue} from '@/api/zs/clue';
import empApi from '@/api/system/employee' import empApi from '@/api/system/employee';
import { getAllPlaces } from '@/api/sch/place' import { getAllPlaces } from '@/api/sch/place';
import PlaceMap from './components/PlaceMap.vue'; import PlaceMap from './components/PlaceMap.vue';
import FollowRecord from './components/FollowRecord.vue'; import FollowRecord from './components/FollowRecord.vue';
import MapDialog from './components/MapDialog.vue'; import MapDialog from './components/MapDialog.vue';
import SkillDialog from '../components/SkillDialog.vue';
export default { export default {
name: 'ClueForm', name: 'ClueForm',
components: { components: {
PlaceMap, FollowRecord, MapDialog PlaceMap, FollowRecord, MapDialog, SkillDialog
}, },
data() { data() {
return { return {
@ -360,7 +366,30 @@ export default {
toBackClue() { toBackClue() {
const obj = { path: "/zs/clue" }; const obj = { path: "/zs/clue" };
this.$tab.closeOpenPage(obj); this.$tab.closeOpenPage(obj);
},
// 线
handleDiscard() {
this.$confirm('是否确认释放该条线索(“' + this.clueForm.name + '/' + this.clueForm.phone + '”)到公海?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then((res) => {
discardClue(this.clueForm).then((resp) => {
if (resp && resp.code === 200) {
this.$message.success('释放成功');
this.toBackClue();
} }
});
})
.catch(function () { });
},
//
handleSkill() {
this.$nextTick(() => {
this.$refs.SkillDialog.init();
});
},
} }
}; };

@ -119,7 +119,7 @@ export default {
address: { required: true, message: '位置不为空', trigger: 'blur' }, address: { required: true, message: '位置不为空', trigger: 'blur' },
intentionState: { required: true, message: '意向状态不为空', trigger: 'blur,change' }, intentionState: { required: true, message: '意向状态不为空', trigger: 'blur,change' },
goodName: { required: true, message: '商品名称不为空', trigger: 'blur,change' }, goodName: { required: true, message: '商品名称不为空', trigger: 'blur,change' },
amountReceived: { required: true, message: '订单实收不为空', trigger: 'blur,change' } amountReceived: { required: true, message: '订单实收不为空', trigger: 'blur,change' },
}, },

@ -12,7 +12,7 @@
<el-input v-model="searchForm.name" placeholder="姓名/联系方式" clearable style="width: 200px" /> <el-input v-model="searchForm.name" placeholder="姓名/联系方式" clearable style="width: 200px" />
</el-form-item> </el-form-item>
<el-form-item label="线索来源"> <el-form-item label="线索来源">
<el-select v-model="searchForm.source" placeholder="选择线索来源" clearable> <el-select v-model="searchForm.source" placeholder="选择线索来源" filterable clearable>
<el-option v-for="dict in sourceOptions" :key="dict.dictValue" :value="dict.dictValue" /> <el-option v-for="dict in sourceOptions" :key="dict.dictValue" :value="dict.dictValue" />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -66,7 +66,8 @@ export default {
{ value: 5, label: '今日跟踪' }, { value: 5, label: '今日跟踪' },
{ value: 6, label: '过期线索' }, { value: 6, label: '过期线索' },
{ value: 7, label: '相关线索' }, { value: 7, label: '相关线索' },
{ value: 8, label: '撞单线索' } { value: 8, label: '撞单线索' },
{ value: 9, label: '待分配' }
], ],
intentionOptions: [], intentionOptions: [],
createDateRange: [], createDateRange: [],

@ -0,0 +1,90 @@
<!--
* @Author: riverQiu
* @Date: 2023-10-14 13:21:37
* @LastEditors: riverQiu
* @LastEditTime: 2023-10-15 00:55:44
* @Description:
-->
<template>
<el-dialog title="话术" :close-on-click-modal="false" append-to-body :visible.sync="visible" width="800px" height="700">
<div>
<!-- 问题 -->
<el-input v-model="queryParams.searchValue" placeholder="请输入问题" clearable @keyup.enter.native="queryAnswer" style="margin-bottom: 10px;"/>
<!-- 关键词 -->
<el-checkbox-group v-model="queryParams.keyList" @change="queryAnswer">
<el-checkbox v-for="(item, index) in dict.type.dm_skill_key" :key="index" :label="item.value" style="margin: 2px;" border>{{item.label}}</el-checkbox>
</el-checkbox-group>
<!-- 话术内容 -->
<el-card class="box-card">
<div class="text item">
<ul v-for="item in skillInfo">
<li>
<span style="font-style: italic; font-size: 16px; font-weight: bold; margin-right: 5px;">Q:</span><span>{{item.question}}</span>
</li>
<li>
<span style="font-style: italic; font-size: 16px; font-weight: bold; margin-right: 5px;">A:</span><span v-html="item.content"></span>
</li>
<el-divider></el-divider>
</ul>
<span v-html="content" />
</div>
</el-card>
</div>
</el-dialog>
</template>
<script>
import { listSkill,getSkillKey, getSkill } from '@/api/system/skill';
export default {
name: 'SkillDialog',
dicts: ['dm_skill_key'],
data () {
return {
visible: false,
loading: true,
keyOptions: [],
content: undefined,
skillId: undefined,
queryParams:{
searchValue: undefined,
keyList: [],
status: 2
},
skillInfo:[]
};
},
methods: {
init () {
this.visible = true;
this.getSkillKeyOption();
},
getSkillKeyOption () {
getSkillKey().then((resp) => {
if (resp && resp.code === 200) {
this.keyOptions = resp.data;
}
});
},
queryAnswer(){
console.log(this.queryParams)
this.skillInfo = []
listSkill(this.queryParams).then((resp) => {
if (resp && resp.code === 200) {
this.skillInfo = resp.data;
}
});
}
}
};
</script>
<style lang="scss" scoped>
.box-card {
width: 500px;
min-height: 100px;
}
</style>

@ -13,6 +13,8 @@
<el-button v-hasPermi="['zs:clue:export']" icon="el-icon-download" type="warning" @click="handleExport">导出</el-button> <el-button v-hasPermi="['zs:clue:export']" icon="el-icon-download" type="warning" @click="handleExport">导出</el-button>
<el-button v-hasPermi="['zs:clue:edit']" icon="el-icon-edit" type="primary" :disabled="multiple" @click="handleBatChUpdate()">批量修改</el-button> <el-button v-hasPermi="['zs:clue:edit']" icon="el-icon-edit" type="primary" :disabled="multiple" @click="handleBatChUpdate()">批量修改</el-button>
<el-button type="primary" @click="handlePublicClue">公海</el-button> <el-button type="primary" @click="handlePublicClue">公海</el-button>
<el-button type="primary" @click="handleSkill">关键话术</el-button>
</el-col> </el-col>
<right-toolbar :show-search.sync="showSearch" :columns="columns" @queryTable="_getTableList" /> <right-toolbar :show-search.sync="showSearch" :columns="columns" @queryTable="_getTableList" />
</el-row> </el-row>
@ -58,6 +60,8 @@
<MemoFormDialog ref="memoDialog" @refreshDataList="_getTableList" /> <MemoFormDialog ref="memoDialog" @refreshDataList="_getTableList" />
<!-- 抖音直播弹框 --> <!-- 抖音直播弹框 -->
<DYClueFormDialog ref="DYClueFormDialog" @refreshDataList="_getTableList"/> <DYClueFormDialog ref="DYClueFormDialog" @refreshDataList="_getTableList"/>
<!-- 关键性话术 -->
<SkillDialog ref="SkillDialog"/>
</div> </div>
</template> </template>
@ -72,6 +76,7 @@ import SignFormDialog from '../sign/components/SignFormDialog.vue';
import ZhuangDanDialog from './components/ZhuangDanDialog.vue'; import ZhuangDanDialog from './components/ZhuangDanDialog.vue';
import MemoFormDialog from './components/MemoFormDialog.vue'; import MemoFormDialog from './components/MemoFormDialog.vue';
import DYClueFormDialog from './components/DYClueFormDialog.vue'; import DYClueFormDialog from './components/DYClueFormDialog.vue';
import SkillDialog from './components/SkillDialog.vue';
import { defaultColumns } from './columns.js'; import { defaultColumns } from './columns.js';
import { getClueList, deleteClue, getClueCountBadge, discardClue, getSign, getConsultRecord } from '@/api/zs/clue'; import { getClueList, deleteClue, getClueCountBadge, discardClue, getSign, getConsultRecord } from '@/api/zs/clue';
@ -89,7 +94,7 @@ export default {
}, },
components: { components: {
SearchForm, BatchUpdateDialog, PublicDialog, UploadDialog, SignFormDialog, DistributeFormDialog, ZhuangDanDialog, MemoFormDialog, SearchForm, BatchUpdateDialog, PublicDialog, UploadDialog, SignFormDialog, DistributeFormDialog, ZhuangDanDialog, MemoFormDialog,
DYClueFormDialog DYClueFormDialog,SkillDialog
}, },
data() { data() {
return { return {
@ -300,7 +305,12 @@ export default {
}); });
} }
} },
handleSkill() {
this.$nextTick(() => {
this.$refs.SkillDialog.init();
});
},
} }
}; };
</script> </script>

@ -32,7 +32,7 @@
</el-form-item> </el-form-item>
<el-form-item label="线索来源"> <el-form-item label="线索来源">
<el-select v-model="searchForm.source" placeholder="请选择" clearable> <el-select v-model="searchForm.source" placeholder="请选择" filterable clearable>
<el-option v-for="dict in options.sourceOptions" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue" /> <el-option v-for="dict in options.sourceOptions" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue" />
</el-select> </el-select>
</el-form-item> </el-form-item>

@ -629,15 +629,35 @@ export default {
}, },
priceChange() { priceChange() {
// - // -
// if (this.modalForm.signClass && this.modalForm.signPrice) {
// const minprice = this.classTypeOptions.find(
// (item) => item.typeId == this.modalForm.signClass
// ).minPrice;
// if (minprice) {
// this.$set(this.modalForm, 'schoolPay', this.modalForm.signPrice - minprice);
// }
// } else {
// this.$set(this.modalForm, 'schoolPay', undefined);
// }
this.$set(this.modalForm, 'schoolPay', undefined);
if (this.modalForm.signClass && this.modalForm.signPrice) { if (this.modalForm.signClass && this.modalForm.signPrice) {
const minprice = this.classTypeOptions.find( const classType = this.classTypeOptions.find(
(item) => item.typeId == this.modalForm.signClass (item) => item.typeId == this.modalForm.signClass
).minPrice; );
if (minprice) { if (classType.profitType == 1) {
this.$set(this.modalForm, 'schoolPay', this.modalForm.signPrice - minprice); //
} this.$set(this.modalForm, 'schoolPay', this.modalForm.signPrice - classType.minPrice);
} else if (classType.profitType == 2) {
//
this.$set(this.modalForm, 'schoolPay', this.modalForm.signPrice * Number(classType.profitParam));
} else { } else {
this.$set(this.modalForm, 'schoolPay', undefined); //
classType.profitParamVOList.forEach(item => {
if (item.min <= this.modalForm.signPrice && item.max >= this.modalForm.signPrice) {
this.$set(this.modalForm, 'schoolPay', item.profit);
}
});
}
} }
}, },
getZhuangDanPeople(clueId) { getZhuangDanPeople(clueId) {

@ -7,7 +7,7 @@ function resolve(dir) {
const CompressionPlugin = require('compression-webpack-plugin'); const CompressionPlugin = require('compression-webpack-plugin');
const name = process.env.VUE_APP_TITLE || '莳松管理系统'; // 网页标题 const name = process.env.VUE_APP_TITLE || '寻驾招生管理系统'; // 网页标题
const port = process.env.port || process.env.npm_config_port || 80; // 端口 const port = process.env.port || process.env.npm_config_port || 80; // 端口
@ -33,18 +33,18 @@ module.exports = {
port: port, port: port,
open: true, open: true,
proxy: { proxy: {
[process.env.VUE_APP_BASE_API + '/driver-api']: { [process.env.VUE_APP_BASE_API + '/xunjia']: {
// target: `http://118.31.23.45:8888/driver-api/`, // target: `http://localhost:8889/driver-api/`,
target: `http://localhost:8888/driver-api/`, target: `https://xueche.ahduima.com/duima/xunjia/`,
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
['^' + process.env.VUE_APP_BASE_API + '/driver-api']: '' ['^' + process.env.VUE_APP_BASE_API + '/xunjia']: ''
} }
}, },
// detail: https://cli.vuejs.org/config/#devserver-proxy // detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: { [process.env.VUE_APP_BASE_API]: {
// target: `https://xueche.ahduima.com/duima/`, target: `https://xueche.ahduima.com/duima/`,
target: `http://localhost:8086`, // target: `http://localhost:8086`,
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: '' ['^' + process.env.VUE_APP_BASE_API]: ''

Loading…
Cancel
Save