后台参数设定,自选项目缓存等

main
yanzai 1 year ago
parent dd6f75f3c4
commit fe11454167

@ -9,7 +9,7 @@ use Illuminate\Support\Facades\DB;
class ComboController extends Controller
{
//获取套餐列表
//获取套餐
public function UpdateCombo()
{
$hospital_id =request('hospital');
@ -20,9 +20,23 @@ class ComboController extends Controller
$peis=new PEISApiController();
$info= $peis::Post('套餐查询',$hospital_id,$data,false);
$successCount=0;//成功的数量
if(count($info['data'])>0){
$combos=$info['data'];
//查询医院下所有缓存的套餐
$db_combo_all=DB::table('combos')->where(['hospital_id'=>$hospital_id])->get();
foreach($db_combo_all as $key=>$db_combo){
$cunzai=false;
foreach ($combos as $c_key=>$combo){
if($db_combo->combo_id==$combo['Id']){
$cunzai=true;
}
}
if(!$cunzai){
DB::table('combos')->where(['id'=>$db_combo->id])->update([
'status'=>0
]);
}
}
foreach ($combos as $c_key=>$combo){
$item=[];
@ -37,25 +51,31 @@ class ComboController extends Controller
'desc'=>$v['简介'],
];
}
$item=json_encode($item,JSON_UNESCAPED_UNICODE);
$sex=null;
if(isset($combo['性别限制'])){
$sex_array=['全部'=>0,'男'=>1,'女'=>2];
$sex=$sex_array[$combo['性别限制']]>=0?$sex_array[$combo['性别限制']]:null;
}
$db_combo=DB::table('combos')->where(['combo_id'=>$combo['Id']])->first();
$db_combo=DB::table('combos')->where(['hospital_id'=>$hospital_id,'combo_id'=>$combo['Id']])->first();
$comboData=[
'hospital_id'=>$hospital_id,
'combo_id'=>$combo['Id'],
'sex'=>$sex,
'name'=>$combo['名称'],
'original_price'=>$combo['原价'],
'price'=>$combo['价格'],
'items'=>$item,
'status'=>1,
'updated_at'=>date('Y-m-d H:i:s'),
];
if(!!$db_combo){
//如果存在套餐
$u=DB::table('combos')->where(['combo_id'=>$combo['Id']])->update($comboData);
$u=DB::table('combos')->where(['hospital_id'=>$hospital_id,'combo_id'=>$combo['Id']])->update($comboData);
}else{
//如果不存在套餐
$comboData['tags']=json_encode([]);
$u= DB::table('combos')->insert($comboData);
}
if($u){
@ -80,4 +100,51 @@ class ComboController extends Controller
return \Yz::echoError1('未查询到套餐');
}
}
public function GetList()
{
$page = request('page');
$pageSize = request('pageSize');
$searchInfo = request('searchInfo');
$list=DB::table('combos')
->select('combos.*','hospital.name as hospital_name')
->leftJoin('hospital','hospital.id','=','combos.hospital_id');
if(isset($searchInfo['name'])){
$list = $list->where('combos.name', 'like', '%' . $searchInfo['name'] . '%');
}
$count=$list->count();
$list=$list
->skip(($page-1)*$pageSize) // 跳过前9999条记录
->take($pageSize)->get();
return \Yz::Return(true,"查询完成",['list'=>$list,'count'=>$count]);
}
public function GetDetail()
{
$id = request('id');
$query=DB::table('combos')->where(['id'=>$id])->first();
if(!!$query){
$query->tags=implode(", ", json_decode($query->tags,true));
$query->items=json_decode($query->items);
return \Yz::Return(true,"查询完成",$query);
}else{
return \Yz::echoError1("获取详情失败");
}
}
public function Save()
{
$Info = request('Info');
$u=DB::table('combos')->where(['id'=>$Info['id']])->update([
'tags'=>json_encode($Info['tags'],JSON_UNESCAPED_UNICODE),
'cover'=>$Info['cover'],
'intro'=>$Info['intro'],
'sub_intro'=>$Info['sub_intro'],
'desc'=>$Info['desc']
]);
if($u){
return \Yz::Return(true,"更新完成",[]);
}else{
return \Yz::echoError1("没有数据更新");
}
}
}

@ -0,0 +1,79 @@
<?php
namespace App\Http\Controllers\API\Admin\YeWu;
use App\Http\Controllers\Controller;
use DateTime;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class ItemController extends Controller
{
//获取套餐
public function UpdateItem()
{
$hospital_id =request('hospital');
date_default_timezone_set('PRC');
$data=[
"价格下限"=>"0","价格上限"=>"999999","性别"=>null,"妇检"=>false,"套餐Id"=>null,"项目Id列表"=>[],"请求来源"=>"小程序"
];
$peis=new PEISApiController();
$info= $peis::Post('自选项目查询',$hospital_id,$data,false);
$successCount=0;//成功的数量
if(count($info['data'])>0){
$items=$info['data'];
//查询医院下所有缓存的套餐
$db_items_all=DB::table('items')->where(['hospital_id'=>$hospital_id])->get();
foreach($db_items_all as $key=>$db_items){
$cunzai=false;
foreach ($items as $c_key=>$item){
if($db_items->item_id==$item['Id']){
$cunzai=true;
}
}
if(!$cunzai){
DB::table('items')->where(['id'=>$db_items->id])->update([
'status'=>0
]);
}
}
foreach ($items as $c_key=>$item){
$sex=null;
if(isset($item['性别限制'])){
$sex_array=['全部'=>0,'男'=>1,'女'=>2];
$sex=$sex_array[$item['性别限制']]>=0?$sex_array[$item['性别限制']]:null;
}
$db_item=DB::table('items')->where(['hospital_id'=>$hospital_id,'item_id'=>$item['Id']])->first();
$ItemData=[
'hospital_id'=>$hospital_id,
'item_id'=>$item['Id'],
'sex'=>$sex,
'name'=>$item['名称'],
'price'=>$item['价格'],
'status'=>1,
'updated_at'=>date('Y-m-d H:i:s'),
];
if(!!$db_item){
//如果存在项目
$u=DB::table('items')->where(['hospital_id'=>$hospital_id,'item_id'=>$item['Id']])->update($ItemData);
}else{
//如果不存在套餐
$u= DB::table('items')->insert($ItemData);
}
if($u){
$successCount++;
}else{
return \Yz::echoError1('更新失败');
}
}
return \Yz::Return(true,'操作完成',['success_count'=>$successCount,'combos_count'=>count($items)]);
}else{
return \Yz::echoError1('未查询到套餐');
}
}
}

