修改功能

main
yanzai 2 years ago
parent d7743db33e
commit fe336becc4

Binary file not shown.

@ -5,6 +5,7 @@ namespace App\Http\Controllers\API\Admin\YeWu;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Services\Admin\YeWu\AppointmentService;
use Illuminate\Support\Facades\DB;
class AppointmentController extends Controller
{
//获取预约记录
@ -17,4 +18,46 @@ class AppointmentController extends Controller
$s=app()->make(AppointmentService::class);
return $s->GetAppointmentList(['userid'=>$userid,'group'=>$group,'page'=>$page,'pageSize'=>$pageSize,'searchInfo'=>$searchInfo]);
}
//对外插入预约记录
public function CreateAppointment(){
date_default_timezone_set('PRC');
$currentYear = date('Y');
$firstDay = date('Y-01-01', strtotime($currentYear));
$lastDay = date('Y-12-31', strtotime($currentYear));
$source='接口';
$info=request('info');
$c=DB::table('appointment_record as a')
->where([['a.id_card_num','=',$info['id_card_num']],['a.fee_type','=',0],['a.created_at','>=',$firstDay],['a.created_at','<=',$lastDay]])->get();
if(count($c)>0){
$result['status']=false;
$result['msg']='已体检过';
$result['info']=$c;
return \Yz::Return(false,'本年度已经体检过',['info'=>$c]);
}else{
$result['status']=true;
$result['msg']='可以继续,本年度无免费体检记录';
$result['info']=$c;
}
$i=DB::table('appointment_record')->insert([
'source'=>$source,
'type'=>$info['type'],
'name'=>$info['name'],
'id_card_num'=>$info['id_card_num'],
'sex'=>$info['sex'],
'tel'=>$info['tel'],
'content'=>json_encode($info['content']),
'fee_type'=>$info['fee_type']
]);
if($i){
return \Yz::Return(true,'保存成功',[]);
}else{
return \Yz::echoError1('保存失败');
}
}
}

@ -17,18 +17,22 @@ class HealthCheckupController extends Controller
if(!$CheckupInfo) return \Yz::echoError1('检查信息为空');
if(!$CheckupInfo['name']) return \Yz::echoError1('姓名不能为空');
if(!isset($CheckupInfo['id_card_num'])) return \Yz::echoError1('id_card_num不能为空');
if(!isset($CheckupInfo['type'])) return \Yz::echoError1('type不能为空');
if(!isset($CheckupInfo['institution_sn'])) return \Yz::echoError1('institution_sn不能为空');
if(!isset($CheckupInfo['institution_sn'])) return \Yz::echoError1('体检机构编码institution_sn不能为空');
if(!isset($CheckupInfo['tijian_num'])) return \Yz::echoError1('体检号tijian_num不能为空');
if(!isset($CheckupInfo['tijian_time'])) return \Yz::echoError1('体检时间tijian_time不能为空');
if(!isset($CheckupInfo['fee_type'])) return \Yz::echoError1('收费类型fee_type不能为空');
if(!isset($CheckupInfo['report_content'])) return \Yz::echoError1('报告内容report_content不能为空');
if(!isset($CheckupInfo['issue_time'])) return \Yz::echoError1('发证时间issue_time不能为空');
if(!isset($CheckupInfo['expire_time'])) return \Yz::echoError1('证件到期时间expire_time不能为空');
if(!isset($CheckupInfo['sex'])) return \Yz::echoError1('性别sex不能为空');
$s=app()->make(HealthCheckupService::class);
return $s->CreateRecord($CheckupInfo);
}
//查询能否进行免费体检
public function CheckRequirements(){
$id_card_num=request('id_card_num');
$type=request('type');//体检类型 1,健康证2老年人
$s=app()->make(PersonService::class);
return $s->GetPersonRecode(['id_num'=>$id_card_num]);
}

@ -0,0 +1,37 @@
<?php
namespace App\Http\Controllers\API;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class DxAppController extends Controller
{
//大兴app根据userid查询用户信息
public function getUserInfo(){
$userId=request('userId');
$base_url="http://114.242.58.53:8782";
$url =$base_url.'/family/api/getUserFamilyDataList?userId='.$userId;
$encryptStr=self::post($url,'');
$r_data=json_decode($encryptStr, true);
return \Yz::Return(true,'',$r_data);
}
public function post($url, $data_string)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
// curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_HTTPHEADER, [
'Content-Type: application/json; charset=utf-8',
'Content-Length: ' . strlen($data_string)
]);
// curl_setopt($curl, CURLOPT_POSTFIELDS, $data_string);
$r = curl_exec($curl);
curl_close($curl);
return $r;
}
}

@ -7,6 +7,7 @@ use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use JWT;
use App\Services\Login\LoginService;
use App\Lib\UKEY;
class UkeyController extends Controller
{
public function Bind(Request $request){
@ -28,4 +29,45 @@ class UkeyController extends Controller
return \Yz::echoError1("密码验证失败");
}
}
public function GetServeInfo(){
$info =UKEY::GetServerInfo();
return \Yz::Return(true,'获取成功',['serve_info'=>$info]);
}
public function UkeyLogin(){
$cliCert=request('cliCert'); //客户端证书
$sign=request('sign'); //签名值
$oridata=request('oridata'); //随机数原文
$ukey_userid=request('ukey_userid'); //ukey唯一标识
$check=UKEY::CheckCert($cliCert);
if($check==1){
$checksign=UKEY::CheckSign($cliCert,$oridata,$sign);
if($checksign){
$user=DB::table('users')->where(['ukey_sfuid'=>$ukey_userid,'status'=>1])->get();
if(count($user)>0){
$result=[];
$jwt= new JWT();
$accessTimeout = $jwt -> GetGetSecretTimeOut();
$refreshTimeout = $jwt -> GetRefreshTokenTimeOut();
$access_token = $jwt->BuildJWT('yz','access',$user[0]->id,$user[0]->group,$accessTimeout);
$refresh_token = $jwt->BuildJWT('yz','refresh',$user[0]->id,'',$refreshTimeout);
if(!empty($arr['mian7'])){
$mian7_token = $jwt->BuildJWT('yz','mian7',$user[0]->id,'',$jwt -> GetMian7TokenTimeOut());
$result['mian7_token']=$mian7_token;
}
DB::table('users')->where(['id'=>$user[0]->id,'status'=>1])->update(['token'=>md5($refresh_token)]);
$result['token']=$access_token;
$result['refresh_token']=$refresh_token;
return \Yz::Return(true,'验证成功',$result);
}else{
return \Yz::echoError1("未找到关联此Ukey的有效用户");
}
}else{
return \Yz::echoError1("验证客户端随机数签名失败");
}
}else{
return \Yz::echoError1("证书验证失败".$check);
}
}
}

