后台文章管理、对接小程序获取就诊人列表、H5登录接口、调整项目结构

wenjuan
yanzai 1 year ago
parent 1c88dcc5c9
commit 391ec9cc4c

@ -0,0 +1,36 @@
<?php
namespace App\Http\Controllers\API\Admin\YeWu;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class ArticleController extends Controller
{
public function GetList()
{
$searchInfo=request('searchInfo');
$list = DB::table('articles')->where(['type'=>$searchInfo['ArticleType'],'is_del'=>0,'status'=>1]);
$count=$list->count();
$list=$list->orderBy('order','asc')->get();
return \Yz::Return(true,"查询完成",['list'=>$list,'count'=>$count]);
}
public function Save()
{
}
//获取详情
public function GetDetail()
{
$id=request('id');
$info = DB::table('articles')->where(['id'=>$id,'is_del'=>0,'status'=>1])->first();
if($info){
return \Yz::Return(true,"查询完成",['info'=>$info]);
}else{
return \Yz::echoError1("文章内容查询失败");
}
}
}

@ -2,6 +2,7 @@
namespace App\Http\Controllers\API\Admin\YeWu; namespace App\Http\Controllers\API\Admin\YeWu;
use App\Http\Controllers\API\PEISApiController;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use DateTime; use DateTime;
use Illuminate\Http\Request; use Illuminate\Http\Request;

@ -2,6 +2,7 @@
namespace App\Http\Controllers\API\Admin\YeWu; namespace App\Http\Controllers\API\Admin\YeWu;
use App\Http\Controllers\API\PEISApiController;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;

@ -12,7 +12,7 @@ class ArticleController extends Controller
public function GetList() public function GetList()
{ {
$type=request('type'); $type=request('type');
$list = DB::table('articles')->where(['type'=>$type,'is_del'=>0])->get(); $list = DB::table('articles')->where(['type'=>$type,'is_del'=>0,'status'=>1])->orderBy('order','asc')->get();
return \Yz::Return(true,"查询完成",['list'=>$list]); return \Yz::Return(true,"查询完成",['list'=>$list]);
} }
@ -20,7 +20,7 @@ class ArticleController extends Controller
public function GetDetail() public function GetDetail()
{ {
$id=request('id'); $id=request('id');
$info = DB::table('articles')->where(['id'=>$id,'is_del'=>0])->first(); $info = DB::table('articles')->where(['id'=>$id,'is_del'=>0,'status'=>1])->first();
if($info){ if($info){
return \Yz::Return(true,"查询完成",['info'=>$info]); return \Yz::Return(true,"查询完成",['info'=>$info]);
}else{ }else{

@ -0,0 +1,25 @@
<?php
namespace App\Http\Controllers\API\H5;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class LoginController extends Controller
{
public function Login()
{
$openid =request('openid');
if(!isset($openid)) return \Yz::echoError1("openid不能为空");
$user=DB::table('web_users')->where(['openid'=>$openid])->first();
if(!$user){
$user=DB::table('web_users')->insert(['openid'=>$openid]);
}
if($user){
return \Yz::Return(true,"登录成功",['openid'=>$openid]);
}else{
return \Yz::echoError1("登录失败");
}
}
}

@ -66,12 +66,88 @@ class UserController extends Controller
//调用his接口查询用户积分和预存款 //调用his接口查询用户积分和预存款
$integral = 90; $integral = 90;
$save_money = 150; $save_money = 150;
$coupon_count=2;//优惠券数量 $coupon_count = 2;//优惠券数量
$person->integral = $integral;
$person->save_money = $save_money;
$person->coupon_count = $coupon_count;
return \Yz::Return(true, "查询完成", ['person_info' => $person]);
}
//更新用户列表,调用远程小程序接口
public function UpdatePersonList()
{
$openid = "234243";
$ApiPersonList = [
[
'ghzid' => 'ghz11',
'id_number'=>'24324324322',
'name' => '测试1',
'phone' => '11111111111',
'sex' => '1',
'birthday' => '1989-01-01',
'patient_type' => '0',
'marriage' => '1',
],
[
'ghzid' => 'ghz22',
'id_number'=>'1132112432432',
'name' => '测试2',
'phone' => '222222222',
'sex' => '1',
'birthday' => '1990-01-01',
'patient_type' => '1',
'marriage' => '1',
]
];
$user = DB::table('web_users')->where(['openid' => $openid, 'status' => 1, 'is_del' => 0])->first();
if (!$user) return \Yz::echoError1('用户不存在');
//库里存在的用户ghzid数组
$db_person_ghzids = DB::table('web_user_person')->where(['user_id' => $user->id,'is_del'=>0])->pluck('ghzid')->toArray();
//接口返回的用户ghzids数组
$api_person_ghzids = [];
foreach ($ApiPersonList as $apiperson) {
$api_person_ghzids[] = $apiperson['ghzid'];
}
// 取交集
$intersection = array_intersect($db_person_ghzids, $api_person_ghzids);
// 仅存在于 数据库里 中的ghzid
$onlyInDb = array_diff($db_person_ghzids, $api_person_ghzids);
// 仅存在于 api接口 中的ghzid
$onlyInApi = array_diff($api_person_ghzids, $db_person_ghzids);
$success_count=0;
foreach ($ApiPersonList as $apiperson) {
$personInfo = [
'ghzid' => $apiperson['ghzid'],
'id_number' => $apiperson['id_number'],
'name' => $apiperson['name'],
'birthday' => $apiperson['birthday'],
'sex' => $apiperson['sex'],
'phone' => $apiperson['phone'],
'married' => $apiperson['marriage'],
'user_id' => $user->id,
'patient_type' => $apiperson['patient_type'],
'updated_at'=>date('Y-m-d H:i:s')
];
if (in_array($apiperson['ghzid'], $intersection)) {//双方都有的,更新
$u=DB::table('web_user_person')->where(['user_id' => $user->id, 'ghzid' => $apiperson['ghzid']])->update($personInfo);
if($u) $success_count+=$u;
}
if (in_array($apiperson['ghzid'], $onlyInApi)) { //小程序新增的 添加
$i=DB::table('web_user_person')->insert($personInfo);
if($i) $success_count++;
}
}
if (count($onlyInDb) > 0) { //小程序不存在的用户 ,数据进行删除
$d=DB::table('web_user_person')->where(['user_id' => $user->id])->whereIn('ghzid',$onlyInDb)->update([
'is_del' => 1
]);
if($d) $success_count++;
}
return \Yz::Return(true,"更新",['success_count'=>$success_count]);
$person->integral=$integral;
$person->save_money=$save_money;
$person->coupon_count=$coupon_count;
return \Yz::Return(true,"查询完成",['person_info'=>$person]);
} }
} }

