44 changed files with 4011 additions and 16000 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
@ -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
@ -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> |
|
||||
File diff suppressed because it is too large
Loading…
Reference in new issue