85 changed files with 6229 additions and 16899 deletions
@ -0,0 +1,333 @@ |
|||
<template> |
|||
<el-dialog |
|||
v-model="showDialog" |
|||
:title="t('addBindingTestPaper')" |
|||
width="50%" |
|||
class="diy-dialog-wrap" |
|||
:destroy-on-close="true" |
|||
> |
|||
<el-form |
|||
:inline="true" |
|||
:model="lessonCourseTeachingTable.searchParam" |
|||
ref="searchFormRef" |
|||
> |
|||
<el-form-item :label="t('totalScore')" prop="title"> |
|||
<el-input |
|||
v-model="lessonCourseTeachingTable.searchParam.total_score" |
|||
:placeholder="t('totalScore')" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item :label="t('selectionMode')" prop="status"> |
|||
|
|||
<el-select class="input-width" v-model="lessonCourseTeachingTable.searchParam.selection_mode" clearable :placeholder="t('selectionMode')"> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option label="随机组题" value="random" /> |
|||
<el-option label="自选题目" value="manual" /> |
|||
</el-select> |
|||
</el-form-item> |
|||
<el-form-item> |
|||
<el-button type="primary" @click="loadLessonCourseTeachingList()">{{ |
|||
t('search') |
|||
}}</el-button> |
|||
<el-button @click="resetForm(searchFormRef)">{{ |
|||
t('reset') |
|||
}}</el-button> |
|||
</el-form-item> |
|||
</el-form> |
|||
|
|||
<div class="mt-[10px]"> |
|||
<el-table |
|||
:data="lessonCourseTeachingTable.data" |
|||
size="large" |
|||
v-loading="lessonCourseTeachingTable.loading" |
|||
@selection-change="handleSelectionChange" |
|||
> |
|||
<template #empty> |
|||
<span>{{ |
|||
!lessonCourseTeachingTable.loading ? t('emptyData') : '' |
|||
}}</span> |
|||
</template> |
|||
<el-table-column type="selection" width="55" /> |
|||
<el-table-column |
|||
prop="total_score" |
|||
min-width="80" |
|||
:label="t('totalScore')" |
|||
:show-overflow-tooltip="true" |
|||
/> |
|||
<el-table-column |
|||
prop="passing_score" |
|||
min-width="80" |
|||
:label="t('passingScore')" |
|||
:show-overflow-tooltip="true" |
|||
/> |
|||
<el-table-column |
|||
:label="t('selectionMode')" |
|||
min-width="120" |
|||
align="center" |
|||
:show-overflow-tooltip="true" |
|||
> |
|||
<template #default="{ row }"> |
|||
<div v-if="row.selection_mode == 'random'">随机组题</div> |
|||
<div v-if="row.selection_mode == 'manual'">自选题目</div> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="created_at" |
|||
:label="t('userCreateTime')" |
|||
min-width="150" |
|||
:show-overflow-tooltip="true" |
|||
/> |
|||
<!-- <el-table-column :label="t('operation')" fixed="right" min-width="120">--> |
|||
<!-- <template #default="{ row }">--> |
|||
<!-- <el-button type="primary" link @click="editEvent(row)">{{--> |
|||
<!-- t('edit')--> |
|||
<!-- }}</el-button>--> |
|||
<!-- <el-button type="primary" link @click="deleteEvent(row.id, 1)">{{--> |
|||
<!-- t('delete')--> |
|||
<!-- }}</el-button>--> |
|||
<!-- </template>--> |
|||
<!-- </el-table-column>--> |
|||
</el-table> |
|||
<div class="mt-[16px] flex justify-end"> |
|||
<el-pagination |
|||
v-model:current-page="lessonCourseTeachingTable.page" |
|||
v-model:page-size="lessonCourseTeachingTable.limit" |
|||
layout="total, sizes, prev, pager, next, jumper" |
|||
:total="lessonCourseTeachingTable.total" |
|||
@size-change="loadLessonCourseTeachingList()" |
|||
@current-change="loadLessonCourseTeachingList" |
|||
/> |
|||
</div> |
|||
</div> |
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> |
|||
<el-button |
|||
type="primary" |
|||
:loading="loading" |
|||
@click="confirm(formRef)" |
|||
>{{ t('confirm') }}</el-button |
|||
> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import { t } from '@/lang' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { |
|||
addLessonCourseTeaching, |
|||
editLessonCourseTeaching, |
|||
getLessonCourseTeachingInfo, |
|||
getLessonCourseTeachingList, |
|||
getWithPersonnelDataList, getWithTestPaperList, |
|||
setBindingTestPaperModule, |
|||
} from '@/app/api/lesson_course_teaching' |
|||
import { ElMessage } from 'element-plus' |
|||
|
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
let lessonCourseTeachingTable = reactive({ |
|||
page: 1, |
|||
limit: 10, |
|||
total: 0, |
|||
loading: true, |
|||
data: [], |
|||
searchParam: { |
|||
total_score: '', |
|||
selection_mode: '' |
|||
}, |
|||
}) |
|||
|
|||
const multipleSelection = ref<[]>([]) |
|||
const binding_module = ref('') |
|||
const handleSelectionChange = (val: []) => { |
|||
multipleSelection.value = val |
|||
} |
|||
|
|||
const loadLessonCourseTeachingList = (page: number = 1) => { |
|||
lessonCourseTeachingTable.loading = true |
|||
lessonCourseTeachingTable.page = page |
|||
|
|||
getWithTestPaperList({ |
|||
page: lessonCourseTeachingTable.page, |
|||
limit: lessonCourseTeachingTable.limit, |
|||
...lessonCourseTeachingTable.searchParam, |
|||
}) |
|||
.then((res) => { |
|||
lessonCourseTeachingTable.loading = false |
|||
lessonCourseTeachingTable.data = res.data.data |
|||
lessonCourseTeachingTable.total = res.data.total |
|||
}) |
|||
.catch(() => { |
|||
lessonCourseTeachingTable.loading = false |
|||
}) |
|||
} |
|||
loadLessonCourseTeachingList() |
|||
|
|||
const resetForm = (page: number = 1) => { |
|||
lessonCourseTeachingTable.searchParam.total_score = '' |
|||
lessonCourseTeachingTable.searchParam.selection_mode = '' |
|||
loadLessonCourseTeachingList() |
|||
} |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
title: '', |
|||
image: '', |
|||
type: '', |
|||
content: '', |
|||
status: '', |
|||
// user_permission: [], |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
title: [ |
|||
{ required: true, message: t('titlePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
image: [ |
|||
{ required: true, message: t('imagePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
type: [{ required: true, message: t('typePlaceholder'), trigger: 'blur' }], |
|||
content: [ |
|||
{ required: true, message: t('contentPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if(multipleSelection.value.length == 0) { |
|||
ElMessage.error('请选择数据'); |
|||
return; |
|||
} else if (multipleSelection.value.length > 1) { |
|||
ElMessage.error('只能选择一条数据'); |
|||
return; |
|||
} |
|||
let data = { |
|||
id: BindingId.value, |
|||
exam_papers_id: multipleSelection.value |
|||
.map((item) => item.id) |
|||
.join(',') |
|||
} |
|||
setBindingTestPaperModule(data) |
|||
.then((res) => { |
|||
loading.value = false |
|||
showDialog.value = false |
|||
emit('complete') |
|||
}) |
|||
.catch((err) => { |
|||
loading.value = false |
|||
}) |
|||
} |
|||
|
|||
// 获取字典数据 |
|||
let typeList = ref([]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('material_type')).data.dictionary |
|||
} |
|||
typeDictList() |
|||
watch( |
|||
() => typeList.value, |
|||
() => { |
|||
formData.type = typeList.value[0].value |
|||
} |
|||
) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await ( |
|||
await useDictionary('course_status') |
|||
).data.dictionary |
|||
} |
|||
statusDictList() |
|||
watch( |
|||
() => statusList.value, |
|||
() => { |
|||
formData.status = statusList.value[0].value |
|||
} |
|||
) |
|||
|
|||
const userPermissionList = ref([] as any[]) |
|||
const BindingId = ref(undefined) |
|||
const setUserPermissionList = async () => { |
|||
userPermissionList.value = await (await getWithPersonnelDataList({})).data |
|||
} |
|||
setUserPermissionList() |
|||
const setFormData = async (row: any = null) => { |
|||
BindingId.value = row.id |
|||
binding_module.value = row.table_type |
|||
} |
|||
|
|||
// 验证手机号格式 |
|||
const mobileVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/^1[3-9]\d{9}$/.test(value)) { |
|||
callback(new Error(t('generateMobile'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证身份证号 |
|||
const idCardVerify = (rule: any, value: any, callback: any) => { |
|||
if ( |
|||
value && |
|||
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test( |
|||
value |
|||
) |
|||
) { |
|||
callback(new Error(t('generateIdCard'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证邮箱号 |
|||
const emailVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) { |
|||
callback(new Error(t('generateEmail'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证请输入整数 |
|||
const numberVerify = (rule: any, value: any, callback: any) => { |
|||
if (!Number.isInteger(value)) { |
|||
callback(new Error(t('generateNumber'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
defineExpose({ |
|||
showDialog, |
|||
setFormData, |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
<style lang="scss"> |
|||
.diy-dialog-wrap .el-form-item__label { |
|||
height: auto !important; |
|||
} |
|||
</style> |
|||
@ -1,273 +0,0 @@ |
|||
<template> |
|||
<el-dialog |
|||
v-model="showDialog" |
|||
:title=" |
|||
formData.id |
|||
? t('editBasketballTeachingLibrary') |
|||
: t('addBasketballTeachingLibrary') |
|||
" |
|||
width="50%" |
|||
class="diy-dialog-wrap" |
|||
:destroy-on-close="true" |
|||
> |
|||
<el-form |
|||
:model="formData" |
|||
label-width="120px" |
|||
ref="formRef" |
|||
:rules="formRules" |
|||
class="page-form" |
|||
v-loading="loading" |
|||
> |
|||
<el-form-item :label="t('title')" prop="title"> |
|||
<el-input |
|||
v-model="formData.title" |
|||
clearable |
|||
:placeholder="t('titlePlaceholder')" |
|||
class="input-width" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('image')" prop="image"> |
|||
<upload-image v-model="formData.image" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('type')" prop="type"> |
|||
<el-select |
|||
class="input-width" |
|||
v-model="formData.type" |
|||
clearable |
|||
:placeholder="t('typePlaceholder')" |
|||
> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in typeList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('content')" prop="content"> |
|||
<editor v-model="formData.content" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group |
|||
v-model="formData.status" |
|||
:placeholder="t('statusPlaceholder')" |
|||
> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.value" |
|||
> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<!-- <el-form-item :label="t('userPermission')" prop="user_permission">--> |
|||
<!-- <el-checkbox-group v-model="formData.user_permission" :placeholder="t('userPermissionPlaceholder')">--> |
|||
<!-- <el-checkbox--> |
|||
<!-- v-for="(item, index) in userPermissionList"--> |
|||
<!-- :key="index"--> |
|||
<!-- :label="item['sys_user_id']">--> |
|||
<!-- {{ item['name'] }}--> |
|||
<!-- </el-checkbox>--> |
|||
<!-- </el-checkbox-group>--> |
|||
<!-- </el-form-item>--> |
|||
</el-form> |
|||
|
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> |
|||
<el-button |
|||
type="primary" |
|||
:loading="loading" |
|||
@click="confirm(formRef)" |
|||
>{{ t('confirm') }}</el-button |
|||
> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import { t } from '@/lang' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { |
|||
addBasketballTeachingLibrary, |
|||
editBasketballTeachingLibrary, |
|||
getLessonCourseTeachingInfo, |
|||
getWithPersonnelDataList, |
|||
} from '@/app/api/lesson_course_teaching' |
|||
import { |
|||
addPublicLibraryList, |
|||
editPublicLibraryList, |
|||
} from '@/app/api/future_ontent' |
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
title: '', |
|||
image: '', |
|||
type: '', |
|||
content: '', |
|||
status: '', |
|||
table_type: 26, |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
title: [ |
|||
{ required: true, message: t('titlePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
image: [ |
|||
{ required: true, message: t('imagePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
type: [{ required: true, message: t('typePlaceholder'), trigger: 'blur' }], |
|||
content: [ |
|||
{ required: true, message: t('contentPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id ? editPublicLibraryList : addPublicLibraryList |
|||
|
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
|
|||
let data = formData |
|||
data.table_type = 26 |
|||
save(data) |
|||
.then((res) => { |
|||
loading.value = false |
|||
showDialog.value = false |
|||
emit('complete') |
|||
}) |
|||
.catch((err) => { |
|||
loading.value = false |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
|
|||
// 获取字典数据 |
|||
let typeList = ref([]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('material_type')).data.dictionary |
|||
} |
|||
typeDictList() |
|||
watch( |
|||
() => typeList.value, |
|||
() => { |
|||
formData.type = typeList.value[0].value |
|||
} |
|||
) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await ( |
|||
await useDictionary('course_status') |
|||
).data.dictionary |
|||
} |
|||
statusDictList() |
|||
watch( |
|||
() => statusList.value, |
|||
() => { |
|||
formData.status = statusList.value[0].value |
|||
} |
|||
) |
|||
|
|||
const userPermissionList = ref([] as any[]) |
|||
const setUserPermissionList = async () => { |
|||
userPermissionList.value = await (await getWithPersonnelDataList({})).data |
|||
} |
|||
setUserPermissionList() |
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if (row) { |
|||
const data = await (await getLessonCourseTeachingInfo(row.id)).data |
|||
if (data) |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
loading.value = false |
|||
} |
|||
|
|||
// 验证手机号格式 |
|||
const mobileVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/^1[3-9]\d{9}$/.test(value)) { |
|||
callback(new Error(t('generateMobile'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证身份证号 |
|||
const idCardVerify = (rule: any, value: any, callback: any) => { |
|||
if ( |
|||
value && |
|||
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test( |
|||
value |
|||
) |
|||
) { |
|||
callback(new Error(t('generateIdCard'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证邮箱号 |
|||
const emailVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) { |
|||
callback(new Error(t('generateEmail'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证请输入整数 |
|||
const numberVerify = (rule: any, value: any, callback: any) => { |
|||
if (!Number.isInteger(value)) { |
|||
callback(new Error(t('generateNumber'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
defineExpose({ |
|||
showDialog, |
|||
setFormData, |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
<style lang="scss"> |
|||
.diy-dialog-wrap .el-form-item__label { |
|||
height: auto !important; |
|||
} |
|||
</style> |
|||
@ -1,271 +0,0 @@ |
|||
<template> |
|||
<el-dialog |
|||
v-model="showDialog" |
|||
:title=" |
|||
formData.id ? t('editNinjaTeachingLibrary') : t('addNinjaTeachingLibrary') |
|||
" |
|||
width="50%" |
|||
class="diy-dialog-wrap" |
|||
:destroy-on-close="true" |
|||
> |
|||
<el-form |
|||
:model="formData" |
|||
label-width="120px" |
|||
ref="formRef" |
|||
:rules="formRules" |
|||
class="page-form" |
|||
v-loading="loading" |
|||
> |
|||
<el-form-item :label="t('title')" prop="title"> |
|||
<el-input |
|||
v-model="formData.title" |
|||
clearable |
|||
:placeholder="t('titlePlaceholder')" |
|||
class="input-width" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('image')" prop="image"> |
|||
<upload-image v-model="formData.image" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('type')" prop="type"> |
|||
<el-select |
|||
class="input-width" |
|||
v-model="formData.type" |
|||
clearable |
|||
:placeholder="t('typePlaceholder')" |
|||
> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in typeList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('content')" prop="content"> |
|||
<editor v-model="formData.content" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group |
|||
v-model="formData.status" |
|||
:placeholder="t('statusPlaceholder')" |
|||
> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.value" |
|||
> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<!-- <el-form-item :label="t('userPermission')" prop="user_permission">--> |
|||
<!-- <el-checkbox-group v-model="formData.user_permission" :placeholder="t('userPermissionPlaceholder')">--> |
|||
<!-- <el-checkbox--> |
|||
<!-- v-for="(item, index) in userPermissionList"--> |
|||
<!-- :key="index"--> |
|||
<!-- :label="item['sys_user_id']">--> |
|||
<!-- {{ item['name'] }}--> |
|||
<!-- </el-checkbox>--> |
|||
<!-- </el-checkbox-group>--> |
|||
<!-- </el-form-item>--> |
|||
</el-form> |
|||
|
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> |
|||
<el-button |
|||
type="primary" |
|||
:loading="loading" |
|||
@click="confirm(formRef)" |
|||
>{{ t('confirm') }}</el-button |
|||
> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import { t } from '@/lang' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { |
|||
addNinjaTeachingLibrary, |
|||
editNinjaTeachingLibrary, |
|||
getLessonCourseTeachingInfo, |
|||
getWithPersonnelDataList, |
|||
} from '@/app/api/lesson_course_teaching' |
|||
import { |
|||
addPublicLibraryList, |
|||
editPublicLibraryList, |
|||
} from '@/app/api/future_ontent' |
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
title: '', |
|||
image: '', |
|||
type: '', |
|||
content: '', |
|||
status: '', |
|||
table_type: 21, |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
title: [ |
|||
{ required: true, message: t('titlePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
image: [ |
|||
{ required: true, message: t('imagePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
type: [{ required: true, message: t('typePlaceholder'), trigger: 'blur' }], |
|||
content: [ |
|||
{ required: true, message: t('contentPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id ? editPublicLibraryList : addPublicLibraryList |
|||
|
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
|
|||
let data = formData |
|||
data.table_type = 21 |
|||
save(data) |
|||
.then((res) => { |
|||
loading.value = false |
|||
showDialog.value = false |
|||
emit('complete') |
|||
}) |
|||
.catch((err) => { |
|||
loading.value = false |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
|
|||
// 获取字典数据 |
|||
let typeList = ref([]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('material_type')).data.dictionary |
|||
} |
|||
typeDictList() |
|||
watch( |
|||
() => typeList.value, |
|||
() => { |
|||
formData.type = typeList.value[0].value |
|||
} |
|||
) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await ( |
|||
await useDictionary('course_status') |
|||
).data.dictionary |
|||
} |
|||
statusDictList() |
|||
watch( |
|||
() => statusList.value, |
|||
() => { |
|||
formData.status = statusList.value[0].value |
|||
} |
|||
) |
|||
|
|||
const userPermissionList = ref([] as any[]) |
|||
const setUserPermissionList = async () => { |
|||
userPermissionList.value = await (await getWithPersonnelDataList({})).data |
|||
} |
|||
setUserPermissionList() |
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if (row) { |
|||
const data = await (await getLessonCourseTeachingInfo(row.id)).data |
|||
if (data) |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
loading.value = false |
|||
} |
|||
|
|||
// 验证手机号格式 |
|||
const mobileVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/^1[3-9]\d{9}$/.test(value)) { |
|||
callback(new Error(t('generateMobile'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证身份证号 |
|||
const idCardVerify = (rule: any, value: any, callback: any) => { |
|||
if ( |
|||
value && |
|||
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test( |
|||
value |
|||
) |
|||
) { |
|||
callback(new Error(t('generateIdCard'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证邮箱号 |
|||
const emailVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) { |
|||
callback(new Error(t('generateEmail'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证请输入整数 |
|||
const numberVerify = (rule: any, value: any, callback: any) => { |
|||
if (!Number.isInteger(value)) { |
|||
callback(new Error(t('generateNumber'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
defineExpose({ |
|||
showDialog, |
|||
setFormData, |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
<style lang="scss"> |
|||
.diy-dialog-wrap .el-form-item__label { |
|||
height: auto !important; |
|||
} |
|||
</style> |
|||
@ -1,271 +0,0 @@ |
|||
<template> |
|||
<el-dialog |
|||
v-model="showDialog" |
|||
:title=" |
|||
formData.id |
|||
? t('editPhysicalTeachingLibrary') |
|||
: t('addPhysicalTeachingLibrary') |
|||
" |
|||
width="50%" |
|||
class="diy-dialog-wrap" |
|||
:destroy-on-close="true" |
|||
> |
|||
<el-form |
|||
:model="formData" |
|||
label-width="120px" |
|||
ref="formRef" |
|||
:rules="formRules" |
|||
class="page-form" |
|||
v-loading="loading" |
|||
> |
|||
<el-form-item :label="t('title')" prop="title"> |
|||
<el-input |
|||
v-model="formData.title" |
|||
clearable |
|||
:placeholder="t('titlePlaceholder')" |
|||
class="input-width" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('image')" prop="image"> |
|||
<upload-image v-model="formData.image" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('type')" prop="type"> |
|||
<el-select |
|||
class="input-width" |
|||
v-model="formData.type" |
|||
clearable |
|||
:placeholder="t('typePlaceholder')" |
|||
> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in typeList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('content')" prop="content"> |
|||
<editor v-model="formData.content" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group |
|||
v-model="formData.status" |
|||
:placeholder="t('statusPlaceholder')" |
|||
> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.value" |
|||
> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<!-- <el-form-item :label="t('userPermission')" prop="user_permission">--> |
|||
<!-- <el-checkbox-group v-model="formData.user_permission" :placeholder="t('userPermissionPlaceholder')">--> |
|||
<!-- <el-checkbox--> |
|||
<!-- v-for="(item, index) in userPermissionList"--> |
|||
<!-- :key="index"--> |
|||
<!-- :label="item['sys_user_id']">--> |
|||
<!-- {{ item['name'] }}--> |
|||
<!-- </el-checkbox>--> |
|||
<!-- </el-checkbox-group>--> |
|||
<!-- </el-form-item>--> |
|||
</el-form> |
|||
|
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> |
|||
<el-button |
|||
type="primary" |
|||
:loading="loading" |
|||
@click="confirm(formRef)" |
|||
>{{ t('confirm') }}</el-button |
|||
> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import { t } from '@/lang' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { |
|||
addPhysicalTeachingLibrary, |
|||
editPhysicalTeachingLibrary, |
|||
getLessonCourseTeachingInfo, |
|||
getWithPersonnelDataList, |
|||
} from '@/app/api/lesson_course_teaching' |
|||
|
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
title: '', |
|||
image: '', |
|||
type: '', |
|||
content: '', |
|||
status: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
title: [ |
|||
{ required: true, message: t('titlePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
image: [ |
|||
{ required: true, message: t('imagePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
type: [{ required: true, message: t('typePlaceholder'), trigger: 'blur' }], |
|||
content: [ |
|||
{ required: true, message: t('contentPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id |
|||
? editPhysicalTeachingLibrary |
|||
: addPhysicalTeachingLibrary |
|||
|
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
|
|||
let data = formData |
|||
|
|||
save(data) |
|||
.then((res) => { |
|||
loading.value = false |
|||
showDialog.value = false |
|||
emit('complete') |
|||
}) |
|||
.catch((err) => { |
|||
loading.value = false |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
|
|||
// 获取字典数据 |
|||
let typeList = ref([]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('material_type')).data.dictionary |
|||
} |
|||
typeDictList() |
|||
watch( |
|||
() => typeList.value, |
|||
() => { |
|||
formData.type = typeList.value[0].value |
|||
} |
|||
) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await ( |
|||
await useDictionary('course_status') |
|||
).data.dictionary |
|||
} |
|||
statusDictList() |
|||
watch( |
|||
() => statusList.value, |
|||
() => { |
|||
formData.status = statusList.value[0].value |
|||
} |
|||
) |
|||
|
|||
const userPermissionList = ref([] as any[]) |
|||
const setUserPermissionList = async () => { |
|||
userPermissionList.value = await (await getWithPersonnelDataList({})).data |
|||
} |
|||
setUserPermissionList() |
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if (row) { |
|||
const data = await (await getLessonCourseTeachingInfo(row.id)).data |
|||
if (data) |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
loading.value = false |
|||
} |
|||
|
|||
// 验证手机号格式 |
|||
const mobileVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/^1[3-9]\d{9}$/.test(value)) { |
|||
callback(new Error(t('generateMobile'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证身份证号 |
|||
const idCardVerify = (rule: any, value: any, callback: any) => { |
|||
if ( |
|||
value && |
|||
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test( |
|||
value |
|||
) |
|||
) { |
|||
callback(new Error(t('generateIdCard'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证邮箱号 |
|||
const emailVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) { |
|||
callback(new Error(t('generateEmail'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证请输入整数 |
|||
const numberVerify = (rule: any, value: any, callback: any) => { |
|||
if (!Number.isInteger(value)) { |
|||
callback(new Error(t('generateNumber'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
defineExpose({ |
|||
showDialog, |
|||
setFormData, |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
<style lang="scss"> |
|||
.diy-dialog-wrap .el-form-item__label { |
|||
height: auto !important; |
|||
} |
|||
</style> |
|||
@ -1,273 +0,0 @@ |
|||
<template> |
|||
<el-dialog |
|||
v-model="showDialog" |
|||
:title=" |
|||
formData.id |
|||
? t('editSecurityTeachingLibrary') |
|||
: t('addSecurityTeachingLibrary') |
|||
" |
|||
width="50%" |
|||
class="diy-dialog-wrap" |
|||
:destroy-on-close="true" |
|||
> |
|||
<el-form |
|||
:model="formData" |
|||
label-width="120px" |
|||
ref="formRef" |
|||
:rules="formRules" |
|||
class="page-form" |
|||
v-loading="loading" |
|||
> |
|||
<el-form-item :label="t('title')" prop="title"> |
|||
<el-input |
|||
v-model="formData.title" |
|||
clearable |
|||
:placeholder="t('titlePlaceholder')" |
|||
class="input-width" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('image')" prop="image"> |
|||
<upload-image v-model="formData.image" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('type')" prop="type"> |
|||
<el-select |
|||
class="input-width" |
|||
v-model="formData.type" |
|||
clearable |
|||
:placeholder="t('typePlaceholder')" |
|||
> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in typeList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('content')" prop="content"> |
|||
<editor v-model="formData.content" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group |
|||
v-model="formData.status" |
|||
:placeholder="t('statusPlaceholder')" |
|||
> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.value" |
|||
> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<!-- <el-form-item :label="t('userPermission')" prop="user_permission">--> |
|||
<!-- <el-checkbox-group v-model="formData.user_permission" :placeholder="t('userPermissionPlaceholder')">--> |
|||
<!-- <el-checkbox--> |
|||
<!-- v-for="(item, index) in userPermissionList"--> |
|||
<!-- :key="index"--> |
|||
<!-- :label="item['sys_user_id']">--> |
|||
<!-- {{ item['name'] }}--> |
|||
<!-- </el-checkbox>--> |
|||
<!-- </el-checkbox-group>--> |
|||
<!-- </el-form-item>--> |
|||
</el-form> |
|||
|
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> |
|||
<el-button |
|||
type="primary" |
|||
:loading="loading" |
|||
@click="confirm(formRef)" |
|||
>{{ t('confirm') }}</el-button |
|||
> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import { t } from '@/lang' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { |
|||
addSecurityTeachingLibrary, |
|||
editSecurityTeachingLibrary, |
|||
getLessonCourseTeachingInfo, |
|||
getWithPersonnelDataList, |
|||
} from '@/app/api/lesson_course_teaching' |
|||
import { |
|||
addPublicLibraryList, |
|||
editPublicLibraryList, |
|||
} from '@/app/api/future_ontent' |
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
title: '', |
|||
image: '', |
|||
type: '', |
|||
content: '', |
|||
status: '', |
|||
table_type: 22, |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
title: [ |
|||
{ required: true, message: t('titlePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
image: [ |
|||
{ required: true, message: t('imagePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
type: [{ required: true, message: t('typePlaceholder'), trigger: 'blur' }], |
|||
content: [ |
|||
{ required: true, message: t('contentPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id ? editPublicLibraryList : addPublicLibraryList |
|||
|
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
|
|||
let data = formData |
|||
data.table_type = 22 |
|||
save(data) |
|||
.then((res) => { |
|||
loading.value = false |
|||
showDialog.value = false |
|||
emit('complete') |
|||
}) |
|||
.catch((err) => { |
|||
loading.value = false |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
|
|||
// 获取字典数据 |
|||
let typeList = ref([]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('material_type')).data.dictionary |
|||
} |
|||
typeDictList() |
|||
watch( |
|||
() => typeList.value, |
|||
() => { |
|||
formData.type = typeList.value[0].value |
|||
} |
|||
) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await ( |
|||
await useDictionary('course_status') |
|||
).data.dictionary |
|||
} |
|||
statusDictList() |
|||
watch( |
|||
() => statusList.value, |
|||
() => { |
|||
formData.status = statusList.value[0].value |
|||
} |
|||
) |
|||
|
|||
const userPermissionList = ref([] as any[]) |
|||
const setUserPermissionList = async () => { |
|||
userPermissionList.value = await (await getWithPersonnelDataList({})).data |
|||
} |
|||
setUserPermissionList() |
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if (row) { |
|||
const data = await (await getLessonCourseTeachingInfo(row.id)).data |
|||
if (data) |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
loading.value = false |
|||
} |
|||
|
|||
// 验证手机号格式 |
|||
const mobileVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/^1[3-9]\d{9}$/.test(value)) { |
|||
callback(new Error(t('generateMobile'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证身份证号 |
|||
const idCardVerify = (rule: any, value: any, callback: any) => { |
|||
if ( |
|||
value && |
|||
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test( |
|||
value |
|||
) |
|||
) { |
|||
callback(new Error(t('generateIdCard'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证邮箱号 |
|||
const emailVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) { |
|||
callback(new Error(t('generateEmail'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证请输入整数 |
|||
const numberVerify = (rule: any, value: any, callback: any) => { |
|||
if (!Number.isInteger(value)) { |
|||
callback(new Error(t('generateNumber'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
defineExpose({ |
|||
showDialog, |
|||
setFormData, |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
<style lang="scss"> |
|||
.diy-dialog-wrap .el-form-item__label { |
|||
height: auto !important; |
|||
} |
|||
</style> |
|||
@ -1,273 +0,0 @@ |
|||
<template> |
|||
<el-dialog |
|||
v-model="showDialog" |
|||
:title=" |
|||
formData.id |
|||
? t('editStrengthenTeachingLibrary') |
|||
: t('addStrengthenTeachingLibrary') |
|||
" |
|||
width="50%" |
|||
class="diy-dialog-wrap" |
|||
:destroy-on-close="true" |
|||
> |
|||
<el-form |
|||
:model="formData" |
|||
label-width="120px" |
|||
ref="formRef" |
|||
:rules="formRules" |
|||
class="page-form" |
|||
v-loading="loading" |
|||
> |
|||
<el-form-item :label="t('title')" prop="title"> |
|||
<el-input |
|||
v-model="formData.title" |
|||
clearable |
|||
:placeholder="t('titlePlaceholder')" |
|||
class="input-width" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('image')" prop="image"> |
|||
<upload-image v-model="formData.image" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('type')" prop="type"> |
|||
<el-select |
|||
class="input-width" |
|||
v-model="formData.type" |
|||
clearable |
|||
:placeholder="t('typePlaceholder')" |
|||
> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in typeList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('content')" prop="content"> |
|||
<editor v-model="formData.content" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group |
|||
v-model="formData.status" |
|||
:placeholder="t('statusPlaceholder')" |
|||
> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.value" |
|||
> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<!-- <el-form-item :label="t('userPermission')" prop="user_permission">--> |
|||
<!-- <el-checkbox-group v-model="formData.user_permission" :placeholder="t('userPermissionPlaceholder')">--> |
|||
<!-- <el-checkbox--> |
|||
<!-- v-for="(item, index) in userPermissionList"--> |
|||
<!-- :key="index"--> |
|||
<!-- :label="item['sys_user_id']">--> |
|||
<!-- {{ item['name'] }}--> |
|||
<!-- </el-checkbox>--> |
|||
<!-- </el-checkbox-group>--> |
|||
<!-- </el-form-item>--> |
|||
</el-form> |
|||
|
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> |
|||
<el-button |
|||
type="primary" |
|||
:loading="loading" |
|||
@click="confirm(formRef)" |
|||
>{{ t('confirm') }}</el-button |
|||
> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import { t } from '@/lang' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { |
|||
addStrengTeachingLibrary, |
|||
editStrengTeachingLibrary, |
|||
getLessonCourseTeachingInfo, |
|||
getWithPersonnelDataList, |
|||
} from '@/app/api/lesson_course_teaching' |
|||
import { |
|||
addPublicLibraryList, |
|||
editPublicLibraryList, |
|||
} from '@/app/api/future_ontent' |
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
title: '', |
|||
image: '', |
|||
type: '', |
|||
content: '', |
|||
status: '', |
|||
table_type: 20, |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
title: [ |
|||
{ required: true, message: t('titlePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
image: [ |
|||
{ required: true, message: t('imagePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
type: [{ required: true, message: t('typePlaceholder'), trigger: 'blur' }], |
|||
content: [ |
|||
{ required: true, message: t('contentPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id ? editPublicLibraryList : addPublicLibraryList |
|||
|
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
|
|||
let data = formData |
|||
data.table_type = 20 |
|||
save(data) |
|||
.then((res) => { |
|||
loading.value = false |
|||
showDialog.value = false |
|||
emit('complete') |
|||
}) |
|||
.catch((err) => { |
|||
loading.value = false |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
|
|||
// 获取字典数据 |
|||
let typeList = ref([]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('material_type')).data.dictionary |
|||
} |
|||
typeDictList() |
|||
watch( |
|||
() => typeList.value, |
|||
() => { |
|||
formData.type = typeList.value[0].value |
|||
} |
|||
) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await ( |
|||
await useDictionary('course_status') |
|||
).data.dictionary |
|||
} |
|||
statusDictList() |
|||
watch( |
|||
() => statusList.value, |
|||
() => { |
|||
formData.status = statusList.value[0].value |
|||
} |
|||
) |
|||
|
|||
const userPermissionList = ref([] as any[]) |
|||
const setUserPermissionList = async () => { |
|||
userPermissionList.value = await (await getWithPersonnelDataList({})).data |
|||
} |
|||
setUserPermissionList() |
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if (row) { |
|||
const data = await (await getLessonCourseTeachingInfo(row.id)).data |
|||
if (data) |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
loading.value = false |
|||
} |
|||
|
|||
// 验证手机号格式 |
|||
const mobileVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/^1[3-9]\d{9}$/.test(value)) { |
|||
callback(new Error(t('generateMobile'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证身份证号 |
|||
const idCardVerify = (rule: any, value: any, callback: any) => { |
|||
if ( |
|||
value && |
|||
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test( |
|||
value |
|||
) |
|||
) { |
|||
callback(new Error(t('generateIdCard'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证邮箱号 |
|||
const emailVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) { |
|||
callback(new Error(t('generateEmail'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证请输入整数 |
|||
const numberVerify = (rule: any, value: any, callback: any) => { |
|||
if (!Number.isInteger(value)) { |
|||
callback(new Error(t('generateNumber'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
defineExpose({ |
|||
showDialog, |
|||
setFormData, |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
<style lang="scss"> |
|||
.diy-dialog-wrap .el-form-item__label { |
|||
height: auto !important; |
|||
} |
|||
</style> |
|||
File diff suppressed because it is too large
@ -0,0 +1,149 @@ |
|||
<template> |
|||
<el-dialog |
|||
v-model="showDialog" |
|||
:title="formData.id ? t('updateCourse') : t('addCourse')" |
|||
width="50%" |
|||
class="diy-dialog-wrap" |
|||
:destroy-on-close="true" |
|||
> |
|||
<el-form |
|||
:model="formData" |
|||
label-width="120px" |
|||
ref="formRef" |
|||
:rules="formRules" |
|||
class="page-form" |
|||
v-loading="loading" |
|||
> |
|||
|
|||
<el-form-item label="合同" prop="contract_id"> |
|||
<el-select |
|||
class="input-width" |
|||
v-model="formData.contract_id" |
|||
placeholder="请选择合同" |
|||
> |
|||
<el-option |
|||
v-for="(item, index) in contractList" |
|||
:key="index" |
|||
:label="item.contract_name" |
|||
:value="item.id" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
</el-form> |
|||
|
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> |
|||
<el-button |
|||
type="primary" |
|||
:loading="loading" |
|||
@click="confirm(formRef)" |
|||
>{{ t('confirm') }}</el-button |
|||
> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import { t } from '@/lang' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { addCourse, editCourse, getCourseInfo,contractAll } from '@/app/api/course' |
|||
|
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
|
|||
const contractList : any = ref(null) |
|||
// 获取全部标签 |
|||
const getContractAll = async () => { |
|||
contractList.value = await (await contractAll()).data |
|||
} |
|||
getContractAll() |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
course_name: '', |
|||
course_type: '', |
|||
duration: '', |
|||
session_count: '', |
|||
single_session_count: '', |
|||
price: '', |
|||
internal_reminder: '', |
|||
customer_reminder: '', |
|||
remarks: '', |
|||
contract_id: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
} |
|||
}) |
|||
|
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id ? editCourse : addCourse |
|||
|
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
|
|||
let data = formData |
|||
|
|||
save(data) |
|||
.then((res) => { |
|||
loading.value = false |
|||
showDialog.value = false |
|||
emit('complete') |
|||
}) |
|||
.catch((err) => { |
|||
loading.value = false |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
|
|||
// 获取字典数据 |
|||
|
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if (row) { |
|||
const data = await (await getCourseInfo(row.id)).data |
|||
if (data) |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
loading.value = false |
|||
} |
|||
|
|||
|
|||
defineExpose({ |
|||
showDialog, |
|||
setFormData, |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
<style lang="scss"> |
|||
.diy-dialog-wrap .el-form-item__label { |
|||
height: auto !important; |
|||
} |
|||
</style> |
|||
File diff suppressed because it is too large
@ -1,271 +0,0 @@ |
|||
<template> |
|||
<el-dialog |
|||
v-model="showDialog" |
|||
:title=" |
|||
formData.id |
|||
? t('editBasketballTeachingLibrary') |
|||
: t('addBasketballTeachingLibrary') |
|||
" |
|||
width="50%" |
|||
class="diy-dialog-wrap" |
|||
:destroy-on-close="true" |
|||
> |
|||
<el-form |
|||
:model="formData" |
|||
label-width="120px" |
|||
ref="formRef" |
|||
:rules="formRules" |
|||
class="page-form" |
|||
v-loading="loading" |
|||
> |
|||
<el-form-item :label="t('title')" prop="title"> |
|||
<el-input |
|||
v-model="formData.title" |
|||
clearable |
|||
:placeholder="t('titlePlaceholder')" |
|||
class="input-width" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('image')" prop="image"> |
|||
<upload-image v-model="formData.image" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('type')" prop="type"> |
|||
<el-select |
|||
class="input-width" |
|||
v-model="formData.type" |
|||
clearable |
|||
:placeholder="t('typePlaceholder')" |
|||
> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in typeList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('content')" prop="content"> |
|||
<editor v-model="formData.content" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group |
|||
v-model="formData.status" |
|||
:placeholder="t('statusPlaceholder')" |
|||
> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.value" |
|||
> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<!-- <el-form-item :label="t('userPermission')" prop="user_permission">--> |
|||
<!-- <el-checkbox-group v-model="formData.user_permission" :placeholder="t('userPermissionPlaceholder')">--> |
|||
<!-- <el-checkbox--> |
|||
<!-- v-for="(item, index) in userPermissionList"--> |
|||
<!-- :key="index"--> |
|||
<!-- :label="item['sys_user_id']">--> |
|||
<!-- {{ item['name'] }}--> |
|||
<!-- </el-checkbox>--> |
|||
<!-- </el-checkbox-group>--> |
|||
<!-- </el-form-item>--> |
|||
</el-form> |
|||
|
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> |
|||
<el-button |
|||
type="primary" |
|||
:loading="loading" |
|||
@click="confirm(formRef)" |
|||
>{{ t('confirm') }}</el-button |
|||
> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import { t } from '@/lang' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { |
|||
addBasketballTeachingLibrary, |
|||
editBasketballTeachingLibrary, |
|||
getLessonCourseTeachingInfo, |
|||
getWithPersonnelDataList, |
|||
} from '@/app/api/lesson_course_teaching' |
|||
|
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
title: '', |
|||
image: '', |
|||
type: '', |
|||
content: '', |
|||
status: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
title: [ |
|||
{ required: true, message: t('titlePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
image: [ |
|||
{ required: true, message: t('imagePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
type: [{ required: true, message: t('typePlaceholder'), trigger: 'blur' }], |
|||
content: [ |
|||
{ required: true, message: t('contentPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id |
|||
? editBasketballTeachingLibrary |
|||
: addBasketballTeachingLibrary |
|||
|
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
|
|||
let data = formData |
|||
|
|||
save(data) |
|||
.then((res) => { |
|||
loading.value = false |
|||
showDialog.value = false |
|||
emit('complete') |
|||
}) |
|||
.catch((err) => { |
|||
loading.value = false |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
|
|||
// 获取字典数据 |
|||
let typeList = ref([]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('material_type')).data.dictionary |
|||
} |
|||
typeDictList() |
|||
watch( |
|||
() => typeList.value, |
|||
() => { |
|||
formData.type = typeList.value[0].value |
|||
} |
|||
) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await ( |
|||
await useDictionary('course_status') |
|||
).data.dictionary |
|||
} |
|||
statusDictList() |
|||
watch( |
|||
() => statusList.value, |
|||
() => { |
|||
formData.status = statusList.value[0].value |
|||
} |
|||
) |
|||
|
|||
const userPermissionList = ref([] as any[]) |
|||
const setUserPermissionList = async () => { |
|||
userPermissionList.value = await (await getWithPersonnelDataList({})).data |
|||
} |
|||
setUserPermissionList() |
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if (row) { |
|||
const data = await (await getLessonCourseTeachingInfo(row.id)).data |
|||
if (data) |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
loading.value = false |
|||
} |
|||
|
|||
// 验证手机号格式 |
|||
const mobileVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/^1[3-9]\d{9}$/.test(value)) { |
|||
callback(new Error(t('generateMobile'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证身份证号 |
|||
const idCardVerify = (rule: any, value: any, callback: any) => { |
|||
if ( |
|||
value && |
|||
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test( |
|||
value |
|||
) |
|||
) { |
|||
callback(new Error(t('generateIdCard'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证邮箱号 |
|||
const emailVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) { |
|||
callback(new Error(t('generateEmail'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证请输入整数 |
|||
const numberVerify = (rule: any, value: any, callback: any) => { |
|||
if (!Number.isInteger(value)) { |
|||
callback(new Error(t('generateNumber'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
defineExpose({ |
|||
showDialog, |
|||
setFormData, |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
<style lang="scss"> |
|||
.diy-dialog-wrap .el-form-item__label { |
|||
height: auto !important; |
|||
} |
|||
</style> |
|||
@ -1,267 +0,0 @@ |
|||
<template> |
|||
<el-dialog |
|||
v-model="showDialog" |
|||
:title=" |
|||
formData.id ? t('editNinjaTeachingLibrary') : t('addNinjaTeachingLibrary') |
|||
" |
|||
width="50%" |
|||
class="diy-dialog-wrap" |
|||
:destroy-on-close="true" |
|||
> |
|||
<el-form |
|||
:model="formData" |
|||
label-width="120px" |
|||
ref="formRef" |
|||
:rules="formRules" |
|||
class="page-form" |
|||
v-loading="loading" |
|||
> |
|||
<el-form-item :label="t('title')" prop="title"> |
|||
<el-input |
|||
v-model="formData.title" |
|||
clearable |
|||
:placeholder="t('titlePlaceholder')" |
|||
class="input-width" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('image')" prop="image"> |
|||
<upload-image v-model="formData.image" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('type')" prop="type"> |
|||
<el-select |
|||
class="input-width" |
|||
v-model="formData.type" |
|||
clearable |
|||
:placeholder="t('typePlaceholder')" |
|||
> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in typeList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('content')" prop="content"> |
|||
<editor v-model="formData.content" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group |
|||
v-model="formData.status" |
|||
:placeholder="t('statusPlaceholder')" |
|||
> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.value" |
|||
> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<!-- <el-form-item :label="t('userPermission')" prop="user_permission">--> |
|||
<!-- <el-checkbox-group v-model="formData.user_permission" :placeholder="t('userPermissionPlaceholder')">--> |
|||
<!-- <el-checkbox--> |
|||
<!-- v-for="(item, index) in userPermissionList"--> |
|||
<!-- :key="index"--> |
|||
<!-- :label="item['sys_user_id']">--> |
|||
<!-- {{ item['name'] }}--> |
|||
<!-- </el-checkbox>--> |
|||
<!-- </el-checkbox-group>--> |
|||
<!-- </el-form-item>--> |
|||
</el-form> |
|||
|
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> |
|||
<el-button |
|||
type="primary" |
|||
:loading="loading" |
|||
@click="confirm(formRef)" |
|||
>{{ t('confirm') }}</el-button |
|||
> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import { t } from '@/lang' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { |
|||
addNinjaTeachingLibrary, |
|||
editNinjaTeachingLibrary, |
|||
getLessonCourseTeachingInfo, |
|||
getWithPersonnelDataList, |
|||
} from '@/app/api/lesson_course_teaching' |
|||
|
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
title: '', |
|||
image: '', |
|||
type: '', |
|||
content: '', |
|||
status: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
title: [ |
|||
{ required: true, message: t('titlePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
image: [ |
|||
{ required: true, message: t('imagePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
type: [{ required: true, message: t('typePlaceholder'), trigger: 'blur' }], |
|||
content: [ |
|||
{ required: true, message: t('contentPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id ? editNinjaTeachingLibrary : addNinjaTeachingLibrary |
|||
|
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
|
|||
let data = formData |
|||
|
|||
save(data) |
|||
.then((res) => { |
|||
loading.value = false |
|||
showDialog.value = false |
|||
emit('complete') |
|||
}) |
|||
.catch((err) => { |
|||
loading.value = false |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
|
|||
// 获取字典数据 |
|||
let typeList = ref([]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('material_type')).data.dictionary |
|||
} |
|||
typeDictList() |
|||
watch( |
|||
() => typeList.value, |
|||
() => { |
|||
formData.type = typeList.value[0].value |
|||
} |
|||
) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await ( |
|||
await useDictionary('course_status') |
|||
).data.dictionary |
|||
} |
|||
statusDictList() |
|||
watch( |
|||
() => statusList.value, |
|||
() => { |
|||
formData.status = statusList.value[0].value |
|||
} |
|||
) |
|||
|
|||
const userPermissionList = ref([] as any[]) |
|||
const setUserPermissionList = async () => { |
|||
userPermissionList.value = await (await getWithPersonnelDataList({})).data |
|||
} |
|||
setUserPermissionList() |
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if (row) { |
|||
const data = await (await getLessonCourseTeachingInfo(row.id)).data |
|||
if (data) |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
loading.value = false |
|||
} |
|||
|
|||
// 验证手机号格式 |
|||
const mobileVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/^1[3-9]\d{9}$/.test(value)) { |
|||
callback(new Error(t('generateMobile'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证身份证号 |
|||
const idCardVerify = (rule: any, value: any, callback: any) => { |
|||
if ( |
|||
value && |
|||
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test( |
|||
value |
|||
) |
|||
) { |
|||
callback(new Error(t('generateIdCard'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证邮箱号 |
|||
const emailVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) { |
|||
callback(new Error(t('generateEmail'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证请输入整数 |
|||
const numberVerify = (rule: any, value: any, callback: any) => { |
|||
if (!Number.isInteger(value)) { |
|||
callback(new Error(t('generateNumber'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
defineExpose({ |
|||
showDialog, |
|||
setFormData, |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
<style lang="scss"> |
|||
.diy-dialog-wrap .el-form-item__label { |
|||
height: auto !important; |
|||
} |
|||
</style> |
|||
@ -1,271 +0,0 @@ |
|||
<template> |
|||
<el-dialog |
|||
v-model="showDialog" |
|||
:title=" |
|||
formData.id |
|||
? t('editPhysicalTeachingLibrary') |
|||
: t('addPhysicalTeachingLibrary') |
|||
" |
|||
width="50%" |
|||
class="diy-dialog-wrap" |
|||
:destroy-on-close="true" |
|||
> |
|||
<el-form |
|||
:model="formData" |
|||
label-width="120px" |
|||
ref="formRef" |
|||
:rules="formRules" |
|||
class="page-form" |
|||
v-loading="loading" |
|||
> |
|||
<el-form-item :label="t('title')" prop="title"> |
|||
<el-input |
|||
v-model="formData.title" |
|||
clearable |
|||
:placeholder="t('titlePlaceholder')" |
|||
class="input-width" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('image')" prop="image"> |
|||
<upload-image v-model="formData.image" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('type')" prop="type"> |
|||
<el-select |
|||
class="input-width" |
|||
v-model="formData.type" |
|||
clearable |
|||
:placeholder="t('typePlaceholder')" |
|||
> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in typeList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('content')" prop="content"> |
|||
<editor v-model="formData.content" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group |
|||
v-model="formData.status" |
|||
:placeholder="t('statusPlaceholder')" |
|||
> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.value" |
|||
> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<!-- <el-form-item :label="t('userPermission')" prop="user_permission">--> |
|||
<!-- <el-checkbox-group v-model="formData.user_permission" :placeholder="t('userPermissionPlaceholder')">--> |
|||
<!-- <el-checkbox--> |
|||
<!-- v-for="(item, index) in userPermissionList"--> |
|||
<!-- :key="index"--> |
|||
<!-- :label="item['sys_user_id']">--> |
|||
<!-- {{ item['name'] }}--> |
|||
<!-- </el-checkbox>--> |
|||
<!-- </el-checkbox-group>--> |
|||
<!-- </el-form-item>--> |
|||
</el-form> |
|||
|
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> |
|||
<el-button |
|||
type="primary" |
|||
:loading="loading" |
|||
@click="confirm(formRef)" |
|||
>{{ t('confirm') }}</el-button |
|||
> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import { t } from '@/lang' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { |
|||
addPhysicalTeachingLibrary, |
|||
editPhysicalTeachingLibrary, |
|||
getLessonCourseTeachingInfo, |
|||
getWithPersonnelDataList, |
|||
} from '@/app/api/lesson_course_teaching' |
|||
|
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
title: '', |
|||
image: '', |
|||
type: '', |
|||
content: '', |
|||
status: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
title: [ |
|||
{ required: true, message: t('titlePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
image: [ |
|||
{ required: true, message: t('imagePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
type: [{ required: true, message: t('typePlaceholder'), trigger: 'blur' }], |
|||
content: [ |
|||
{ required: true, message: t('contentPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id |
|||
? editPhysicalTeachingLibrary |
|||
: addPhysicalTeachingLibrary |
|||
|
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
|
|||
let data = formData |
|||
|
|||
save(data) |
|||
.then((res) => { |
|||
loading.value = false |
|||
showDialog.value = false |
|||
emit('complete') |
|||
}) |
|||
.catch((err) => { |
|||
loading.value = false |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
|
|||
// 获取字典数据 |
|||
let typeList = ref([]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('material_type')).data.dictionary |
|||
} |
|||
typeDictList() |
|||
watch( |
|||
() => typeList.value, |
|||
() => { |
|||
formData.type = typeList.value[0].value |
|||
} |
|||
) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await ( |
|||
await useDictionary('course_status') |
|||
).data.dictionary |
|||
} |
|||
statusDictList() |
|||
watch( |
|||
() => statusList.value, |
|||
() => { |
|||
formData.status = statusList.value[0].value |
|||
} |
|||
) |
|||
|
|||
const userPermissionList = ref([] as any[]) |
|||
const setUserPermissionList = async () => { |
|||
userPermissionList.value = await (await getWithPersonnelDataList({})).data |
|||
} |
|||
setUserPermissionList() |
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if (row) { |
|||
const data = await (await getLessonCourseTeachingInfo(row.id)).data |
|||
if (data) |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
loading.value = false |
|||
} |
|||
|
|||
// 验证手机号格式 |
|||
const mobileVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/^1[3-9]\d{9}$/.test(value)) { |
|||
callback(new Error(t('generateMobile'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证身份证号 |
|||
const idCardVerify = (rule: any, value: any, callback: any) => { |
|||
if ( |
|||
value && |
|||
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test( |
|||
value |
|||
) |
|||
) { |
|||
callback(new Error(t('generateIdCard'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证邮箱号 |
|||
const emailVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) { |
|||
callback(new Error(t('generateEmail'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证请输入整数 |
|||
const numberVerify = (rule: any, value: any, callback: any) => { |
|||
if (!Number.isInteger(value)) { |
|||
callback(new Error(t('generateNumber'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
defineExpose({ |
|||
showDialog, |
|||
setFormData, |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
<style lang="scss"> |
|||
.diy-dialog-wrap .el-form-item__label { |
|||
height: auto !important; |
|||
} |
|||
</style> |
|||
@ -1,271 +0,0 @@ |
|||
<template> |
|||
<el-dialog |
|||
v-model="showDialog" |
|||
:title=" |
|||
formData.id |
|||
? t('editSecurityTeachingLibrary') |
|||
: t('addSecurityTeachingLibrary') |
|||
" |
|||
width="50%" |
|||
class="diy-dialog-wrap" |
|||
:destroy-on-close="true" |
|||
> |
|||
<el-form |
|||
:model="formData" |
|||
label-width="120px" |
|||
ref="formRef" |
|||
:rules="formRules" |
|||
class="page-form" |
|||
v-loading="loading" |
|||
> |
|||
<el-form-item :label="t('title')" prop="title"> |
|||
<el-input |
|||
v-model="formData.title" |
|||
clearable |
|||
:placeholder="t('titlePlaceholder')" |
|||
class="input-width" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('image')" prop="image"> |
|||
<upload-image v-model="formData.image" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('type')" prop="type"> |
|||
<el-select |
|||
class="input-width" |
|||
v-model="formData.type" |
|||
clearable |
|||
:placeholder="t('typePlaceholder')" |
|||
> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in typeList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('content')" prop="content"> |
|||
<editor v-model="formData.content" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group |
|||
v-model="formData.status" |
|||
:placeholder="t('statusPlaceholder')" |
|||
> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.value" |
|||
> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<!-- <el-form-item :label="t('userPermission')" prop="user_permission">--> |
|||
<!-- <el-checkbox-group v-model="formData.user_permission" :placeholder="t('userPermissionPlaceholder')">--> |
|||
<!-- <el-checkbox--> |
|||
<!-- v-for="(item, index) in userPermissionList"--> |
|||
<!-- :key="index"--> |
|||
<!-- :label="item['sys_user_id']">--> |
|||
<!-- {{ item['name'] }}--> |
|||
<!-- </el-checkbox>--> |
|||
<!-- </el-checkbox-group>--> |
|||
<!-- </el-form-item>--> |
|||
</el-form> |
|||
|
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> |
|||
<el-button |
|||
type="primary" |
|||
:loading="loading" |
|||
@click="confirm(formRef)" |
|||
>{{ t('confirm') }}</el-button |
|||
> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import { t } from '@/lang' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { |
|||
addSecurityTeachingLibrary, |
|||
editSecurityTeachingLibrary, |
|||
getLessonCourseTeachingInfo, |
|||
getWithPersonnelDataList, |
|||
} from '@/app/api/lesson_course_teaching' |
|||
|
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
title: '', |
|||
image: '', |
|||
type: '', |
|||
content: '', |
|||
status: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
title: [ |
|||
{ required: true, message: t('titlePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
image: [ |
|||
{ required: true, message: t('imagePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
type: [{ required: true, message: t('typePlaceholder'), trigger: 'blur' }], |
|||
content: [ |
|||
{ required: true, message: t('contentPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id |
|||
? editSecurityTeachingLibrary |
|||
: addSecurityTeachingLibrary |
|||
|
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
|
|||
let data = formData |
|||
|
|||
save(data) |
|||
.then((res) => { |
|||
loading.value = false |
|||
showDialog.value = false |
|||
emit('complete') |
|||
}) |
|||
.catch((err) => { |
|||
loading.value = false |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
|
|||
// 获取字典数据 |
|||
let typeList = ref([]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('material_type')).data.dictionary |
|||
} |
|||
typeDictList() |
|||
watch( |
|||
() => typeList.value, |
|||
() => { |
|||
formData.type = typeList.value[0].value |
|||
} |
|||
) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await ( |
|||
await useDictionary('course_status') |
|||
).data.dictionary |
|||
} |
|||
statusDictList() |
|||
watch( |
|||
() => statusList.value, |
|||
() => { |
|||
formData.status = statusList.value[0].value |
|||
} |
|||
) |
|||
|
|||
const userPermissionList = ref([] as any[]) |
|||
const setUserPermissionList = async () => { |
|||
userPermissionList.value = await (await getWithPersonnelDataList({})).data |
|||
} |
|||
setUserPermissionList() |
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if (row) { |
|||
const data = await (await getLessonCourseTeachingInfo(row.id)).data |
|||
if (data) |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
loading.value = false |
|||
} |
|||
|
|||
// 验证手机号格式 |
|||
const mobileVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/^1[3-9]\d{9}$/.test(value)) { |
|||
callback(new Error(t('generateMobile'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证身份证号 |
|||
const idCardVerify = (rule: any, value: any, callback: any) => { |
|||
if ( |
|||
value && |
|||
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test( |
|||
value |
|||
) |
|||
) { |
|||
callback(new Error(t('generateIdCard'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证邮箱号 |
|||
const emailVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) { |
|||
callback(new Error(t('generateEmail'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证请输入整数 |
|||
const numberVerify = (rule: any, value: any, callback: any) => { |
|||
if (!Number.isInteger(value)) { |
|||
callback(new Error(t('generateNumber'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
defineExpose({ |
|||
showDialog, |
|||
setFormData, |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
<style lang="scss"> |
|||
.diy-dialog-wrap .el-form-item__label { |
|||
height: auto !important; |
|||
} |
|||
</style> |
|||
@ -1,269 +0,0 @@ |
|||
<template> |
|||
<el-dialog |
|||
v-model="showDialog" |
|||
:title=" |
|||
formData.id |
|||
? t('editStrengthenTeachingLibrary') |
|||
: t('addStrengthenTeachingLibrary') |
|||
" |
|||
width="50%" |
|||
class="diy-dialog-wrap" |
|||
:destroy-on-close="true" |
|||
> |
|||
<el-form |
|||
:model="formData" |
|||
label-width="120px" |
|||
ref="formRef" |
|||
:rules="formRules" |
|||
class="page-form" |
|||
v-loading="loading" |
|||
> |
|||
<el-form-item :label="t('title')" prop="title"> |
|||
<el-input |
|||
v-model="formData.title" |
|||
clearable |
|||
:placeholder="t('titlePlaceholder')" |
|||
class="input-width" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('image')" prop="image"> |
|||
<upload-image v-model="formData.image" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('type')" prop="type"> |
|||
<el-select |
|||
class="input-width" |
|||
v-model="formData.type" |
|||
clearable |
|||
:placeholder="t('typePlaceholder')" |
|||
> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in typeList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('content')" prop="content"> |
|||
<editor v-model="formData.content" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group |
|||
v-model="formData.status" |
|||
:placeholder="t('statusPlaceholder')" |
|||
> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.value" |
|||
> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<!-- <el-form-item :label="t('userPermission')" prop="user_permission">--> |
|||
<!-- <el-checkbox-group v-model="formData.user_permission" :placeholder="t('userPermissionPlaceholder')">--> |
|||
<!-- <el-checkbox--> |
|||
<!-- v-for="(item, index) in userPermissionList"--> |
|||
<!-- :key="index"--> |
|||
<!-- :label="item['sys_user_id']">--> |
|||
<!-- {{ item['name'] }}--> |
|||
<!-- </el-checkbox>--> |
|||
<!-- </el-checkbox-group>--> |
|||
<!-- </el-form-item>--> |
|||
</el-form> |
|||
|
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> |
|||
<el-button |
|||
type="primary" |
|||
:loading="loading" |
|||
@click="confirm(formRef)" |
|||
>{{ t('confirm') }}</el-button |
|||
> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import { t } from '@/lang' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { |
|||
addStrengTeachingLibrary, |
|||
editStrengTeachingLibrary, |
|||
getLessonCourseTeachingInfo, |
|||
getWithPersonnelDataList, |
|||
} from '@/app/api/lesson_course_teaching' |
|||
|
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
title: '', |
|||
image: '', |
|||
type: '', |
|||
content: '', |
|||
status: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
title: [ |
|||
{ required: true, message: t('titlePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
image: [ |
|||
{ required: true, message: t('imagePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
type: [{ required: true, message: t('typePlaceholder'), trigger: 'blur' }], |
|||
content: [ |
|||
{ required: true, message: t('contentPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id ? editStrengTeachingLibrary : addStrengTeachingLibrary |
|||
|
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
|
|||
let data = formData |
|||
|
|||
save(data) |
|||
.then((res) => { |
|||
loading.value = false |
|||
showDialog.value = false |
|||
emit('complete') |
|||
}) |
|||
.catch((err) => { |
|||
loading.value = false |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
|
|||
// 获取字典数据 |
|||
let typeList = ref([]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('material_type')).data.dictionary |
|||
} |
|||
typeDictList() |
|||
watch( |
|||
() => typeList.value, |
|||
() => { |
|||
formData.type = typeList.value[0].value |
|||
} |
|||
) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await ( |
|||
await useDictionary('course_status') |
|||
).data.dictionary |
|||
} |
|||
statusDictList() |
|||
watch( |
|||
() => statusList.value, |
|||
() => { |
|||
formData.status = statusList.value[0].value |
|||
} |
|||
) |
|||
|
|||
const userPermissionList = ref([] as any[]) |
|||
const setUserPermissionList = async () => { |
|||
userPermissionList.value = await (await getWithPersonnelDataList({})).data |
|||
} |
|||
setUserPermissionList() |
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if (row) { |
|||
const data = await (await getLessonCourseTeachingInfo(row.id)).data |
|||
if (data) |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
loading.value = false |
|||
} |
|||
|
|||
// 验证手机号格式 |
|||
const mobileVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/^1[3-9]\d{9}$/.test(value)) { |
|||
callback(new Error(t('generateMobile'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证身份证号 |
|||
const idCardVerify = (rule: any, value: any, callback: any) => { |
|||
if ( |
|||
value && |
|||
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test( |
|||
value |
|||
) |
|||
) { |
|||
callback(new Error(t('generateIdCard'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证邮箱号 |
|||
const emailVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) { |
|||
callback(new Error(t('generateEmail'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证请输入整数 |
|||
const numberVerify = (rule: any, value: any, callback: any) => { |
|||
if (!Number.isInteger(value)) { |
|||
callback(new Error(t('generateNumber'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
defineExpose({ |
|||
showDialog, |
|||
setFormData, |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
<style lang="scss"> |
|||
.diy-dialog-wrap .el-form-item__label { |
|||
height: auto !important; |
|||
} |
|||
</style> |
|||
File diff suppressed because it is too large
@ -1,267 +0,0 @@ |
|||
<template> |
|||
<el-dialog |
|||
v-model="showDialog" |
|||
:title=" |
|||
formData.id ? t('editNinjaTeachingLibrary') : t('addNinjaTeachingLibrary') |
|||
" |
|||
width="50%" |
|||
class="diy-dialog-wrap" |
|||
:destroy-on-close="true" |
|||
> |
|||
<el-form |
|||
:model="formData" |
|||
label-width="120px" |
|||
ref="formRef" |
|||
:rules="formRules" |
|||
class="page-form" |
|||
v-loading="loading" |
|||
> |
|||
<el-form-item :label="t('title')" prop="title"> |
|||
<el-input |
|||
v-model="formData.title" |
|||
clearable |
|||
:placeholder="t('titlePlaceholder')" |
|||
class="input-width" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('image')" prop="image"> |
|||
<upload-image v-model="formData.image" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('type')" prop="type"> |
|||
<el-select |
|||
class="input-width" |
|||
v-model="formData.type" |
|||
clearable |
|||
:placeholder="t('typePlaceholder')" |
|||
> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in typeList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('content')" prop="content"> |
|||
<editor v-model="formData.content" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group |
|||
v-model="formData.status" |
|||
:placeholder="t('statusPlaceholder')" |
|||
> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.value" |
|||
> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<!-- <el-form-item :label="t('userPermission')" prop="user_permission">--> |
|||
<!-- <el-checkbox-group v-model="formData.user_permission" :placeholder="t('userPermissionPlaceholder')">--> |
|||
<!-- <el-checkbox--> |
|||
<!-- v-for="(item, index) in userPermissionList"--> |
|||
<!-- :key="index"--> |
|||
<!-- :label="item['sys_user_id']">--> |
|||
<!-- {{ item['name'] }}--> |
|||
<!-- </el-checkbox>--> |
|||
<!-- </el-checkbox-group>--> |
|||
<!-- </el-form-item>--> |
|||
</el-form> |
|||
|
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> |
|||
<el-button |
|||
type="primary" |
|||
:loading="loading" |
|||
@click="confirm(formRef)" |
|||
>{{ t('confirm') }}</el-button |
|||
> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import { t } from '@/lang' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { |
|||
addNinjaTeachingLibrary, |
|||
editNinjaTeachingLibrary, |
|||
getLessonCourseTeachingInfo, |
|||
getWithPersonnelDataList, |
|||
} from '@/app/api/lesson_course_teaching' |
|||
|
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
title: '', |
|||
image: '', |
|||
type: '', |
|||
content: '', |
|||
status: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
title: [ |
|||
{ required: true, message: t('titlePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
image: [ |
|||
{ required: true, message: t('imagePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
type: [{ required: true, message: t('typePlaceholder'), trigger: 'blur' }], |
|||
content: [ |
|||
{ required: true, message: t('contentPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id ? editNinjaTeachingLibrary : addNinjaTeachingLibrary |
|||
|
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
|
|||
let data = formData |
|||
|
|||
save(data) |
|||
.then((res) => { |
|||
loading.value = false |
|||
showDialog.value = false |
|||
emit('complete') |
|||
}) |
|||
.catch((err) => { |
|||
loading.value = false |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
|
|||
// 获取字典数据 |
|||
let typeList = ref([]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('material_type')).data.dictionary |
|||
} |
|||
typeDictList() |
|||
watch( |
|||
() => typeList.value, |
|||
() => { |
|||
formData.type = typeList.value[0].value |
|||
} |
|||
) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await ( |
|||
await useDictionary('course_status') |
|||
).data.dictionary |
|||
} |
|||
statusDictList() |
|||
watch( |
|||
() => statusList.value, |
|||
() => { |
|||
formData.status = statusList.value[0].value |
|||
} |
|||
) |
|||
|
|||
const userPermissionList = ref([] as any[]) |
|||
const setUserPermissionList = async () => { |
|||
userPermissionList.value = await (await getWithPersonnelDataList({})).data |
|||
} |
|||
setUserPermissionList() |
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if (row) { |
|||
const data = await (await getLessonCourseTeachingInfo(row.id)).data |
|||
if (data) |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
loading.value = false |
|||
} |
|||
|
|||
// 验证手机号格式 |
|||
const mobileVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/^1[3-9]\d{9}$/.test(value)) { |
|||
callback(new Error(t('generateMobile'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证身份证号 |
|||
const idCardVerify = (rule: any, value: any, callback: any) => { |
|||
if ( |
|||
value && |
|||
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test( |
|||
value |
|||
) |
|||
) { |
|||
callback(new Error(t('generateIdCard'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证邮箱号 |
|||
const emailVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) { |
|||
callback(new Error(t('generateEmail'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证请输入整数 |
|||
const numberVerify = (rule: any, value: any, callback: any) => { |
|||
if (!Number.isInteger(value)) { |
|||
callback(new Error(t('generateNumber'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
defineExpose({ |
|||
showDialog, |
|||
setFormData, |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
<style lang="scss"> |
|||
.diy-dialog-wrap .el-form-item__label { |
|||
height: auto !important; |
|||
} |
|||
</style> |
|||
@ -1,271 +0,0 @@ |
|||
<template> |
|||
<el-dialog |
|||
v-model="showDialog" |
|||
:title=" |
|||
formData.id |
|||
? t('editPhysicalTeachingLibrary') |
|||
: t('addPhysicalTeachingLibrary') |
|||
" |
|||
width="50%" |
|||
class="diy-dialog-wrap" |
|||
:destroy-on-close="true" |
|||
> |
|||
<el-form |
|||
:model="formData" |
|||
label-width="120px" |
|||
ref="formRef" |
|||
:rules="formRules" |
|||
class="page-form" |
|||
v-loading="loading" |
|||
> |
|||
<el-form-item :label="t('title')" prop="title"> |
|||
<el-input |
|||
v-model="formData.title" |
|||
clearable |
|||
:placeholder="t('titlePlaceholder')" |
|||
class="input-width" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('image')" prop="image"> |
|||
<upload-image v-model="formData.image" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('type')" prop="type"> |
|||
<el-select |
|||
class="input-width" |
|||
v-model="formData.type" |
|||
clearable |
|||
:placeholder="t('typePlaceholder')" |
|||
> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in typeList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('content')" prop="content"> |
|||
<editor v-model="formData.content" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group |
|||
v-model="formData.status" |
|||
:placeholder="t('statusPlaceholder')" |
|||
> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.value" |
|||
> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<!-- <el-form-item :label="t('userPermission')" prop="user_permission">--> |
|||
<!-- <el-checkbox-group v-model="formData.user_permission" :placeholder="t('userPermissionPlaceholder')">--> |
|||
<!-- <el-checkbox--> |
|||
<!-- v-for="(item, index) in userPermissionList"--> |
|||
<!-- :key="index"--> |
|||
<!-- :label="item['sys_user_id']">--> |
|||
<!-- {{ item['name'] }}--> |
|||
<!-- </el-checkbox>--> |
|||
<!-- </el-checkbox-group>--> |
|||
<!-- </el-form-item>--> |
|||
</el-form> |
|||
|
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> |
|||
<el-button |
|||
type="primary" |
|||
:loading="loading" |
|||
@click="confirm(formRef)" |
|||
>{{ t('confirm') }}</el-button |
|||
> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import { t } from '@/lang' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { |
|||
addPhysicalTeachingLibrary, |
|||
editPhysicalTeachingLibrary, |
|||
getLessonCourseTeachingInfo, |
|||
getWithPersonnelDataList, |
|||
} from '@/app/api/lesson_course_teaching' |
|||
|
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
title: '', |
|||
image: '', |
|||
type: '', |
|||
content: '', |
|||
status: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
title: [ |
|||
{ required: true, message: t('titlePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
image: [ |
|||
{ required: true, message: t('imagePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
type: [{ required: true, message: t('typePlaceholder'), trigger: 'blur' }], |
|||
content: [ |
|||
{ required: true, message: t('contentPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id |
|||
? editPhysicalTeachingLibrary |
|||
: addPhysicalTeachingLibrary |
|||
|
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
|
|||
let data = formData |
|||
|
|||
save(data) |
|||
.then((res) => { |
|||
loading.value = false |
|||
showDialog.value = false |
|||
emit('complete') |
|||
}) |
|||
.catch((err) => { |
|||
loading.value = false |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
|
|||
// 获取字典数据 |
|||
let typeList = ref([]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('material_type')).data.dictionary |
|||
} |
|||
typeDictList() |
|||
watch( |
|||
() => typeList.value, |
|||
() => { |
|||
formData.type = typeList.value[0].value |
|||
} |
|||
) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await ( |
|||
await useDictionary('course_status') |
|||
).data.dictionary |
|||
} |
|||
statusDictList() |
|||
watch( |
|||
() => statusList.value, |
|||
() => { |
|||
formData.status = statusList.value[0].value |
|||
} |
|||
) |
|||
|
|||
const userPermissionList = ref([] as any[]) |
|||
const setUserPermissionList = async () => { |
|||
userPermissionList.value = await (await getWithPersonnelDataList({})).data |
|||
} |
|||
setUserPermissionList() |
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if (row) { |
|||
const data = await (await getLessonCourseTeachingInfo(row.id)).data |
|||
if (data) |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
loading.value = false |
|||
} |
|||
|
|||
// 验证手机号格式 |
|||
const mobileVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/^1[3-9]\d{9}$/.test(value)) { |
|||
callback(new Error(t('generateMobile'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证身份证号 |
|||
const idCardVerify = (rule: any, value: any, callback: any) => { |
|||
if ( |
|||
value && |
|||
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test( |
|||
value |
|||
) |
|||
) { |
|||
callback(new Error(t('generateIdCard'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证邮箱号 |
|||
const emailVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) { |
|||
callback(new Error(t('generateEmail'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证请输入整数 |
|||
const numberVerify = (rule: any, value: any, callback: any) => { |
|||
if (!Number.isInteger(value)) { |
|||
callback(new Error(t('generateNumber'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
defineExpose({ |
|||
showDialog, |
|||
setFormData, |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
<style lang="scss"> |
|||
.diy-dialog-wrap .el-form-item__label { |
|||
height: auto !important; |
|||
} |
|||
</style> |
|||
@ -1,271 +0,0 @@ |
|||
<template> |
|||
<el-dialog |
|||
v-model="showDialog" |
|||
:title=" |
|||
formData.id |
|||
? t('editSecurityTeachingLibrary') |
|||
: t('addSecurityTeachingLibrary') |
|||
" |
|||
width="50%" |
|||
class="diy-dialog-wrap" |
|||
:destroy-on-close="true" |
|||
> |
|||
<el-form |
|||
:model="formData" |
|||
label-width="120px" |
|||
ref="formRef" |
|||
:rules="formRules" |
|||
class="page-form" |
|||
v-loading="loading" |
|||
> |
|||
<el-form-item :label="t('title')" prop="title"> |
|||
<el-input |
|||
v-model="formData.title" |
|||
clearable |
|||
:placeholder="t('titlePlaceholder')" |
|||
class="input-width" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('image')" prop="image"> |
|||
<upload-image v-model="formData.image" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('type')" prop="type"> |
|||
<el-select |
|||
class="input-width" |
|||
v-model="formData.type" |
|||
clearable |
|||
:placeholder="t('typePlaceholder')" |
|||
> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in typeList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('content')" prop="content"> |
|||
<editor v-model="formData.content" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group |
|||
v-model="formData.status" |
|||
:placeholder="t('statusPlaceholder')" |
|||
> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.value" |
|||
> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<!-- <el-form-item :label="t('userPermission')" prop="user_permission">--> |
|||
<!-- <el-checkbox-group v-model="formData.user_permission" :placeholder="t('userPermissionPlaceholder')">--> |
|||
<!-- <el-checkbox--> |
|||
<!-- v-for="(item, index) in userPermissionList"--> |
|||
<!-- :key="index"--> |
|||
<!-- :label="item['sys_user_id']">--> |
|||
<!-- {{ item['name'] }}--> |
|||
<!-- </el-checkbox>--> |
|||
<!-- </el-checkbox-group>--> |
|||
<!-- </el-form-item>--> |
|||
</el-form> |
|||
|
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> |
|||
<el-button |
|||
type="primary" |
|||
:loading="loading" |
|||
@click="confirm(formRef)" |
|||
>{{ t('confirm') }}</el-button |
|||
> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import { t } from '@/lang' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { |
|||
addSecurityTeachingLibrary, |
|||
editSecurityTeachingLibrary, |
|||
getLessonCourseTeachingInfo, |
|||
getWithPersonnelDataList, |
|||
} from '@/app/api/lesson_course_teaching' |
|||
|
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
title: '', |
|||
image: '', |
|||
type: '', |
|||
content: '', |
|||
status: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
title: [ |
|||
{ required: true, message: t('titlePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
image: [ |
|||
{ required: true, message: t('imagePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
type: [{ required: true, message: t('typePlaceholder'), trigger: 'blur' }], |
|||
content: [ |
|||
{ required: true, message: t('contentPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id |
|||
? editSecurityTeachingLibrary |
|||
: addSecurityTeachingLibrary |
|||
|
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
|
|||
let data = formData |
|||
|
|||
save(data) |
|||
.then((res) => { |
|||
loading.value = false |
|||
showDialog.value = false |
|||
emit('complete') |
|||
}) |
|||
.catch((err) => { |
|||
loading.value = false |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
|
|||
// 获取字典数据 |
|||
let typeList = ref([]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('material_type')).data.dictionary |
|||
} |
|||
typeDictList() |
|||
watch( |
|||
() => typeList.value, |
|||
() => { |
|||
formData.type = typeList.value[0].value |
|||
} |
|||
) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await ( |
|||
await useDictionary('course_status') |
|||
).data.dictionary |
|||
} |
|||
statusDictList() |
|||
watch( |
|||
() => statusList.value, |
|||
() => { |
|||
formData.status = statusList.value[0].value |
|||
} |
|||
) |
|||
|
|||
const userPermissionList = ref([] as any[]) |
|||
const setUserPermissionList = async () => { |
|||
userPermissionList.value = await (await getWithPersonnelDataList({})).data |
|||
} |
|||
setUserPermissionList() |
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if (row) { |
|||
const data = await (await getLessonCourseTeachingInfo(row.id)).data |
|||
if (data) |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
loading.value = false |
|||
} |
|||
|
|||
// 验证手机号格式 |
|||
const mobileVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/^1[3-9]\d{9}$/.test(value)) { |
|||
callback(new Error(t('generateMobile'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证身份证号 |
|||
const idCardVerify = (rule: any, value: any, callback: any) => { |
|||
if ( |
|||
value && |
|||
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test( |
|||
value |
|||
) |
|||
) { |
|||
callback(new Error(t('generateIdCard'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证邮箱号 |
|||
const emailVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) { |
|||
callback(new Error(t('generateEmail'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证请输入整数 |
|||
const numberVerify = (rule: any, value: any, callback: any) => { |
|||
if (!Number.isInteger(value)) { |
|||
callback(new Error(t('generateNumber'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
defineExpose({ |
|||
showDialog, |
|||
setFormData, |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
<style lang="scss"> |
|||
.diy-dialog-wrap .el-form-item__label { |
|||
height: auto !important; |
|||
} |
|||
</style> |
|||
@ -1,269 +0,0 @@ |
|||
<template> |
|||
<el-dialog |
|||
v-model="showDialog" |
|||
:title=" |
|||
formData.id |
|||
? t('editStrengthenTeachingLibrary') |
|||
: t('addStrengthenTeachingLibrary') |
|||
" |
|||
width="50%" |
|||
class="diy-dialog-wrap" |
|||
:destroy-on-close="true" |
|||
> |
|||
<el-form |
|||
:model="formData" |
|||
label-width="120px" |
|||
ref="formRef" |
|||
:rules="formRules" |
|||
class="page-form" |
|||
v-loading="loading" |
|||
> |
|||
<el-form-item :label="t('title')" prop="title"> |
|||
<el-input |
|||
v-model="formData.title" |
|||
clearable |
|||
:placeholder="t('titlePlaceholder')" |
|||
class="input-width" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('image')" prop="image"> |
|||
<upload-image v-model="formData.image" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('type')" prop="type"> |
|||
<el-select |
|||
class="input-width" |
|||
v-model="formData.type" |
|||
clearable |
|||
:placeholder="t('typePlaceholder')" |
|||
> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in typeList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('content')" prop="content"> |
|||
<editor v-model="formData.content" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group |
|||
v-model="formData.status" |
|||
:placeholder="t('statusPlaceholder')" |
|||
> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.value" |
|||
> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<!-- <el-form-item :label="t('userPermission')" prop="user_permission">--> |
|||
<!-- <el-checkbox-group v-model="formData.user_permission" :placeholder="t('userPermissionPlaceholder')">--> |
|||
<!-- <el-checkbox--> |
|||
<!-- v-for="(item, index) in userPermissionList"--> |
|||
<!-- :key="index"--> |
|||
<!-- :label="item['sys_user_id']">--> |
|||
<!-- {{ item['name'] }}--> |
|||
<!-- </el-checkbox>--> |
|||
<!-- </el-checkbox-group>--> |
|||
<!-- </el-form-item>--> |
|||
</el-form> |
|||
|
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> |
|||
<el-button |
|||
type="primary" |
|||
:loading="loading" |
|||
@click="confirm(formRef)" |
|||
>{{ t('confirm') }}</el-button |
|||
> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import { t } from '@/lang' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { |
|||
addStrengTeachingLibrary, |
|||
editStrengTeachingLibrary, |
|||
getLessonCourseTeachingInfo, |
|||
getWithPersonnelDataList, |
|||
} from '@/app/api/lesson_course_teaching' |
|||
|
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
title: '', |
|||
image: '', |
|||
type: '', |
|||
content: '', |
|||
status: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
title: [ |
|||
{ required: true, message: t('titlePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
image: [ |
|||
{ required: true, message: t('imagePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
type: [{ required: true, message: t('typePlaceholder'), trigger: 'blur' }], |
|||
content: [ |
|||
{ required: true, message: t('contentPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id ? editStrengTeachingLibrary : addStrengTeachingLibrary |
|||
|
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
|
|||
let data = formData |
|||
|
|||
save(data) |
|||
.then((res) => { |
|||
loading.value = false |
|||
showDialog.value = false |
|||
emit('complete') |
|||
}) |
|||
.catch((err) => { |
|||
loading.value = false |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
|
|||
// 获取字典数据 |
|||
let typeList = ref([]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('material_type')).data.dictionary |
|||
} |
|||
typeDictList() |
|||
watch( |
|||
() => typeList.value, |
|||
() => { |
|||
formData.type = typeList.value[0].value |
|||
} |
|||
) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await ( |
|||
await useDictionary('course_status') |
|||
).data.dictionary |
|||
} |
|||
statusDictList() |
|||
watch( |
|||
() => statusList.value, |
|||
() => { |
|||
formData.status = statusList.value[0].value |
|||
} |
|||
) |
|||
|
|||
const userPermissionList = ref([] as any[]) |
|||
const setUserPermissionList = async () => { |
|||
userPermissionList.value = await (await getWithPersonnelDataList({})).data |
|||
} |
|||
setUserPermissionList() |
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if (row) { |
|||
const data = await (await getLessonCourseTeachingInfo(row.id)).data |
|||
if (data) |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
loading.value = false |
|||
} |
|||
|
|||
// 验证手机号格式 |
|||
const mobileVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/^1[3-9]\d{9}$/.test(value)) { |
|||
callback(new Error(t('generateMobile'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证身份证号 |
|||
const idCardVerify = (rule: any, value: any, callback: any) => { |
|||
if ( |
|||
value && |
|||
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test( |
|||
value |
|||
) |
|||
) { |
|||
callback(new Error(t('generateIdCard'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证邮箱号 |
|||
const emailVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) { |
|||
callback(new Error(t('generateEmail'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证请输入整数 |
|||
const numberVerify = (rule: any, value: any, callback: any) => { |
|||
if (!Number.isInteger(value)) { |
|||
callback(new Error(t('generateNumber'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
defineExpose({ |
|||
showDialog, |
|||
setFormData, |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
<style lang="scss"> |
|||
.diy-dialog-wrap .el-form-item__label { |
|||
height: auto !important; |
|||
} |
|||
</style> |
|||
File diff suppressed because it is too large
@ -0,0 +1,228 @@ |
|||
<template> |
|||
<div class="main-container"> |
|||
<el-card class="box-card !border-none" shadow="never" v-loading="loading"> |
|||
<div class="flex justify-between items-center"> |
|||
<span class="text-lg">{{ pageName }}</span> |
|||
<el-button type="primary" @click="addStage"> 新增阶段 </el-button> |
|||
</div> |
|||
</el-card> |
|||
|
|||
<el-card class="box-card !border-none" shadow="never"> |
|||
<div |
|||
class="flex items-center justify-between p-[10px] table-item-border bg" |
|||
> |
|||
<span class="text-base w-[230px]">阶段名称</span> |
|||
<span class="text-base w-[110px] text-center">底薪</span> |
|||
</div> |
|||
|
|||
<el-collapse v-model="activeNames" accordion> |
|||
<el-collapse-item |
|||
v-for="(stage, index) in stages" |
|||
:key="stage.id" |
|||
:name="stage.id" |
|||
> |
|||
<template #title> |
|||
<div class="collapse-title"> |
|||
<span class="title-name">{{ stage.name }}</span> |
|||
<span class="arrow">{{ stage.price }} 元</span> |
|||
<!-- <span class="arrow">></span> --> |
|||
</div> |
|||
</template> |
|||
|
|||
<el-form label-width="100px" style="margin-bottom: 10px"> |
|||
<el-form-item label="阶段名称"> |
|||
<el-input v-model="stage.name" placeholder="请输入阶段名称" /> |
|||
</el-form-item> |
|||
</el-form> |
|||
|
|||
<el-form label-width="100px" style="margin-bottom: 10px"> |
|||
<el-form-item label="阶段底薪"> |
|||
<el-input v-model="stage.price" placeholder="请输入阶段底薪" /> |
|||
</el-form-item> |
|||
</el-form> |
|||
|
|||
<el-button type="success" size="small" @click="addRule(stage)" |
|||
>新增规则</el-button |
|||
> |
|||
|
|||
<el-table :data="stage.rules" border style="margin-top: 10px"> |
|||
<el-table-column prop="renewal_standard_min" label="续费上限"> |
|||
<template #default="{ row }"> |
|||
<el-input |
|||
v-model="row.renewal_standard_min" |
|||
placeholder="请输入续费上限" |
|||
/> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
<el-table-column prop="renewal_standard_max" label="续费下限"> |
|||
<template #default="{ row }"> |
|||
<el-input |
|||
v-model="row.renewal_standard_max" |
|||
placeholder="请输入续费下限" |
|||
/> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
<el-table-column prop="renewal_commission" label="续费提成"> |
|||
<template #default="{ row }"> |
|||
<el-input v-model="row.renewal_commission" placeholder="%" /> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
<el-table-column prop="new_count_min" label="新单成交数上限"> |
|||
<template #default="{ row }"> |
|||
<el-input v-model="row.new_count_min" /> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
<el-table-column prop="new_count_max" label="新单成交数下限"> |
|||
<template #default="{ row }"> |
|||
<el-input v-model="row.new_count_max" /> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
<el-table-column prop="new_move_5" label="新招(5+1)x3"> |
|||
<template #default="{ row }"> |
|||
<el-input v-model="row.new_move_5" /> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="new_move_7" label="新招(7+1)x3"> |
|||
<template #default="{ row }"> |
|||
<el-input v-model="row.new_move_7" /> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="操作" width="100"> |
|||
<template #default="{ $index }"> |
|||
<el-button |
|||
type="danger" |
|||
size="small" |
|||
@click="removeRule(stage, $index)" |
|||
>删除</el-button |
|||
> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
|
|||
<el-button |
|||
type="danger" |
|||
size="small" |
|||
style="margin-top: 10px" |
|||
@click="removeStage(index)" |
|||
>删除该阶段</el-button |
|||
> |
|||
</el-collapse-item> |
|||
</el-collapse> |
|||
|
|||
<div style="text-align: right; margin-top: 20px"> |
|||
<el-button type="primary" @click="onSave">提交保存</el-button> |
|||
</div> |
|||
</el-card> |
|||
</div> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { jlyjConfig, getJlyjConfig } from '@/app/api/sys' |
|||
import { reactive, ref } from 'vue' |
|||
import { ElMessage } from 'element-plus' |
|||
import { useRoute } from 'vue-router' |
|||
const route = useRoute() |
|||
const pageName = route.meta.title |
|||
|
|||
const loading = ref(true) |
|||
const stages = ref([]) |
|||
const activeNames = ref(null) |
|||
|
|||
function addStage() { |
|||
const newStage = { |
|||
name: '默认阶段', |
|||
price: 0, |
|||
rules: [ |
|||
{ |
|||
renewal_standard_min: '', |
|||
renewal_standard_max: '', |
|||
renewal_commission: '', |
|||
new_count_min: '', |
|||
new_count_max: '', |
|||
new_move_5: '', |
|||
new_move_7: '', |
|||
}, |
|||
], |
|||
} |
|||
stages.value.push(newStage) |
|||
activeNames.value = newStage.name |
|||
} |
|||
|
|||
function removeStage(index) { |
|||
stages.value.splice(index, 1) |
|||
} |
|||
|
|||
function addRule(stage) { |
|||
stage.rules.push({ |
|||
renewal_standard_min: '', |
|||
renewal_standard_max: '', |
|||
renewal_commission: '', |
|||
new_count_min: '', |
|||
new_count_max: '', |
|||
new_move_5: '', |
|||
new_move_7: '', |
|||
}) |
|||
} |
|||
|
|||
function removeRule(stage, ruleIndex) { |
|||
if (stage.rules.length === 1) { |
|||
ElMessage.warning('至少保留一条规则') |
|||
return |
|||
} |
|||
stage.rules.splice(ruleIndex, 1) |
|||
} |
|||
|
|||
const setFormData = async () => { |
|||
const data = await (await getJlyjConfig()).data |
|||
stages.value = data |
|||
loading.value = false |
|||
} |
|||
|
|||
setFormData() |
|||
|
|||
const onSave = async () => { |
|||
jlyjConfig(stages.value) |
|||
.then(() => { |
|||
loading.value = true |
|||
setFormData() |
|||
}) |
|||
.catch(() => { |
|||
loading.value = false |
|||
}) |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.collapse-title { |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: space-between; |
|||
width: 100%; |
|||
font-size: 14px; |
|||
font-weight: 500; |
|||
padding-right: 10px; |
|||
color: #333; |
|||
padding: 10px; |
|||
} |
|||
|
|||
.title-name { |
|||
width: 230px; |
|||
} |
|||
|
|||
.title-salary { |
|||
width: 110px; |
|||
text-align: center; |
|||
color: #7438d5; |
|||
} |
|||
|
|||
.arrow { |
|||
margin-left: auto; |
|||
color: #999; |
|||
font-size: 14px; |
|||
} |
|||
</style> |
|||
@ -1,271 +0,0 @@ |
|||
<template> |
|||
<el-dialog |
|||
v-model="showDialog" |
|||
:title=" |
|||
formData.id ? t('editNinjaTeachingLibrary') : t('addNinjaTeachingLibrary') |
|||
" |
|||
width="50%" |
|||
class="diy-dialog-wrap" |
|||
:destroy-on-close="true" |
|||
> |
|||
<el-form |
|||
:model="formData" |
|||
label-width="120px" |
|||
ref="formRef" |
|||
:rules="formRules" |
|||
class="page-form" |
|||
v-loading="loading" |
|||
> |
|||
<el-form-item :label="t('title')" prop="title"> |
|||
<el-input |
|||
v-model="formData.title" |
|||
clearable |
|||
:placeholder="t('titlePlaceholder')" |
|||
class="input-width" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('image')" prop="image"> |
|||
<upload-image v-model="formData.image" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('type')" prop="type"> |
|||
<el-select |
|||
class="input-width" |
|||
v-model="formData.type" |
|||
clearable |
|||
:placeholder="t('typePlaceholder')" |
|||
> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in typeList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('content')" prop="content"> |
|||
<editor v-model="formData.content" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group |
|||
v-model="formData.status" |
|||
:placeholder="t('statusPlaceholder')" |
|||
> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.value" |
|||
> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<!-- <el-form-item :label="t('userPermission')" prop="user_permission">--> |
|||
<!-- <el-checkbox-group v-model="formData.user_permission" :placeholder="t('userPermissionPlaceholder')">--> |
|||
<!-- <el-checkbox--> |
|||
<!-- v-for="(item, index) in userPermissionList"--> |
|||
<!-- :key="index"--> |
|||
<!-- :label="item['sys_user_id']">--> |
|||
<!-- {{ item['name'] }}--> |
|||
<!-- </el-checkbox>--> |
|||
<!-- </el-checkbox-group>--> |
|||
<!-- </el-form-item>--> |
|||
</el-form> |
|||
|
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> |
|||
<el-button |
|||
type="primary" |
|||
:loading="loading" |
|||
@click="confirm(formRef)" |
|||
>{{ t('confirm') }}</el-button |
|||
> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import { t } from '@/lang' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { |
|||
addNinjaTeachingLibrary, |
|||
editNinjaTeachingLibrary, |
|||
getLessonCourseTeachingInfo, |
|||
getWithPersonnelDataList, |
|||
} from '@/app/api/lesson_course_teaching' |
|||
import { |
|||
addPublicLibraryList, |
|||
editPublicLibraryList, |
|||
} from '@/app/api/future_ontent' |
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
title: '', |
|||
image: '', |
|||
type: '', |
|||
content: '', |
|||
status: '', |
|||
table_type: 21, |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
title: [ |
|||
{ required: true, message: t('titlePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
image: [ |
|||
{ required: true, message: t('imagePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
type: [{ required: true, message: t('typePlaceholder'), trigger: 'blur' }], |
|||
content: [ |
|||
{ required: true, message: t('contentPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id ? editPublicLibraryList : addPublicLibraryList |
|||
|
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
|
|||
let data = formData |
|||
data.table_type = 21 |
|||
save(data) |
|||
.then((res) => { |
|||
loading.value = false |
|||
showDialog.value = false |
|||
emit('complete') |
|||
}) |
|||
.catch((err) => { |
|||
loading.value = false |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
|
|||
// 获取字典数据 |
|||
let typeList = ref([]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('material_type')).data.dictionary |
|||
} |
|||
typeDictList() |
|||
watch( |
|||
() => typeList.value, |
|||
() => { |
|||
formData.type = typeList.value[0].value |
|||
} |
|||
) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await ( |
|||
await useDictionary('course_status') |
|||
).data.dictionary |
|||
} |
|||
statusDictList() |
|||
watch( |
|||
() => statusList.value, |
|||
() => { |
|||
formData.status = statusList.value[0].value |
|||
} |
|||
) |
|||
|
|||
const userPermissionList = ref([] as any[]) |
|||
const setUserPermissionList = async () => { |
|||
userPermissionList.value = await (await getWithPersonnelDataList({})).data |
|||
} |
|||
setUserPermissionList() |
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if (row) { |
|||
const data = await (await getLessonCourseTeachingInfo(row.id)).data |
|||
if (data) |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
loading.value = false |
|||
} |
|||
|
|||
// 验证手机号格式 |
|||
const mobileVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/^1[3-9]\d{9}$/.test(value)) { |
|||
callback(new Error(t('generateMobile'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证身份证号 |
|||
const idCardVerify = (rule: any, value: any, callback: any) => { |
|||
if ( |
|||
value && |
|||
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test( |
|||
value |
|||
) |
|||
) { |
|||
callback(new Error(t('generateIdCard'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证邮箱号 |
|||
const emailVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) { |
|||
callback(new Error(t('generateEmail'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证请输入整数 |
|||
const numberVerify = (rule: any, value: any, callback: any) => { |
|||
if (!Number.isInteger(value)) { |
|||
callback(new Error(t('generateNumber'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
defineExpose({ |
|||
showDialog, |
|||
setFormData, |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
<style lang="scss"> |
|||
.diy-dialog-wrap .el-form-item__label { |
|||
height: auto !important; |
|||
} |
|||
</style> |
|||
@ -1,271 +0,0 @@ |
|||
<template> |
|||
<el-dialog |
|||
v-model="showDialog" |
|||
:title=" |
|||
formData.id |
|||
? t('editPhysicalTeachingLibrary') |
|||
: t('addPhysicalTeachingLibrary') |
|||
" |
|||
width="50%" |
|||
class="diy-dialog-wrap" |
|||
:destroy-on-close="true" |
|||
> |
|||
<el-form |
|||
:model="formData" |
|||
label-width="120px" |
|||
ref="formRef" |
|||
:rules="formRules" |
|||
class="page-form" |
|||
v-loading="loading" |
|||
> |
|||
<el-form-item :label="t('title')" prop="title"> |
|||
<el-input |
|||
v-model="formData.title" |
|||
clearable |
|||
:placeholder="t('titlePlaceholder')" |
|||
class="input-width" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('image')" prop="image"> |
|||
<upload-image v-model="formData.image" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('type')" prop="type"> |
|||
<el-select |
|||
class="input-width" |
|||
v-model="formData.type" |
|||
clearable |
|||
:placeholder="t('typePlaceholder')" |
|||
> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in typeList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('content')" prop="content"> |
|||
<editor v-model="formData.content" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group |
|||
v-model="formData.status" |
|||
:placeholder="t('statusPlaceholder')" |
|||
> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.value" |
|||
> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<!-- <el-form-item :label="t('userPermission')" prop="user_permission">--> |
|||
<!-- <el-checkbox-group v-model="formData.user_permission" :placeholder="t('userPermissionPlaceholder')">--> |
|||
<!-- <el-checkbox--> |
|||
<!-- v-for="(item, index) in userPermissionList"--> |
|||
<!-- :key="index"--> |
|||
<!-- :label="item['sys_user_id']">--> |
|||
<!-- {{ item['name'] }}--> |
|||
<!-- </el-checkbox>--> |
|||
<!-- </el-checkbox-group>--> |
|||
<!-- </el-form-item>--> |
|||
</el-form> |
|||
|
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> |
|||
<el-button |
|||
type="primary" |
|||
:loading="loading" |
|||
@click="confirm(formRef)" |
|||
>{{ t('confirm') }}</el-button |
|||
> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import { t } from '@/lang' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { |
|||
addPhysicalTeachingLibrary, |
|||
editPhysicalTeachingLibrary, |
|||
getLessonCourseTeachingInfo, |
|||
getWithPersonnelDataList, |
|||
} from '@/app/api/lesson_course_teaching' |
|||
|
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
title: '', |
|||
image: '', |
|||
type: '', |
|||
content: '', |
|||
status: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
title: [ |
|||
{ required: true, message: t('titlePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
image: [ |
|||
{ required: true, message: t('imagePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
type: [{ required: true, message: t('typePlaceholder'), trigger: 'blur' }], |
|||
content: [ |
|||
{ required: true, message: t('contentPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id |
|||
? editPhysicalTeachingLibrary |
|||
: addPhysicalTeachingLibrary |
|||
|
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
|
|||
let data = formData |
|||
|
|||
save(data) |
|||
.then((res) => { |
|||
loading.value = false |
|||
showDialog.value = false |
|||
emit('complete') |
|||
}) |
|||
.catch((err) => { |
|||
loading.value = false |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
|
|||
// 获取字典数据 |
|||
let typeList = ref([]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('material_type')).data.dictionary |
|||
} |
|||
typeDictList() |
|||
watch( |
|||
() => typeList.value, |
|||
() => { |
|||
formData.type = typeList.value[0].value |
|||
} |
|||
) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await ( |
|||
await useDictionary('course_status') |
|||
).data.dictionary |
|||
} |
|||
statusDictList() |
|||
watch( |
|||
() => statusList.value, |
|||
() => { |
|||
formData.status = statusList.value[0].value |
|||
} |
|||
) |
|||
|
|||
const userPermissionList = ref([] as any[]) |
|||
const setUserPermissionList = async () => { |
|||
userPermissionList.value = await (await getWithPersonnelDataList({})).data |
|||
} |
|||
setUserPermissionList() |
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if (row) { |
|||
const data = await (await getLessonCourseTeachingInfo(row.id)).data |
|||
if (data) |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
loading.value = false |
|||
} |
|||
|
|||
// 验证手机号格式 |
|||
const mobileVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/^1[3-9]\d{9}$/.test(value)) { |
|||
callback(new Error(t('generateMobile'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证身份证号 |
|||
const idCardVerify = (rule: any, value: any, callback: any) => { |
|||
if ( |
|||
value && |
|||
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test( |
|||
value |
|||
) |
|||
) { |
|||
callback(new Error(t('generateIdCard'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证邮箱号 |
|||
const emailVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) { |
|||
callback(new Error(t('generateEmail'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证请输入整数 |
|||
const numberVerify = (rule: any, value: any, callback: any) => { |
|||
if (!Number.isInteger(value)) { |
|||
callback(new Error(t('generateNumber'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
defineExpose({ |
|||
showDialog, |
|||
setFormData, |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
<style lang="scss"> |
|||
.diy-dialog-wrap .el-form-item__label { |
|||
height: auto !important; |
|||
} |
|||
</style> |
|||
@ -1,273 +0,0 @@ |
|||
<template> |
|||
<el-dialog |
|||
v-model="showDialog" |
|||
:title=" |
|||
formData.id |
|||
? t('editSecurityTeachingLibrary') |
|||
: t('addSecurityTeachingLibrary') |
|||
" |
|||
width="50%" |
|||
class="diy-dialog-wrap" |
|||
:destroy-on-close="true" |
|||
> |
|||
<el-form |
|||
:model="formData" |
|||
label-width="120px" |
|||
ref="formRef" |
|||
:rules="formRules" |
|||
class="page-form" |
|||
v-loading="loading" |
|||
> |
|||
<el-form-item :label="t('title')" prop="title"> |
|||
<el-input |
|||
v-model="formData.title" |
|||
clearable |
|||
:placeholder="t('titlePlaceholder')" |
|||
class="input-width" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('image')" prop="image"> |
|||
<upload-image v-model="formData.image" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('type')" prop="type"> |
|||
<el-select |
|||
class="input-width" |
|||
v-model="formData.type" |
|||
clearable |
|||
:placeholder="t('typePlaceholder')" |
|||
> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in typeList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('content')" prop="content"> |
|||
<editor v-model="formData.content" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group |
|||
v-model="formData.status" |
|||
:placeholder="t('statusPlaceholder')" |
|||
> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.value" |
|||
> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<!-- <el-form-item :label="t('userPermission')" prop="user_permission">--> |
|||
<!-- <el-checkbox-group v-model="formData.user_permission" :placeholder="t('userPermissionPlaceholder')">--> |
|||
<!-- <el-checkbox--> |
|||
<!-- v-for="(item, index) in userPermissionList"--> |
|||
<!-- :key="index"--> |
|||
<!-- :label="item['sys_user_id']">--> |
|||
<!-- {{ item['name'] }}--> |
|||
<!-- </el-checkbox>--> |
|||
<!-- </el-checkbox-group>--> |
|||
<!-- </el-form-item>--> |
|||
</el-form> |
|||
|
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> |
|||
<el-button |
|||
type="primary" |
|||
:loading="loading" |
|||
@click="confirm(formRef)" |
|||
>{{ t('confirm') }}</el-button |
|||
> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import { t } from '@/lang' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { |
|||
addSecurityTeachingLibrary, |
|||
editSecurityTeachingLibrary, |
|||
getLessonCourseTeachingInfo, |
|||
getWithPersonnelDataList, |
|||
} from '@/app/api/lesson_course_teaching' |
|||
import { |
|||
addPublicLibraryList, |
|||
editPublicLibraryList, |
|||
} from '@/app/api/future_ontent' |
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
title: '', |
|||
image: '', |
|||
type: '', |
|||
content: '', |
|||
status: '', |
|||
table_type: 22, |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
title: [ |
|||
{ required: true, message: t('titlePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
image: [ |
|||
{ required: true, message: t('imagePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
type: [{ required: true, message: t('typePlaceholder'), trigger: 'blur' }], |
|||
content: [ |
|||
{ required: true, message: t('contentPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id ? editPublicLibraryList : addPublicLibraryList |
|||
|
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
|
|||
let data = formData |
|||
data.table_type = 22 |
|||
save(data) |
|||
.then((res) => { |
|||
loading.value = false |
|||
showDialog.value = false |
|||
emit('complete') |
|||
}) |
|||
.catch((err) => { |
|||
loading.value = false |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
|
|||
// 获取字典数据 |
|||
let typeList = ref([]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('material_type')).data.dictionary |
|||
} |
|||
typeDictList() |
|||
watch( |
|||
() => typeList.value, |
|||
() => { |
|||
formData.type = typeList.value[0].value |
|||
} |
|||
) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await ( |
|||
await useDictionary('course_status') |
|||
).data.dictionary |
|||
} |
|||
statusDictList() |
|||
watch( |
|||
() => statusList.value, |
|||
() => { |
|||
formData.status = statusList.value[0].value |
|||
} |
|||
) |
|||
|
|||
const userPermissionList = ref([] as any[]) |
|||
const setUserPermissionList = async () => { |
|||
userPermissionList.value = await (await getWithPersonnelDataList({})).data |
|||
} |
|||
setUserPermissionList() |
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if (row) { |
|||
const data = await (await getLessonCourseTeachingInfo(row.id)).data |
|||
if (data) |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
loading.value = false |
|||
} |
|||
|
|||
// 验证手机号格式 |
|||
const mobileVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/^1[3-9]\d{9}$/.test(value)) { |
|||
callback(new Error(t('generateMobile'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证身份证号 |
|||
const idCardVerify = (rule: any, value: any, callback: any) => { |
|||
if ( |
|||
value && |
|||
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test( |
|||
value |
|||
) |
|||
) { |
|||
callback(new Error(t('generateIdCard'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证邮箱号 |
|||
const emailVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) { |
|||
callback(new Error(t('generateEmail'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证请输入整数 |
|||
const numberVerify = (rule: any, value: any, callback: any) => { |
|||
if (!Number.isInteger(value)) { |
|||
callback(new Error(t('generateNumber'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
defineExpose({ |
|||
showDialog, |
|||
setFormData, |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
<style lang="scss"> |
|||
.diy-dialog-wrap .el-form-item__label { |
|||
height: auto !important; |
|||
} |
|||
</style> |
|||
@ -1,273 +0,0 @@ |
|||
<template> |
|||
<el-dialog |
|||
v-model="showDialog" |
|||
:title=" |
|||
formData.id |
|||
? t('editStrengthenTeachingLibrary') |
|||
: t('addStrengthenTeachingLibrary') |
|||
" |
|||
width="50%" |
|||
class="diy-dialog-wrap" |
|||
:destroy-on-close="true" |
|||
> |
|||
<el-form |
|||
:model="formData" |
|||
label-width="120px" |
|||
ref="formRef" |
|||
:rules="formRules" |
|||
class="page-form" |
|||
v-loading="loading" |
|||
> |
|||
<el-form-item :label="t('title')" prop="title"> |
|||
<el-input |
|||
v-model="formData.title" |
|||
clearable |
|||
:placeholder="t('titlePlaceholder')" |
|||
class="input-width" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('image')" prop="image"> |
|||
<upload-image v-model="formData.image" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('type')" prop="type"> |
|||
<el-select |
|||
class="input-width" |
|||
v-model="formData.type" |
|||
clearable |
|||
:placeholder="t('typePlaceholder')" |
|||
> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in typeList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('content')" prop="content"> |
|||
<editor v-model="formData.content" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group |
|||
v-model="formData.status" |
|||
:placeholder="t('statusPlaceholder')" |
|||
> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.value" |
|||
> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<!-- <el-form-item :label="t('userPermission')" prop="user_permission">--> |
|||
<!-- <el-checkbox-group v-model="formData.user_permission" :placeholder="t('userPermissionPlaceholder')">--> |
|||
<!-- <el-checkbox--> |
|||
<!-- v-for="(item, index) in userPermissionList"--> |
|||
<!-- :key="index"--> |
|||
<!-- :label="item['sys_user_id']">--> |
|||
<!-- {{ item['name'] }}--> |
|||
<!-- </el-checkbox>--> |
|||
<!-- </el-checkbox-group>--> |
|||
<!-- </el-form-item>--> |
|||
</el-form> |
|||
|
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> |
|||
<el-button |
|||
type="primary" |
|||
:loading="loading" |
|||
@click="confirm(formRef)" |
|||
>{{ t('confirm') }}</el-button |
|||
> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import { t } from '@/lang' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { |
|||
addStrengTeachingLibrary, |
|||
editStrengTeachingLibrary, |
|||
getLessonCourseTeachingInfo, |
|||
getWithPersonnelDataList, |
|||
} from '@/app/api/lesson_course_teaching' |
|||
import { |
|||
addPublicLibraryList, |
|||
editPublicLibraryList, |
|||
} from '@/app/api/future_ontent' |
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
title: '', |
|||
image: '', |
|||
type: '', |
|||
content: '', |
|||
status: '', |
|||
table_type: 20, |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
title: [ |
|||
{ required: true, message: t('titlePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
image: [ |
|||
{ required: true, message: t('imagePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
type: [{ required: true, message: t('typePlaceholder'), trigger: 'blur' }], |
|||
content: [ |
|||
{ required: true, message: t('contentPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id ? editPublicLibraryList : addPublicLibraryList |
|||
|
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
|
|||
let data = formData |
|||
data.table_type = 20 |
|||
save(data) |
|||
.then((res) => { |
|||
loading.value = false |
|||
showDialog.value = false |
|||
emit('complete') |
|||
}) |
|||
.catch((err) => { |
|||
loading.value = false |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
|
|||
// 获取字典数据 |
|||
let typeList = ref([]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('material_type')).data.dictionary |
|||
} |
|||
typeDictList() |
|||
watch( |
|||
() => typeList.value, |
|||
() => { |
|||
formData.type = typeList.value[0].value |
|||
} |
|||
) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await ( |
|||
await useDictionary('course_status') |
|||
).data.dictionary |
|||
} |
|||
statusDictList() |
|||
watch( |
|||
() => statusList.value, |
|||
() => { |
|||
formData.status = statusList.value[0].value |
|||
} |
|||
) |
|||
|
|||
const userPermissionList = ref([] as any[]) |
|||
const setUserPermissionList = async () => { |
|||
userPermissionList.value = await (await getWithPersonnelDataList({})).data |
|||
} |
|||
setUserPermissionList() |
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if (row) { |
|||
const data = await (await getLessonCourseTeachingInfo(row.id)).data |
|||
if (data) |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
loading.value = false |
|||
} |
|||
|
|||
// 验证手机号格式 |
|||
const mobileVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/^1[3-9]\d{9}$/.test(value)) { |
|||
callback(new Error(t('generateMobile'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证身份证号 |
|||
const idCardVerify = (rule: any, value: any, callback: any) => { |
|||
if ( |
|||
value && |
|||
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test( |
|||
value |
|||
) |
|||
) { |
|||
callback(new Error(t('generateIdCard'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证邮箱号 |
|||
const emailVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) { |
|||
callback(new Error(t('generateEmail'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证请输入整数 |
|||
const numberVerify = (rule: any, value: any, callback: any) => { |
|||
if (!Number.isInteger(value)) { |
|||
callback(new Error(t('generateNumber'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
defineExpose({ |
|||
showDialog, |
|||
setFormData, |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
<style lang="scss"> |
|||
.diy-dialog-wrap .el-form-item__label { |
|||
height: auto !important; |
|||
} |
|||
</style> |
|||
File diff suppressed because it is too large
@ -1,271 +0,0 @@ |
|||
<template> |
|||
<el-dialog |
|||
v-model="showDialog" |
|||
:title=" |
|||
formData.id |
|||
? t('editPhysicalTeachingLibrary') |
|||
: t('addPhysicalTeachingLibrary') |
|||
" |
|||
width="50%" |
|||
class="diy-dialog-wrap" |
|||
:destroy-on-close="true" |
|||
> |
|||
<el-form |
|||
:model="formData" |
|||
label-width="120px" |
|||
ref="formRef" |
|||
:rules="formRules" |
|||
class="page-form" |
|||
v-loading="loading" |
|||
> |
|||
<el-form-item :label="t('title')" prop="title"> |
|||
<el-input |
|||
v-model="formData.title" |
|||
clearable |
|||
:placeholder="t('titlePlaceholder')" |
|||
class="input-width" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('image')" prop="image"> |
|||
<upload-image v-model="formData.image" /> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('type')" prop="type"> |
|||
<el-select |
|||
class="input-width" |
|||
v-model="formData.type" |
|||
clearable |
|||
:placeholder="t('typePlaceholder')" |
|||
> |
|||
<el-option label="请选择" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in typeList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('content')" prop="content"> |
|||
<editor v-model="formData.content" /> |
|||
</el-form-item> |
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-radio-group |
|||
v-model="formData.status" |
|||
:placeholder="t('statusPlaceholder')" |
|||
> |
|||
<el-radio |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.value" |
|||
> |
|||
{{ item.name }} |
|||
</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
|
|||
<!-- <el-form-item :label="t('userPermission')" prop="user_permission">--> |
|||
<!-- <el-checkbox-group v-model="formData.user_permission" :placeholder="t('userPermissionPlaceholder')">--> |
|||
<!-- <el-checkbox--> |
|||
<!-- v-for="(item, index) in userPermissionList"--> |
|||
<!-- :key="index"--> |
|||
<!-- :label="item['sys_user_id']">--> |
|||
<!-- {{ item['name'] }}--> |
|||
<!-- </el-checkbox>--> |
|||
<!-- </el-checkbox-group>--> |
|||
<!-- </el-form-item>--> |
|||
</el-form> |
|||
|
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="showDialog = false">{{ t('cancel') }}</el-button> |
|||
<el-button |
|||
type="primary" |
|||
:loading="loading" |
|||
@click="confirm(formRef)" |
|||
>{{ t('confirm') }}</el-button |
|||
> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive, computed, watch } from 'vue' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import { t } from '@/lang' |
|||
import type { FormInstance } from 'element-plus' |
|||
import { |
|||
addPhysicalTeachingLibrary, |
|||
editPhysicalTeachingLibrary, |
|||
getLessonCourseTeachingInfo, |
|||
getWithPersonnelDataList, |
|||
} from '@/app/api/lesson_course_teaching' |
|||
|
|||
let showDialog = ref(false) |
|||
const loading = ref(false) |
|||
|
|||
/** |
|||
* 表单数据 |
|||
*/ |
|||
const initialFormData = { |
|||
id: '', |
|||
title: '', |
|||
image: '', |
|||
type: '', |
|||
content: '', |
|||
status: '', |
|||
} |
|||
const formData: Record<string, any> = reactive({ ...initialFormData }) |
|||
|
|||
const formRef = ref<FormInstance>() |
|||
|
|||
// 表单验证规则 |
|||
const formRules = computed(() => { |
|||
return { |
|||
title: [ |
|||
{ required: true, message: t('titlePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
image: [ |
|||
{ required: true, message: t('imagePlaceholder'), trigger: 'blur' }, |
|||
], |
|||
type: [{ required: true, message: t('typePlaceholder'), trigger: 'blur' }], |
|||
content: [ |
|||
{ required: true, message: t('contentPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
status: [ |
|||
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, |
|||
], |
|||
} |
|||
}) |
|||
|
|||
const emit = defineEmits(['complete']) |
|||
|
|||
/** |
|||
* 确认 |
|||
* @param formEl |
|||
*/ |
|||
const confirm = async (formEl: FormInstance | undefined) => { |
|||
if (loading.value || !formEl) return |
|||
let save = formData.id |
|||
? editPhysicalTeachingLibrary |
|||
: addPhysicalTeachingLibrary |
|||
|
|||
await formEl.validate(async (valid) => { |
|||
if (valid) { |
|||
loading.value = true |
|||
|
|||
let data = formData |
|||
|
|||
save(data) |
|||
.then((res) => { |
|||
loading.value = false |
|||
showDialog.value = false |
|||
emit('complete') |
|||
}) |
|||
.catch((err) => { |
|||
loading.value = false |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
|
|||
// 获取字典数据 |
|||
let typeList = ref([]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('material_type')).data.dictionary |
|||
} |
|||
typeDictList() |
|||
watch( |
|||
() => typeList.value, |
|||
() => { |
|||
formData.type = typeList.value[0].value |
|||
} |
|||
) |
|||
let statusList = ref([]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await ( |
|||
await useDictionary('course_status') |
|||
).data.dictionary |
|||
} |
|||
statusDictList() |
|||
watch( |
|||
() => statusList.value, |
|||
() => { |
|||
formData.status = statusList.value[0].value |
|||
} |
|||
) |
|||
|
|||
const userPermissionList = ref([] as any[]) |
|||
const setUserPermissionList = async () => { |
|||
userPermissionList.value = await (await getWithPersonnelDataList({})).data |
|||
} |
|||
setUserPermissionList() |
|||
const setFormData = async (row: any = null) => { |
|||
Object.assign(formData, initialFormData) |
|||
loading.value = true |
|||
if (row) { |
|||
const data = await (await getLessonCourseTeachingInfo(row.id)).data |
|||
if (data) |
|||
Object.keys(formData).forEach((key: string) => { |
|||
if (data[key] != undefined) formData[key] = data[key] |
|||
}) |
|||
} |
|||
loading.value = false |
|||
} |
|||
|
|||
// 验证手机号格式 |
|||
const mobileVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/^1[3-9]\d{9}$/.test(value)) { |
|||
callback(new Error(t('generateMobile'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证身份证号 |
|||
const idCardVerify = (rule: any, value: any, callback: any) => { |
|||
if ( |
|||
value && |
|||
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test( |
|||
value |
|||
) |
|||
) { |
|||
callback(new Error(t('generateIdCard'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证邮箱号 |
|||
const emailVerify = (rule: any, value: any, callback: any) => { |
|||
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) { |
|||
callback(new Error(t('generateEmail'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
// 验证请输入整数 |
|||
const numberVerify = (rule: any, value: any, callback: any) => { |
|||
if (!Number.isInteger(value)) { |
|||
callback(new Error(t('generateNumber'))) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
|
|||
defineExpose({ |
|||
showDialog, |
|||
setFormData, |
|||
}) |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
<style lang="scss"> |
|||
.diy-dialog-wrap .el-form-item__label { |
|||
height: auto !important; |
|||
} |
|||
</style> |
|||
@ -1,789 +0,0 @@ |
|||
<template> |
|||
<div class="main-container"> |
|||
<el-card class="box-card !border-none" shadow="never"> |
|||
<el-tabs v-model="active"> |
|||
<el-tab-pane label="训练内容" name="CourseSyllabus"> |
|||
<div class="flex justify-between items-center"> |
|||
<el-button type="primary" @click="addEvent"> |
|||
{{ t('addLessonCourseTeaching') }} |
|||
</el-button> |
|||
</div> |
|||
<el-card |
|||
class="box-card !border-none my-[10px] table-search-wrap" |
|||
shadow="never" |
|||
> |
|||
<el-form |
|||
:inline="true" |
|||
:model="lessonCourseTeachingTable.searchParam" |
|||
ref="searchFormRef" |
|||
> |
|||
<el-form-item :label="t('title')" prop="title"> |
|||
<el-input |
|||
v-model="lessonCourseTeachingTable.searchParam.title" |
|||
:placeholder="t('titlePlaceholder')" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-select |
|||
class="w-[280px]" |
|||
v-model="lessonCourseTeachingTable.searchParam.status" |
|||
clearable |
|||
:placeholder="t('statusPlaceholder')" |
|||
> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('createTime')" prop="create_time"> |
|||
<el-date-picker |
|||
v-model="lessonCourseTeachingTable.searchParam.create_time" |
|||
type="datetimerange" |
|||
format="YYYY-MM-DD hh:mm:ss" |
|||
:start-placeholder="t('startDate')" |
|||
:end-placeholder="t('endDate')" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('updateTime')" prop="update_time"> |
|||
<el-date-picker |
|||
v-model="lessonCourseTeachingTable.searchParam.update_time" |
|||
type="datetimerange" |
|||
format="YYYY-MM-DD hh:mm:ss" |
|||
:start-placeholder="t('startDate')" |
|||
:end-placeholder="t('endDate')" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item> |
|||
<el-button |
|||
type="primary" |
|||
@click="loadLessonCourseTeachingList()" |
|||
>{{ t('search') }}</el-button |
|||
> |
|||
<el-button @click="resetForm(searchFormRef, 13)">{{ |
|||
t('reset') |
|||
}}</el-button> |
|||
</el-form-item> |
|||
</el-form> |
|||
</el-card> |
|||
|
|||
<div class="mt-[10px]"> |
|||
<el-table |
|||
:data="lessonCourseTeachingTable.data" |
|||
size="large" |
|||
v-loading="lessonCourseTeachingTable.loading" |
|||
> |
|||
<template #empty> |
|||
<span>{{ |
|||
!lessonCourseTeachingTable.loading ? t('emptyData') : '' |
|||
}}</span> |
|||
</template> |
|||
<el-table-column |
|||
prop="title" |
|||
:label="t('title')" |
|||
min-width="120" |
|||
:show-overflow-tooltip="true" |
|||
/> |
|||
|
|||
<el-table-column :label="t('image')" width="100" align="left"> |
|||
<template #default="{ row }"> |
|||
<el-avatar v-if="row.image" :src="img(row.image)" /> |
|||
<el-avatar v-else icon="UserFilled" /> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column |
|||
:label="t('type')" |
|||
min-width="180" |
|||
align="center" |
|||
:show-overflow-tooltip="true" |
|||
> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in typeList"> |
|||
<div v-if="item.value == row.type">{{ item.name }}</div> |
|||
</div> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
<el-table-column |
|||
:label="t('status')" |
|||
min-width="180" |
|||
align="center" |
|||
:show-overflow-tooltip="true" |
|||
> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in statusList"> |
|||
<div v-if="item.value == row.status">{{ item.name }}</div> |
|||
</div> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
<el-table-column |
|||
:label="t('operation')" |
|||
fixed="right" |
|||
min-width="120" |
|||
> |
|||
<template #default="{ row }"> |
|||
<el-button type="primary" link @click="editEvent(row)">{{ |
|||
t('edit') |
|||
}}</el-button> |
|||
<el-button |
|||
type="primary" |
|||
link |
|||
@click="deleteEvent(row.id, 13)" |
|||
>{{ t('delete') }}</el-button |
|||
> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<div class="mt-[16px] flex justify-end"> |
|||
<el-pagination |
|||
v-model:current-page="lessonCourseTeachingTable.page" |
|||
v-model:page-size="lessonCourseTeachingTable.limit" |
|||
layout="total, sizes, prev, pager, next, jumper" |
|||
:total="lessonCourseTeachingTable.total" |
|||
@size-change="loadLessonCourseTeachingList()" |
|||
@current-change="loadLessonCourseTeachingList" |
|||
/> |
|||
</div> |
|||
</div> |
|||
|
|||
<edit |
|||
ref="editLessonCourseTeachingDialog" |
|||
@complete="loadLessonCourseTeachingList" |
|||
/> |
|||
</el-tab-pane> |
|||
<el-tab-pane label="训练视频" name="JumpLessonLibrary"> |
|||
<div class="flex justify-between items-center"> |
|||
<el-button type="primary" @click="addJumpLessonLibrary"> |
|||
{{ t('addJumpLessonLibrary') }} |
|||
</el-button> |
|||
</div> |
|||
<el-card |
|||
class="box-card !border-none my-[10px] table-search-wrap" |
|||
shadow="never" |
|||
> |
|||
<el-form |
|||
:inline="true" |
|||
:model="JumpLessonLibraryTable.searchParam" |
|||
ref="searchFormRef" |
|||
> |
|||
<el-form-item :label="t('title')" prop="title"> |
|||
<el-input |
|||
v-model="JumpLessonLibraryTable.searchParam.title" |
|||
:placeholder="t('titlePlaceholder')" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-select |
|||
class="w-[280px]" |
|||
v-model="JumpLessonLibraryTable.searchParam.status" |
|||
clearable |
|||
:placeholder="t('statusPlaceholder')" |
|||
> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('createTime')" prop="create_time"> |
|||
<el-date-picker |
|||
v-model="JumpLessonLibraryTable.searchParam.create_time" |
|||
type="datetimerange" |
|||
format="YYYY-MM-DD hh:mm:ss" |
|||
:start-placeholder="t('startDate')" |
|||
:end-placeholder="t('endDate')" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('updateTime')" prop="update_time"> |
|||
<el-date-picker |
|||
v-model="JumpLessonLibraryTable.searchParam.update_time" |
|||
type="datetimerange" |
|||
format="YYYY-MM-DD hh:mm:ss" |
|||
:start-placeholder="t('startDate')" |
|||
:end-placeholder="t('endDate')" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item> |
|||
<el-button |
|||
type="primary" |
|||
@click="loadJumpLessonLibraryList()" |
|||
>{{ t('search') }}</el-button |
|||
> |
|||
<el-button @click="resetForm(searchFormRef, 14)">{{ |
|||
t('reset') |
|||
}}</el-button> |
|||
</el-form-item> |
|||
</el-form> |
|||
</el-card> |
|||
|
|||
<div class="mt-[10px]"> |
|||
<el-table |
|||
:data="JumpLessonLibraryTable.data" |
|||
size="large" |
|||
v-loading="JumpLessonLibraryTable.loading" |
|||
> |
|||
<template #empty> |
|||
<span>{{ |
|||
!JumpLessonLibraryTable.loading ? t('emptyData') : '' |
|||
}}</span> |
|||
</template> |
|||
<el-table-column |
|||
prop="title" |
|||
:label="t('title')" |
|||
min-width="120" |
|||
:show-overflow-tooltip="true" |
|||
/> |
|||
|
|||
<el-table-column :label="t('image')" width="100" align="left"> |
|||
<template #default="{ row }"> |
|||
<el-avatar v-if="row.image" :src="img(row.image)" /> |
|||
<el-avatar v-else icon="UserFilled" /> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column |
|||
:label="t('type')" |
|||
min-width="180" |
|||
align="center" |
|||
:show-overflow-tooltip="true" |
|||
> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in typeList"> |
|||
<div v-if="item.value == row.type">{{ item.name }}</div> |
|||
</div> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
<el-table-column |
|||
:label="t('status')" |
|||
min-width="180" |
|||
align="center" |
|||
:show-overflow-tooltip="true" |
|||
> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in statusList"> |
|||
<div v-if="item.value == row.status">{{ item.name }}</div> |
|||
</div> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
<el-table-column |
|||
:label="t('operation')" |
|||
fixed="right" |
|||
min-width="120" |
|||
> |
|||
<template #default="{ row }"> |
|||
<el-button |
|||
type="primary" |
|||
link |
|||
@click="editJumpLessonLibrary(row)" |
|||
>{{ t('edit') }}</el-button |
|||
> |
|||
<el-button |
|||
type="primary" |
|||
link |
|||
@click="deleteEvent(row.id, 14)" |
|||
>{{ t('delete') }}</el-button |
|||
> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<div class="mt-[16px] flex justify-end"> |
|||
<el-pagination |
|||
v-model:current-page="JumpLessonLibraryTable.page" |
|||
v-model:page-size="JumpLessonLibraryTable.limit" |
|||
layout="total, sizes, prev, pager, next, jumper" |
|||
:total="JumpLessonLibraryTable.total" |
|||
@size-change="loadJumpLessonLibraryList()" |
|||
@current-change="loadJumpLessonLibraryList" |
|||
/> |
|||
</div> |
|||
</div> |
|||
|
|||
<edit-jump |
|||
ref="editJumpLessonLibraryDialog" |
|||
@complete="loadJumpLessonLibraryList" |
|||
/> |
|||
</el-tab-pane> |
|||
<el-tab-pane label="课后作业" name="EnTeachingLibrary"> |
|||
<div class="flex justify-between items-center"> |
|||
<el-button type="primary" @click="addEnTeachingLibrary"> |
|||
{{ t('addEnTeachingLibrary') }} |
|||
</el-button> |
|||
</div> |
|||
<el-card |
|||
class="box-card !border-none my-[10px] table-search-wrap" |
|||
shadow="never" |
|||
> |
|||
<el-form |
|||
:inline="true" |
|||
:model="EnTeachingLibraryTable.searchParam" |
|||
ref="searchFormRef" |
|||
> |
|||
<el-form-item :label="t('title')" prop="title"> |
|||
<el-input |
|||
v-model="EnTeachingLibraryTable.searchParam.title" |
|||
:placeholder="t('titlePlaceholder')" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('status')" prop="status"> |
|||
<el-select |
|||
class="w-[280px]" |
|||
v-model="EnTeachingLibraryTable.searchParam.status" |
|||
clearable |
|||
:placeholder="t('statusPlaceholder')" |
|||
> |
|||
<el-option label="全部" value=""></el-option> |
|||
<el-option |
|||
v-for="(item, index) in statusList" |
|||
:key="index" |
|||
:label="item.name" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('createTime')" prop="create_time"> |
|||
<el-date-picker |
|||
v-model="EnTeachingLibraryTable.searchParam.create_time" |
|||
type="datetimerange" |
|||
format="YYYY-MM-DD hh:mm:ss" |
|||
:start-placeholder="t('startDate')" |
|||
:end-placeholder="t('endDate')" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item :label="t('updateTime')" prop="update_time"> |
|||
<el-date-picker |
|||
v-model="EnTeachingLibraryTable.searchParam.update_time" |
|||
type="datetimerange" |
|||
format="YYYY-MM-DD hh:mm:ss" |
|||
:start-placeholder="t('startDate')" |
|||
:end-placeholder="t('endDate')" |
|||
/> |
|||
</el-form-item> |
|||
|
|||
<el-form-item> |
|||
<el-button |
|||
type="primary" |
|||
@click="loadEnTeachingLibraryList()" |
|||
>{{ t('search') }}</el-button |
|||
> |
|||
<el-button @click="resetForm(searchFormRef, 15)">{{ |
|||
t('reset') |
|||
}}</el-button> |
|||
</el-form-item> |
|||
</el-form> |
|||
</el-card> |
|||
|
|||
<div class="mt-[10px]"> |
|||
<el-table |
|||
:data="EnTeachingLibraryTable.data" |
|||
size="large" |
|||
v-loading="EnTeachingLibraryTable.loading" |
|||
> |
|||
<template #empty> |
|||
<span>{{ |
|||
!EnTeachingLibraryTable.loading ? t('emptyData') : '' |
|||
}}</span> |
|||
</template> |
|||
<el-table-column |
|||
prop="title" |
|||
:label="t('title')" |
|||
min-width="120" |
|||
:show-overflow-tooltip="true" |
|||
/> |
|||
|
|||
<el-table-column :label="t('image')" width="100" align="left"> |
|||
<template #default="{ row }"> |
|||
<el-avatar v-if="row.image" :src="img(row.image)" /> |
|||
<el-avatar v-else icon="UserFilled" /> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column |
|||
:label="t('type')" |
|||
min-width="180" |
|||
align="center" |
|||
:show-overflow-tooltip="true" |
|||
> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in typeList"> |
|||
<div v-if="item.value == row.type">{{ item.name }}</div> |
|||
</div> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
<el-table-column |
|||
:label="t('status')" |
|||
min-width="180" |
|||
align="center" |
|||
:show-overflow-tooltip="true" |
|||
> |
|||
<template #default="{ row }"> |
|||
<div v-for="(item, index) in statusList"> |
|||
<div v-if="item.value == row.status">{{ item.name }}</div> |
|||
</div> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
<el-table-column |
|||
:label="t('operation')" |
|||
fixed="right" |
|||
min-width="120" |
|||
> |
|||
<template #default="{ row }"> |
|||
<el-button |
|||
type="primary" |
|||
link |
|||
@click="editEnTeachingLibrary(row)" |
|||
>{{ t('edit') }}</el-button |
|||
> |
|||
<el-button |
|||
type="primary" |
|||
link |
|||
@click="deleteEvent(row.id, 15)" |
|||
>{{ t('delete') }}</el-button |
|||
> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<div class="mt-[16px] flex justify-end"> |
|||
<el-pagination |
|||
v-model:current-page="EnTeachingLibraryTable.page" |
|||
v-model:page-size="EnTeachingLibraryTable.limit" |
|||
layout="total, sizes, prev, pager, next, jumper" |
|||
:total="EnTeachingLibraryTable.total" |
|||
@size-change="loadEnTeachingLibraryList()" |
|||
@current-change="loadEnTeachingLibraryList" |
|||
/> |
|||
</div> |
|||
</div> |
|||
|
|||
<edit-en |
|||
ref="editEnTeachingLibraryDialog" |
|||
@complete="loadEnTeachingLibraryList" |
|||
/> |
|||
</el-tab-pane> |
|||
</el-tabs> |
|||
</el-card> |
|||
</div> |
|||
</template> |
|||
|
|||
addPublicLibraryList editPublicLibraryList |
|||
|
|||
<script lang="ts" setup> |
|||
import { reactive, ref, watch } from 'vue' |
|||
import { t } from '@/lang' |
|||
import { useDictionary } from '@/app/api/dict' |
|||
import { |
|||
getLessonCourseTeachingList, |
|||
deleteLessonCourseTeaching, |
|||
getWithPersonnelDataList, |
|||
} from '@/app/api/lesson_course_teaching' |
|||
import { getPublicLibraryList } from '@/app/api/future_ontent' |
|||
import { img } from '@/utils/common' |
|||
import { ElMessageBox, FormInstance } from 'element-plus' |
|||
import Edit from '@/app/views/future_ontent/components/lesson-course-teaching-edit.vue' |
|||
import EditJump from '@/app/views/future_ontent/components/Jump-lesson-library-edit.vue' |
|||
import EditEn from '@/app/views/future_ontent/components/en-course-teaching-edit.vue' |
|||
import { useRoute } from 'vue-router' |
|||
const route = useRoute() |
|||
const pageName = route.meta.title |
|||
const active = 'CourseSyllabus' |
|||
|
|||
let lessonCourseTeachingTable = reactive({ |
|||
page: 1, |
|||
limit: 10, |
|||
total: 0, |
|||
loading: true, |
|||
data: [], |
|||
searchParam: { |
|||
title: '', |
|||
status: '', |
|||
create_time: [], |
|||
update_time: [], |
|||
table_type: 13, |
|||
}, |
|||
}) |
|||
let JumpLessonLibraryTable = reactive({ |
|||
page: 1, |
|||
limit: 10, |
|||
total: 0, |
|||
loading: true, |
|||
data: [], |
|||
searchParam: { |
|||
title: '', |
|||
status: '', |
|||
create_time: [], |
|||
update_time: [], |
|||
table_type: 14, |
|||
}, |
|||
}) |
|||
let EnTeachingLibraryTable = reactive({ |
|||
page: 1, |
|||
limit: 10, |
|||
total: 0, |
|||
loading: true, |
|||
data: [], |
|||
searchParam: { |
|||
title: '', |
|||
status: '', |
|||
create_time: [], |
|||
update_time: [], |
|||
table_type: 15, |
|||
}, |
|||
}) |
|||
|
|||
const searchFormRef = ref<FormInstance>() |
|||
|
|||
// 选中数据 |
|||
const selectData = ref<any[]>([]) |
|||
|
|||
// 字典数据 |
|||
const typeList = ref([] as any[]) |
|||
const typeDictList = async () => { |
|||
typeList.value = await (await useDictionary('material_type')).data.dictionary |
|||
} |
|||
typeDictList() |
|||
const statusList = ref([] as any[]) |
|||
const statusDictList = async () => { |
|||
statusList.value = await ( |
|||
await useDictionary('course_status') |
|||
).data.dictionary |
|||
} |
|||
statusDictList() |
|||
|
|||
const editLessonCourseTeachingDialog: Record<string, any> | null = ref(null) |
|||
const editJumpLessonLibraryDialog: Record<string, any> | null = ref(null) |
|||
const editEnTeachingLibraryDialog: Record<string, any> | null = ref(null) |
|||
|
|||
/** |
|||
* 获取课程教学大纲列表 |
|||
*/ |
|||
const loadLessonCourseTeachingList = (page: number = 1) => { |
|||
lessonCourseTeachingTable.loading = true |
|||
lessonCourseTeachingTable.page = page |
|||
|
|||
getPublicLibraryList({ |
|||
page: lessonCourseTeachingTable.page, |
|||
limit: lessonCourseTeachingTable.limit, |
|||
...lessonCourseTeachingTable.searchParam, |
|||
}) |
|||
.then((res) => { |
|||
lessonCourseTeachingTable.loading = false |
|||
lessonCourseTeachingTable.data = res.data.data |
|||
lessonCourseTeachingTable.total = res.data.total |
|||
}) |
|||
.catch(() => { |
|||
lessonCourseTeachingTable.loading = false |
|||
}) |
|||
} |
|||
loadLessonCourseTeachingList() |
|||
|
|||
/** |
|||
* 添加课程教学大纲 |
|||
*/ |
|||
const addEvent = () => { |
|||
editLessonCourseTeachingDialog.value.setFormData() |
|||
editLessonCourseTeachingDialog.value.showDialog = true |
|||
} |
|||
|
|||
/** |
|||
* 编辑课程教学大纲 |
|||
* @param data |
|||
*/ |
|||
const editEvent = (data: any) => { |
|||
editLessonCourseTeachingDialog.value.setFormData(data) |
|||
editLessonCourseTeachingDialog.value.showDialog = true |
|||
} |
|||
|
|||
/** |
|||
* 获取跳绳教案库列表 |
|||
*/ |
|||
const loadJumpLessonLibraryList = (page: number = 1) => { |
|||
JumpLessonLibraryTable.loading = true |
|||
JumpLessonLibraryTable.page = page |
|||
|
|||
getPublicLibraryList({ |
|||
page: JumpLessonLibraryTable.page, |
|||
limit: JumpLessonLibraryTable.limit, |
|||
...JumpLessonLibraryTable.searchParam, |
|||
}) |
|||
.then((res) => { |
|||
JumpLessonLibraryTable.loading = false |
|||
JumpLessonLibraryTable.data = res.data.data |
|||
JumpLessonLibraryTable.total = res.data.total |
|||
}) |
|||
.catch(() => { |
|||
JumpLessonLibraryTable.loading = false |
|||
}) |
|||
} |
|||
loadJumpLessonLibraryList() |
|||
|
|||
/** |
|||
* 添加跳绳教案库 |
|||
*/ |
|||
const addJumpLessonLibrary = () => { |
|||
editJumpLessonLibraryDialog.value.setFormData() |
|||
editJumpLessonLibraryDialog.value.showDialog = true |
|||
} |
|||
|
|||
/** |
|||
* 编辑跳绳教案库 |
|||
* @param data |
|||
*/ |
|||
const editJumpLessonLibrary = (data: any) => { |
|||
editJumpLessonLibraryDialog.value.setFormData(data) |
|||
editJumpLessonLibraryDialog.value.showDialog = true |
|||
} |
|||
|
|||
/** |
|||
* 获取增高教案库列表 |
|||
*/ |
|||
const loadEnTeachingLibraryList = (page: number = 1) => { |
|||
EnTeachingLibraryTable.loading = true |
|||
EnTeachingLibraryTable.page = page |
|||
|
|||
getPublicLibraryList({ |
|||
page: EnTeachingLibraryTable.page, |
|||
limit: EnTeachingLibraryTable.limit, |
|||
...EnTeachingLibraryTable.searchParam, |
|||
}) |
|||
.then((res) => { |
|||
EnTeachingLibraryTable.loading = false |
|||
EnTeachingLibraryTable.data = res.data.data |
|||
EnTeachingLibraryTable.total = res.data.total |
|||
}) |
|||
.catch(() => { |
|||
EnTeachingLibraryTable.loading = false |
|||
}) |
|||
} |
|||
loadEnTeachingLibraryList() |
|||
|
|||
/** |
|||
* 添加增高教案库 |
|||
*/ |
|||
const addEnTeachingLibrary = () => { |
|||
editEnTeachingLibraryDialog.value.setFormData() |
|||
editEnTeachingLibraryDialog.value.showDialog = true |
|||
} |
|||
|
|||
/** |
|||
* 编辑增高教案库 |
|||
* @param data |
|||
*/ |
|||
const editEnTeachingLibrary = (data: any) => { |
|||
editEnTeachingLibraryDialog.value.setFormData(data) |
|||
editEnTeachingLibraryDialog.value.showDialog = true |
|||
} |
|||
|
|||
/** |
|||
* 删除教研管理 |
|||
*/ |
|||
const deleteEvent = (id: number, type: number) => { |
|||
ElMessageBox.confirm(t('lessonCourseTeachingDeleteTips'), t('warning'), { |
|||
confirmButtonText: t('confirm'), |
|||
cancelButtonText: t('cancel'), |
|||
type: 'warning', |
|||
}).then(() => { |
|||
deleteLessonCourseTeaching(id) |
|||
.then(() => { |
|||
if (type === 13) { |
|||
loadLessonCourseTeachingList() |
|||
} else if (type === 14) { |
|||
loadJumpLessonLibraryList() |
|||
} else if (type === 15) { |
|||
loadEnTeachingLibraryList() |
|||
} |
|||
}) |
|||
.catch(() => {}) |
|||
}) |
|||
} |
|||
|
|||
const userPermissionList = ref([]) |
|||
const setUserPermissionList = async () => { |
|||
userPermissionList.value = await (await getWithPersonnelDataList({})).data |
|||
} |
|||
setUserPermissionList() |
|||
|
|||
const resetForm = (formEl: FormInstance | undefined, type: number) => { |
|||
if (!formEl) return |
|||
formEl.resetFields() |
|||
if (type === 13) { |
|||
lessonCourseTeachingTable = reactive({ |
|||
page: 1, |
|||
limit: 10, |
|||
total: 0, |
|||
loading: true, |
|||
data: [], |
|||
searchParam: { |
|||
title: '', |
|||
status: '', |
|||
create_time: [], |
|||
update_time: [], |
|||
table_type: 13, |
|||
}, |
|||
}) |
|||
loadLessonCourseTeachingList() |
|||
} else if (type === 14) { |
|||
JumpLessonLibraryTable = reactive({ |
|||
page: 1, |
|||
limit: 10, |
|||
total: 0, |
|||
loading: true, |
|||
data: [], |
|||
searchParam: { |
|||
title: '', |
|||
status: '', |
|||
create_time: [], |
|||
update_time: [], |
|||
table_type: 14, |
|||
}, |
|||
}) |
|||
loadJumpLessonLibraryList() |
|||
} else if (type === 15) { |
|||
EnTeachingLibraryTable = reactive({ |
|||
page: 1, |
|||
limit: 10, |
|||
total: 0, |
|||
loading: true, |
|||
data: [], |
|||
searchParam: { |
|||
title: '', |
|||
status: '', |
|||
create_time: [], |
|||
update_time: [], |
|||
table_type: 15, |
|||
}, |
|||
}) |
|||
loadEnTeachingLibraryList() |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
/* 多行超出隐藏 */ |
|||
.multi-hidden { |
|||
word-break: break-all; |
|||
text-overflow: ellipsis; |
|||
overflow: hidden; |
|||
display: -webkit-box; |
|||
-webkit-line-clamp: 2; |
|||
-webkit-box-orient: vertical; |
|||
} |
|||
</style> |
|||
@ -0,0 +1,188 @@ |
|||
<template> |
|||
<div class="main-container"> |
|||
<!-- 实时概况 --> |
|||
<el-card shadow="never" class="!border-none"> |
|||
|
|||
<template #header> |
|||
<span class="text-lg font-extrabold mr-[10px]">统计概括</span> |
|||
<span class="text-sm text-[#a19f98]">查看校区、员工、资源和学员的实时数据</span> |
|||
</template> |
|||
|
|||
<el-row :gutter="20"> |
|||
<el-col :span="6"> |
|||
<div class="text-sm text-[#a19f98] leading-8 "> |
|||
<el-statistic :value="info.campus_count"> |
|||
<template #title> |
|||
<div style="display: inline-flex; align-items: center"> |
|||
<span class="mr-[5px]">校区数量</span> |
|||
</div> |
|||
</template> |
|||
</el-statistic> |
|||
<div class="text-sm text-[#a19f98] leading-8"> |
|||
|
|||
</div> |
|||
</div> |
|||
</el-col> |
|||
|
|||
<el-col :span="6"> |
|||
<div class="text-sm text-[#a19f98] leading-8 "> |
|||
<el-statistic :value="info.personnel_count"> |
|||
<template #title> |
|||
<div style="display: inline-flex; align-items: center"> |
|||
<span class="mr-[5px]">员工数量</span> |
|||
</div> |
|||
</template> |
|||
</el-statistic> |
|||
|
|||
<div class="text-sm text-[#a19f98] leading-8"> |
|||
|
|||
</div> |
|||
</div> |
|||
</el-col> |
|||
|
|||
<el-col :span="6"> |
|||
<div class="text-sm text-[#a19f98] leading-8 "> |
|||
<el-statistic :value="info.customerResources_count"> |
|||
<template #title> |
|||
<div style="display: inline-flex; align-items: center"> |
|||
<span class="mr-[5px]">资源数量</span> |
|||
</div> |
|||
</template> |
|||
</el-statistic> |
|||
|
|||
<div class="text-sm text-[#a19f98] leading-8"> |
|||
<span>昨日新增</span> |
|||
<span>{{info.customerResources_day_count}}</span> |
|||
</div> |
|||
</div> |
|||
</el-col> |
|||
|
|||
<el-col :span="6"> |
|||
<div class="text-sm text-[#a19f98] leading-8 "> |
|||
<el-statistic :value="info.student_count"> |
|||
<template #title> |
|||
<div style="display: inline-flex; align-items: center"> |
|||
<span class="mr-[5px]">学员数量</span> |
|||
</div> |
|||
</template> |
|||
</el-statistic> |
|||
<div class="text-sm text-[#a19f98] leading-8"> |
|||
<span>昨日新增</span> |
|||
<span>{{info.student_day_count}}</span> |
|||
</div> |
|||
</div> |
|||
</el-col> |
|||
|
|||
|
|||
</el-row> |
|||
|
|||
|
|||
</el-card> |
|||
<!-- 实时概况 end --> |
|||
|
|||
|
|||
<el-row :gutter="15" class="mt-[15px]"> |
|||
<el-col :span="24"> |
|||
<el-card shadow="never" class="!border-none"> |
|||
<template #header> |
|||
<span class="text-lg font-extrabold">资源增长趋势</span> |
|||
</template> |
|||
<div > |
|||
<el-button :type="activeRange === 'week' ? 'primary' : 'default'" size="small" |
|||
@click="changeRange('week')">周</el-button> |
|||
<el-button :type="activeRange === 'month' ? 'primary' : 'default'" size="small" |
|||
@click="changeRange('month')">月</el-button> |
|||
<el-button :type="activeRange === 'year' ? 'primary' : 'default'" size="small" |
|||
@click="changeRange('year')">年</el-button> |
|||
|
|||
</div> |
|||
|
|||
<div ref="visitStat" :style="{ width: '100%', height: '300px' }"> |
|||
|
|||
</div> |
|||
</el-card> |
|||
</el-col> |
|||
</el-row> |
|||
|
|||
</div> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import { ref, reactive } from 'vue' |
|||
import { getHome } from '@/app/api/sys' |
|||
import * as echarts from 'echarts' |
|||
const visitStat = ref<any>(null) |
|||
const activeRange = ref<'week' | 'month' | 'year'>('week') |
|||
|
|||
const info = reactive({ |
|||
campus_count: 0, |
|||
personnel_count: 0, |
|||
customerResources_count: 0, |
|||
customerResources_day_count: 0, |
|||
student_count: 0, |
|||
student_day_count: 0, |
|||
customer: [] |
|||
}) |
|||
|
|||
const changeRange = (range) => { |
|||
activeRange.value = range |
|||
Init(range) // 加载新数据 |
|||
} |
|||
|
|||
const Init = (range) => { |
|||
|
|||
getHome({'date':range}) |
|||
.then((res) => { |
|||
info.campus_count = res.data.campus_count |
|||
info.personnel_count = res.data.personnel_count |
|||
info.customerResources_count = res.data.customerResources_count |
|||
info.customerResources_day_count = res.data.customerResources_day_count |
|||
info.student_count = res.data.student_count |
|||
info.student_day_count = res.data.student_day_count |
|||
info.customer = res.data.customer |
|||
drawChart(''); |
|||
}) |
|||
.catch(() => { |
|||
|
|||
}) |
|||
} |
|||
|
|||
Init(); |
|||
|
|||
|
|||
const drawChart = (item : any) => { |
|||
let value = info.customer.value |
|||
if (item) value = item |
|||
if (!visitStat.value) return |
|||
|
|||
|
|||
const visitStatChart = echarts.init(visitStat.value) |
|||
const visitStatOption = ref({ |
|||
// title: { |
|||
// text: '订单量趋势' |
|||
// }, |
|||
legend: {}, |
|||
xAxis: { |
|||
data: [] |
|||
}, |
|||
yAxis: {}, |
|||
tooltip: { |
|||
trigger: 'axis' |
|||
}, |
|||
series: [ |
|||
{ |
|||
type: 'line', |
|||
data: [] |
|||
} |
|||
] |
|||
}) |
|||
|
|||
|
|||
visitStatOption.value.xAxis.data = info.customer.time |
|||
visitStatOption.value.series[0].data = value |
|||
|
|||
visitStatChart.setOption(visitStatOption.value) |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped></style> |
|||
File diff suppressed because it is too large
Binary file not shown.
@ -0,0 +1,161 @@ |
|||
<?php |
|||
// +---------------------------------------------------------------------- |
|||
// | Niucloud-admin 企业快速开发的多应用管理平台 |
|||
// +---------------------------------------------------------------------- |
|||
// | 官方网址:https://www.niucloud.com |
|||
// +---------------------------------------------------------------------- |
|||
// | niucloud团队 版权所有 开源版本可自由商用 |
|||
// +---------------------------------------------------------------------- |
|||
// | Author: Niucloud Team |
|||
// +---------------------------------------------------------------------- |
|||
|
|||
namespace app\api\controller\apiController; |
|||
|
|||
use app\Request; |
|||
use app\service\admin\campus\CampusService; |
|||
use app\service\api\apiService\AttendanceService; |
|||
use app\service\api\apiService\CommonService; |
|||
use core\base\BaseApiService; |
|||
|
|||
/** |
|||
* 员工考勤控制器相关接口 |
|||
* Class Personnel |
|||
* @package app\api\controller\apiController |
|||
*/ |
|||
class Attendance extends BaseApiService |
|||
{ |
|||
|
|||
//列表 |
|||
public function index(Request $request){ |
|||
|
|||
$where = [ |
|||
'campus_id' => $request->param('campus_id', ''),// |
|||
'staff_id' => $request->param('staff_id', ''),// |
|||
'attendance_date' => $request->param('attendance_date', ''),// |
|||
'status' => $request->param('status', ''),// |
|||
'status_arr' => $request->param('status_arr', []),// |
|||
]; |
|||
|
|||
$res = (new AttendanceService())->getList($where); |
|||
return success($res); |
|||
} |
|||
|
|||
//员工考勤-编辑(员工打卡/请假/签退) |
|||
public function edit(Request $request){ |
|||
$campus_id =$request->param('campus_id','');//校区ID |
|||
$staff_id =$this->member_id;//人员ID |
|||
$attendance_date =$request->param('attendance_date','');//考勤日期 |
|||
$remarks =$request->param('remarks','');//备注 |
|||
$status =$request->param('status','');//考勤状态: present-出勤, absent-缺勤, late-迟到, leave_early-早退,leave-请假,sign_out-签退 |
|||
$longitude = $request->param('longitude','');//经度 |
|||
$latitude = $request->param('latitude','');//纬度 |
|||
$coordinate = '';//坐标 |
|||
if(!empty($longitude) && !empty($latitude)){ |
|||
$coordinate = "{$longitude},{$latitude}"; |
|||
}else{ |
|||
return fail('缺少定位坐标'); |
|||
} |
|||
|
|||
if(empty($campus_id) || empty($attendance_date) || empty($status)){ |
|||
return fail('缺少参数'); |
|||
} |
|||
if(!in_array($status,['present','absent','late','leave_early','leave','sign_out'])){ |
|||
return fail('状态类型不正确'); |
|||
} |
|||
|
|||
//获取校区的经纬度坐标 |
|||
$campus_data = (new CampusService)->getInfo($campus_id);//查校区详情 |
|||
$campus_lng = $campus_data['campus_coordinates']['lng'];//校区经度坐标 |
|||
$campus_lat = $campus_data['campus_coordinates']['lat'];//校区纬度坐标 |
|||
$radius = 1500.0;//打卡半径(米) |
|||
|
|||
//判断签到+签退时是否超出打卡范围 |
|||
if(in_array($status,['present','sign_out'])){ |
|||
$isInCheckRange = (new CommonService())->isInCheckRange((float)$campus_lng, (float)$campus_lat, (float)$longitude, (float)$latitude, (float)$radius); |
|||
if(!$isInCheckRange){ |
|||
return fail("超出打卡范围,规定打卡范围({$radius}米)"); |
|||
} |
|||
} |
|||
|
|||
|
|||
|
|||
//查询数据是否存在,一天一个校区同一个人只能产生一条数据 |
|||
$date_h = date('H:i:s'); |
|||
|
|||
$obj = (new AttendanceService()); |
|||
$info = $obj->info([ |
|||
'campus_id'=>$campus_id, |
|||
'staff_id'=>$staff_id, |
|||
'attendance_date'=>$attendance_date, |
|||
])['data']; |
|||
|
|||
//如果是签退的时候就是修改 |
|||
if($status == 'sign_out'){ |
|||
|
|||
if (($info['status'] ?? '') != 'present') { |
|||
return fail('未查询到今日签到信息,无法签退'); |
|||
} |
|||
|
|||
//签退的情况 |
|||
$where = [ |
|||
'id'=>$info['id'] |
|||
]; |
|||
$data = [ |
|||
'check_out_time'=>$date_h,//签退时间 |
|||
'coordinate'=>$coordinate,//坐标|经度,纬度 |
|||
]; |
|||
//执行修改操作 |
|||
$res = $obj->editData($where,$data); |
|||
}else{ |
|||
//如果是签到/请假 |
|||
$data = [ |
|||
'campus_id'=>$campus_id,//校区ID |
|||
'staff_id'=>$staff_id,//人员ID |
|||
'attendance_date'=>$attendance_date,//考勤日期 |
|||
'coordinate'=>$coordinate,//坐标|经度,纬度 |
|||
'status'=>$status,//考勤状态 |
|||
]; |
|||
//如果是签到的情况 |
|||
if($info){ |
|||
if($status == 'present' && $info['status'] == 'present'){ |
|||
//更新签到数据 |
|||
//执行修改操作 |
|||
$edit_data = [ |
|||
'check_in_time'=>$date_h,//签到时间 |
|||
'coordinate'=>$coordinate,//坐标|经度,纬度 |
|||
'status'=>$status//考勤状态 |
|||
]; |
|||
$res = $obj->editData(['id'=>$info['id']],$edit_data); |
|||
if(!$res['code']){ |
|||
return fail($res['msg']); |
|||
} |
|||
return success($res['data']); |
|||
} |
|||
$status_arr = (new \app\model\attendance\Attendance())::STATUS; |
|||
$status_name = $status_arr[$info['status']] ?? ''; |
|||
if(!$status_name){ |
|||
$status_name = '考勤'; |
|||
} |
|||
return fail("今日已{$status_name}重复操作"); |
|||
}else{ |
|||
$data['check_in_time'] = $date_h;//签到时间 |
|||
if($remarks){ |
|||
$data['remarks'] = $remarks; |
|||
} |
|||
//执行创建操作 |
|||
$res = $obj->addData($data); |
|||
if(!$res['code']){ |
|||
return fail($res['msg']); |
|||
} |
|||
return success($res['data']); |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,91 @@ |
|||
<?php |
|||
// +---------------------------------------------------------------------- |
|||
// | Niucloud-admin 企业快速开发的多应用管理平台 |
|||
// +---------------------------------------------------------------------- |
|||
// | 官方网址:https://www.niucloud.com |
|||
// +---------------------------------------------------------------------- |
|||
// | niucloud团队 版权所有 开源版本可自由商用 |
|||
// +---------------------------------------------------------------------- |
|||
// | Author: Niucloud Team |
|||
// +---------------------------------------------------------------------- |
|||
|
|||
namespace app\model\chat_friends; |
|||
|
|||
use app\model\customer_resources\CustomerResources; |
|||
use core\base\BaseModel; |
|||
use think\model\concern\SoftDelete; |
|||
use app\model\personnel\Personnel; |
|||
|
|||
/** |
|||
* 员工与会员聊天好友关系模型 |
|||
* Class Attendance |
|||
* @package app\model\attendance |
|||
*/ |
|||
class ChatFriends extends BaseModel |
|||
{ |
|||
|
|||
use SoftDelete; |
|||
|
|||
/** |
|||
* 数据表主键 |
|||
* @var string |
|||
*/ |
|||
protected $pk = 'id'; |
|||
|
|||
/** |
|||
* 模型名称 |
|||
* @var string |
|||
*/ |
|||
protected $name = 'chat_friends'; |
|||
|
|||
/** |
|||
* 定义软删除标记字段. |
|||
* @var string |
|||
*/ |
|||
protected $deleteTime = 'deleted_at'; |
|||
/** |
|||
* 定义软删除字段的默认值. |
|||
* @var int |
|||
*/ |
|||
protected $defaultSoftDelete = 0; |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
/** |
|||
* 搜索器:员工人力资源表id |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchPersonnelIdAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("personnel_id", $value); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 搜索器:学生资源表id |
|||
* @param $value |
|||
* @param $data |
|||
*/ |
|||
public function searchCustomerResourcesIdAttr($query, $value, $data) |
|||
{ |
|||
if ($value) { |
|||
$query->where("customer_resources_id", $value); |
|||
} |
|||
} |
|||
|
|||
|
|||
public function campus(){ |
|||
return $this->hasOne(CustomerResources::class, 'id', 'customer_resources_id')->joinType('left')->withField('name,id')->bind(['customer_resources_id'=>'name']); |
|||
} |
|||
|
|||
public function personnel(){ |
|||
return $this->hasOne(Personnel::class, 'id', 'personnel_id')->joinType('left')->withField('name,id')->bind(['personnel_id_name'=>'name']); |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,50 @@ |
|||
<?php |
|||
// +---------------------------------------------------------------------- |
|||
// | Niucloud-admin 企业快速开发的多应用管理平台 |
|||
// +---------------------------------------------------------------------- |
|||
// | 官方网址:https://www.niucloud.com |
|||
// +---------------------------------------------------------------------- |
|||
// | niucloud团队 版权所有 开源版本可自由商用 |
|||
// +---------------------------------------------------------------------- |
|||
// | Author: Niucloud Team |
|||
// +---------------------------------------------------------------------- |
|||
|
|||
namespace app\model\chat_messages; |
|||
|
|||
use core\base\BaseModel; |
|||
use think\model\concern\SoftDelete; |
|||
|
|||
/** |
|||
* 员工与会员聊天记录表模型 |
|||
* Class Attendance |
|||
* @package app\model\attendance |
|||
*/ |
|||
class ChatMessages extends BaseModel |
|||
{ |
|||
|
|||
use SoftDelete; |
|||
|
|||
/** |
|||
* 数据表主键 |
|||
* @var string |
|||
*/ |
|||
protected $pk = 'id'; |
|||
|
|||
/** |
|||
* 模型名称 |
|||
* @var string |
|||
*/ |
|||
protected $name = 'chat_messages'; |
|||
|
|||
/** |
|||
* 定义软删除标记字段. |
|||
* @var string |
|||
*/ |
|||
protected $deleteTime = 'deleted_at'; |
|||
/** |
|||
* 定义软删除字段的默认值. |
|||
* @var int |
|||
*/ |
|||
protected $defaultSoftDelete = 0; |
|||
|
|||
} |
|||
@ -0,0 +1,156 @@ |
|||
<?php |
|||
// +---------------------------------------------------------------------- |
|||
// | Niucloud-admin 企业快速开发的多应用管理平台 |
|||
// +---------------------------------------------------------------------- |
|||
// | 官方网址:https://www.niucloud.com |
|||
// +---------------------------------------------------------------------- |
|||
// | niucloud团队 版权所有 开源版本可自由商用 |
|||
// +---------------------------------------------------------------------- |
|||
// | Author: Niucloud Team |
|||
// +---------------------------------------------------------------------- |
|||
|
|||
namespace app\service\api\apiService; |
|||
|
|||
use app\model\attendance\Attendance; |
|||
use core\base\BaseApiService; |
|||
|
|||
/** |
|||
* 考勤管理服务层 |
|||
* Class MemberService |
|||
* @package app\service\api\member |
|||
*/ |
|||
class AttendanceService extends BaseApiService |
|||
{ |
|||
public function __construct() |
|||
{ |
|||
parent::__construct(); |
|||
$this->model = (new Attendance()); |
|||
} |
|||
|
|||
//列表 |
|||
public function getList(array $where, string $field = '*') |
|||
{ |
|||
$page_params = $this->getPageParam();//获取请求参数中的页码+分页数 |
|||
$page = $page_params['page']; |
|||
$limit = $page_params['limit']; |
|||
|
|||
$model = $this->model; |
|||
|
|||
if (!empty($where['campus_id'])) { |
|||
$model = $model->where('campus_id', $where['campus_id']); |
|||
} |
|||
if (!empty($where['staff_id'])) { |
|||
$model = $model->where('staff_id', $where['staff_id']); |
|||
} |
|||
if (!empty($where['attendance_date'])) { |
|||
$model = $model->where('attendance_date', $where['attendance_date']); |
|||
} |
|||
if (!empty($where['status'])) { |
|||
$model = $model->where('status', $where['status']); |
|||
} |
|||
if (!empty($where['status_arr'])) { |
|||
$model = $model->whereIn('status', $where['status_arr']); |
|||
} |
|||
|
|||
$res = $model->with([ |
|||
'campus', |
|||
'personnel', |
|||
])->append([ |
|||
'status_name' |
|||
]) |
|||
->order('created_at','desc') |
|||
->paginate([ |
|||
'list_rows' => $limit, |
|||
'page' => $page, |
|||
])->toArray(); |
|||
return $res; |
|||
} |
|||
|
|||
//查询详情 |
|||
public function info(array $where, string $field = '*') |
|||
{ |
|||
$res = [ |
|||
'code' => 0, |
|||
'msg' => '操作失败', |
|||
'data' => [], |
|||
]; |
|||
if (empty($where)) { |
|||
$res['msg'] = '筛选条件不能唯空'; |
|||
return $res; |
|||
} |
|||
$model = $this->model; |
|||
if (!empty($where['id'])) { |
|||
$model = $model->where('id', $where['id']); |
|||
} |
|||
if (!empty($where['campus_id'])) { |
|||
$model = $model->where('campus_id', $where['campus_id']); |
|||
} |
|||
if (!empty($where['staff_id'])) { |
|||
$model = $model->where('staff_id', $where['staff_id']); |
|||
} |
|||
if (!empty($where['attendance_date'])) { |
|||
$model = $model->where('attendance_date', $where['attendance_date']); |
|||
} |
|||
$data = $model->field($field)->find(); |
|||
if ($data) { |
|||
$res = [ |
|||
'code' => 1, |
|||
'msg' => '操作成功', |
|||
'data' => $data->toArray(), |
|||
]; |
|||
} else { |
|||
$res['msg'] = '暂无数据'; |
|||
} |
|||
|
|||
return $res; |
|||
} |
|||
|
|||
//添加数据 |
|||
public function addData(array $data) |
|||
{ |
|||
|
|||
$add = $this->model->create($data); |
|||
if ($add) { |
|||
$res = [ |
|||
'code' => 1, |
|||
'msg' => '操作成功', |
|||
'data' => [], |
|||
]; |
|||
} else { |
|||
$res = [ |
|||
'code' => 0, |
|||
'msg' => '操作失败', |
|||
'data' => [], |
|||
]; |
|||
} |
|||
return $res; |
|||
} |
|||
|
|||
//编辑数据 |
|||
public function editData(array $where, array $data) |
|||
{ |
|||
|
|||
$data['updated_at'] = date('Y-m-d H:i:s'); |
|||
$model = $this->model; |
|||
if (!empty($where['id'])) { |
|||
$model = $model->where('id', $where['id']); |
|||
} |
|||
$edit = $model->update($data); |
|||
if ($edit) { |
|||
$res = [ |
|||
'code' => 1, |
|||
'msg' => '操作成功', |
|||
'data' => [], |
|||
]; |
|||
} else { |
|||
$res = [ |
|||
'code' => 0, |
|||
'msg' => '操作失败', |
|||
'data' => [], |
|||
]; |
|||
} |
|||
return $res; |
|||
} |
|||
|
|||
|
|||
} |
|||
Loading…
Reference in new issue