@ -0,0 +1,62 @@
<?php
namespace App\Http\Controllers\API\Admin\YeWu;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class LinkUnitsController extends Controller
{
public function GetList()
{
$page = request('page');
$pageSize = request('pageSize');
$searchInfo = request('searchInfo');
$list=DB::table('link_units')->where(['is_del'=>0]);
if(isset($searchInfo['name'])){
$list = $list->where('name', 'like', '%' . $searchInfo['name'] . '%');
}
$count=$list->count();
$list=$list
->skip(($page-1)*$pageSize) // 跳过前9999条记录
->take($pageSize)->get();
return \Yz::Return(true,"查询完成",['list'=>$list,'count'=>$count]);
}
public function Save()
{
$Info = request('Info');
$data=[
'name'=>$Info['name'],
'img'=>$Info['logo'],
'url'=>$Info['url'],
'type'=>$Info['type'],
'status'=>$Info['status'],
];
if($Info['id']==0){
$data['created_at']=date('Y-m-d H:i:s');
$u=DB::table('link_units')->insert($data);
}else{
$u=DB::table('link_units')->where(['id'=>$Info['id']])->update($data);
}
if($u){
return \Yz::Return(true,"操作完成",[]);
}else{
return \Yz::echoError1("没有数据更新");
}
}
public function Del()
{
$id = request('id');
$d= DB::table('link_units')->where(['id'=>$id])->update([
'is_del'=>1
]);
if($d){
return \Yz::Return(true,"操作完成",[]);
}else{
return \Yz::echoError1("删除失败");
}
}
}

@ -0,0 +1,56 @@
<?php
namespace App\Http\Controllers\API\Admin\YeWu;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class NavController extends Controller
{
public function GetList()
{
$page = request('page');
$pageSize = request('pageSize');
$searchInfo = request('searchInfo');
$list=DB::table('web_nav')->where(['is_del'=>0]);
$count=$list->count();
$list=$list
->skip(($page-1)*$pageSize) // 跳过前9999条记录
->take($pageSize)->get();
return \Yz::Return(true,"查询完成",['list'=>$list,'count'=>$count]);
}
public function Save()
{
$Info = request('Info');
$data=[
'title'=>$Info['title'],
'l_title'=>$Info['l_title'],
'url'=>$Info['url']
];
if($Info['id']==0){
$u=DB::table('web_nav')->insert($data);
}else{
$u=DB::table('web_nav')->where(['id'=>$Info['id']])->update($data);
}
if($u){
return \Yz::Return(true,"操作完成",[]);
}else{
return \Yz::echoError1("没有数据更新");
}
}
public function Del()
{
$id = request('id');
$d= DB::table('web_nav')->where(['id'=>$id])->update([
'is_del'=>1
]);
if($d){
return \Yz::Return(true,"操作完成",[]);
}else{
return \Yz::echoError1("删除失败");
}
}
}

@ -0,0 +1,57 @@
<?php
namespace App\Http\Controllers\API\Admin\YeWu;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class WebMngrController extends Controller
{
//保存轮播信息
public function SaveLunBo()
{
$urls = request('urls');
$links = request('links');
$urls = json_encode($urls);
$u = DB::table('configs')->where(['label' => '首页轮播'])->update([
'value' => $urls
]);
if(isset($links)){
$u = DB::table('configs')->where(['label' => '轮播链接'])->update([
'value' =>json_encode($links)
]);
}
if ($u) {
return \Yz::Return(true, '保存成功', []);
} else {
return \Yz::echoError1("没有数据更新");
}
}
public function GetAllConfigs()
{
$configArray = request('configArray');
$all = DB::table('configs')->whereIn('label',$configArray)->get();
foreach ($all as $key=>$v){
if(in_array($v->label,['首页轮播','轮播链接','广告图片','广告链接'])){
$all[$key]->value= json_decode($v->value, true);
}
}
return \Yz::Return(true, '保存成功', $all);
}
public function SaveWebConfig()
{
$configInfo = request('configInfo');
if(!empty($configInfo)){
foreach ($configInfo as $key=>$item){
DB::table('configs')->where(['label'=>$item['label']])->update([
'value'=>$item['value']
]);
}
return \Yz::Return(true, '保存成功', []);
}else{
return \Yz::echoError1("没有数据更新");
}
}
}

@ -12,19 +12,40 @@ class UpLoadController extends Controller
{
public function UpFile(){
$file=request('file');
if ($file->isValid()) {
$WangEditorImageFile=request('WangEditorImageFile');
if(isset($file)){
if ($file->isValid()) {
// $s=app()->make(HealthCheckupService::class);
// $save=$s->SaveFile(['file'=>$file]);
$date = date("Ymd");
$save = $file->store('public/'.$date);
return \Yz::Return(true,'上传成功',Storage::url($save));
$date = date("Ymd");
$save = $file->store('public/'.$date);
return \Yz::Return(true,'上传成功',Storage::url($save));
}else{
return \Yz::echoError1("上传失败");
}
}
if(isset($WangEditorImageFile)){
$result = array();
if ($WangEditorImageFile->isValid()) {
$date = date("Ymd");
$save = $WangEditorImageFile->store('public/'.$date);
$result['status'] = true;
$result['msg'] ='上传成功';
$result['data'] = ["url"=>env('APP_URL').Storage::url($save)];
$result['errno'] = 0;
}else{
$result['status'] = false;
$result['msg'] ='失败';
$result['message'] ='上传失败';
$result['data'] = [];
$result['errno'] = 1;
}
return $result;
}
}else{
return \Yz::echoError1('获取文件失败');
}
}
}

@ -25,7 +25,13 @@ class ViewController extends Controller
{
$request = request();
$search = $request->get('search') ?? '';
$configs=DB::table('configs')->whereIn('label',['客服电话','客服在线时间'])->get()->toArray();
$c_arr=[];
foreach ($configs as $key=>$value){
$c_arr= array_merge($c_arr,[$value->label=>$value->value]);
}
return [
'configs'=>$c_arr,
'search_value' => $search,
'search_tags' => ['女性', '男性', '入职', '父母', '高端']
];
@ -191,11 +197,32 @@ class ViewController extends Controller
foreach ($hospital_list as $hospital) {
$hospital->tags_arr = json_decode($hospital->tags, true);
}
return view('home.home', [
//获取配置信息
$configs=DB::table('configs')->whereIn('label',['首页轮播'])->get();
$c_arr=[];
foreach ($configs as $key=>$value){
if($value->label=='首页轮播'){
$c_arr= array_merge($c_arr,[$value->label=>json_decode($value->value, true)]);
}else{
$c_arr= array_merge($c_arr,[$value->label=>$value->value]);
// $c_arr[]=[$value->label=>$value->value];
}
}
//首页导航
$navs=DB::table('web_nav')->where(['is_del'=>0])->get();
$nav_list=['navs'=>$navs];
//合作单位和机构
$link_units=DB::table('link_units')->where(['status'=>1,'is_del'=>0])->get();
$link_units=['link_units'=>$link_units];
$arr= [
'public_config' => self::public_config(),
'combos' => $combos,
'hospitals' => $hospital_list,
]);
];
$arr=array_merge($c_arr,$arr,$nav_list,$link_units);
return view('home.home', $arr);
}
public function combo(Request $request)