@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\API\Admin\YeWu; namespace App\Http\Controllers\API;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Http\Request; use Illuminate\Http\Request;

@ -48,6 +48,8 @@ Route::group(['prefix' => 'H5'], function () {
Route::post('/ArticleGetList', 'App\Http\Controllers\API\H5\ArticleController@GetList');//文章列表 Route::post('/ArticleGetList', 'App\Http\Controllers\API\H5\ArticleController@GetList');//文章列表
Route::post('/ArticleGetDetail', 'App\Http\Controllers\API\H5\ArticleController@GetDetail');//文章详情 Route::post('/ArticleGetDetail', 'App\Http\Controllers\API\H5\ArticleController@GetDetail');//文章详情
Route::post('/GetPersonInfo', 'App\Http\Controllers\API\H5\UserController@GetPersonInfo');//获取体检人基本信息 Route::post('/GetPersonInfo', 'App\Http\Controllers\API\H5\UserController@GetPersonInfo');//获取体检人基本信息
Route::post('/UpdatePersonList', 'App\Http\Controllers\API\H5\UserController@UpdatePersonList');//远程获取小程序端用户列表
Route::post('/Login', 'App\Http\Controllers\API\H5\LoginController@Login');//登录
}); });

@ -0,0 +1,230 @@
<template>
<div>
<div class="head">
<el-row>
<el-form-item>
<el-button type="success" style="margin-left: 10px;" @click="AddClick()"></el-button>
</el-form-item>
</el-row>
<el-row>
<el-form-item>
文章类型
<el-radio-group style="margin-left: 8px;" v-model="searchInfo.ArticleType"
@change="ArticleTypeChange()">
<el-radio-button :label="1">健康指导</el-radio-button>
<el-radio-button :label="2">注意事项</el-radio-button>
</el-radio-group>
</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="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="author" label="作者" />
<el-table-column prop="order" label="排序" />
<el-table-column prop="show_date" label="显示时间" />
<el-table-column label="操作">
<template #default="scope">
<el-button type="primary" @click="EditClick(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="名称">
{{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>
</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,
ArticleGetList
} from '@/api/api.js'
import {
Edit,
Top,
Bottom,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.cover = res.data
}
let searchInfo = ref({});
let Info = ref({});
const GetList = () => {
loading.value = true
ArticleGetList({
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)
}
})
}
//
// 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
}
const ArticleTypeChange = () => {
GetList()
}
const AddClick=()=>{
dialogVisible.value = true
}
const EditClick = () => {
dialogVisible.value = true
}
onMounted(() => {
searchInfo.value.ArticleType = 1
GetList()
})
</script>
<style>
</style>
Loading…
Cancel
Save