@ -8,6 +8,7 @@ use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use JWT;
use function PHPUnit\Framework\isEmpty;
class LoginController extends Controller
@ -62,5 +63,30 @@ class LoginController extends Controller
return $result;
}
//APP嵌套h5登录参数APP内用户唯一id
public function Applogin(){
$openid =request('openid');
if(isset($openid)){
$accessTimeout = JWT::GetGetSecretTimeOut();
$refreshTimeout = JWT::GetRefreshTokenTimeOut();
$access_token = JWT::BuildJWT('yz','access',$openid,'mH5user',$accessTimeout);
$refresh_token = JWT::BuildJWT('yz','refresh',$openid,'',$refreshTimeout);
$s=app()->make(PersonService::class);
$c= $s->checkRegister(['openid'=>$openid]);
if($c){ //判断是否注册过
DB::table('persons')->where(['openid'=>$openid,'status'=>1])->update(['token'=>md5($refresh_token)]);
$result['isRegister']=true;
}else{
$result['isRegister']=false;
}
$result['token']=$access_token;
$result['refresh_token']=$refresh_token;
$result['status']='ok';
}else{
$result['msg']='获取openid失败';
$result['status']='no';
}
return $result;
}
}

@ -23,8 +23,8 @@ class PersonController extends Controller
}
//获取用户pdf
public function GetPersonReportDetail(){
$tijian_num =request('tijian_num');
$info=DB::table('examination_records')->where(['tijian_num'=>$tijian_num])->first();
$sfz =request('sfz');
$info=DB::table('examination_records')->where(['id_card_num'=>$sfz]) ->orderBy('id', 'desc')->first();
if($info){
$item=DB::table('report_result_item')
->where(['examination_id'=>$info->id])

@ -0,0 +1,13 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class TestController extends Controller
{
public function DBtest(){
echo DB::table('users')->count();
}
}

@ -0,0 +1,97 @@
<?php
namespace App\Lib;
class UKEY
{
protected static $url="http://223.70.139.221:18088";
protected static $appName="SVSDefault";
public static function GetServerInfo(){
$info=[];
$c=[
'appName'=>self::$appName,
'length'=>16
];
$random='';
$res=self::post(self::$url.'/api/common/genRandom',json_encode($c));//获取随机数
if($res['status']==0){
$random=$res['body']['random'];
$info['random']=$random;
$info['signData']=self::signData($random);
$info['serverCert']=self::GetServerCert();
}
return $info;
}
//数据签名
public static function signData($oriData){
$c=[
'appName'=>self::$appName,
'oriData'=>$oriData
];
$sign='';
$res=self::post(self::$url.'/api/pkcs1/signData',json_encode($c));
if($res['status']==0){
$sign=$res['body']['p1Sign'];
}
return $sign;
}
//获取服务器证书
public static function GetServerCert(){
$c=[
'appName'=>self::$appName,
];
$cert='';
$res=self::post(self::$url.'/api/cert/getServerCertificate',json_encode($c));
if($res['status']==0){
$cert=$res['body']['base64Cert'];
}
return $cert;
}
//服务端验证客户端证书有效性,证书有效返回1,证书无效情况下:-1为不是所信任的根-2为超过
//有效期,-3为作废证书-4已加入黑名单-5证书未生效, 0 未知错误
public static function CheckCert($cert){
$c=[
'appName'=>self::$appName,
'cert'=>$cert
];
$validRes='';
$res=self::post(self::$url.'/api/cert/validateCert',json_encode($c));
if($res['status']==0){
$validRes=$res['body']['validRes'];
}
return $validRes;
}
//验证数据签名 返回数据签名验证结果,true 验证通过false 验证失败
public static function CheckSign($cert,$oriData,$sign){
$c=[
'appName'=>self::$appName,
'cert'=>$cert,
'oriData'=>$oriData,
'sign'=>$sign
];
$validRes=false;
$res=self::post(self::$url.'/api/pkcs1/verifySignData',json_encode($c));
if($res['status']==0){
$validRes=$res['body']['verifyRes'];
}
return $validRes;
}
public function post($url, $data_string)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_HTTPHEADER, [
'Content-Type: application/json; charset=utf-8',
'Content-Length: ' . strlen($data_string)
]);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data_string);
$r = curl_exec($curl);
curl_close($curl);
return json_decode($r,true);
}
}