@ -6,14 +6,13 @@ class MenuService
public function GetBaseMenuList($arr){
$result=array();
if($arr['userid']=='search'){
$menulist=DB::select("select b.id,b.pid,b.order,b.icon, b.name,b.url from group_menu as a left join menu as b on a.menu_id=b.id where a.group_id =? and b.status=1",[$arr['group']]);
$menulist=DB::select("select b.id,b.pid,b.order,b.icon, b.name,b.url from group_menu as a left join menu as b on a.menu_id=b.id where a.group_id =? and b.status=1 order by `order` ",[$arr['group']]);
$result['list']=$menulist;
$result['status']='ok';
}else{
$query=DB::select("select `group` from users where id =? ",[$arr['userid']]);
if($query[0]->group==$arr['group']){
$menulist=DB::select("select b.id,b.pid,b.order,b.icon, b.name,b.url from group_menu as a left join menu as b on a.menu_id=b.id where a.group_id =? and b.status=1 and b.is_menu=1",[$arr['group']]);
$menulist=DB::select("select b.id,b.pid,b.order,b.icon, b.name,b.url from group_menu as a left join menu as b on a.menu_id=b.id where a.group_id =? and b.status=1 order by `order`",[$arr['group']]);
$result['list']=$menulist;
$result['status']='ok';

@ -39,8 +39,8 @@
</div>
<div class="header_info_wrapper">
<div class="header_info_tel_wrapper">
<div class="header_info_tel_number_wrapper">4000-3333-2222</div>
<div class="header_info_tel_tip_wrapper">客服在线时间:07:30 - 22:00</div>
<div class="header_info_tel_number_wrapper">{{$public_config['configs']['客服电话']}}</div>
<div class="header_info_tel_tip_wrapper">客服在线时间:{{$public_config['configs']['客服在线时间']}}</div>
</div>
<div class="header_info_chat_wrapper">
<div class="header_info_chat_number_wrapper">公立医院授权</div>

@ -12,23 +12,32 @@
</div>
<div class="banner_menu_wrapper">
<div class="banner_menu_list_wrapper">
<a href="/combo_list">
<div class="banner_menu_item_wrapper">
<div class="banner_menu_item_title_wrapper">体检套餐</div>
<div class="banner_menu_item_subtitle_wrapper">适应人群 高发疾病</div>
</div>
</a>
<div class="banner_menu_item_wrapper">
<div class="banner_menu_item_title_wrapper">体检机构</div>
<div class="banner_menu_item_subtitle_wrapper">公立医院 体检机构</div>
</div>
<div class="banner_menu_item_wrapper">
<div class="banner_menu_item_title_wrapper">体检采购平台</div>
<div class="banner_menu_item_subtitle_wrapper">企业采购体检 安全可靠</div>
</div>
@foreach($navs as $nav)
<a href={{$nav->url}}>
<div class="banner_menu_item_wrapper">
<div class="banner_menu_item_title_wrapper">{{$nav->title}}</div>
<div class="banner_menu_item_subtitle_wrapper">{{$nav->l_title}}</div>
</div>
</a>
@endforeach
{{-- <div class="banner_menu_item_wrapper">--}}
{{-- <div class="banner_menu_item_title_wrapper">体检机构</div>--}}
{{-- <div class="banner_menu_item_subtitle_wrapper">公立医院 体检机构</div>--}}
{{-- </div>--}}
{{-- <div class="banner_menu_item_wrapper">--}}
{{-- <div class="banner_menu_item_title_wrapper">体检采购平台</div>--}}
{{-- <div class="banner_menu_item_subtitle_wrapper">企业采购体检 安全可靠</div>--}}
{{-- </div>--}}
</div>
<div class="banner_menu_cover_wrapper">
<img src="./assets/images/banner.png" alt="">
{{-- <img src="./assets/images/banner.png" alt="">--}}
<el-carousel height="450px">
@foreach($首页轮播 as $item)
<el-carousel-item >
<img src={{env('APP_URL')}}{{$item}} alt="">
</el-carousel-item>
@endforeach
</el-carousel>
</div>
</div>
</div>
@ -106,11 +115,13 @@
<div class="combo_title_wrapper">部分合作医院&机构</div>
</div>
<div class="hospital_list_wrapper">
@for($i = 0; $i < 8; $i++)
<div class="hospital_item_wrapper">
<img src="./assets/images/yy-logo.png" alt="">
</div>
@endfor
@foreach($link_units as $key=>$link_unit)
@if($link_unit->type == 1 and $key<8)
<div class="hospital_item_wrapper">
<img src="./assets/images/yy-logo.png" alt="">
</div>
@endif
@endforeach
<div class="hospital_item_blank_wrapper"></div>
<div class="hospital_item_blank_wrapper"></div>
<div class="hospital_item_blank_wrapper"></div>
@ -122,11 +133,13 @@
<div class="combo_title_wrapper">部分合作企业&单位</div>
</div>
<div class="hospital_list_wrapper">
@for($i = 0; $i < 8; $i++)
<div class="hospital_item_wrapper">
<img src="./assets/images/qy-logo.png" alt="">
</div>
@endfor
@foreach($link_units as $key=>$link_unit)
@if($link_unit->type == 2 and $key<8)
<div class="hospital_item_wrapper">
<img src="./assets/images/yy-logo.png" alt="">
</div>
@endif
@endforeach
<div class="hospital_item_blank_wrapper"></div>
<div class="hospital_item_blank_wrapper"></div>
<div class="hospital_item_blank_wrapper"></div>

@ -16,7 +16,7 @@
.hospital_item_wrapper {
width: 280px;
height: 100px;
border: 1px solid #8c939d;
border: 1px solid #ddd;
margin: 10px 5px;
overflow: hidden;
}
@ -28,7 +28,22 @@
object-fit: contain;
}
.hospital_item_wrapper:hover {
animation: shadow-drop-1-center 0.2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
}
@keyframes shadow-drop-1-center {
0% {
transform: translateZ(0);
box-shadow: 0 0 0 0 rgba(0, 0, 0, 0);
}
100% {
transform: translateZ(50px);
box-shadow: 0 0 20px 0px rgba(0, 0, 0, 0.2);
border: 1px solid #fff;
}
}
.hospital_item_blank_wrapper {
width: 290px;
}
@ -56,6 +71,10 @@
height: 150px;
margin: 5px;
}
.ad_item_wrapper:hover {
animation: shadow-drop-2-center 0.2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
}
.ad_item_wrapper img {
width: 380px;
@ -106,6 +125,9 @@
padding-left: 30px;
margin-top: 20px;
}
.banner_menu_item_wrapper:hover {
color:#333;
}
.banner_wrapper {
width: 1200px;
@ -190,6 +212,24 @@
height: 200px;
object-fit: cover;
}
.combo_cover_wrapper:hover {
animation: shadow-drop-2-center 0.2s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
}
@keyframes shadow-drop-2-center {
0% {
transform: translateZ(0);
box-shadow: 0 0 0 0 rgba(0, 0, 0, 0);
margin-top: 0px;
}
100% {
transform: translateZ(50px);
box-shadow: 0 0 20px 0px rgba(0, 0, 0, 0.35);
margin-top: -8px;
}
}
.combo_item_wrapper {
width: 25%;
@ -207,3 +247,22 @@
width: 1200px;
margin: 20px auto 0;
}
.demonstration {
color: var(--el-text-color-secondary);
}
.el-carousel__item h3 {
color: #475669;
opacity: 0.75;
line-height: 450px;
margin: 0;
text-align: center;
}
.el-carousel__item:nth-child(2n) {
background-color: #99a9bf;
}
.el-carousel__item:nth-child(2n + 1) {
background-color: #d3dce6;
}

@ -59,12 +59,23 @@ Route::group(['middleware'=>['checktoken','log'],'prefix'=>'v1'],function () {
Route::post('admin/HospitalGetList','App\Http\Controllers\API\Admin\YeWu\HospitalController@GetList');
Route::post('admin/GetBaseInfoDetail','App\Http\Controllers\API\Admin\YeWu\HospitalController@GetBaseInfoDetail');
Route::post('admin/SaveCacheInfo','App\Http\Controllers\API\Admin\YeWu\HospitalController@SaveCacheInfo');
Route::post('admin/ComboGetList','App\Http\Controllers\API\Admin\YeWu\ComboController@GetList');//获取套餐列表
Route::post('admin/ComboGetDetail','App\Http\Controllers\API\Admin\YeWu\ComboController@GetDetail');//获取套餐详情
Route::post('admin/ComboSave','App\Http\Controllers\API\Admin\YeWu\ComboController@Save');//获取套餐详情保存
Route::post('admin/WebMngrSaveLunBo','App\Http\Controllers\API\Admin\YeWu\WebMngrController@SaveLunBo');//保存轮播
Route::post('admin/GetAllConfigs','App\Http\Controllers\API\Admin\YeWu\WebMngrController@GetAllConfigs');
Route::post('admin/SaveWebConfig','App\Http\Controllers\API\Admin\YeWu\WebMngrController@SaveWebConfig');
Route::post('admin/NavGetList','App\Http\Controllers\API\Admin\YeWu\NavController@GetList');
Route::post('admin/NavSave','App\Http\Controllers\API\Admin\YeWu\NavController@Save');
Route::post('admin/NavDel','App\Http\Controllers\API\Admin\YeWu\NavController@Del');
Route::post('admin/LinkUnitsGetList','App\Http\Controllers\API\Admin\YeWu\LinkUnitsController@GetList');
Route::post('admin/LinkUnitsSave','App\Http\Controllers\API\Admin\YeWu\LinkUnitsController@Save');
Route::post('admin/LinkUnitsDel','App\Http\Controllers\API\Admin\YeWu\LinkUnitsController@Del');
});
Route::post('admin/UpdateCombo','App\Http\Controllers\API\Admin\YeWu\ComboController@UpdateCombo')->middleware('log');
Route::post('admin/UpdateItem','App\Http\Controllers\API\Admin\YeWu\ItemController@UpdateItem')->middleware('log');

@ -10,6 +10,8 @@
"dependencies": {
"@element-plus/icons-vue": "^2.1.0",
"@vueuse/core": "^10.4.1",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12",
"axios": "^1.5.1",
"echarts": "^5.4.3",
"element-plus": "^2.3.14",
@ -48,6 +50,17 @@
"node": ">=6.0.0"
}
},
"node_modules/@babel/runtime": {
"version": "7.24.7",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz",
"integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==",
"dependencies": {
"regenerator-runtime": "^0.14.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@ctrl/tinycolor": {
"version": "3.6.1",
"resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
@ -603,6 +616,16 @@
"integrity": "sha512-EF3948ckf3f5uPgYbQ6GhyA56Dmv8yg0+ir+BroRjwdxyZJsekhZzawOecC2rOTPCz173t7ZcR1HHZu0dZgOCw==",
"dev": true
},
"node_modules/@transloadit/prettier-bytes": {
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz",
"integrity": "sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA=="
},
"node_modules/@types/event-emitter": {
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/@types/event-emitter/-/event-emitter-0.3.5.tgz",
"integrity": "sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ=="
},
"node_modules/@types/lodash": {
"version": "4.14.199",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.199.tgz",
@ -621,6 +644,56 @@
"resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz",
"integrity": "sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA=="
},
"node_modules/@uppy/companion-client": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-2.2.2.tgz",
"integrity": "sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==",
"dependencies": {
"@uppy/utils": "^4.1.2",
"namespace-emitter": "^2.0.1"
}
},
"node_modules/@uppy/core": {
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/@uppy/core/-/core-2.3.4.tgz",
"integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==",
"dependencies": {
"@transloadit/prettier-bytes": "0.0.7",
"@uppy/store-default": "^2.1.1",
"@uppy/utils": "^4.1.3",
"lodash.throttle": "^4.1.1",
"mime-match": "^1.0.2",
"namespace-emitter": "^2.0.1",
"nanoid": "^3.1.25",
"preact": "^10.5.13"
}
},
"node_modules/@uppy/store-default": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@uppy/store-default/-/store-default-2.1.1.tgz",
"integrity": "sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ=="
},
"node_modules/@uppy/utils": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/@uppy/utils/-/utils-4.1.3.tgz",
"integrity": "sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==",
"dependencies": {
"lodash.throttle": "^4.1.1"
}
},
"node_modules/@uppy/xhr-upload": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz",
"integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==",
"dependencies": {
"@uppy/companion-client": "^2.2.2",
"@uppy/utils": "^4.1.2",
"nanoid": "^3.1.25"
},
"peerDependencies": {
"@uppy/core": "^2.3.3"
}
},
"node_modules/@vitejs/plugin-vue": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.3.4.tgz",
@ -838,6 +911,156 @@
}
}
},
"node_modules/@wangeditor/basic-modules": {
"version": "1.1.7",
"resolved": "https://registry.npmjs.org/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz",
"integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==",
"dependencies": {
"is-url": "^1.2.4"
},
"peerDependencies": {
"@wangeditor/core": "1.x",
"dom7": "^3.0.0",
"lodash.throttle": "^4.1.1",
"nanoid": "^3.2.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
}
},
"node_modules/@wangeditor/code-highlight": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz",
"integrity": "sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==",
"dependencies": {
"prismjs": "^1.23.0"
},
"peerDependencies": {
"@wangeditor/core": "1.x",
"dom7": "^3.0.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
}
},
"node_modules/@wangeditor/core": {
"version": "1.1.19",
"resolved": "https://registry.npmjs.org/@wangeditor/core/-/core-1.1.19.tgz",
"integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==",
"dependencies": {
"@types/event-emitter": "^0.3.3",
"event-emitter": "^0.3.5",
"html-void-elements": "^2.0.0",
"i18next": "^20.4.0",
"scroll-into-view-if-needed": "^2.2.28",
"slate-history": "^0.66.0"
},
"peerDependencies": {
"@uppy/core": "^2.1.1",
"@uppy/xhr-upload": "^2.0.3",
"dom7": "^3.0.0",
"is-hotkey": "^0.2.0",
"lodash.camelcase": "^4.3.0",
"lodash.clonedeep": "^4.5.0",
"lodash.debounce": "^4.0.8",
"lodash.foreach": "^4.5.0",
"lodash.isequal": "^4.5.0",
"lodash.throttle": "^4.1.1",
"lodash.toarray": "^4.4.0",
"nanoid": "^3.2.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
}
},
"node_modules/@wangeditor/editor": {
"version": "5.1.23",
"resolved": "https://registry.npmjs.org/@wangeditor/editor/-/editor-5.1.23.tgz",
"integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==",
"dependencies": {
"@uppy/core": "^2.1.1",
"@uppy/xhr-upload": "^2.0.3",
"@wangeditor/basic-modules": "^1.1.7",
"@wangeditor/code-highlight": "^1.0.3",
"@wangeditor/core": "^1.1.19",
"@wangeditor/list-module": "^1.0.5",
"@wangeditor/table-module": "^1.1.4",
"@wangeditor/upload-image-module": "^1.0.2",
"@wangeditor/video-module": "^1.1.4",
"dom7": "^3.0.0",
"is-hotkey": "^0.2.0",
"lodash.camelcase": "^4.3.0",
"lodash.clonedeep": "^4.5.0",
"lodash.debounce": "^4.0.8",
"lodash.foreach": "^4.5.0",
"lodash.isequal": "^4.5.0",
"lodash.throttle": "^4.1.1",
"lodash.toarray": "^4.4.0",
"nanoid": "^3.2.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
}
},
"node_modules/@wangeditor/editor-for-vue": {
"version": "5.1.12",
"resolved": "https://registry.npmjs.org/@wangeditor/editor-for-vue/-/editor-for-vue-5.1.12.tgz",
"integrity": "sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==",
"peerDependencies": {
"@wangeditor/editor": ">=5.1.0",
"vue": "^3.0.5"
}
},
"node_modules/@wangeditor/list-module": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@wangeditor/list-module/-/list-module-1.0.5.tgz",
"integrity": "sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==",
"peerDependencies": {
"@wangeditor/core": "1.x",
"dom7": "^3.0.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
}
},
"node_modules/@wangeditor/table-module": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@wangeditor/table-module/-/table-module-1.1.4.tgz",
"integrity": "sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==",
"peerDependencies": {
"@wangeditor/core": "1.x",
"dom7": "^3.0.0",
"lodash.isequal": "^4.5.0",
"lodash.throttle": "^4.1.1",
"nanoid": "^3.2.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
}
},
"node_modules/@wangeditor/upload-image-module": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz",
"integrity": "sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==",
"peerDependencies": {
"@uppy/core": "^2.0.3",
"@uppy/xhr-upload": "^2.0.3",
"@wangeditor/basic-modules": "1.x",
"@wangeditor/core": "1.x",
"dom7": "^3.0.0",
"lodash.foreach": "^4.5.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
}
},
"node_modules/@wangeditor/video-module": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@wangeditor/video-module/-/video-module-1.1.4.tgz",
"integrity": "sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==",
"peerDependencies": {
"@uppy/core": "^2.1.4",
"@uppy/xhr-upload": "^2.0.7",
"@wangeditor/core": "1.x",
"dom7": "^3.0.0",
"nanoid": "^3.2.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
}
},
"node_modules/acorn": {
"version": "8.10.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
@ -1063,6 +1286,11 @@
"node": ">= 0.8"
}
},
"node_modules/compute-scroll-into-view": {
"version": "1.0.20",
"resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
"integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg=="
},
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@ -1100,6 +1328,18 @@
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
"integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
},
"node_modules/d": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz",
"integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==",
"dependencies": {
"es5-ext": "^0.10.64",
"type": "^2.7.2"
},
"engines": {
"node": ">=0.12"
}
},
"node_modules/dayjs": {
"version": "1.11.10",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz",
@ -1207,6 +1447,14 @@
"node": ">=6.0.0"
}
},
"node_modules/dom7": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/dom7/-/dom7-3.0.0.tgz",
"integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==",
"dependencies": {
"ssr-window": "^3.0.0-alpha.1"
}
},
"node_modules/echarts": {
"version": "5.4.3",
"resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.3.tgz",
@ -1344,6 +1592,43 @@
"resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz",
"integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw=="
},
"node_modules/es5-ext": {
"version": "0.10.64",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz",
"integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==",
"hasInstallScript": true,
"dependencies": {
"es6-iterator": "^2.0.3",
"es6-symbol": "^3.1.3",
"esniff": "^2.0.1",
"next-tick": "^1.1.0"
},
"engines": {
"node": ">=0.10"
}
},
"node_modules/es6-iterator": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
"integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
"dependencies": {
"d": "1",
"es5-ext": "^0.10.35",
"es6-symbol": "^3.1.1"
}
},
"node_modules/es6-symbol": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz",
"integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==",
"dependencies": {
"d": "^1.0.2",
"ext": "^1.7.0"
},
"engines": {
"node": ">=0.12"
}
},
"node_modules/esbuild": {
"version": "0.18.20",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
@ -1542,6 +1827,20 @@
"url": "https://opencollective.com/eslint"
}
},
"node_modules/esniff": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz",
"integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==",
"dependencies": {
"d": "^1.0.1",
"es5-ext": "^0.10.62",
"event-emitter": "^0.3.5",
"type": "^2.7.2"
},
"engines": {
"node": ">=0.10"
}
},
"node_modules/espree": {
"version": "9.6.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
@ -1606,6 +1905,15 @@
"node": ">=0.10.0"
}
},
"node_modules/event-emitter": {
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
"integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
"dependencies": {
"d": "1",
"es5-ext": "~0.10.14"
}
},
"node_modules/execa": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz",
@ -1629,6 +1937,14 @@
"url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
"node_modules/ext": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
"integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
"dependencies": {
"type": "^2.7.2"
}
},
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@ -1884,6 +2200,15 @@
"node": ">=8"
}
},
"node_modules/html-void-elements": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz",
"integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/human-signals": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz",
@ -1893,6 +2218,14 @@
"node": ">=14.18.0"
}
},
"node_modules/i18next": {
"version": "20.6.1",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-20.6.1.tgz",
"integrity": "sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==",
"dependencies": {
"@babel/runtime": "^7.12.0"
}
},
"node_modules/ignore": {
"version": "5.2.4",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
@ -1902,6 +2235,15 @@
"node": ">= 4"
}
},
"node_modules/immer": {
"version": "9.0.21",
"resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
"integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/immer"
}
},
"node_modules/import-fresh": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
@ -1987,6 +2329,11 @@
"node": ">=0.10.0"
}
},
"node_modules/is-hotkey": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/is-hotkey/-/is-hotkey-0.2.0.tgz",
"integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw=="
},
"node_modules/is-inside-container": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
@ -2023,6 +2370,14 @@
"node": ">=8"
}
},
"node_modules/is-plain-object": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-stream": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
@ -2035,6 +2390,11 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-url": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz",
"integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="
},
"node_modules/is-wsl": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
@ -2155,12 +2515,47 @@
"lodash-es": "*"
}
},
"node_modules/lodash.camelcase": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
"integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
},
"node_modules/lodash.clonedeep": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
"integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="
},
"node_modules/lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
},
"node_modules/lodash.foreach": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
"integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ=="
},
"node_modules/lodash.isequal": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
"integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
},
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true
},
"node_modules/lodash.throttle": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
"integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
},
"node_modules/lodash.toarray": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
"integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw=="
},
"node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@ -2225,6 +2620,14 @@
"node": ">= 0.6"
}
},
"node_modules/mime-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/mime-match/-/mime-match-1.0.2.tgz",
"integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==",
"dependencies": {
"wildcard": "^1.1.0"
}
},
"node_modules/mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
@ -2266,6 +2669,11 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
"node_modules/namespace-emitter": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/namespace-emitter/-/namespace-emitter-2.0.1.tgz",
"integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g=="
},
"node_modules/nanoid": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
@ -2289,6 +2697,11 @@
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
"dev": true
},
"node_modules/next-tick": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
},
"node_modules/normalize-wheel-es": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
@ -2583,6 +2996,15 @@
"node": ">=4"
}
},
"node_modules/preact": {
"version": "10.22.1",
"resolved": "https://registry.npmjs.org/preact/-/preact-10.22.1.tgz",
"integrity": "sha512-jRYbDDgMpIb5LHq3hkI0bbl+l/TQ9UnkdQ0ww+lp+4MMOdqaUYdFc5qeyP+IV8FAd/2Em7drVPeKdQxsiWCf/A==",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/preact"
}
},
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@ -2619,6 +3041,14 @@
"node": ">=6.0.0"
}
},
"node_modules/prismjs": {
"version": "1.29.0",
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
"integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
"engines": {
"node": ">=6"
}
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
@ -2670,6 +3100,11 @@
}
]
},
"node_modules/regenerator-runtime": {
"version": "0.14.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
},
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@ -2860,6 +3295,14 @@
"queue-microtask": "^1.2.2"
}
},
"node_modules/scroll-into-view-if-needed": {
"version": "2.2.31",
"resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz",
"integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==",
"dependencies": {
"compute-scroll-into-view": "^1.0.20"
}
},
"node_modules/semver": {
"version": "7.5.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
@ -2907,6 +3350,35 @@
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
"dev": true
},
"node_modules/slate": {
"version": "0.72.8",
"resolved": "https://registry.npmjs.org/slate/-/slate-0.72.8.tgz",
"integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==",
"dependencies": {
"immer": "^9.0.6",
"is-plain-object": "^5.0.0",
"tiny-warning": "^1.0.3"
}
},
"node_modules/slate-history": {
"version": "0.66.0",
"resolved": "https://registry.npmjs.org/slate-history/-/slate-history-0.66.0.tgz",
"integrity": "sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==",
"dependencies": {
"is-plain-object": "^5.0.0"
},
"peerDependencies": {
"slate": ">=0.65.3"
}
},
"node_modules/snabbdom": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/snabbdom/-/snabbdom-3.6.2.tgz",
"integrity": "sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q==",
"engines": {
"node": ">=12.17.0"
}
},
"node_modules/source-map-js": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
@ -2915,6 +3387,11 @@
"node": ">=0.10.0"
}
},
"node_modules/ssr-window": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-3.0.0.tgz",
"integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA=="
},
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@ -2997,6 +3474,11 @@
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"dev": true
},
"node_modules/tiny-warning": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
"integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
},
"node_modules/titleize": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz",
@ -3027,6 +3509,11 @@
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
"dev": true
},
"node_modules/type": {
"version": "2.7.3",
"resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz",
"integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ=="
},
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@ -3200,6 +3687,11 @@
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
"integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="
},
"node_modules/wildcard": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/wildcard/-/wildcard-1.1.2.tgz",
"integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng=="
},
"node_modules/wrap-ansi": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",

