Compare commits

..

6 Commits
dev-cl ... main

Author SHA1 Message Date
qsh cd9b974389 sc 1 day ago
qsh e449f1a124 sc 6 days ago
qsh 80b8eddd35 sc 7 days ago
qsh 6359913c2c sc 2 weeks ago
qsh cff96918ce sc 2 weeks ago
qsh f5b7a77fb0 sc 3 weeks ago
  1. 4
      .env.base
  2. 1
      package.json
  3. 9
      src/api/uav/clue.js
  4. 8
      src/api/uav/record.js
  5. 33
      src/api/uav/regiest.js
  6. 28
      src/api/uav/testRoom.js
  7. 58
      src/components/Editor/src/Editor.vue
  8. 6
      src/main.js
  9. 34
      src/views/ExamVenue/Calendar/index.vue
  10. 297
      src/views/ExamVenue/Room/index.vue
  11. 155
      src/views/JoinUs/Coach/index.vue
  12. 325
      src/views/JoinUs/Station/index.vue
  13. 6
      src/views/Question/UAV/Components/QuestionAddForm.vue
  14. 4
      src/views/Question/UAV/index.vue
  15. 10
      src/views/Question/UAVChapter/index.vue
  16. 106
      src/views/UAVClue/CluePool/index.vue
  17. 52
      src/views/UAVClue/StudyRecord/components/Practice.vue
  18. 3136
      yarn.lock

@ -4,14 +4,14 @@ VITE_NODE_ENV=development
VITE_DEV=true
# 请求路径
VITE_BASE_URL='http://localhost:48080'
# VITE_BASE_URL='http://localhost:48080'
VITE_BASE_URL='http://47.98.161.246:48080'
# VITE_BASE_URL='http://114.55.169.15:48080'
# VITE_BASE_URL='http://114.215.207.150:48080'
# 上传路径
VITE_UPLOAD_URL='http://47.98.161.246:48080/admin-api/system/file/upload'
VITE_UPLOAD_URL='http://47.98.161.246:48080/admin-api/system/file/upload'
# VITE_UPLOAD_URL='http://114.55.169.15:48080/admin-api/system/file/upload'
# 接口前缀

@ -39,6 +39,7 @@
"@vueuse/core": "^10.1.2",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.10",
"@wangeditor/plugin-upload-attachment": "^1.1.0",
"@zxcvbn-ts/core": "^3.0.1",
"animate.css": "^4.1.1",
"axios": "^1.4.0",

@ -0,0 +1,9 @@
import request from '@/config/axios'
// 查询线索
export const searchClue = async (params) => {
return await request.get({
url: '/admin-api/applet/wrj/clue/page',
params
})
}

@ -0,0 +1,8 @@
import request from '@/config/axios'
export const searchStudyRecords = async (data) => {
return await request.post({
url: 'wrj-api/wrjQuestionPractice/query',
data
})
}

@ -0,0 +1,33 @@
import request from '@/config/axios'
// 查询机构
export const searchStation = async (params) => {
return await request.get({
url: '/admin-api/applet/wrj/school/page',
params
})
}
// 审核机构
export const auditStation = async (data) => {
return await request.post({
url: '/admin-api/applet/wrj/school/check',
data
})
}
// 查询教员
export const searchTeacher = async (params) => {
return await request.get({
url: '/admin-api/applet/wrj/teacher/page',
params
})
}
// 审核教员
export const auditTeacher = async (data) => {
return await request.post({
url: '/admin-api/applet/wrj/teacher/audit',
data
})
}

@ -0,0 +1,28 @@
import request from '@/config/axios'
export const searchTestroom = async (params) => {
return await request.get({
url: '/admin-api/applet/wrj/examPlace/page',
params
})
}
export const addTestroom = async (data) => {
return await request.post({
url: '/admin-api/applet/wrj/examPlace/add',
data,
isSubmitForm: true
})
}
export const updateTestroom = async (data) => {
return await request.put({
url: '/admin-api/applet/wrj/examPlace/update',
data
})
}
export const deleteTestroom = async (params) => {
return await request.delete({
url: '/admin-api/applet/wrj/examPlace/delete',
params
})
}