@ -18,6 +18,7 @@ class Yz{
$result['msg']=$msg;
return response()->json($result)->setEncodingOptions(JSON_UNESCAPED_UNICODE);
}
public static function Return($status,$msg,$data=[]){
$result=array();
$result['status']=$status;

@ -2,6 +2,8 @@
namespace App\Services\Admin\YeWu;
use Illuminate\Support\Facades\DB;
use App\Services\mH5\PersonService;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
class HealthCheckupService
{
@ -28,7 +30,7 @@ class HealthCheckupService
DB::beginTransaction(); // 开始事务
try {
// 执行数据库操作
if($CheckupInfo['type']==1){
// if($CheckupInfo['type']==1){
//如果体检类型为健康证 更新预约记录表
$u= DB::table('appointment_record')
->where([
@ -38,46 +40,56 @@ class HealthCheckupService
])->whereBetween('created_at',[$firstDay,$lastDay])->update(['status'=>2]);
}
// }
//检查体检流水号是否存在,存在禁止再次插入。
$check_cunzai=DB::table('examination_records')->where('tijian_num',$CheckupInfo['tijian_num'])->get();
if(count($check_cunzai)>0) return \Yz::echoError1('此体检号已经存在,禁止创建');
$img_url='';
if(isset($CheckupInfo['head_img'])){
$date = date("Ymd");
preg_match('/^(data:\s*image\/(\w+);base64,)/', $CheckupInfo['head_img'], $res);
$file = base64_decode(Str::after($CheckupInfo['head_img'], $res[1]));
$filePath = 'APIUpload/'.$date.'/'.$CheckupInfo['tijian_num'].'.jpg';
Storage::disk('public')->put($filePath, $file);
$img_url='/storage/'.$filePath;
}
$u2=DB::table('examination_records')->insert([
$u2=DB::table('examination_records')->insertGetId([
"name"=>$CheckupInfo['name'],
"sex"=>$CheckupInfo['sex'],
"tel"=>$CheckupInfo['tel'],
"head_img"=>$img_url,
"id_card_num"=>$CheckupInfo['id_card_num'],
"type"=>$CheckupInfo['type'],
"type"=>1,
"industry_type"=>$CheckupInfo['industry_type'],
"institution_id"=>$org_id[0]->id,
"tijian_time"=>$CheckupInfo['tijian_time'],
"register_time"=>$CheckupInfo['register_time'],//登记时间
"tijian_num"=>$CheckupInfo['tijian_num'],
"report_content"=>json_encode($CheckupInfo['report_content']),
"fee_type"=>$CheckupInfo['fee_type']
"report_content"=>isset($CheckupInfo['report_content'])?json_encode($CheckupInfo['report_content'],JSON_UNESCAPED_UNICODE):'',
"result_status"=>$CheckupInfo['result_status'],
"issue_time"=>$CheckupInfo['issue_time'],
"expire_time"=>$CheckupInfo['expire_time']
]);
if($CheckupInfo['type']==1){
if($u==1 and $u2==true){
DB::commit(); // 提交事务
$status=true;
}else{
DB::rollBack(); // 回滚事务
}
}else{
if($u2){
if( $u2>0){
foreach ($CheckupInfo['report_content'] as $item){
$item['examination_id']=$u2;
$item['tijian_num']=$CheckupInfo['tijian_num'];
DB::table('report_result_item')->insert($item);
}
DB::commit(); // 提交事务
$status=true;
}else{
DB::rollBack(); // 回滚事务
DB::rollBack(); // 回滚事务
}
}
} catch (\Exception $e) {
DB::rollBack(); // 回滚事务
@ -97,7 +109,7 @@ class HealthCheckupService
public function SaveFile($arr){
$date = date("Ymd");
$path = $arr['file']->store('public/'.$date);
$path = $arr['file']->store('public/reportPDF/'.$date);
return \Yz::Return(true,'',$path);
}
//查询个人查询体检记录列表

@ -53,7 +53,7 @@ Route::group(['middleware'=>['checktoken','log'],'prefix'=>'v1'],function () {
Route::post('wxGetOpenid','App\Http\Controllers\API\mH5\LoginController@wxGetOpenid')->middleware('log'); //mH5手机用户获取openid
Route::post('AppLogin','App\Http\Controllers\API\mH5\LoginController@AppLogin')->middleware('log'); //APP嵌套h5登录参数APP内用户唯一id
Route::group(['middleware'=>['checktoken','log'],'prefix'=>'v1/mH5'],function () { //手机H5路由分组
Route::post('Register','App\Http\Controllers\API\mH5\PersonController@Register'); //手机H5端用户注册
Route::post('GetPersonRecode','App\Http\Controllers\API\mH5\PersonController@GetPersonRecode'); //查询用户本年度体检记录
@ -74,10 +74,14 @@ Route::group(['middleware'=>['check.sign','log'],'prefix'=>'v1'],function () {
Route::post('UploadFile','App\Http\Controllers\API\Admin\YeWu\HealthCheckupController@UploadFile'); //上传体检报告pdf
Route::get('GetPersonCheckUpList','App\Http\Controllers\API\Admin\YeWu\HealthCheckupController@GetPersonCheckUpList');//查询个人查询体检记录列表
Route::get('GetPersonCheckUpDetail','App\Http\Controllers\API\Admin\YeWu\HealthCheckupController@GetPersonCheckUpDetail');//根据体检号查询体检详情
Route::post('CreateAppointment','App\Http\Controllers\API\Admin\YeWu\AppointmentController@CreateAppointment');//创建预约记录
});
Route::post('test','App\Http\Controllers\API\Admin\LoginController@test');
Route::any('XTSignNotify','App\Http\Controllers\API\XTSignController@Notify');
Route::post('XTSignCheckNotify','App\Http\Controllers\API\XTSignController@CheckNotify')->middleware('log'); ;
Route::post('XTSignCheckNotify','App\Http\Controllers\API\XTSignController@CheckNotify')->middleware('log');
Route::post('addSignJob','App\Http\Controllers\API\XTSignController@addSignJob')->middleware('log'); ; //添加签名任务展示二维码
Route::post('AppGetUserInfo','App\Http\Controllers\API\DxAppController@getUserInfo')->middleware('log');//大兴app根据userid查询用户信息
Route::post('UkeyGetServeInfo','App\Http\Controllers\API\UkeyController@GetServeInfo')->middleware('log');//Ukey登录获取服务器信息
Route::post('UkeyLogin','App\Http\Controllers\API\UkeyController@UkeyLogin')->middleware('log');//Ukey登录

@ -25,3 +25,4 @@ Route::get('/wxLogin/{env}', function ($env) {
});
//微信登录授权获取openid
Route::get('/wxGetCode','App\Http\Controllers\API\mH5\LoginController@wxGetCode' );
Route::get('/test','App\Http\Controllers\TestController@DBtest' );

@ -879,7 +879,7 @@ function ParseDateString(strDate) {
}
//Form login
function Login(formName, strCertID, strPin) {
function xtxLogin(formName, strCertID, strPin,strServerCert, strServerRan, strServerSignedData) {
var objForm = eval(formName);
if (objForm == null) {
return false;
@ -980,6 +980,5 @@ function Login(formName, strCertID, strPin) {
objForm.UserCert.value = strClientCert;
objForm.UserSignedData.value = clientSignData;
objForm.LoginToken.value = xtxsync.custom.getToken();
return true;
}

@ -111,4 +111,13 @@ export const XTSignBindUser = (data={}) => {
//admin后台用户绑定ukey
export const UkeyBindUser = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/UkeyBindUser',data:data})
}
//Ukey获取服务器参数
export const UkeyGetServeInfo = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'UkeyGetServeInfo',data:data})
}
//Ukey登陆
export const UkeyUserInfoLogin = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'UkeyLogin',data:data})
}

@ -20,5 +20,4 @@ app.use(ElementPlus, {
})
app.use(createPinia())
app.use(router)
app.use(ElementPlus)
app.mount('#app')

@ -14,7 +14,7 @@
inactive-action-icon="Sunny" @change="toggleDark" />
</div>
</div>
<el-form v-if="!UseErweima" style="width: 400px;" ref="ruleFormRef" status-icon class="demo-ruleForm">
<el-form v-if="!UseErweima && !UseUkey" style="width: 400px;" ref="ruleFormRef" status-icon class="demo-ruleForm">
<el-form-item>
<span style="font-size: 22px;">登录您的账户</span>
</el-form-item>
@ -38,7 +38,7 @@
<div style="height: 160px;"></div>
</el-form>
<el-form v-else style="width: 400px;" status-icon class="demo-ruleForm erweima">
<el-form v-if="UseErweima" style="width: 400px;" status-icon class="demo-ruleForm erweima">
<el-form-item>
<span style="font-size: 22px;">请扫描二维码登录</span>
</el-form-item>
@ -54,7 +54,7 @@
</el-form-item>
<div style="height: 160px;"></div>
</el-form>
<el-form style="width: 400px;" status-icon class="demo-ruleForm erweima">
<el-form v-if="UseUkey" id="form_xtx" name="form_xtx" style="width: 400px;" status-icon class="demo-ruleForm erweima">
<el-form-item>
<span style="font-size: 22px;">证书登录</span>
</el-form-item>
@ -65,11 +65,14 @@
</el-select>
</el-form-item>
<el-form-item>
<el-input v-model="pwd" type="password" autocomplete="off" placeholder="密码" size="large"
<el-input v-model="uke_pwd" type="password" autocomplete="off" placeholder="密码" size="large"
:prefix-icon="Lock" />
</el-form-item>
<el-form-item>
<el-button style="width: 100%;" @click="ukeyLogin()" size="large">登录</el-button>
<el-button style="width: 100%;" @click="ukeyLogin()" type="danger" size="large">登录</el-button>
</el-form-item>
<el-form-item>
<el-button style="width: 100%;" @click="UseUkey=false;" size="large">返回账号密码</el-button>
</el-form-item>
<div style="height: 160px;"></div>
</el-form>
@ -84,7 +87,7 @@
<script setup>
import {
Login,addSignJob,XTSignCheckNotify
Login,addSignJob,XTSignCheckNotify,UkeyGetServeInfo,UkeyUserInfoLogin
} from "@/api/api.js";
import QRCode from 'qrcode'
import {
@ -105,8 +108,10 @@
useDark
} from "@vueuse/core";
const erweima_loading=ref(false)
const UseErweima=ref(false) //使
const UseUkey=ref(false) //使Ukey
const isDark = useDark()
const toggleDark = () => useToggle(isDark)
@ -219,11 +224,12 @@
}
//--------------------------------------------------------------
let LoginType=ref('');
let ZhengShuList = ref('');
let selectedZhengShuId = ref(''); //id
let uke_pwd=ref('');
const useUkey= ()=>{
LoginType.value='ukey'
UseUkey.value=true
let list = xtxsync.SOF_GetUserList()
console.log('证书列表 SOF_GetVersion', list) //
const arr = list.split('&&&').slice(0, -1);
@ -234,8 +240,30 @@
value
};
});
UkeyGetServeInfoAction()
}
let serverInfo=ref('');
const UkeyGetServeInfoAction=()=>{
UkeyGetServeInfo().then(res=>{
if(res.status){
serverInfo.value=res.data.serve_info
if(serverInfo.value.random && serverInfo.value.signData && serverInfo.value.serverCert){
return true
}else{
return ElMessage.error('获取服务器信息失败')
}
}
})
}
const ukeyLogin=()=>{
if(selectedZhengShuId.value==''){
return ElMessage.error('请选择证书')
}
if(uke_pwd.value==''){
return ElMessage.error('请输入证书密码')
}
console.log(selectedZhengShuId.value);
//
let randomStr=xtxsync.GenerateRandom(16);
@ -243,6 +271,62 @@
//
let randomStrSign=xtxsync.SignedData(selectedZhengShuId.value,randomStr);
console.log(randomStrSign);
//----
//var strServerSignedData="MEUCIQCOxI79/PFbZiA+tz+PhejhBX8dQn+IvUhA3J/gxD3TygIgT8sPpdr2OqQPUkBUJ3TzF2UiJMu2/WQbAjbi3FBPMN4="
//var strServerRan = "4sXyN2iip6PeTj3n16iRsA=="
//var strServerCert ="MIIEazCCBBCgAwIBAgIKGhAAAAAAIA/MZDAKBggqgRzPVQGDdTBEMQswCQYDVQQGEwJDTjENMAsGA1UECgwEQkpDQTENMAsGA1UECwwEQkpDQTEXMBUGA1UEAwwOQmVpamluZyBTTTIgQ0EwHhcNMjMwNzAyMTYwMDAwWhcNMjYwNzAzMTU1OTU5WjCBgDELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAiIiMQswCQYDVQQHDAIiIjEPMA0GA1UECgwG5YWo5oC7MRIwEAYDVQQLDAnmtYvor5Xpg6gxGzAZBgNVBAMMEuWFqOaAu+a1i+ivleivgeS5pjEVMBMGA1UEKQwMMTExMTExMjIzMTIzMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEiSiGTJ/XbzT7W+SKm7cOp0KAK6S9ZXKHJqVGDefI4UK0+CaUJGJbjYN1HoSu82/M/VTHQg6VAi37iqXyrwLMqaOCAqswggKnMB8GA1UdIwQYMBaAFB/mz9SPxSIql0opihXnFsmSNMS2MB0GA1UdDgQWBBRYIKlLw6Mb3ggWoOsF8YLiF7q6WzAOBgNVHQ8BAf8EBAMCBsAwgaMGA1UdHwSBmzCBmDBgoF6gXKRaMFgxCzAJBgNVBAYTAkNOMQ0wCwYDVQQKDARCSkNBMQ0wCwYDVQQLDARCSkNBMRcwFQYDVQQDDA5CZWlqaW5nIFNNMiBDQTESMBAGA1UEAxMJY2EyMWNybDMwMDSgMqAwhi5odHRwOi8vdGVzdC5iamNhLm9yZy5jbjo4MDAzL2NybC9jYTIxY3JsMzAuY3JsMB4GCiqBHIbvMgIBAQEEEAwOSkoxMTExMTEyMjMxMjMwYAYIKwYBBQUHAQEEVDBSMCMGCCsGAQUFBzABhhdPQ1NQOi8vb2NzcC5iamNhLm9yZy5jbjArBggrBgEFBQcwAoYfaHR0cDovL2NybC5iamNhLm9yZy5jbi9jYWlzc3VlcjBABgNVHSAEOTA3MDUGCSqBHIbvMgICATAoMCYGCCsGAQUFBwIBFhpodHRwOi8vd3d3LmJqY2Eub3JnLmNuL2NwczARBglghkgBhvhCAQEEBAMCAP8wHAYKKoEchu8yAgEBCAQODAwxMTExMTEyMjMxMjMwHgYKKoEchu8yAgECAgQQDA5KSjExMTExMTIyMzEyMzAfBgoqgRyG7zICAQEOBBEMDzk5ODAwMDEwMDkyNDQ0OTAeBgoqgRyG7zICAQEEBBAMDkpKMTExMTExMjIzMTIzMCcGCiqBHIbvMgIBARcEGQwXMUAyMTUwMDlKSjAxMTExMTEyMjMxMjMwGgYIKoEc0BQEAQQEDgwMMTExMTExMjIzMTIzMBQGCiqBHIbvMgIBAR4EBgwEMTA1MDAKBggqgRzPVQGDdQNJADBGAiEAieGsHBwvSeYSrGlK8OCO73lk2B8xP1Hu2OpuHp8AswICIQC7T5jjMXpNMdYA6zZRO1mU61to9uW4UmRjnIgg6GX6GA=="
// 4sXyN2iip6PeTj3n16iRsA==
// MEUCIQCOxI79/PFbZiA+tz+PhejhBX8dQn+IvUhA3J/gxD3TygIgT8sPpdr2OqQPUkBUJ3TzF2UiJMu2/WQbAjbi3FBPMN4=
// MIIEazCCBBCgAwIBAgIKGhAAAAAAIA/MZDAKBggqgRzPVQGDdTBEMQswCQYDVQQGEwJDTjENMAsGA1UECgwEQkpDQTENMAsGA1UECwwEQkpDQTEXMBUGA1UEAwwOQmVpamluZyBTTTIgQ0EwHhcNMjMwNzAyMTYwMDAwWhcNMjYwNzAzMTU1OTU5WjCBgDELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAiIiMQswCQYDVQQHDAIiIjEPMA0GA1UECgwG5YWo5oC7MRIwEAYDVQQLDAnmtYvor5Xpg6gxGzAZBgNVBAMMEuWFqOaAu+a1i+ivleivgeS5pjEVMBMGA1UEKQwMMTExMTExMjIzMTIzMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEiSiGTJ/XbzT7W+SKm7cOp0KAK6S9ZXKHJqVGDefI4UK0+CaUJGJbjYN1HoSu82/M/VTHQg6VAi37iqXyrwLMqaOCAqswggKnMB8GA1UdIwQYMBaAFB/mz9SPxSIql0opihXnFsmSNMS2MB0GA1UdDgQWBBRYIKlLw6Mb3ggWoOsF8YLiF7q6WzAOBgNVHQ8BAf8EBAMCBsAwgaMGA1UdHwSBmzCBmDBgoF6gXKRaMFgxCzAJBgNVBAYTAkNOMQ0wCwYDVQQKDARCSkNBMQ0wCwYDVQQLDARCSkNBMRcwFQYDVQQDDA5CZWlqaW5nIFNNMiBDQTESMBAGA1UEAxMJY2EyMWNybDMwMDSgMqAwhi5odHRwOi8vdGVzdC5iamNhLm9yZy5jbjo4MDAzL2NybC9jYTIxY3JsMzAuY3JsMB4GCiqBHIbvMgIBAQEEEAwOSkoxMTExMTEyMjMxMjMwYAYIKwYBBQUHAQEEVDBSMCMGCCsGAQUFBzABhhdPQ1NQOi8vb2NzcC5iamNhLm9yZy5jbjArBggrBgEFBQcwAoYfaHR0cDovL2NybC5iamNhLm9yZy5jbi9jYWlzc3VlcjBABgNVHSAEOTA3MDUGCSqBHIbvMgICATAoMCYGCCsGAQUFBwIBFhpodHRwOi8vd3d3LmJqY2Eub3JnLmNuL2NwczARBglghkgBhvhCAQEEBAMCAP8wHAYKKoEchu8yAgEBCAQODAwxMTExMTEyMjMxMjMwHgYKKoEchu8yAgECAgQQDA5KSjExMTExMTIyMzEyMzAfBgoqgRyG7zICAQEOBBEMDzk5ODAwMDEwMDkyNDQ0OTAeBgoqgRyG7zICAQEEBBAMDkpKMTExMTExMjIzMTIzMCcGCiqBHIbvMgIBARcEGQwXMUAyMTUwMDlKSjAxMTExMTEyMjMxMjMwGgYIKoEc0BQEAQQEDgwMMTExMTExMjIzMTIzMBQGCiqBHIbvMgIBAR4EBgwEMTA1MDAKBggqgRzPVQGDdQNJADBGAiEAieGsHBwvSeYSrGlK8OCO73lk2B8xP1Hu2OpuHp8AswICIQC7T5jjMXpNMdYA6zZRO1mU61to9uW4UmRjnIgg6GX6GA==
var strServerSignedData=serverInfo.value.signData
var strServerRan =serverInfo.value.random
var strServerCert =serverInfo.value.serverCert
var bRet = xtxLogin("form_xtx", selectedZhengShuId.value, uke_pwd.value,strServerCert,strServerRan,strServerSignedData);
console.log(bRet)
if (bRet) {
//
console.log('前端校验成功')
UkeyUserInfoLoginAction()
} else {
console.log('ukey登录失败')
}
}
//
const UkeyUserInfoLoginAction=()=>{
var UserCert= document.getElementsByName('UserCert')
var UserSignedData= document.getElementsByName('UserSignedData')
var ukey_userid=xtxsync.GetCertEntity(UserCert[0].value)//
var data={
ukey_userid:ukey_userid,
cliCert:UserCert[0].value ,
sign:UserSignedData[0].value,
oridata:serverInfo.value.random,
}
UkeyUserInfoLogin(data).then(res=>{
if(res.status){
sessionStorage.setItem('token', res.data.token);
sessionStorage.setItem('refreshToken', res.data.refresh_token);
// sessionStorage.setItem('tk', JSON.stringify(res.data.tk));
var token = sessionStorage.getItem('token');
if (token == res.data.token) {
window.location.href = "./#/dashboard"
}
}else{
return ElMessage.error(res.msg)
}
})
}

@ -33,4 +33,14 @@ export const UpFile = (data) => {
//获取体检报告详情
export const GetPersonReportDetail = (data) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/mH5/GetPersonReportDetail',data:data})
}
//APP嵌套h5登录
export const AppLogin = (data) => {
return axios({url:import.meta.env.VITE_APP_API+'AppLogin',data:data})
}
//大兴APP获取登录用户信息
export const AppGetUserInfo = (data) => {
return axios({url:import.meta.env.VITE_APP_API+'AppGetUserInfo',data:data})
}

@ -12,6 +12,10 @@ const router = createRouter({
// this generates a separate chunk (About.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import('../views/Login.vue')
},{
path: '/applogin',
name: 'applogin',
component: () => import('../views/AppLogin.vue')
},{
path: '/login',
name: 'login',

@ -11,6 +11,7 @@ export const usePiniaStore = defineStore('usePiniaStore', () => {
function ChangeYuYueInfo(info){
yuyue_info.value=info
}
let hangyeInfo=ref([{
id:1,
label:'食品类',

@ -5,9 +5,19 @@ import axios from 'axios'
//请求拦截器
axios.interceptors.request.use(
config => {
// const originalRequest = config;
// console.log(originalRequest);
config.headers.Authorization = 'Bearer ' + sessionStorage.getItem("token")
config.method = 'POST'
// config.data = {
// originalData: originalRequest.data ,// 携带原来请求的参数
// originalUrl: originalRequest.url ,// 携带原来请求的参数
// };
// config.url = 'http://daxing-middle/redirect_api'; // 将请求重定向到同一个接口
return config
},
err => {

@ -0,0 +1,164 @@
<template>
<div class="LoginMain">
<LoadingD :status="dloading"></LoadingD>
<van-button class="button" round type="default" icon="todo-list-o" :loading="loading" @click="gotoYuyue">{{buttonText}}</van-button>
<van-button class="button2" round type="warning" icon="newspaper-o" :loading="loading" @click="gotoReport"></van-button>
</div>
</template>
<script setup>
import {
AppLogin,AppGetUserInfo,mH5Register
} from "@/api/api.js";
import {
ref,
onMounted,onActivated
} from 'vue';
import {
useRoute,
useRouter
} from "vue-router"
import { showToast } from 'vant';
const route = useRoute()
const router = useRouter();
let openid =''
const login = () => {
if( !sessionStorage.getItem('sfz')) {
showToast('查询用户信息出错!');
return false
}
loading.value = true
AppLogin({
openid: openid
}).then(res => {
loading.value = false
if (res.status == 'ok') {
sessionStorage.setItem('token', res.token);
sessionStorage.setItem('refreshToken', res.refresh_token);
var token = sessionStorage.getItem('token');
if (token == res.token){
if(res.isRegister){
//
// router.push('/selectOrganization')
}else{
//
Reg()
}
}else{
showToast('查询存储信息失败');
}
}else{
showToast(res.msg);
}
})
}
let loading = ref(false)
let buttonText = ref('开始预约')
const gotoYuyue=()=>{
if( sessionStorage.getItem('sfz')){
router.push('/selectOrganization')
}else{
showToast('查询用户信息出错!');
}
}
const gotoReport=()=>{
if( sessionStorage.getItem('sfz')){
router.push('/showReport')
}else{
showToast('查询用户信息出错!');
}
}
let dloading=ref(false)
const AppGetUserinfoAction=()=>{ //APP
dloading.value=true
AppGetUserInfo({
userId: openid
}).then(res => {
dloading.value=false
console.log(res)
if (res.status) {
let info=res.data
if(info[0] !=undefined){
sessionStorage.setItem('sfz', info[0].idcardno);
sessionStorage.setItem('name', info[0].xm);
sessionStorage.setItem('tel', info[0].sj);
sessionStorage.setItem('sex', info[0].xb);
login()
}else{
showToast('查询用户信息出错!');
}
}else{
showToast(res.msg);
}
})
}
//
const Reg = () => {
let info={
name: sessionStorage.getItem('name'),
sex: sessionStorage.getItem('sex'),
tel: sessionStorage.getItem('tel'),
sfz: sessionStorage.getItem('sfz'),
}
loading.value=true
mH5Register({
info: info
}).then(res => {
loading.value=false
if (res.status == true) {
// showDialog({
// title: '',
// message: '',
// }).then(() => {
// //
// router.replace('/selectOrganization')
// });
showToast('注册成功!');
} else {
showToast(res.msg);
}
})
}
onMounted(() => {
openid= route.query.userId
AppGetUserinfoAction()
console.log(openid);
})
</script>
<style scoped>
.LoginMain {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
height: 100vh;
background-image: url('../assets/image/login.jpg');
background-size: 100%;
background-repeat: no-repeat;
background-color: #afeefd;
background-position: top center;
}
.button {
width: 60%;
margin-top: 50%;
background-color: #33cdc9;
color: #fff;
border: 3px solid #e6f5fd;
}
.button2 {
width: 60%;
margin-top: 20px;
background-color: #ffaa7f;
color: #fff;
border: 3px solid #e6f5fd;
}
</style>

@ -25,7 +25,13 @@
sessionStorage.setItem('token', res.token);
sessionStorage.setItem('refreshToken', res.refresh_token);
var token = sessionStorage.getItem('token');
let loginType=sessionStorage.getItem('loginType');// report
console.log(loginType)
if (token == res.token){
if(loginType=='report'){
router.replace('/ShowReport')
return false
}
if(res.isRegister){
//
// window.location.href="./#/selectOrganization"

@ -1,200 +1,227 @@
<template>
<div class="HealthCertificate">
<div class="main">
<div class="title">北京市从业人员健康证明</div>
<div class="info">
<div class="left">
<div class="pic"><img src="@/assets/image/touxiang.jpg"></div>
<div class="left_xia">
<div>类型食品</div>
<div>日期2023-05-01</div>
<div>编号1235454546</div>
</div>
</div>
<div class="right">
<div class="right_shang">
<div class="erweima">
<img src="@/assets/image/erweima.jpg">
</div>
<div class="userinfo">
<div class="name">李梦<span class="sex">()</span></div>
<div class="sfz">身份证号130666454545454545</div>
</div>
</div>
<div class="right_xia">
<table cellpadding="0" cellspacing="0" border="1">
<tr>
<td>检查项目</td>
<td>检查结果</td>
<td>检查日期</td>
</tr>
<tr>
<td>细菌性痢疾</td>
<td>合格</td>
<td>2022-05-01</td>
</tr>
<tr>
<td>细菌性痢疾</td>
<td>合格</td>
<td>2022-05-01</td>
</tr>
<tr>
<td>细菌性痢疾</td>
<td>合格</td>
<td>2022-05-01</td>
</tr>
<tr>
<td>细菌性痢疾</td>
<td>合格</td>
<td>2022-05-01</td>
</tr>
<tr>
<td>细菌性痢疾</td>
<td>合格</td>
<td>2022-05-01</td>
</tr>
<tr>
<td>细菌性痢疾</td>
<td>合格</td>
<td>2022-05-01</td>
</tr>
<tr>
<td>细菌性痢疾</td>
<td>合格</td>
<td>2022-05-01</td>
</tr>
</table>
</div>
</div>
</div>
<div class="bottom">22</div>
</div>
<div class="zhang">
<img src="@/assets/image/zhang.png">
</div>
</div>
<div class="HealthCertificate" v-if="reportinfo">
<div class="main">
<div class="title">北京市从业人员健康证明</div>
<div class="info">
<div class="left">
<div class="pic"><img :src="headImage"></div>
<div class="left_xia">
<div>类型{{reportinfo.industry_type}}</div>
<div>日期{{reportinfo.tijian_time.substring(0,10)}}</div>
<div>编号1235454546</div>
</div>
</div>
<div class="right">
<div class="right_shang">
<div class="erweima">
<img src="@/assets/image/erweima.jpg">
</div>
<div class="userinfo">
<div class="name">{{reportinfo.name}}<span class="sex" v-if="reportinfo.sex==1">()</span><span class="sex" v-if="reportinfo.sex==2">()</span></div>
<div class="sfz">身份证号{{reportinfo.id_card_num}}</div>
</div>
</div>
<div class="right_xia">
<table cellpadding="0" cellspacing="0" border="1">
<tr>
<td>检查项目</td>
<td>检查结果</td>
<td>检查日期</td>
</tr>
<tr v-for="(item,index) in reportinfo.items">
<td>{{item.item_name}}</td>
<td>合格</td>
<td>2022-05-01</td>
</tr>
</table>
</div>
</div>
</div>
<div class="bottom">22</div>
</div>
<div class="zhang">
<img src="@/assets/image/zhang.png">
</div>
</div>
</template>
<script>
document.title='报告查询'
<script setup>
import {
ref,
onMounted
} from 'vue';
import {
RouterLink,
useRouter
} from 'vue-router';
import {
GetPersonReportDetail
} from "@/api/api.js";
import {
showToast,
showDialog
} from 'vant';
const router = useRouter();
let loading = ref(false)
document.title = '报告查询'
let reportinfo=ref('')
let headImage=ref('');
const getDetail=()=>{
let sfz=sessionStorage.getItem('sfz');
loading.value=true
GetPersonReportDetail({sfz:sfz}).then(res => {
loading.value=false
if (res.status) {
reportinfo.value=res.data.info
headImage.value=import.meta.env.VITE_APP_FILE_URL+ reportinfo.value.head_img
} else {
showToast(res.msg);
}
})
}
onMounted(()=>{
getDetail()
})
</script>
<style scoped>
.HealthCertificate{
background-color: #f5f5f5;
padding-top: 10px;
}
.main{
aspect-ratio:158 / 100;
border-radius: 5%;
overflow: hidden;
}
.title{
font-size: 6vw;
height: 15%;
text-align: center;
color: #fff;
background-color: #1b2f60;
}
.info{
display: flex;
height: 80%;
}
.bottom{
height: 5%;
background-color: #1b2f60;
}
.left{
width: 30%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
}
.pic{
width: 80%;
height: 65%;
padding-top: 10%;
}
.pic img{
width: 100%;
}
.left_xia{
display: flex;
flex-direction: column;
height: 35%;
justify-content: space-between;
font-size: 2.5vw;
padding-top:10% ;
padding-bottom: 10%;
}
.right{
height: 100%;
width: 70%;
}
.right_shang{
display: flex;
height: 33%;
}
.erweima{
width: 30%;
height: 100%;
padding: 4% ;
}
.erweima img{
width: 100%;
margin-left: -3%;
}
.userinfo{
width: 70%;
padding: 5% 10% 0 2%;
}
.name{
font-size: 5vw;
border-bottom: 1px solid #000;
font-weight: bolder;
}
.sex{
font-size: 4vw;
}
.sfz{
font-size: 2.5vw;
margin-top: 3%;
font-weight: 500;
}
.right_xia{
padding-top: 5%;
padding-right: 2%;
padding-left: 2%;
}
table{
width: 100%;
text-align: center;
border: 1px solid #000;
font-size: 2.1vw;
}
td{
border: 1px solid #000;
padding: 0px;
}
tr{
padding: 0px;
}
.zhang{
position: absolute;
top: 35vw;
left: 20%;
}
.zhang img{
width: 21vw;
}
.HealthCertificate {
background-color: #f5f5f5;
padding-top: 10px;
}
.main {
aspect-ratio: 158 / 100;
border-radius: 5%;
overflow: hidden;
}
.title {
font-size: 6vw;
height: 15%;
text-align: center;
color: #fff;
background-color: #1b2f60;
}
.info {
display: flex;
height: 80%;
}
.bottom {
height: 5%;
background-color: #1b2f60;
}
.left {
width: 30%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
}
.pic {
width: 80%;
height: 65%;
padding-top: 10%;
}
.pic img {
width: 100%;
}
.left_xia {
display: flex;
flex-direction: column;
height: 35%;
justify-content: space-between;
font-size: 2.5vw;
padding-top: 10%;
padding-bottom: 10%;
}
.right {
height: 100%;
width: 70%;
}
.right_shang {
display: flex;
height: 33%;
}
.erweima {
width: 30%;
height: 100%;
padding: 4%;
}
.erweima img {
width: 100%;
margin-left: -3%;
}
.userinfo {
width: 70%;
padding: 5% 10% 0 2%;
}
.name {
font-size: 5vw;
border-bottom: 1px solid #000;
font-weight: bolder;
}
.sex {
font-size: 4vw;
}
.sfz {
font-size: 2.5vw;
margin-top: 3%;
font-weight: 500;
}
.right_xia {
padding-top: 5%;
padding-right: 2%;
padding-left: 2%;
}
table {
width: 100%;
text-align: center;
border: 1px solid #000;
font-size: 2.1vw;
}
td {
border: 1px solid #000;
padding: 0px;
}
tr {
padding: 0px;
}
.zhang {
position: absolute;
top: 35vw;
left: 20%;
}
.zhang img {
width: 21vw;
}
</style>

@ -1,7 +1,7 @@
<template>
<div class="LoginMain">
<!-- <van-loading color="#1989fa" >登录中...</van-loading> -->
<van-button class="button" round type="default" :loading="loading" @click="login"></van-button>
<van-button class="button" round type="default" :loading="loading" @click="login">{{buttonText}}</van-button>
</div>
</template>
@ -14,13 +14,29 @@
useRoute,
useRouter
} from "vue-router"
const route = useRoute()
const login = () => {
loading.value=true
window.location.replace(import.meta.env.VITE_APP_WXCODE_URL)
}
let loading=ref(false)
let buttonText=ref('开始预约')
onMounted(() => {
let tijian_num =route.query.tijian_num
let logintype =route.query.logintype
sessionStorage.setItem('loginType', logintype);
sessionStorage.setItem('tijian_num', tijian_num);
let sloginType=sessionStorage.getItem('loginType');
console.log(sloginType)
if(sloginType=='undefined'){
console.log('denglu')
buttonText.value='开始预约'
}else{
console.log('report')
buttonText.value='查看报告'
}
//router.replace('/selectOrganization')
//window.location.href="http://localhostcommon/wxLogin"

@ -16,7 +16,7 @@
<van-col span="18">{{reportinfo.id_card_num}}</van-col>
</van-row>
<van-row class="button">
<van-col span="12"><RouterLink to="/healthCertificate"><van-button size="small" plain>查看健康证</van-button></RouterLink></van-col>
<van-col span="12"><van-button @click="gotoHealthCertificate" size="small" plain>查看健康证</van-button></van-col>
<van-col span="12"><van-button size="small" @click="previewReport" plain>查看报告</van-button></van-col>
</van-row>
<div class="title1">北京市从业人员体检结果</div>
@ -85,8 +85,9 @@ let list = [
document.title='报告查询'
let reportinfo=ref('')
const getDetail=()=>{
let sfz=sessionStorage.getItem('sfz');
loading.value=true
GetPersonReportDetail({tijian_num:'34567'}).then(res => {
GetPersonReportDetail({sfz:sfz}).then(res => {
loading.value=false
if (res.status) {
reportinfo.value=res.data.info
@ -116,6 +117,13 @@ const previewReport=()=>{
}
}
const gotoHealthCertificate=()=>{
if(reportinfo.value.result_status==1){
router.push('/healthCertificate')
}else{
showToast('暂无对应此次体检结果的健康证');
}
}
onMounted(()=>{
getDetail()
})

Loading…
Cancel
Save