@ -12,6 +12,8 @@
"dependencies": {
"@element-plus/icons-vue": "^2.1.0",
"@vueuse/core": "^10.4.1",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12",
"axios": "^1.5.1",
"echarts": "^5.4.3",
"element-plus": "^2.3.14",

@ -145,4 +145,52 @@ export const UpdateCombo = (data={}) => {
//更新缓存
export const SaveCacheInfo = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/SaveCacheInfo',data:data})
}
}
//获取套餐列表
export const ComboGetList = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/ComboGetList',data:data})
}
//获取套餐详情
export const ComboGetDetail = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/ComboGetDetail',data:data})
}
//保存套餐详情
export const ComboSave = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/ComboSave',data:data})
}
//保存轮播
export const WebMngrSaveLunBo = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/WebMngrSaveLunBo',data:data})
}
//获取轮播
export const GetAllConfigs = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/GetAllConfigs',data:data})
}
//保存网站配置信息
export const SaveWebConfig = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/SaveWebConfig',data:data})
}
//获取网站导航菜单列表
export const NavGetList = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/NavGetList',data:data})
}
//保存网站导航菜单
export const NavSave = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/NavSave',data:data})
}
//删除网站导航
export const NavDel = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/NavDel',data:data})
}
//获取合作单位列表
export const LinkUnitsGetList = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/LinkUnitsGetList',data:data})
}
//保存合作单位信息
export const LinkUnitsSave = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/LinkUnitsSave',data:data})
}
//删除合作单位信息
export const LinkUnitsDel = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/LinkUnitsDel',data:data})
}