@ -42,7 +42,11 @@ const props = defineProps({
'undo', //
'redo', //
'fullScreen'
]
],
insertKeys: {
index: 20, //
keys: ['uploadAttachment'] //
}
})
}
})
@ -104,6 +108,12 @@ const editorConfig = computed((): IEditorConfig => {
},
autoFocus: false,
scroll: true,
//
hoverbarKeys: {
attachment: {
menuKeys: ['downloadAttachment'] //
}
},
MENU_CONF: {
['uploadImage']: {
server: import.meta.env.VITE_UPLOAD_URL,
@ -218,6 +228,52 @@ const editorConfig = computed((): IEditorConfig => {
customInsert(res: any, insertFn: InsertFnType) {
insertFn(res.data, 'video', res.data)
}
},
uploadAttachment: {
server: import.meta.env.VITE_UPLOAD_URL,
timeout: 20 * 1000, // 2s
fieldName: 'file',
// meta: { token: 'xxx', a: 100 }, //
// metaWithUrl: true, // meta url
// headers: { Accept: 'text/x-json' },
// http header
headers: {
Accept: '*',
Authorization: 'Bearer ' + getAccessToken(),
'tenant-id': getTenantId(),
'instance-id': getAppId()
},
maxFileSize: 20 * 1024 * 1024, // 20M
onBeforeUpload(file: File) {
console.log('onBeforeUpload', file)
return file // file
// return false //
},
onProgress(progress: number) {
console.log('onProgress', progress)
},
onSuccess(file: File, res: any) {
console.log('onSuccess', file, res)
},
onFailed(file: File, res: any) {
alert(res.message)
console.log('onFailed', file, res)
},
onError(file: File, err: Error, res: any) {
alert(err.message)
console.error('onError', file, err, res)
},
//
customInsert(res: any, file: File, insertFn: Function) {
console.log('customInsert', res)
//
insertFn(file.name, res.data)
// insertFn(res.data, `customInsert-${file.name}`, res.data)
}
}
},
uploadImgShowBase64: true

@ -42,8 +42,14 @@ import '@/plugins/tongji' // 百度统计
import Logger from '@/utils/Logger'
import VueDOMPurifyHTML from 'vue-dompurify-html'
import { Boot } from '@wangeditor/editor'
import attachmentModule from '@wangeditor/plugin-upload-attachment'
// 创建实例
const setupAll = async () => {
// 注册。要在创建编辑器之前注册,且只能注册一次,不可重复注册。
Boot.registerModule(attachmentModule)
const app = createApp(App)
await setupI18n(app)

@ -1,7 +1,37 @@
<template>
<div> 考试日历 </div>
<div>
<el-tabs v-model="examType">
<el-tab-pane label="理论考试" :name="1" />
<el-tab-pane label="实践考试" :name="2" />
<el-calendar>
<template #date-cell="{ data }">
<el-popover placement="top" width="500px" trigger="click">
<template #reference>
<div>
<div>{{ new Date(data.day).getDate() }}</div>
<div class="mt-10px">考场数量{{ new Date(data.day).getDate() % 5 }}</div>
</div>
</template>
<el-table :data="roomList" border stripe>
<el-table-column prop="name" label="考场名称" width="120px" />
<el-table-column prop="address" label="考场地址" />
</el-table>
</el-popover>
</template>
</el-calendar>
</el-tabs>
</div>
</template>
<script setup name="Calendar"></script>
<script setup name="Calendar">
const examType = ref(1)
const roomList = ref([
{
name: '合肥瑶海长安考场',
address: '合肥瑶海大道100号'
}
])
</script>
<style lang="scss" scoped></style>

@ -1,13 +1,298 @@
<template>
<div>
<div>无人机章节</div>
<div>权限</div>
<div>新增ExamVenue:Room:add</div>
<div>修改ExamVenue:Room:edit</div>
<div>删除ExamVenue:Room:delete</div>
<el-form :model="searchForm" inline label-width="0">
<el-form-item>
<el-input v-model="searchForm.placeName" placeholder="考场名称" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleQuery"> </el-button>
<el-button v-hasPermi="['ExamVenue:Room:add']" @click="handleDetail(null)"> </el-button>
</el-form-item>
</el-form>
<el-table :data="tableList" border stripe>
<el-table-column type="index" width="50" />
<el-table-column prop="placeName" label="考点名称" min-width="200px" />
<el-table-column prop="leader" label="负责人" width="100px" />
<el-table-column prop="leaderPhone" label="负责人电话" width="100px" />
<el-table-column prop="contacts" label="联系人" width="100px" />
<el-table-column prop="contactPhone" label="联系人电话" width="100px" />
<el-table-column prop="address" label="地址" min-width="200px" />
<el-table-column label="理论" align="center">
<el-table-column label="时间" width="100px" align="center">
<template #default="{ row }">
{{
row.theoryExamDate
.split(',')
.map((item) => `每月${item}`)
.join(',')
}}
</template>
</el-table-column>
<el-table-column prop="theoryExamAddress" label="地址" min-width="200px" align="center" />
</el-table-column>
<el-table-column label="实践" align="center">
<el-table-column label="时间" width="100px" align="center">
<template #default="{ row }">
{{
row.practiceExamDate
.split(',')
.map((item) => `每月${item}`)
.join(',')
}}
</template>
</el-table-column>
<el-table-column prop="practiceExamAddress" label="地址" min-width="200px" align="center" />
</el-table-column>
<el-table-column label="操作" fixed="right" width="150">
<template #default="{ row }">
<el-button
v-hasPermi="['ExamVenue:Room:edit']"
type="primary"
link
@click="handleDetail(row)"
>
修改
</el-button>
<el-button
v-hasPermi="['ExamVenue:Room:delete']"
type="danger"
link
@click="handleDelete(row)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<Pagination
:total="total"
v-model:page="searchForm.pageNo"
v-model:limit="searchForm.pageSize"
@pagination="getList"
/>
<Dialog v-model="dialogVisible" title="教员详情" style="width: 800px">
<el-form :model="form" ref="formRef" :rules="rules" label-width="100px">
<el-row :gutter="20">
<el-col :span="24" :offset="0">
<el-form-item label="考点名称" prop="placeName">
<el-input v-model="form.placeName" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="12" :offset="0">
<el-form-item label="负责人" prop="leader">
<el-input v-model="form.leader" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="12" :offset="0">
<el-form-item label="负责人电话" prop="leaderPhone">
<el-input v-model="form.leaderPhone" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="12" :offset="0">
<el-form-item label="联系人" prop="contacts">
<el-input v-model="form.contacts" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="12" :offset="0">
<el-form-item label="联系人电话" prop="contactPhone">
<el-input v-model="form.contactPhone" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="24" :offset="0">
<el-form-item label="地址" prop="address">
<el-input
v-model="form.address"
type="textarea"
:autosize="{ minRows: 2 }"
placeholder="请输入"
/>
</el-form-item>
</el-col>
</el-row>
<el-divider direction="horizontal" content-position="left">理论</el-divider>
<el-row :gutter="20">
<el-col :span="24" :offset="0">
<el-form-item label="理论地址" prop="theoryExamAddress">
<el-input
v-model="form.theoryExamAddress"
type="textarea"
:autosize="{ minRows: 2 }"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="24" :offset="0">
<el-form-item label="理论时间">
<el-input
class="mr-2 mb-2"
v-for="(item, index) in form.theoryExamDate"
:key="index"
v-model="form.theoryExamDate[index]"
style="width: 180px"
>
<template #prepend>每月</template>
<template #append></template>
</el-input>
<el-button type="primary" @click="form.theoryExamDate.push(undefined)">
新增考试时间
</el-button>
</el-form-item>
</el-col>
</el-row>
<el-divider direction="horizontal" content-position="left">实践</el-divider>
<el-row :gutter="20">
<el-col :span="24" :offset="0">
<el-form-item label="实践地址" prop="theoryExamAddress">
<el-input
v-model="form.practiceExamAddress"
type="textarea"
:autosize="{ minRows: 2 }"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="24" :offset="0">
<el-form-item label="实践时间">
<el-input
class="mr-2 mb-2"
v-for="(item, index) in form.practiceExamDate"
:key="index"
v-model="form.practiceExamDate[index]"
style="width: 180px"
>
<template #prepend>每月</template>
<template #append></template>
</el-input>
<el-button type="primary" @click="form.practiceExamDate.push(undefined)">
新增考试时间
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<el-button type="primary" :disabled="formLoading" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</div>
</template>
<script setup name="ExamVenue"></script>
<script setup name="ExamVenue">
import * as api from '@/api/uav/testRoom'
const message = useMessage()
const searchForm = ref({
placeName: '',
pageNo: 1,
pageSize: 20
})
const tableList = ref([])
const total = ref(0)
onMounted(() => {
handleQuery()
})
function handleQuery() {
searchForm.value.pageNo = 1
getList()
}
function getList() {
try {
api.searchTestroom(searchForm.value).then((res) => {
tableList.value = res.list
total.value = res.total
})
} catch (error) {
console.log(error)
}
}
const form = ref({})
const rules = {
placeName: { required: true, message: '请输入名称', trigger: 'blur' },
leader: { required: true, message: '请输入姓名', trigger: 'blur' },
leaderPhone: { required: true, message: '请输入手机号', trigger: 'blur' }
}
const dialogVisible = ref(false)
const formLoading = ref(false)
const handleDetail = (row) => {
resetForm()
dialogVisible.value = true
if (row) {
form.value = { ...row }
form.value.theoryExamDate = row.theoryExamDate.split(',')
form.value.practiceExamDate = row.practiceExamDate.split(',')
}
}
const formRef = ref(null)
function resetForm() {
form.value = {
id: undefined,
placeName: '',
leader: '',
leaderPhone: '',
contacts: '',
contactPhone: '',
address: '',
theoryExamAddress: '',
theoryExamDate: [],
practiceExamAddress: '',
practiceExamDate: []
}
formRef.value && formRef.value.resetFields()
}
const handleDelete = async (row) => {
try {
//
await message.delConfirm()
//
await api.deleteTestroom({ id: row.placeId })
message.success('删除成功')
//
getList()
} catch {}
}
const submitForm = async () => {
if (!formRef.value) return
const valid = await formRef.value.validate()
if (!valid) return
try {
formLoading.value = true
let params = { ...form.value }
params.theoryExamDate = params.theoryExamDate.join(',')
params.practiceExamDate = params.practiceExamDate.join(',')
if (form.value.placeId) {
api.updateTestroom(params).then((response) => {
if (response) {
message.success('修改成功')
dialogVisible.value = false
}
})
} else {
api.addTestroom(params).then((response) => {
if (response) {
message.success('新增成功')
dialogVisible.value = false
}
})
}
} finally {
formLoading.value = false
getList()
}
}
</script>
<style lang="scss" scoped></style>

@ -1,11 +1,158 @@
<template>
<div>
<div>教员入驻</div>
<div>权限</div>
<div>审核JoinUs:Coach:audit</div>
<el-form :model="searchForm" inline label-width="0">
<el-form-item>
<el-input v-model="searchForm.name" placeholder="教员姓名" />
</el-form-item>
<el-form-item>
<el-input v-model="searchForm.phone" placeholder="手机号" />
</el-form-item>
<el-form-item>
<el-select v-model="searchForm.status" clearable filterable placeholder="审核状态">
<el-option label="待审核" :value="1" />
<el-option label="已通过" :value="2" />
<el-option label="未通过" :value="3" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleQuery"> 搜索 </el-button>
</el-form-item>
</el-form>
<el-table :data="tableList" border stripe>
<el-table-column type="index" width="50" />
<el-table-column prop="name" label="教员姓名" />
<el-table-column prop="phone" label="联系方式" />
<el-table-column prop="remark" label="备注" />
<el-table-column prop="createTime" label="申请时间" />
<el-table-column prop="auditRemark" label="审核状态" />
<el-table-column prop="auditUser" label="审核人" />
<el-table-column prop="auditTime" label="审核时间" />
<!-- 操作 -->
<el-table-column label="操作" fixed="right" width="150">
<template #default="{ row }">
<el-button
v-if="row.status == 1"
type="primary"
link
v-hasPermi="['JoinUs:Station:audit']"
@click="handleDetail(row, 'audit')"
>
审核
</el-button>
<el-button
v-else
type="primary"
link
v-hasPermi="['JoinUs:Station:audit']"
@click="handleDetail(row, 'detail')"
>
详情
</el-button>
</template>
</el-table-column>
</el-table>
<Pagination
:total="total"
v-model:page="searchForm.pageNo"
v-model:limit="searchForm.pageSize"
@pagination="getList"
/>
<Dialog v-model="dialogVisible" title="教员详情" style="width: 600px">
<el-form
:model="form"
ref="formRef"
:rules="rules"
label-width="80px"
:disabled="form.status != 1"
>
<el-form-item label="教员姓名" prop="applyUser">
<el-input v-model="form.applyUser" placeholder="请输入姓名" />
</el-form-item>
<el-form-item label="联系方式" prop="phone">
<el-input v-model="form.phone" placeholder="请输入电话" />
</el-form-item>
<el-form-item label="备注" prop="xcwa">
<el-input
v-model="form.name"
type="textarea"
:autosize="{ minRows: 2 }"
placeholder="请输入"
/>
</el-form-item>
<div v-if="dialogType == 'audit'">
<el-divider direction="horizontal" content-position="left">审核信息</el-divider>
<el-form-item label="审核结果" prop="shjg">
<el-radio-group v-model="form.shjg">
<el-radio :label="2" :value="2">通过</el-radio>
<el-radio :label="3" :value="3">不通过</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="审核说明" prop="shsm">
<el-input
v-model="form.shsm"
type="textarea"
:autosize="{ minRows: 2 }"
placeholder="请输入"
/>
</el-form-item>
</div>
</el-form>
<template #footer>
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</div>
</template>
<script setup name="Coach"></script>
<script setup name="Coach">
import { searchTeacher } from '@/api/uav/regiest'
const searchForm = ref({
name: '',
phone: '',
status: 1,
pageNo: 1,
pageSize: 20
})
const tableList = ref([])
const total = ref(0)
const form = ref({})
const rules = {
name: { required: true, message: '请输入名称', trigger: 'blur' },
phone: { required: true, message: '请输入手机号', trigger: 'blur' }
}
const dialogVisible = ref(false)
const dialogType = ref('audit')
onMounted(() => {
handleQuery()
})
function handleQuery() {
searchForm.value.pageNo = 1
getList()
}
function getList() {
searchTeacher(searchForm.value).then((response) => {
tableList.value = response.list
total.value = response.total
})
}
function handleDetail(row, type) {
dialogType.value = type
dialogVisible.value = true
form.value = { ...row }
}
function submitForm() {
dialogVisible.value = false
}
</script>
<style lang="scss" scoped></style>

@ -1,11 +1,328 @@
<template>
<div>
<div>机构入驻</div>
<div>权限</div>
<div>审核JoinUs:Station:audit</div>
<el-form :model="searchForm" inline label-width="0">
<el-form-item>
<el-input v-model="searchForm.schoolName" placeholder="机构名称" />
</el-form-item>
<el-form-item>
<el-select v-model="searchForm.status" clearable filterable placeholder="审核状态">
<el-option label="待审核" :value="1" />
<el-option label="已通过" :value="2" />
<el-option label="未通过" :value="3" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleQuery"> 搜索 </el-button>
</el-form-item>
</el-form>
<el-table :data="tableList" border stripe>
<el-table-column type="index" width="50" />
<el-table-column prop="schoolName" label="机构名称" />
<el-table-column prop="contacts" label="联系人" />
<el-table-column prop="phone" label="联系方式" />
<el-table-column prop="createTime" label="申请时间" />
<el-table-column prop="auditRemark" label="审核状态" />
<el-table-column prop="auditUser" label="审核人" />
<el-table-column prop="auditTime" label="审核时间" />
<!-- 操作 -->
<el-table-column label="操作" fixed="right" width="150">
<template #default="{ row }">
<el-button
v-if="row.status == 1"
type="primary"
link
v-hasPermi="['JoinUs:Station:audit']"
@click="handleDetail(row, 'audit')"
>
审核
</el-button>
<el-button
v-else
type="primary"
link
v-hasPermi="['JoinUs:Station:audit']"
@click="handleDetail(row, 'detail')"
>
详情
</el-button>
</template>
</el-table-column>
</el-table>
<Pagination
:total="total"
v-model:page="searchForm.pageNo"
v-model:limit="searchForm.pageSize"
@pagination="getList"
/>
<Dialog v-model="dialogVisible" title="机构详情" style="width: 1000px">
<el-form :model="form" ref="formRef" :rules="rules" label-position="top">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="机构名称" prop="schoolName">
<el-input v-model="form.schoolName" placeholder="请输入机构名称" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="联系人" prop="contacts">
<el-input v-model="form.contacts" placeholder="请输入姓名" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="联系方式" prop="phone">
<el-input v-model="form.phone" placeholder="请输入电话" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="培训机构宣传文案" prop="introduction">
<el-input
v-model="form.introduction"
type="textarea"
:autosize="{ minRows: 2 }"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="培训机构地址" prop="address">
<el-input
v-model="form.address"
type="textarea"
:autosize="{ minRows: 2 }"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="培训项目-多旋翼" prop="dxy">
<el-checkbox-group v-model="form.dxy">
<el-checkbox
v-for="item in driverOptions"
:key="item.value"
:label="item.value"
:value="item.value"
>
{{ item.label }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="培训项目-垂直起降" prop="czqj">
<el-checkbox-group v-model="form.czqj">
<el-checkbox
v-for="item in driverOptions"
:key="item.value"
:label="item.value"
:value="item.value"
>
{{ item.label }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="培训项目-直升机" prop="zsj">
<el-checkbox-group v-model="form.zsj">
<el-checkbox
v-for="item in driverOptions"
:key="item.value"
:label="item.value"
:value="item.value"
>
{{ item.label }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="培训项目-固定翼" prop="gdy">
<el-checkbox-group v-model="form.gdy">
<el-checkbox
v-for="item in driverOptions"
:key="item.value"
:label="item.value"
:value="item.value"
>
{{ item.label }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合格证图片" prop="certs">
<UploadImgs v-model="form.certs" height="100px" width="100px" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="培训机构Logo" prop="logo">
<UploadImg v-model="form.logo" height="100px" width="100px" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="主页宣传图" prop="imgUrl">
<UploadImgs v-model="form.imgUrl" :limit="6" height="100px" width="100px" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="优势标签" prop="schoolTagList">
<el-checkbox-group v-model="form.schoolTagList">
<el-checkbox
v-for="item in goodOptions"
:key="item.value"
:label="item.value"
:value="item.value"
>
{{ item.label }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="其他服务" prop="schoolServiceList">
<el-checkbox-group v-model="form.schoolServiceList">
<el-checkbox
v-for="item in serviceOptions"
:key="item.value"
:label="item.value"
:value="item.value"
>
{{ item.label }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="其他诉求" prop="otherRequirement">
<el-input
v-model="form.otherRequirement"
type="textarea"
:autosize="{ minRows: 2 }"
placeholder="请输入"
/>
</el-form-item>
</el-col>
</el-row>
<div v-if="dialogType == 'audit'">
<el-row>
<el-divider direction="horizontal" content-position="left">审核信息</el-divider>
<el-col :span="6" :offset="0">
<el-form-item label="审核结果" prop="shjg">
<el-radio-group v-model="form.shjg">
<el-radio :label="2" :value="2">通过</el-radio>
<el-radio :label="3" :value="3">不通过</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="18" :offset="0">
<el-form-item label="审核说明" prop="shsm">
<el-input v-model="form.shsm" placeholder="请输入" />
</el-form-item>
</el-col>
</el-row>
</div>
</el-form>
<template #footer>
<el-button type="primary" :disabled="formLoading" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</div>
</template>
<script setup name="Station"></script>
<script setup name="Station">
import { searchStation, auditStation } from '@/api/uav/regiest'
const message = useMessage()
const searchForm = ref({
schoolName: '',
status: 1,
pageNo: 1,
pageSize: 20
})
const tableList = ref([])
const total = ref(0)
const form = ref({})
const rules = {
schoolName: { required: true, message: '请输入名称', trigger: 'blur' },
contacts: { required: true, message: '请输入创建人', trigger: 'blur' },
phone: { required: true, message: '请输入手机号', trigger: 'blur' }
}
const dialogVisible = ref(false)
const dialogType = ref('audit')
const driverOptions = ref([
{ label: '小型-视距内驾驶员', value: 1 },
{ label: '小型-超视距驾驶员', value: 2 },
{ label: '小型-教员', value: 3 },
{ label: '中型-视距内驾驶员', value: 4 },
{ label: '中型-超视距驾驶员', value: 5 },
{ label: '中型-教员', value: 6 }
])
const goodOptions = ref([
{ label: '服务好', value: 1 },
{ label: '交通便利', value: 2 },
{ label: '提供住宿', value: 3 },
{ label: '免费接送', value: 4 }
])
const serviceOptions = ref([
{ label: '希望平台主动推荐学员', value: 1 },
{ label: '接受团购学员报名', value: 2 },
{ label: '希望平台推荐教员资源', value: 3 },
{ label: '希望平台推荐无人机相关的设备', value: 4 }
])
onMounted(() => {
handleQuery()
})
function handleQuery() {
searchForm.value.pageNo = 1
getList()
}
function getList() {
searchStation(searchForm.value).then((response) => {
tableList.value = response.list
total.value = response.total
})
}
function handleDetail(row, type) {
dialogType.value = type
dialogVisible.value = true
form.value = { ...row }
}
const formRef = ref(null)
const formLoading = ref(false)
async function submitForm() {
if (!formRef.value) return
const valid = await formRef.value.validate()
if (!valid) return
try {
formLoading.value = true
let params = { ...form.value }
if (dialogType.value == 'audit') {
auditStation(params).then((response) => {
if (response) {
dialogVisible.value = false
message.success('操作成功')
}
})
} else {
}
} finally {
formLoading.value = false
getList()
}
}
</script>
<style lang="scss" scoped></style>

@ -236,7 +236,7 @@ const dialogForm = ref({
chooseC: undefined,
chooseD: undefined,
imageUrl: undefined,
type: undefined,
type: '2',
trueAnswer: undefined,
carTypeId: undefined,
skillInfoPic: undefined,
@ -257,7 +257,7 @@ const open = (info = undefined, opts) => {
dialogForm.value.driveTypeName = info.driveTypeName
dialogForm.value.carTypeName = info.carTypeName
if (info) {
dialogForm.value = { ...info, chapter: info.chapter }
dialogForm.value = { ...dialogForm.value, ...info, chapter: info.chapter }
if (dialogForm.value.imageUrl) {
imgUrl.value = dialogForm.value.imageUrl.includes('http')
? dialogForm.value.imageUrl
@ -283,7 +283,7 @@ const resetDialogForm = () => {
chooseC: undefined,
chooseD: undefined,
imageUrl: undefined,
type: undefined,
type: '2',
trueAnswer: undefined,
carTypeId: undefined,
skillInfoPic: undefined,

@ -239,7 +239,9 @@ function handleEdit(item) {
function handleAdd() {
dialogAddForm.value.open(
{
chapter: queryParams.value.chapter
chapter: queryParams.value.chapter,
modelId: queryParams.value.modelId,
typeId: queryParams.value.typeId
},
chapterOptions.value
)

@ -20,7 +20,7 @@
v-loading="loading"
:data="tableList"
highlight-current-row
max-height="calc(100vh - 320px)"
max-height="calc(100vh - 180px)"
>
<el-table-column type="index" width="55" align="center" />
<el-table-column label="章节名称" prop="chapterName" />
@ -66,8 +66,8 @@
</el-form-item>
</el-col>
</el-row>
<el-form-item label="知识总结" prop="remark">
<Editor v-model="form.remark" />
<el-form-item label="知识总结" prop="summary">
<Editor v-model="form.summary" />
</el-form-item>
</el-form>
<template #footer>
@ -130,7 +130,7 @@ function handleEdit(row) {
chapterName: row.chapterName,
sort: row.sort,
chapterId: row.chapterId,
remark: row.remark
summary: row.summary
}
}
@ -138,7 +138,7 @@ function resetForm() {
form.value = {
chapterName: undefined,
sort: 1,
remark: undefined
summary: undefined
}
if (dialogFormRef.value) {
dialogFormRef.value.resetFields()

@ -29,11 +29,12 @@
<el-table-column label="姓名" prop="name" />
<el-table-column label="手机号" prop="phone" />
<el-table-column label="城市" prop="city" />
<el-table-column label="意向机构" prop="likeOrg" />
<el-table-column label="咨询类型" prop="cartype" />
<el-table-column label="意向机构" prop="schoolName" />
<el-table-column label="咨询类型" prop="typeName" />
<el-table-column label="咨询日期" prop="createTime" />
<el-table-column label="诉求" prop="need" />
<el-table-column label="备注" prop="remark" />
<el-table-column label="预期开课时间" prop="studyTime" :formatter="dateFormatter" />
<el-table-column label="诉求" prop="otherRequirement" />
<el-table-column label="客服备注" prop="remark" />
<el-table-column label="报名状态" prop="status">
<template #default="{ row }">
<el-tag v-if="row.status == 1" type="primary">未报名</el-tag>
@ -41,14 +42,14 @@
<el-tag v-else-if="row.status == 3" type="info">已失效</el-tag>
</template>
</el-table-column>
<el-table-column label="绑定机构" prop="bindSchoolName" />
<!-- <el-table-column label="绑定机构" prop="bindSchoolName" /> -->
<el-table-column label="操作" align="center" width="140">
<template #default="scope">
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleEdit(scope.row)"
@click="handleEdit(row)"
v-hasPermi="['UAVClue:CluePool:edit']"
>
修改
@ -86,43 +87,16 @@
<el-input v-model="form.city" placeholder="请输入城市或地址" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="意向机构" prop="likeOrg">
<el-select
v-model="form.likeOrg"
placeholder="选择意向机构"
clearable
filterable
@change="getCartypeOptions"
>
<el-option
v-for="item in orgOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-col :span="12" :offset="0">
<el-form-item label="咨询类型" prop="typeName">
<el-input v-model="form.typeName" placeholder="请输入" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12" :offset="0">
<el-form-item label="咨询类型" prop="carTypeId">
<el-radio-group v-model="form.carTypeId">
<el-radio label="10001" value="10001">多旋翼</el-radio>
<el-radio label="10002" value="10002">垂直起降固定翼</el-radio>
<el-radio label="10003" value="10003">直升机</el-radio>
<el-radio label="10004" value="10004">固定翼</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12" :offset="0">
<el-form-item label="驾驶员类型" prop="driveType">
<el-radio-group v-model="form.driveType">
<el-radio label="1" value="1">视距内驾驶员</el-radio>
<el-radio label="2" value="2">超视距驾驶员</el-radio>
<el-radio label="3" value="3">教员</el-radio>
</el-radio-group>
<el-col :span="24">
<el-form-item label="意向机构" prop="schoolName">
<el-input v-model="form.schoolName" placeholder="请输入" clearable />
</el-form-item>
</el-col>
</el-row>
@ -143,18 +117,6 @@
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12" :offset="0" v-if="form.status == 2">
<el-form-item label="绑定机构" prop="bindOrgId">
<el-select v-model="form.bindOrgId" placeholder="选择意向机构" clearable filterable>
<el-option
v-for="item in orgOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
@ -179,6 +141,10 @@
</template>
<script setup name="CluePool">
import * as api from '@/api/uav/clue'
import { removeNullField } from '@/utils'
import { dateFormatter } from '@/utils/formatTime'
const loading = ref(false)
const total = ref(0)
const tableList = ref([])
@ -187,15 +153,11 @@ const searchForm = ref({
phone: '',
city: '',
pageNo: 1,
pageSize: 100
pageSize: 50
})
onMounted(() => {
handleQuery()
orgOptions.value = [
{ label: '银湖低空经济发展有限公司', value: '1' },
{ label: '中科未来飞行科技有限公司', value: '2' }
]
})
function handleQuery() {
@ -205,28 +167,14 @@ function handleQuery() {
function getList() {
loading.value = true
tableList.value = [
{
name: '张三',
phone: '12345678901',
city: '上海',
status: 1
},
{
name: '张三1',
phone: '12345678901',
city: '合肥',
status: 2
}
]
total.value = 0
loading.value = false
}
const cartypeOptions = ref([])
const orgOptions = ref([])
function getCartypeOptions() {
cartypeOptions.value = []
try {
api.searchClue(removeNullField(searchForm.value)).then((data) => {
tableList.value = data.list
total.value = data.total
})
} finally {
loading.value = false
}
}
const form = ref({})

@ -3,7 +3,7 @@
<el-form :model="searchForm" inline @submit.prevent>
<el-form-item>
<el-input
v-model="searchForm.nameOrPhone"
v-model="searchForm.userNameOrPhone"
placeholder="输入学员姓名/手机号"
@keyup.enter="handleQuery"
/>
@ -13,18 +13,18 @@
</el-form-item>
<el-form-item>
<el-select
v-model="searchForm.status"
v-model="searchForm.answerResult"
placeholder="选择答题结果"
@change="handleQuery"
style="width: 150px"
clearable
>
<el-option label="答对" :value="1" />
<el-option label="答错" :value="0" />
<el-option label="答错" :value="2" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleQuery"> </el-button>
<el-button type="primary" @click="handleQuery"> </el-button>
</el-form-item>
</el-form>
<el-table
@ -42,9 +42,9 @@
<el-table-column label="姓名" prop="name" />
<el-table-column label="手机号" prop="phone" />
<el-table-column label="答题选择" prop="yourAnswer" />
<el-table-column label="答题结果" prop="status">
<el-table-column label="答题结果" prop="answerResult">
<template #default="{ row }">
<el-tag v-if="row.status == 0" type="danger">答错</el-tag>
<el-tag v-if="row.answerResult == 2" type="danger">答错</el-tag>
<el-tag v-else type="success">答对</el-tag>
</template>
</el-table-column>
@ -62,11 +62,15 @@
</template>
<script setup>
import { searchStudyRecords } from '@/api/uav/record'
const searchForm = ref({
userNameOrPhone: '',
practiceType: 1,
question: '',
status: '',
answerResult: undefined,
pageNo: 1,
pageSize: 100
pageSize: 50
})
const loading = ref(false)
@ -76,20 +80,26 @@ const tableList = ref([])
onMounted(() => {
handleQuery()
})
function getList() {
async function getList() {
loading.value = true
tableList.value = [
{
id: 1,
question: '1+1=?',
answer: 'B',
yourAnswer: 'B',
status: '1',
createTime: ''
}
]
total.value = 1
loading.value = false
try {
const resp = await searchStudyRecords(searchForm.value)
console.log(resp)
tableList.value = [
{
id: 1,
question: '1+1=?',
answer: 'B',
yourAnswer: 'B',
answerResult: 1,
createTime: ''
}
]
total.value = 1
} finally {
loading.value = false
}
}
function handleQuery() {

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save