You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

307 lines
8.7 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div>
<div class="head">
<el-row>
<el-form-item>
<el-input v-model="searchInfo.name" />
</el-form-item>
<el-form-item>
<el-button type="primary" style="margin-left: 10px;" @click="GetList()">搜索</el-button>
</el-form-item>
</el-row>
<el-table :data="tableData" style="width: 100%;" row-key="id" v-loading="loading">
<el-table-column prop="hospital_name" label="医院" />
<el-table-column prop="name" label="套餐名称" />
<el-table-column prop="combo_type_name" label="套餐类型" />
<el-table-column prop="combo_crowd_name" label="适用人群" />
<el-table-column prop="price" label="价格" />
<el-table-column prop="sex" label="性别">
<template #default="scope">
<el-tag v-if="scope.row.sex==0" class="ml-2">全部</el-tag>
<el-tag v-if="scope.row.sex==1" class="ml-2" type="danger">男</el-tag>
<el-tag v-if="scope.row.sex==2" class="ml-2" type="success">女</el-tag>
</template>
</el-table-column>
<el-table-column prop="updated_at" label="更新时间" />
<el-table-column label="操作" width="100">
<template #default="scope">
<el-button type="primary" @click="EditFunc(scope.row)" :icon="Edit" circle />
</template>
</el-table-column>
</el-table>
<div class="page">
<el-pagination v-model:current-page="currentPage" v-model:page-size="pageSize"
:page-sizes="[15, 50, 100, 200]" layout="total,sizes, prev, pager, next" :total="total"
@size-change="PageSizeChange" @current-change="PageCurrentChange" />
</div>
<el-dialog v-model="dialogVisible" title="套餐信息" width="60%">
<el-form :model="Info" label-width="100px" v-loading="loading">
<el-form-item label="名称">
{{Info.name}}
</el-form-item>
<el-form-item label="Logo">
<el-upload class="avatar-uploader" :action="upfileurl" :headers="headerObj"
:show-file-list="false" :on-success="upLoadSuccess">
<img v-if="logo" :src="logo" class="avatar" style="width: 60px;" />
<el-icon v-else class="avatar-uploader-icon">
<Plus />
</el-icon>
</el-upload>
</el-form-item>
<el-form-item label="体检类型">
<el-checkbox-group v-model="Info.checkup_type_id">
<el-select :filterable="true" clearable v-model="Info.checkup_type_id" placeholder="选择体检类型">
<el-option v-for="(item,index) in CheckUpTypeEnableList" :key="index" :label="item.name"
:value="item.id" />
</el-select>
</el-checkbox-group>
</el-form-item>
<el-form-item label="套餐类型">
<el-select :filterable="true" clearable v-model="Info.type_id" placeholder="选择套餐类型">
<el-option v-for="(item,index) in ComboTypeList" :key="index" :label="item.name"
:value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="适应人群">
<el-select :filterable="true" clearable v-model="Info.crowd_id" placeholder="选择适应人群">
<el-option v-for="(item,index) in ComboCrowdList" :key="index" :label="item.name"
:value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="标签">
<el-input v-model="Info.tags" type="textarea" />
</el-form-item>
<el-form-item label="标签2">
<el-input v-model="Info.tags2" type="textarea" />
</el-form-item>
<el-form-item label="简介">
<el-input v-model="Info.intro" type="textarea" />
</el-form-item>
<el-form-item label="服务承诺">
<el-input v-model="Info.sub_intro" type="textarea" />
</el-form-item>
<el-form-item label="详情">
<div style="border: 1px solid #ccc">
<Toolbar style="border-bottom: 1px solid #ccc" :editor="editorRef"
:defaultConfig="toolbarConfig" :mode="mode" />
<Editor style="height: 500px; overflow-y: hidden;" v-model="valueHtml"
:defaultConfig="editorConfig" :mode="mode" @onCreated="handleCreated" />
</div>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="Save">
</el-button>
</span>
</template>
</el-dialog>
</div>
</div>
</template>
<script setup>
import '@wangeditor/editor/dist/css/style.css' // 引入 css
import {
onBeforeUnmount,
ref,
shallowRef,
onMounted
} from 'vue'
import {
Editor,
Toolbar
} from '@wangeditor/editor-for-vue'
import {
ElMessage
} from 'element-plus'
import {
UpFileUrl,
ComboGetList,
ComboGetDetail,
ComboSave,
ComboTypeGetList,
ComboCrowdGetList,
CheckUpTypeGetEnableList
} from '@/api/api.js'
import {
Edit
} from '@element-plus/icons-vue'
let loading = ref(false)
let tableData = ref([])
let currentPage = ref(1) //当前页码
let pageSize = ref(15) //每页数量
let total = 0 //总数量
let dialogVisible = ref(false)
const PageSizeChange = (e) => { // 修改每页数量
pageSize.value = e
GetList()
}
const PageCurrentChange = (e) => { //切换页码
currentPage.value = e
GetList()
}
let upfileurl = UpFileUrl()
let headerObj = {
Authorization: 'Bearer ' + sessionStorage.getItem("token")
}
let logo = ref('');
//上传成功钩子
let BaseUrl = ref(import.meta.env.VITE_APP_FILE)
const upLoadSuccess = (res) => {
logo.value = BaseUrl.value + res.data
Info.value.cover = res.data
}
let searchInfo = ref({});
let Info = ref({});
const GetList = () => {
loading.value = true
ComboGetList({
page: currentPage.value,
pageSize: pageSize.value,
searchInfo: searchInfo.value
}).then(res => {
loading.value = false
if (res.status) {
tableData.value = res.data.list
total = res.data.count
} else {
ElMessage.error(res.msg)
}
})
}
const Save = () => {
Info.value.desc = editorRef.value.getHtml()
if (!Array.isArray(Info.value.tags)) {
Info.value.tags = toArray(Info.value.tags)
}
if (!Array.isArray(Info.value.tags2)) {
Info.value.tags2 = toArray(Info.value.tags2)
}
loading.value = true
ComboSave({
Info: Info.value
}).then(res => {
loading.value = false
if (res.status) {
dialogVisible.value = false
GetList()
} else {
ElMessage.error(res.msg)
}
})
}
const EditFunc = (row) => {
dialogVisible.value = true
loading.value = true
GetComboType()
GetComboCrowd()
ComboGetDetail({
id: row.id
}).then(res => {
loading.value = false
if (res.status) {
Info.value = res.data
logo.value = BaseUrl.value + res.data.cover
editorRef.value.setHtml(Info.value.desc)
} else {
ElMessage.error(res.msg)
}
})
}
const toArray = (str) => { //字符串转数组
console.log(str);
if (!str) return
str = str.replace(//g, ',')
if (str.endsWith(',')) {
// 如果以逗号结尾则使用slice方法去掉最后一个字符
str = str.slice(0, -1);
}
return str.split(",")
}
//富文本编辑器
// 编辑器实例,必须用 shallowRef
const editorRef = shallowRef()
// 内容 HTML
const valueHtml = ref(null)
const toolbarConfig = {}
const editorConfig = {
placeholder: '请输入内容...',
MENU_CONF: {},
}
let mode = 'default' // 'simple\default'
// 修改 uploadImage 菜单配置
editorConfig.MENU_CONF['uploadImage'] = {
server: upfileurl,
fieldName: 'WangEditorImageFile',
headers: headerObj,
// 继续写其他配置...
//【注意】不需要修改的不用写wangEditor 会去 merge 当前其他配置
}
// 组件销毁时,也及时销毁编辑器
onBeforeUnmount(() => {
const editor = editorRef.value
if (editor == null) return
editor.destroy()
})
const handleCreated = (editor) => {
editorRef.value = editor // 记录 editor 实例,重要!
}
//获取全部套餐类型
let ComboTypeList = ref([]);
const GetComboType = () => {
loading.value = true
ComboTypeGetList({}).then(res => {
loading.value = false
if (res.status) {
ComboTypeList.value = res.data.list
} else {
ElMessage.error(res.msg)
}
})
}
//获取全部套餐适应人群
let ComboCrowdList = ref([]);
const GetComboCrowd = () => {
loading.value = true
ComboCrowdGetList({}).then(res => {
loading.value = false
if (res.status) {
ComboCrowdList.value = res.data.list
} else {
ElMessage.error(res.msg)
}
})
}
//可用体检类型列表
let CheckUpTypeEnableList = ref([]);
const GetCheckUpTypeEnableList_Func = () => {
loading.value = true
CheckUpTypeGetEnableList().then(res => {
loading.value = false
if (res.status) {
CheckUpTypeEnableList.value = res.data.list
} else {
ElMessage.error(res.msg)
}
})
}
onMounted(() => {
GetList()
GetCheckUpTypeEnableList_Func()
})
</script>
<style>
</style>