@ -98,6 +98,34 @@ const router = createRouter({
meta: {
title: '医院管理'
}
},{
path: '/combo/combomngr',
name: 'ComboComboMngr',
component: () => import('../views/Combo/ComboMngr.vue'),
meta: {
title: '套餐管理'
}
},{
path: '/webmngr/pageindex',
name: 'WebMngrPageIndex',
component: () => import('../views/WebMngr/PageIndex.vue'),
meta: {
title: '首页设置'
}
},{
path: '/webmngr/nav',
name: 'WebMngrNav',
component: () => import('../views/WebMngr/Nav.vue'),
meta: {
title: '导航设置'
}
},{
path: '/webmngr/linkunits',
name: 'WebMngrLinkUnits',
component: () => import('../views/WebMngr/LinkUnits.vue'),
meta: {
title: '合作单位机构'
}
}]
},

@ -0,0 +1,233 @@
<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="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-input v-model="Info.tags" 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
} 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)
}
loading.value = true
ComboSave({
Info: Info.value
}).then(res => {
loading.value = false
if (res.status) {
dialogVisible.value = false
} else {
ElMessage.error(res.msg)
}
})
}
const EditFunc = (row) => {
dialogVisible.value = true
loading.value = true
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
}
onMounted(() => {
GetList()
})
</script>
<style>
</style>

@ -0,0 +1,198 @@
<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-button type="success" style="margin-left: 10px;" @click="Add()"></el-button>
</el-form-item>
</el-row>
</div>
<el-table :data="tableData" style="width: 100%;" row-key="id" v-loading="loading">
<el-table-column prop="name" label="名称" />
<el-table-column prop="type" label="类型">
<template #default="scope">
<el-tag v-if="scope.row.type==1" class="ml-2" >医院</el-tag>
<el-tag v-if="scope.row.type==2" class="ml-2" type="info"></el-tag>
</template>
</el-table-column>
<el-table-column prop="status" label="状态">
<template #default="scope">
<el-tag v-if="scope.row.status==1" class="ml-2" type="success"></el-tag>
<el-tag v-if="scope.row.status==0" class="ml-2" type="danger"></el-tag>
</template>
</el-table-column>
<el-table-column prop="url" label="Url" />
<el-table-column label="操作" width="100">
<template #default="scope">
<el-button type="primary" @click="EditFunc(scope.row)" :icon="Edit" circle />
<el-button type="danger" @click="Del(scope.row)" :icon="Delete" 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="名称">
<el-input v-model="Info.name" style="width: 300px;"/>
</el-form-item>
<el-form-item label="图片">
<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="Url">
<el-input v-model="Info.url" />
</el-form-item>
<el-form-item label="类型">
<el-select v-model="Info.type" placeholder="选择类型" size="large" style="width: 240px">
<el-option label="医院" :value="1" />
<el-option label="企业" :value="2" />
</el-select>
</el-form-item>
<el-form-item label="状态">
<el-switch v-model="Info.status" size="large" active-text="" inactive-text="" :active-value="1"
:inactive-value="0" />
</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>
</template>
<script setup>
import {
onBeforeUnmount,
ref,
shallowRef,
onMounted
} from 'vue'
import {
Editor,
Toolbar
} from '@wangeditor/editor-for-vue'
import {
ElMessage
} from 'element-plus'
import {
UpFileUrl,
LinkUnitsGetList,
LinkUnitsSave,
LinkUnitsDel
} from '@/api/api.js'
import {
Edit,
Delete
} 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.logo = res.data
}
let searchInfo = ref({});
let Info = ref({
id: 0
});
const GetList = () => {
loading.value = true
LinkUnitsGetList({
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 Add = () => {
Info.value = {}
dialogVisible.value = true
Info.value.status=1
Info.value.id = 0
logo.value=''
}
const Save = () => {
loading.value = true
LinkUnitsSave({
Info: Info.value
}).then(res => {
loading.value = false
if (res.status) {
dialogVisible.value = false
GetList()
} else {
ElMessage.error(res.msg)
}
})
}
const Del = (row) => {
loading.value = true
LinkUnitsDel({
id: row.id
}).then(res => {
loading.value = false
if (res.status) {
GetList()
} else {
ElMessage.error(res.msg)
}
})
}
const EditFunc = (row) => {
dialogVisible.value = true
Info.value = row
logo.value=BaseUrl.value+row.img
}
onMounted(() => {
GetList()
})
</script>
<style scoped>
</style>

@ -0,0 +1,155 @@
<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-button type="success" style="margin-left: 10px;" @click="Add()"></el-button>
</el-form-item>
</el-row>
</div>
<el-table :data="tableData" style="width: 100%;" row-key="id" v-loading="loading">
<el-table-column prop="title" label="标题" />
<el-table-column prop="l_title" label="小标题" />
<el-table-column prop="url" label="Url" />
<el-table-column label="操作" width="100">
<template #default="scope">
<el-button type="primary" @click="EditFunc(scope.row)" :icon="Edit" circle />
<el-button type="danger" @click="Del(scope.row)" :icon="Delete" 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="标题">
<el-input v-model="Info.title" style="width: 300px;"/>
</el-form-item>
<el-form-item label="小标题">
<el-input v-model="Info.l_title" style="width: 300px;"/>
</el-form-item>
<el-form-item label="Url">
<el-input v-model="Info.url" />
</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>
</template>
<script setup>
import {
onBeforeUnmount,
ref,
shallowRef,
onMounted
} from 'vue'
import {
Editor,
Toolbar
} from '@wangeditor/editor-for-vue'
import {
ElMessage
} from 'element-plus'
import {
NavGetList,
NavSave,
NavDel
} from '@/api/api.js'
import {
Edit,Delete
} 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 searchInfo = ref({});
let Info = ref({
id: 0
});
const GetList = () => {
loading.value = true
NavGetList({
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 Add = () => {
Info.value = {}
dialogVisible.value = true
Info.value.id = 0
}
const Save = () => {
loading.value = true
NavSave({
Info: Info.value
}).then(res => {
loading.value = false
if (res.status) {
dialogVisible.value = false
GetList()
} else {
ElMessage.error(res.msg)
}
})
}
const Del = (row) => {
loading.value = true
NavDel({
id: row.id
}).then(res => {
loading.value = false
if (res.status) {
GetList()
} else {
ElMessage.error(res.msg)
}
})
}
const EditFunc = (row) => {
dialogVisible.value = true
Info.value = row
}
onMounted(() => {
GetList()
})
</script>
<style>
</style>

@ -0,0 +1,213 @@
<template>
<div>
<el-form label-width="100px" v-loading="loading">
<el-form-item label="轮播图">
<div style="display: flex;flex-direction: column;">
<div style="font-size: 12px;color: #666;">尺寸1000*450</div>
<div style="display: flex;align-items: center;">
<el-upload v-model:file-list="LunBoFileList" :action="upfileurl" :headers="headerObj"
list-type="picture-card" :on-remove="LunBoHandleRemove">
<el-icon>
<Plus />
</el-icon>
</el-upload>
<el-button style="margin-left: 12px; height: 60px;" type="primary"
@click="LunBoSave()">保存</el-button>
</div>
<el-input v-model="LunBoUrl" type="textarea" />
</div>
</el-form-item>
<div
style="border-top: 1px solid #e9e9e9;border-bottom: 1px solid #e9e9e9;padding: 20px 0px;text-align: center;">
<span v-for="(item,index) in AllConfigs" :key="index">
<el-form-item :label="item.label" v-if="item.label!='轮播链接'">
<span v-if="item.label=='客服电话'||item.label=='客服在线时间'">
<el-input v-model="AllConfigs[index].value" style="width: 300px;" />
</span>
<span v-if="item.label=='广告图片'">
<el-upload v-model:file-list="GuangGaoFileList" limit="3" :action="upfileurl" :headers="headerObj"
list-type="picture-card">
<el-icon>
<Plus />
</el-icon>
</el-upload>
</span>
<span v-if="item.label=='广告链接'">
<el-input v-model="AllConfigs[index].value" type="textarea" rows="3"
style="width: 500px;" />
</span>
</el-form-item>
</span>
<el-button style="margin-left: 12px; width: 120px; height: 40px;" type="primary"
@click="ConfigSave()">保存</el-button>
</div>
</el-form>
</div>
</template>
<script setup>
import {
onBeforeUnmount,
ref,
shallowRef,
onMounted
} from 'vue'
import {
ElMessage
} from 'element-plus'
import {
UpFileUrl,
WebMngrSaveLunBo,
GetAllConfigs,
SaveWebConfig
} from '@/api/api.js'
let loading = ref(false)
let LunBoFileList = ref([]);
let LunBoUrl = ref('');
let GuangGaoFileList = ref([]);
let upfileurl = UpFileUrl()
let headerObj = {
Authorization: 'Bearer ' + sessionStorage.getItem("token")
}
let BaseUrl = ref(import.meta.env.VITE_APP_FILE)
const LunBoUpLoadSuccess = (res) => {
logo.value = BaseUrl.value + res.data
Info.value.cover = res.data
}
const LunBoHandleRemove = (uploadFile, uploadFiles) => {
console.log(uploadFile, uploadFiles)
}
const LunBoSave = () => {
console.log(LunBoFileList.value);
let urls = []
LunBoFileList.value.forEach((v, i) => {
if (v.response != undefined) {
urls.push(v.response.data)
} else {
urls.push(v.org_url)
}
})
if (!Array.isArray(LunBoUrl.value)) {
LunBoUrl.value = toArray(LunBoUrl.value)
}
loading.value = true
WebMngrSaveLunBo({
urls: urls,
links:LunBoUrl.value
}).then(res => {
loading.value = false
if (res.status) {
ElMessage({
message: '保存成功',
type: 'success',
})
GetConfigFunc()
} else {
ElMessage.error(res.msg)
}
})
}
let AllConfigs = ref([]);
const GetConfigFunc = () => {
loading.value = true
GetAllConfigs({
configArray: ['首页轮播', '轮播链接', '客服电话', '客服在线时间', '广告图片', '广告链接']
}).then(res => {
AllConfigs.value = []
loading.value = false
LunBoFileList.value = []
GuangGaoFileList.value = []
if (res.status) {
res.data.forEach((v, i) => {
if (v.label == '首页轮播') {
v.value.forEach((v2, i2) => {
LunBoFileList.value.push({
url: BaseUrl.value + v2,
org_url: v2
})
})
} else {
if (v.label == '轮播链接') {
LunBoUrl.value=v.value
}
if (v.label == '广告图片') {
v.value.forEach((v2, i2) => {
GuangGaoFileList.value.push({
url: BaseUrl.value + v2,
org_url: v2
})
})
}
AllConfigs.value.push(v)
}
})
} else {
ElMessage.error(res.msg)
}
})
}
const ConfigSave = () => {
let urls = []
GuangGaoFileList.value.forEach((v, i) => {
if (v.response != undefined) {
urls.push(v.response.data)
} else {
urls.push(v.org_url)
}
})
AllConfigs.value.forEach((v, i) => {
if (v.label == '广告图片') {
AllConfigs.value[i].value = urls
}
if (v.label == '广告链接') {
if (!Array.isArray(v.value)) {
AllConfigs.value[i].value = toArray(v.value)
}
}
})
loading.value = true
SaveWebConfig({
configInfo: AllConfigs.value
}).then(res => {
loading.value = false
if (res.status) {
ElMessage({
message: '保存成功',
type: 'success',
})
GetConfigFunc()
} else {
ElMessage.error(res.msg)
}
})
}
const toArray = (str) => { //
if (!str) return
str = str.replace(//g, ',')
if (str.endsWith(',')) {
// 使slice
str = str.slice(0, -1);
}
return str.split(",")
}
onMounted(() => {
GetConfigFunc()
})
</script>
<style>
</style>
Loading…
Cancel
Save