完善功能

main
yanzai 2 years ago
parent 1a8b630969
commit 5440472fed

@ -6,6 +6,8 @@ use App\Http\Controllers\Controller;
use App\Services\Login\LoginService;
use Illuminate\Http\Request;
use Yz;
use App\Lib\HSM;
use App\Lib\XTSign;
class LoginController extends Controller
{
public function Login(){
@ -15,4 +17,37 @@ class LoginController extends Controller
//$login= new LoginService();
return Yz::echo($login->Login(['username'=>$username,'password'=>$password]));
}
public function test(){
//加密解密测试
// dd( HSM::HsmDecrypt("9bef05d29d91d1058b742261638b8d1c"));
//登录签名测试
$data=[
"userName"=>"张三",
"idType"=>"SF",
"idNumber"=>"513436200005039287",
"department"=>'QT',
"mobile"=>"18745292116",
];
//产生激活码测试
$data=[
'userId'=>'b24d281af0b7f2bc3a49c90cf1853cd2e59569c982cb10970aa60a254bcc83f7'
];
//添加任务签名
$data=[
// "userId"=>"b24d281af0b7f2bc3a49c90cf1853cd2e59569c982cb10970aa60a254bcc83f7",
"title"=>"测试签名",
"dataType"=>"DATA",
"algo"=>"SM3withSM2",
"description"=>"签名数据描述信息",
"expiryDate"=>"1440",
"data"=>"562+5ZCN5rWL6K+V5pWw5o2u",
"requireQrCode"=>"N",
"callBackUrl"=>"https://www.yanzai.vip/common/laravel/public/api/XTSignNotify"
];
$r=XTSign::XTRequest('addSignJob',$data);
return $r;
}
}

@ -17,6 +17,10 @@ class HealthCheckupController extends Controller
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['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不能为空');
$s=app()->make(HealthCheckupService::class);
return $s->CreateRecord($CheckupInfo);
}
@ -38,19 +42,20 @@ class HealthCheckupController extends Controller
public function UploadFile(Request $request){
$file=request('file');
$id_card_num=request('id_card_num');
$tijian_num=request('tijian_num');
date_default_timezone_set('PRC');
$currentYear = date('Y');
$firstDay = date('Y-01-01', strtotime($currentYear));
$lastDay = date('Y-12-31', strtotime($currentYear));
$cha=DB::table('examination_records')->where(['id_card_num'=>$id_card_num])->whereBetween('created_at', [$firstDay, $lastDay])->get();
if(count($cha)==0) return \Yz::echoError1('未找到此用户的体检记录,无法存储报告');
$cha=DB::table('examination_records')->where(['id_card_num'=>$id_card_num,'tijian_num'=>$tijian_num])->whereBetween('created_at', [$firstDay, $lastDay])->get();
if(count($cha)==0) return \Yz::echoError1('未找到此用户对应的体检记录,无法存储报告');
if ($file->isValid()) {
$s=app()->make(HealthCheckupService::class);
$save=$s->SaveFile(['file'=>$file]);
if(!$save['status']) return \Yz::echoError1('文件保持失败');
$u=DB::table('examination_records')->where(['id'=>$cha[0]->id])->update(['report_file'=>$save['data']]);
@ -64,6 +69,17 @@ class HealthCheckupController extends Controller
return \Yz::echoError1('获取文件失败');
}
}
//根据身份证号码查询体检记录列表
public function GetPersonCheckUpList(){
$id_card_num=request('id_card_num');
$s=app()->make(HealthCheckupService::class);
return $s->GetPersonCheckUpList(['id_card_num'=>$id_card_num]);
}
//根据体检号查询体检详情
public function GetPersonCheckUpDetail(){
$tijian_num=request('tijian_num');
$s=app()->make(HealthCheckupService::class);
return $s->GetPersonCheckUpDetail(['tijian_num'=>$tijian_num]);
}
}

@ -0,0 +1,30 @@
<?php
namespace App\Http\Controllers\API;
use App\Http\Controllers\Controller;
use App\Services\Admin\YeWu\HealthCheckupService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class UpLoadController extends Controller
{
public function UpFile(){
$file=request('file');
if ($file->isValid()) {
// $s=app()->make(HealthCheckupService::class);
// $save=$s->SaveFile(['file'=>$file]);
$date = date("Ymd");
$save = $file->store('public/H5Upload/'.$date);
return \Yz::Return(true,'上传成功',$save);
}else{
return \Yz::echoError1('获取文件失败');
}
}
}

@ -0,0 +1,135 @@
<?php
namespace App\Http\Controllers\API;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Lib\XTSign;
use JWT;
use App\Services\Login\LoginService;
class XTSignController extends Controller
{
//添加签名任务展示二维码
public function addSignJob(){
//添加任务签名
$data=[
// "userId"=>"b24d281af0b7f2bc3a49c90cf1853cd2e59569c982cb10970aa60a254bcc83f7",
"title"=>"用户身份确认签名",
"dataType"=>"DATA",
"algo"=>"SM3withSM2",
"description"=>"用户身份确认签名",
"expiryDate"=>"1440",
"data"=>"562+5ZCN5rWL6K+V5pWw5o2u",
"requireQrCode"=>"N",
"callBackUrl"=>"https://www.yanzai.vip/common/laravel/public/api/XTSignNotify"
];
return XTSign::XTRequest('addSignJob',$data);
}
//用户绑定协同签名id
public function bindUser(Request $request){
$userid = $request->get('userid');//中间件产生的参数
$pwd=request('pwd'); //密码
$signJobId=request('signJobId'); //签名任务 id
$cha=DB::table('xt_sign_notify')->where(['sign_job_id'=>$signJobId])->get();
if(count($cha)>0){
//解析证书信息
$data=[
"cert"=>$cha[0]->sign_cert
];
$certInfo= XTSign::XTRequest('getCertInfo',$data);
if($certInfo['status']){
$s=app()->make(LoginService::class);
$check=$s->CheckPwd(['userid'=>$userid,'password'=>$pwd]);
if($check['status']){
$u=DB::table('users')->where(['id'=>$userid])->update([
'xtsign_userid'=>$certInfo['data']['userId'],
'xtsign_username'=>$certInfo['data']['certCN']
]);
if($u){
return \Yz::Return(true,'绑定成功',[]);
}else{
return \Yz::echoError1("绑定失败");
}
}else{
return \Yz::echoError1("密码验证失败");
}
}
}
}
//检查协同签名回调状态
public function CheckNotify(){
$notifyType=request('notifyType'); //回调类型
$signJobId=request('signJobId'); //签名任务 id
$cha=DB::table('xt_sign_notify')->where(['sign_job_id'=>$signJobId])->get();
if(count($cha)>0){
//如果查到回调结果,判断回调结果,进行验签和查询证书详情获取用户信息
if($notifyType=='bind') { //绑定操作
return \Yz::Return(true,'扫码成功',[]);
}
//解析证书信息
$data=[
"cert"=>$cha[0]->sign_cert
];
$certInfo= XTSign::XTRequest('getCertInfo',$data);
if($certInfo['status']){
$query= DB::table('users')->where(['xtsign_userid'=>$certInfo['data']['userId'],'status'=>1])->get();
if(count($query)>0){
$jwt= new JWT();
$accessTimeout = $jwt -> GetGetSecretTimeOut();
$refreshTimeout = $jwt -> GetRefreshTokenTimeOut();
$access_token = $jwt->BuildJWT('yz','access',$query[0]->id,$query[0]->group,$accessTimeout);
$refresh_token = $jwt->BuildJWT('yz','refresh',$query[0]->id,'',$refreshTimeout);
if(!empty($arr['mian7'])){
$mian7_token = $jwt->BuildJWT('yz','mian7',$query[0]->id,'',$jwt -> GetMian7TokenTimeOut());
$result['mian7_token']=$mian7_token;
}
DB::table('users')->where(['id'=>$query[0]->id,'status'=>1])->update(['token'=>md5($refresh_token)]);
$result['token']=$access_token;
$result['refresh_token']=$refresh_token;
$result['status']='ok';
return \Yz::Return(true,'用户匹配成功',$result);
}else{
return \Yz::echoError1("扫码失败,未找到关联此用户的信息");
}
}
// return \Yz::Return(true,'查到回调信息',$cha);
}else{
return \Yz::echoError1("暂未回调");
}
}
//协同签名回调
public function Notify(){
$signJobId=request('signJobId'); //签名任务 id
$status =request('status'); //签名任务状态
$msspId=request('msspId'); //用户唯一标识
$signResult =request('signResult'); //签名结果
$signCert =request('signCert'); //签名证书
$i=DB::table('xt_sign_notify')->insert([
'sign_job_id'=>$signJobId,
'status'=>$status,
'mssp_id'=>$msspId,
'sign_result'=>$signResult,
'sign_cert'=>$signCert
]);
if($i){
$rd=[
"status"=>200,
"message"=>"SUCCESS",
"data"=>[
"signJobId"=>$signJobId,
"status"=>$status
]
];
return $rd;
}
}
}

@ -32,7 +32,8 @@ class OrganizationController extends Controller
}
$s=app()->make(OrganizationService::class);
return $s->StartYuYue(['openid'=>$openid,'group'=>$group,'info'=>$subinfo]);
$type=1;//1 健康证体检 2老年人体检
return $s->StartYuYue(['openid'=>$openid,'group'=>$group,'info'=>$subinfo],$type);
}else{
return \Yz::echoError1("参数不完整");
}

@ -0,0 +1,66 @@
<?php
namespace App\Lib;
class HSM
{
protected static $baseurl="http://223.70.139.221:2018";
protected static $keyIndex=1;
protected static $encAlg="SM4/CBC/PKCS5Padding";
protected static $iv="31323334353637383132333435363738";
//加密
public static function HsmEncrypt($str){
$str = bin2hex($str);
$url= self::$baseurl."/api/hsm/sym/symEncryptInternalForKEK";
$data=[
"keyIndex"=>self::$keyIndex,
"encAlg"=>self::$encAlg,
"iv"=>self::$iv,
"plainData"=>$str
];
$data=json_encode($data);
$encryptStr=self::post($url,$data);
$r_data=json_decode($encryptStr, true);
// dd($r_data);
if($r_data['status']==0){
return ['encrypt_str'=>$r_data['body']['cipherData'],'status'=>true];
}else{
return ['status'=>false];
}
}
//解密
public static function HsmDecrypt($str){
$url= self::$baseurl."/api/hsm/sym/symDecryptInternalForKEK";
$data=[
"keyIndex"=>self::$keyIndex,
"encAlg"=>self::$encAlg,
"iv"=>self::$iv,
"cipherData"=>$str
];
$data=json_encode($data);
$encryptStr=self::post($url,$data);
$r_data=json_decode($encryptStr, true);
if($r_data['status']==0){
return ['decrypt_str'=>hex2bin($r_data['body']['plain']),'status'=>true];
}else{
return ['status'=>false];
}
}
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;
}
}

@ -0,0 +1,107 @@
<?php
namespace App\Lib;
class XTSign
{
const Appid="APP_7B3F36A14E99410A80B37AEF332E3247";
const Key="DLwiH46Esb8ccNTkuSSVAadNTWUfW0sc";
const BaseUrl="https://newcoss-dev.isignet.cn:10201";
const ApiList=[
'register'=>self::BaseUrl."/coss/service/v1/addUser", //注册
'getAuthCode'=>self::BaseUrl."/coss/service/v1/getAuthCode", //产生激活码
'addSignJob'=>self::BaseUrl."/coss/service/v1/addSignJob", //添加签名任务
'verifySignData'=>self::BaseUrl."/coss/service/v1/verifySignData", //验签接口 3.4.9.3
'getCertInfo'=>self::BaseUrl."/coss/service/v1/getCertInfo", //解析证书信息
];
//系统签名接口调用
public static function XTRequest($url,$data){
if(!isset(self::ApiList[$url])) return \Yz::echoError1("接口不存在");
$url= self::ApiList[$url];
$baseData=[
"version"=>"1.0",
"appId"=>self::Appid,
"signAlgo"=>"HMAC",
];
$data=array_merge($baseData, $data);
$sign=self::Sign($data);
$data= array_merge($data,['signature'=>$sign]);
// dd($data);
$data=json_encode($data);
$encryptStr=self::post($url,$data);
$r_data=json_decode($encryptStr, true);
if($r_data['status']==200){
return \Yz::Return(true,$r_data['message'],$r_data['data']);
}else{
return \Yz::echoError1($r_data['message']);
}
}
//产生激活码
// public static function getAuthCode(){
// $url= self::$baseUrl."/coss/service/v1/getAuthCode";
// $data=[
// "version"=>"1.0",
// "appId"=>self::$appid,
// "signAlgo"=>"HMAC",
// "userId"=>"915b164cd8e883f7fb289e3bcf34ac68d971c7e1058f18bcb24ad33ec7a201e1",
// ];
// $sign=self::Sign($data);
// $data= array_merge($data,['signature'=>$sign]);
// // dd($data);
// $data=json_encode($data);
// $encryptStr=self::post($url,$data);
// $r_data=json_decode($encryptStr, true);
//
// return $r_data;
// }
public static function Sign($parameters){
// 定义 M 集合内的参数值
// $parameters = array(
// "key1" => "value1",
// "key2" => "value2",
// // ...
// );
// 按照参数名的 ASCII 码从小到大排序
ksort($parameters);
// 拼接参数为 URL 键值对字符串
$stringA = "";
foreach ($parameters as $key => $value) {
if ($value === "") {
// 参数值为空,进行相应的处理
// 比如跳过该参数或者抛出异常
continue;
}
$stringA .= $key . "=" . $value . "&";
}
$stringA = rtrim($stringA, "&");
// HMAC 运算
$secretKey =self::Key;
$signature = base64_encode(hash_hmac("sha256", $stringA, $secretKey, true));
return $signature;
}
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;
}
}

@ -60,7 +60,7 @@ class UserService
return $result;
}
public function GetDetail($arr){
$c=DB::table('users')->select(['id','cn_name','username','status','group','img'])->where(['id'=>$arr['id']])->whereIn('status',[0,1])->get();
$c=DB::table('users')->select(['id','cn_name','username','status','group','img','xtsign_userid','xtsign_username'])->where(['id'=>$arr['id']])->whereIn('status',[0,1])->get();
if(count($c)){
$result['info']=$c;
$result['status']='ok';

@ -12,14 +12,19 @@ class HealthCheckupService
$firstDay = date('Y-01-01', strtotime($currentYear));
$lastDay = date('Y-12-31', strtotime($currentYear));
//检查今年是否体检过
$s=app()->make(PersonService::class);
$check=$s->GetPersonRecode(['id_num'=>$CheckupInfo['id_card_num']]);
if(!$check['status']) return $check;
//如果此次报告内容是免费类型,则检查今年是否进行过免费体检
// if($CheckupInfo['fee_type']==0){
// $s=app()->make(PersonService::class);
// $check=$s->GetPersonRecode(['id_num'=>$CheckupInfo['id_card_num']]);
//
// if(!$check['status']) return $check;
// }
$org_id=DB::select("select id from medical_institution where sn=?",[$CheckupInfo['institution_sn']]);
if(count($org_id)!=1) return \Yz::echoError1('机构码不存在');
$status=false;
DB::beginTransaction(); // 开始事务
try {
// 执行数据库操作
@ -34,10 +39,20 @@ class HealthCheckupService
}
//检查体检流水号是否存在,存在禁止再次插入。
$check_cunzai=DB::table('examination_records')->where('tijian_num',$CheckupInfo['tijian_num'])->get();
if(count($check_cunzai)>0) return \Yz::echoError1('此体检号已经存在,禁止创建');
$u2=DB::table('examination_records')->insert([
"name"=>$CheckupInfo['name'],
"id_card_num"=>$CheckupInfo['id_card_num'],
"type"=>$CheckupInfo['type'],
"institution_id"=>$org_id[0]->id
"institution_id"=>$org_id[0]->id,
"tijian_time"=>$CheckupInfo['tijian_time'],
"tijian_num"=>$CheckupInfo['tijian_num'],
"report_content"=>json_encode($CheckupInfo['report_content']),
"fee_type"=>$CheckupInfo['fee_type']
]);
if($CheckupInfo['type']==1){
@ -62,12 +77,12 @@ class HealthCheckupService
} catch (\Exception $e) {
DB::rollBack(); // 回滚事务
dd($e);
}
if($status){
return \Yz::Return(true,'ok',[]);
return \Yz::Return(true,'记录完成',["num"=>$CheckupInfo['tijian_num']]);
}else{
return \Yz::echoError1("操作失败");
}
@ -76,8 +91,26 @@ class HealthCheckupService
//保存文件返回存储路径
public function SaveFile($arr){
$date = date("Ymd");
$path = $arr['file']->store('public/'.$date);
return \Yz::Return(true,'',$path);
}
//查询个人查询体检记录列表
public function GetPersonCheckUpList($arr){
$list = DB::table("examination_records")->where(['id_card_num'=>$arr['id_card_num']])->get();
return \Yz::Return(true,'查询成功',['list'=>$list,'count'=>count($list)]);
}
//根据体检号查询体检详情
public function GetPersonCheckUpDetail($arr){
$detail=DB::table('examination_records')->where(['tijian_num'=>$arr['tijian_num']])->first();
if(!empty($detail)){
return \Yz::Return(true,'查询成功',$detail);
}else{
return \Yz::echoError1("未找到记录");
}
}
}

@ -55,11 +55,12 @@ class OrganizationService
return $result;
}
//开始预约
public function StartYuYue($arr){
public function StartYuYue($arr,$type=1){
$result=array();
$openid=$arr['openid'];
$group=$arr['group'];
$info=$arr['info'];
//判断用户是否有效
$cha_info=DB::table('persons')->select(['id','name','id_card_num'])->where(['openid'=>$openid,'status'=>1])->get();
if(!count($cha_info)){
@ -76,7 +77,7 @@ class OrganizationService
if(count($cha)) {
return \Yz::Return(false,'本年度已经预约过,无法继续预约');
}
//判断是否体检过
//判断是否免费体检过
$s=app()->make(PersonService::class);
$char=$s->GetPersonRecode(['openid'=>$openid,'group'=>$group]);
@ -95,27 +96,52 @@ class OrganizationService
}
//如果都通过则继续
DB::beginTransaction();
try {
$idd=DB::table('appointment_record')->insertGetId(
[
'type'=>$type,
'calendar_id' => $info['calendar_id'],
'name' => $cha_info[0]->name,
'id_card_num' => $cha_info[0]->id_card_num,
'person_id'=>$cha_info[0]->id,
'openid'=>$openid,
'date'=>$q_date[0]->date,
'time'=>$q_date[0]->time,
'doc_type_id'=>$info['doc_id'],
'doc_type_name'=>$info['doc_name'],
'org_id'=>$info['org_id'],
'status'=>1
]
);
$file=array();
foreach ($info['upfileList'] as $key=> $fvalue) {
foreach ($fvalue as $key2=> $fvalue2) {
$file[]=[
'type' =>$key,
'appointment_record_id' =>$idd,
'imgurl' =>$fvalue2,
];
}
}
$i=DB::table('appointment_record')->insert(
[
'calendar_id' => $info['calendar_id'],
'name' => $cha_info[0]->name,
'id_card_num' => $cha_info[0]->id_card_num,
'person_id'=>$cha_info[0]->id,
'openid'=>$openid,
'date'=>$q_date[0]->date,
'time'=>$q_date[0]->time,
'doc_type_id'=>$info['doc_id'],
'doc_type_name'=>$info['doc_name'],
'org_id'=>$info['org_id'],
'status'=>1
]
);
if($i){
return \Yz::Return(true,'预约完成');
}else{
$i_img=DB::table('appointment_img')->insert($file);
if($i_img){
DB::commit();
return \Yz::Return(true,'预约完成');
}else{
DB::rollback();
return \Yz::Return(false,'预约失败');
}
} catch (Exception $e) {
DB::rollback();
return \Yz::Return(false,'预约失败');
}
}
}

@ -41,7 +41,7 @@ class PersonService
return $result;
}
//检测是否体检
//检测是否进行过免费体检
public function GetPersonRecode($arr){
$result=array();
$id_num='';
@ -64,15 +64,19 @@ class PersonService
$currentYear = date('Y');
$firstDay = date('Y-01-01', strtotime($currentYear));
$lastDay = date('Y-12-31', strtotime($currentYear));
//查询体检预约记录
$c=DB::table('examination_records')->select(['id','id_card_num','created_at as insertime'])->where([['id_card_num','=',$id_num],['created_at','>=',$firstDay],['created_at','<=',$lastDay]])->get();
//查询体检记录表 免费体检记录
$c=DB::table('examination_records as a') ->join('medical_institution as b', 'a.institution_id', '=', 'b.id')
->select(['a.id','a.institution_id','a.id_card_num','a.tijian_num','a.tijian_time','a.created_at as insertime','b.org_name'])->where([['a.id_card_num','=',$id_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;
}else{
$result['status']=true;
$result['msg']='可以继续,本年度无体检记录';
$result['msg']='可以继续,本年度无免费体检记录';
$result['info']=$c;
}
}else{
$result['status']=false;

@ -45,6 +45,7 @@ Route::group(['middleware'=>['checktoken','log'],'prefix'=>'v1'],function () {
Route::post('admin/CalendarGetList','App\Http\Controllers\API\Admin\YeWu\healthCalendarController@getList'); //admin后台获取日历列表
Route::post('admin/CalendarListDel','App\Http\Controllers\API\Admin\YeWu\healthCalendarController@Del'); //admin后台删除日历
Route::post('admin/CalendarChangeInfo','App\Http\Controllers\API\Admin\YeWu\healthCalendarController@ChangeInfo'); //admin后台更新日历
Route::post('admin/XTSignBindUser','App\Http\Controllers\API\XTSignController@bindUser');//admin后台用户绑定协同签名useid
});
@ -56,15 +57,23 @@ Route::group(['middleware'=>['checktoken','log'],'prefix'=>'v1/mH5'],function ()
Route::post('GetOrgEnableList','App\Http\Controllers\API\mH5\OrganizationController@GetEnableList'); //获取可用体检机构
Route::post('GetEnableCalendar','App\Http\Controllers\API\mH5\OrganizationController@GetEnableCalendar'); //获取可用体检机构日历
Route::post('StartYuYue','App\Http\Controllers\API\mH5\OrganizationController@StartYuYue'); //开始预约
Route::post('UpFile','App\Http\Controllers\API\UpLoadController@UpFile'); //上传文件
});
//对外接口
Route::group(['middleware'=>['check.sign','log'],'prefix'=>'v1'],function () {
Route::get('CreateCheckupRecord','App\Http\Controllers\API\Admin\YeWu\HealthCheckupController@CreateRecord'); //创建预约记录
Route::post('CreateCheckupRecord','App\Http\Controllers\API\Admin\YeWu\HealthCheckupController@CreateRecord'); //创建预约记录
Route::get('GetAppointmentRecord','App\Http\Controllers\API\Admin\YeWu\HealthCheckupController@GetAppointmentRecord'); //获取个人预约详情
Route::get('CheckRequirements','App\Http\Controllers\API\Admin\YeWu\HealthCheckupController@CheckRequirements'); //检查是否能进行免费体检
Route::post('UploadFile','App\Http\Controllers\API\Admin\YeWu\HealthCheckupController@UploadFile');
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('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('addSignJob','App\Http\Controllers\API\XTSignController@addSignJob')->middleware('log'); ; //添加签名任务展示二维码

@ -14,6 +14,7 @@
"echarts": "^5.4.3",
"element-plus": "^2.3.14",
"pinia": "^2.1.6",
"qrcode": "^1.5.3",
"vue": "^3.3.4",
"vue-router": "^4.2.4"
},
@ -878,7 +879,6 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"engines": {
"node": ">=8"
}
@ -887,7 +887,6 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@ -1003,6 +1002,14 @@
"node": ">=6"
}
},
"node_modules/camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"engines": {
"node": ">=6"
}
},
"node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@ -1019,11 +1026,20 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/cliui": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
"integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^6.2.0"
}
},
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@ -1034,8 +1050,7 @@
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"node_modules/combined-stream": {
"version": "1.0.8",
@ -1107,6 +1122,14 @@
}
}
},
"node_modules/decamelize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
"integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/deep-is": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
@ -1167,6 +1190,11 @@
"node": ">=0.4.0"
}
},
"node_modules/dijkstrajs": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
"integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA=="
},
"node_modules/doctrine": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
@ -1306,6 +1334,16 @@
}
}
},
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
},
"node_modules/encode-utf8": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz",
"integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw=="
},
"node_modules/esbuild": {
"version": "0.18.20",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
@ -1764,6 +1802,14 @@
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"engines": {
"node": "6.* || 8.* || >= 10.*"
}
},
"node_modules/get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
@ -1921,6 +1967,14 @@
"node": ">=0.10.0"
}
},
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"engines": {
"node": ">=8"
}
},
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
@ -2368,6 +2422,14 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"engines": {
"node": ">=6"
}
},
"node_modules/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@ -2384,7 +2446,6 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true,
"engines": {
"node": ">=8"
}
@ -2474,6 +2535,14 @@
}
}
},
"node_modules/pngjs": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz",
"integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==",
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/postcss": {
"version": "8.4.31",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
@ -2564,6 +2633,23 @@
"node": ">=6"
}
},
"node_modules/qrcode": {
"version": "1.5.3",
"resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz",
"integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==",
"dependencies": {
"dijkstrajs": "^1.0.1",
"encode-utf8": "^1.0.3",
"pngjs": "^5.0.0",
"yargs": "^15.3.1"
},
"bin": {
"qrcode": "bin/qrcode"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@ -2584,6 +2670,19 @@
}
]
},
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/require-main-filename": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
},
"node_modules/resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@ -2776,6 +2875,11 @@
"node": ">=10"
}
},
"node_modules/set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
},
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@ -2811,11 +2915,23 @@
"node": ">=0.10.0"
}
},
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
@ -3079,6 +3195,24 @@
"node": ">= 8"
}
},
"node_modules/which-module": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
"integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="
},
"node_modules/wrap-ansi": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
"integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@ -3094,12 +3228,98 @@
"node": ">=12"
}
},
"node_modules/y18n": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
"integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
},
"node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
},
"node_modules/yargs": {
"version": "15.4.1",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
"integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
"dependencies": {
"cliui": "^6.0.0",
"decamelize": "^1.2.0",
"find-up": "^4.1.0",
"get-caller-file": "^2.0.1",
"require-directory": "^2.1.1",
"require-main-filename": "^2.0.0",
"set-blocking": "^2.0.0",
"string-width": "^4.2.0",
"which-module": "^2.0.0",
"y18n": "^4.0.0",
"yargs-parser": "^18.1.2"
},
"engines": {
"node": ">=8"
}
},
"node_modules/yargs-parser": {
"version": "18.1.3",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
"integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
"dependencies": {
"camelcase": "^5.0.0",
"decamelize": "^1.2.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/yargs/node_modules/find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/yargs/node_modules/locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dependencies": {
"p-locate": "^4.1.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/yargs/node_modules/p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dependencies": {
"p-try": "^2.0.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/yargs/node_modules/p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dependencies": {
"p-limit": "^2.2.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",

@ -16,6 +16,7 @@
"echarts": "^5.4.3",
"element-plus": "^2.3.14",
"pinia": "^2.1.6",
"qrcode": "^1.5.3",
"vue": "^3.3.4",
"vue-router": "^4.2.4"
},

@ -86,4 +86,16 @@ export const CalendarChangeInfo = (data={}) => {
//admin后台更新日历
export const CheckMenuAuth = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/CheckMenuAuth',data:data})
}
//请求登录二维码
export const addSignJob = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'addSignJob',data:data})
}
//检查扫码回调结果
export const XTSignCheckNotify = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'XTSignCheckNotify',data:data})
}
//admin后台用户绑定协同签名useid
export const XTSignBindUser = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/XTSignBindUser',data:data})
}

@ -55,7 +55,7 @@ const router = createRouter({
path: '/adminChangPwd',
name: 'AdminChangPwd',
component: AdminChangPwd,
meta: { title: '修改密码' }
meta: { title: '用户中心' }
}, {
path: '/healthCalendar',
name: 'HealthCalendar',

@ -2,38 +2,60 @@
<div>
<el-container class="common-layout">
<el-row style="width: 100%; display: flex; justify-content: center;">
<el-col :span="9" class="left">
</el-col>
<el-col :span="15" class="right">
<div class="right_top">
<div>
<el-switch v-model="isDark" inline-prompt active-color="var(--el-fill-color-dark)"
inactive-color="var(--el-color-primary)" active-action-icon="Moon"
inactive-action-icon="Sunny" @change="toggleDark" />
<el-row style="width: 100%; display: flex; justify-content: center;">
<el-col :span="9" class="left">
</el-col>
<el-col :span="15" class="right">
<div class="right_top">
<div>
<el-switch v-model="isDark" inline-prompt active-color="var(--el-fill-color-dark)"
inactive-color="var(--el-color-primary)" active-action-icon="Moon"
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-item>
<span style="font-size: 22px;">登录您的账户</span>
</el-form-item>
<el-form-item>
<el-input v-model.number="username" :prefix-icon="User" placeholder="用户名" size="large" />
</el-form-item>
<el-form-item>
<el-input v-model="pwd" type="password" autocomplete="off" placeholder="密码" size="large"
:prefix-icon="Lock" />
</el-form-item>
<el-form-item>
<el-button style="width: 100%;" type="primary" @click="login(ruleFormRef)"
size="large">登录</el-button>
</el-form-item>
<el-form-item>
<el-button style="width: 50%;" @click="usePhone()" size="large"
:icon="Iphone">手机协同签名登录</el-button>
</el-form-item>
<div style="height: 160px;"></div>
</el-form>
<el-form v-else style="width: 400px;" status-icon class="demo-ruleForm erweima">
<el-form-item>
<span style="font-size: 22px;">请扫描二维码登录</span>
</el-form-item>
<div class="erweima_tu" v-loading="erweima_loading">
<canvas v-if="seconds>0" id="canvas" width="300" height="300" style="min-height: 300px;min-width: 300px;"></canvas>
<div v-else class="timeout" @click="refresh()">{{erweimaErrMsg}}
<div><RefreshRight style="height: 60px;width: 60px;"></RefreshRight></div>
</div>
</div>
<el-form style="width: 400px;" ref="ruleFormRef" status-icon
class="demo-ruleForm">
<el-form-item>
<span style="font-size: 22px;">登录您的账户</span>
</el-form-item>
<el-form-item>
<el-input v-model.number="username" :prefix-icon="User" placeholder="用户名" size="large"/>
</el-form-item>
<el-form-item >
<el-input v-model="pwd" type="password" autocomplete="off" placeholder="密码" size="large" :prefix-icon="Lock"/>
</el-form-item>
<el-form-item>
<el-button style="width: 100%;" type="primary" @click="login(ruleFormRef)" size="large">登录</el-button>
</el-form-item>
<div style="height: 160px;"></div>
</el-form>
<div></div>
</el-col>
</el-row>
<el-form-item>
<el-button style="width: 100%;" @click="UseErweima=false;seconds=0" size="large">返回账号密码</el-button>
</el-form-item>
<div style="height: 160px;"></div>
</el-form>
<div class="right_bottom"></div>
</el-col>
</el-row>
</el-container>
</div>
@ -41,26 +63,32 @@
<script setup>
import {
Login
Login,addSignJob,XTSignCheckNotify
} from "@/api/api.js";
import QRCode from 'qrcode'
import {
ElMessage
} from 'element-plus'
import {
ref
} from 'vue'
import { Lock, User } from '@element-plus/icons-vue'
import {
Lock,
User,
Iphone,RefreshRight
} from '@element-plus/icons-vue'
import {
useToggle
} from '@vueuse/shared'
import {
useDark
} from "@vueuse/core";
const erweima_loading=ref(false)
const UseErweima=ref(false) //使
const isDark = useDark()
const toggleDark = () => useToggle(isDark)
let username = ref('')
let pwd = ref('')
@ -79,19 +107,96 @@
// sessionStorage.setItem('tk', JSON.stringify(res.data.tk));
var token = sessionStorage.getItem('token');
if (token == res.data.token) {
window.location.href = "./#/dashboard"
}
} else {
ElMessage.error(res.data.msg)
}
})
}
const refresh=()=>{
usePhone()
}
let erweimaErrMsg=ref('扫描超时,点击刷新');
let signJobId=ref('');////id
let qrcode=ref('');
//使
const usePhone=()=>{
clearInterval(timer);
signJobId.value=''
qrcode.value=''
seconds.value=timelength
erweima_loading.value=true
UseErweima.value=true
addSignJob({}).then(res => {
if(res.status){
qrcode.value = JSON.stringify(JSON.parse(res.data.qrCode));
signJobId.value=res.data.signDataId;
console.log(qrcode.value )
var canvas = document.getElementById("canvas");
//
QRCode.toCanvas(canvas,qrcode.value, function(error) {
if (error) {
console.error(error);
} else {
erweima_loading.value=false
start_time()
console.log("success!");
}
})
}else{
ElMessage.error(res.msg)
}
})
}
//60
let timelength=60
let seconds = ref(0);
seconds.value=timelength
let pinlv=5 ///
let timer
const start_time=()=>{
timer = setInterval(CheckNotify, pinlv*1000);
}
//
const CheckNotify=()=>{
if (seconds.value <= 0) {
console.log("倒计时结束!");
clearInterval(timer);
} else {
console.log(seconds.value + "秒");
XTSignCheckNotify({signJobId:signJobId.value}).then(res=>{
if(res.msg !='暂未回调'){
//
clearInterval(timer);
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{
ElMessage.error(res.msg)
erweimaErrMsg.value=res.msg
seconds.value=0
}
}
})
seconds.value=seconds.value-pinlv;
}
}
</script>
<style scoped>
@ -107,27 +212,30 @@
justify-content: center;
align-items: center;
}
.left{
.left {
display: flex;
align-items: center;
justify-content: center;
height: 100vh;
background-color: var(--color-table-th-background);
background-image: url('../assets/loginBackg.png');
background-size: 100% ;
background-size: 100%;
background-repeat: no-repeat;
background-position: center center;
background-position: center center;
}
.right{
.right {
display: flex;
align-items: center;
justify-content: space-between;
flex-direction: column;
}
.right_top{
.right_top {
display: flex;
justify-content: flex-end;
width: 100%;
@ -135,4 +243,23 @@
padding-top: 10px;
padding-bottom: 10px;
}
.erweima{
}
.erweima_tu {
width: 300px;
height: 300px;
border: 1px solid #ccc;
margin-left: auto;
margin-right: auto;
margin-bottom: 20px;
text-align: center;
color: coral;
}
.timeout{
margin-top: 40%;
text-align: center;
color: coral;
cursor:pointer;
}
</style>

@ -1,6 +1,23 @@
<template>
<div v-loading="loading">
<el-form label-width="120px">
<el-form label-width="180px" style="border: 1px solid #e9e9e9; border-radius: 5px;">
<el-row style="padding: 20px;margin:10px ;">
<el-col :span="16" v-if="userinfo.length==1">
<el-form-item v-if="userinfo[0].xtsign_userid != '' && userinfo[0].xtsign_userid !=null " label="已绑定的协同签名用户">
<el-icon color="#409EFC"><Iphone /></el-icon> <span style="font-weight: 700;color: #333;"> {{userinfo[0].xtsign_username}}</span>
</el-form-item>
<el-button style="margin-left: 40px;"
:icon="Iphone" type="primary" @click="Scan()"><span v-if="userinfo[0].xtsign_userid == '' || userinfo[0].xtsign_userid ==null"></span><span v-else></span></el-button>
</el-col>
</el-row>
</el-form>
<el-form label-width="120px" style="border: 1px solid #e9e9e9; border-radius: 5px;margin-top: 8px;">
<el-row style="padding: 20px;margin:10px ;">
<el-col :span="16">
修改密码
</el-col>
</el-row>
<el-row style="padding: 20px;margin:10px ;">
<el-col :span="16">
<el-form-item label="旧密码">
@ -19,11 +36,32 @@
<el-col :span="8" style="display:flex;align-items:center;"><el-button type="primary" size="large"
@click="SetPwd"> </el-button></el-col>
</el-row>
</el-form>
<el-dialog
v-model="dialogVisible"
title="绑定协同签名"
width="40%"
>
<el-form status-icon class="demo-ruleForm erweima">
<el-form-item>
<span style="font-size: 22px;">请使用app扫描二维码绑定</span>
</el-form-item>
<div class="erweima_tu" v-loading="erweima_loading">
<canvas v-if="seconds>0" id="canvas" width="300" height="300" style="min-height: 300px;min-width: 300px;"></canvas>
<div v-else class="timeout" @click="refresh()">{{erweimaErrMsg}}
<div><RefreshRight style="height: 60px;width: 60px;"></RefreshRight></div>
</div>
</div>
<div style="height: 160px;"></div>
</el-form>
</el-dialog>
</div>
</template>
<script setup>
import QRCode from 'qrcode'
import {
ref,
onMounted
@ -32,9 +70,25 @@
ElMessage,ElMessageBox
} from 'element-plus'
import {
adminChangePwd
Iphone
} from '@element-plus/icons-vue'
import {
adminChangePwd,addSignJob,XTSignCheckNotify,XTSignBindUser,GetBaseAdminUserInfo
} from '@/api/api.js'
let loading=ref(false)
//
let userinfo=ref([]);
const getUserBaseInfo=()=>{
GetBaseAdminUserInfo().then(res=>{
if(res.status=='ok'){
userinfo.value=res.info
}else{
ElMessage.error(res.msg)
}
})
}
getUserBaseInfo()//
let oldpwd=ref('')
let newpwd=ref('')
let renewpwd=ref('')
@ -59,7 +113,140 @@
ElMessage.error("两次密码不一致,请重新输入!")
}
}
let dialogVisible=ref(false)
const Scan=()=>{
dialogVisible.value=true
usePhone()
}
const erweima_loading=ref(false)
const UseErweima=ref(false) //使
const refresh=()=>{
usePhone()
}
let erweimaErrMsg=ref('扫描超时,点击刷新');
let signJobId=ref('');////id
let qrcode=ref('');
//
const usePhone=()=>{
clearInterval(timer);
signJobId.value=''
qrcode.value=''
seconds.value=timelength
erweima_loading.value=true
UseErweima.value=true
addSignJob({}).then(res => {
if(res.status){
qrcode.value = JSON.stringify(JSON.parse(res.data.qrCode));
signJobId.value=res.data.signDataId;
console.log(qrcode.value )
var canvas = document.getElementById("canvas");
//
QRCode.toCanvas(canvas,qrcode.value, function(error) {
if (error) {
console.error(error);
} else {
erweima_loading.value=false
start_time()
console.log("success!");
}
})
}else{
ElMessage.error(res.msg)
}
})
}
//60
let timelength=60
let seconds = ref(0);
seconds.value=timelength
let pinlv=2 ///
let timer
const start_time=()=>{
timer = setInterval(CheckNotify, pinlv*1000);
}
//const saoma_status=ref(false) //
//
const CheckNotify=()=>{
if (seconds.value <= 0) {
console.log("倒计时结束!");
clearInterval(timer);
} else {
console.log(seconds.value + "秒");
XTSignCheckNotify({signJobId:signJobId.value,notifyType:'bind'}).then(res=>{
if(res.msg !='暂未回调'){
//
clearInterval(timer);
if(res.status){
dialogVisible.value=false
ElMessageBox.prompt('扫码成功,请输入登录密码,验证绑定', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
inputType:'password'
})
.then(({ value }) => {
console.log(value)
XTbind(value)
})
.catch(() => {
})
}else{
ElMessage.error(res.msg)
erweimaErrMsg.value=res.msg
seconds.value=0
}
}
})
seconds.value=seconds.value-pinlv;
}
}
//userid
const XTbind=(pwd)=>{
XTSignBindUser({signJobId:signJobId.value,pwd:pwd}).then(res=>{
if(res.status){
ElMessageBox.alert('绑定成功', '提示', {
// if you want to disable its autofocus
// autofocus: false,
confirmButtonText: 'OK',
callback: () => {
getUserBaseInfo()
},
})
}else{
ElMessage.error(res.msg)
}
})
}
</script>
<style>
<style scoped>
.erweima_tu {
height: 310px;
margin-left: auto;
margin-right: auto;
margin-bottom: 20px;
text-align: center;
color: coral;
}
.timeout{
margin-top: 20%;
text-align: center;
color: coral;
cursor:pointer;
}
.saoma_tishi{
color: #7cba74;
padding-top: 20%;
font-size: 20px;
}
</style>

@ -23,4 +23,9 @@ export const GetEnableCalendar = (data) => {
//开始预约
export const StartYuYue = (data) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/mH5/StartYuYue',data:data})
}
//上传图片
export const UpFile = (data) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/mH5/UpFile',data:data})
}

@ -1,5 +1,5 @@
<template>
<div class="c_loading">
<div v-if="status==true" class="c_loading">
<van-row class="loading" v-if="status==true">
<van-col span="24" style="text-align: center;"><van-loading color="#33cdc9" >加载中...</van-loading></van-col>
</van-row>

@ -18,13 +18,13 @@ export const usePiniaStore = defineStore('usePiniaStore', () => {
img:'foodpng',
fileList:[
{label:'1.《食品生产许可证》《食品经营许可证》《北京市小规模食品生产经营许可证》《北京市小食杂店备案卡》或《网络食品交易第三方平台提供者备案信息表》复印件。(以上材料有其一即可)',
fileurl:''},
fileurl:[]},
{label:'2.用工证明或拟录用证明(如劳动合同、工作证、就业协议书等;原件现场核查,复印件加盖用人单位公章存档)',
fileurl:''},
fileurl:[]},
{label:'3.免费健康检查申请单',
fileurl:''},
fileurl:[]},
{label:'4.从业人员有效身份证件',
fileurl:''},
fileurl:[]},
]
},{
id:2,
@ -33,13 +33,13 @@ export const usePiniaStore = defineStore('usePiniaStore', () => {
img:'huazhuangpin',
fileList:[
{label:'1.《化妆品生产许可证》复印件、营业执照复印件(经营范围应包括:化妆品生产或相关内容)、化妆品注册备案信息服务平台中的化妆品注册人/备案人企业信息资料管理界面截图。(以上材料有其一即可)',
fileurl:''},
fileurl:[]},
{label:'2.用工证明或拟录用证明(如劳动合同、工作证、就业协议书等;原件现场核查,复印件加盖用人单位公章存档)',
fileurl:''},
fileurl:[]},
{label:'3.免费健康检查申请单',
fileurl:''},
fileurl:[]},
{label:'4.从业人员有效身份证件',
fileurl:''},
fileurl:[]},
]
},{
id:3,
@ -48,13 +48,13 @@ export const usePiniaStore = defineStore('usePiniaStore', () => {
img:'gonggongpng',
fileList:[
{label:'1.《卫生许可证》复印件',
fileurl:''},
fileurl:[]},
{label:'2.用工证明或拟录用证明(如劳动合同、工作证、就业协议书等;原件现场核查,复印件加盖用人单位公章存档)',
fileurl:''},
fileurl:[]},
{label:'3.免费健康检查申请单',
fileurl:''},
fileurl:[]},
{label:'4.从业人员有效身份证件',
fileurl:''},
fileurl:[]},
]
},{
id:4,
@ -63,13 +63,13 @@ export const usePiniaStore = defineStore('usePiniaStore', () => {
img:'yinyongshui',
fileList:[
{label:'1.营业执照(经营范围应包括:饮用水供水服务或相关内容)或《卫生许可证》复印件。(以上材料有其一即可)',
fileurl:''},
fileurl:[]},
{label:'2.用工证明或拟录用证明(如劳动合同、工作证、就业协议书等;原件现场核查,复印件加盖用人单位公章存档)',
fileurl:''},
fileurl:[]},
{label:'3.免费健康检查申请单',
fileurl:''},
fileurl:[]},
{label:'4.从业人员有效身份证件',
fileurl:''},
fileurl:[]},
]
},{
id:5,
@ -78,13 +78,13 @@ export const usePiniaStore = defineStore('usePiniaStore', () => {
img:'xiaodupng',
fileList:[
{label:'1.营业执照(经营范围应包括:生产消毒产品)或《消毒产品生产卫生许可证》复印件。(以上材料有其一即可)',
fileurl:''},
fileurl:[]},
{label:'2.用工证明或拟录用证明(如劳动合同、工作证、就业协议书等;原件现场核查,复印件加盖用人单位公章存档)',
fileurl:''},
fileurl:[]},
{label:'3.免费健康检查申请单',
fileurl:''},
fileurl:[]},
{label:'4.从业人员有效身份证件',
fileurl:''},
fileurl:[]},
]
}])
return { count, doubleCount, increment,yuyue_info,ChangeYuYueInfo,hangyeInfo }

@ -1,56 +1,110 @@
<template>
<div class="uploadfiles">
<LoadingD :status="loading"></LoadingD>
<van-steps active="0" active-icon="checked" active-color="#33cdc9">
<van-step>类型选择(上传)</van-step>
<van-step>选择日期</van-step>
<van-step>预约完成</van-step>
</van-steps>
<div class="head" >
<div class="head">
请上传"{{needinfo.label}}"相关证件
</div>
<div v-for="(item,index) in needinfo.fileList">
<div class="l_title">
{{item.label}}
</div>
<van-uploader :ref="`uploader${index}`" :name="index" :key="index" :after-read="afterRead">
<van-button icon="plus" plain size="small" type="primary">上传文件</van-button>
<van-uploader :ref="`uploader${index}`" :name="index" :key="index" :after-read="afterRead"
v-model="needinfo.fileList[index].fileurl" preview-size="2.5rem" multiple>
<van-button icon="plus" plain size="small" type="primary">上传文件</van-button>
</van-uploader>
<div style="font-size: 12px; color: #797979; margin: 5px;">{{item.fileurl}}</div>
</div>
</div>
<van-button type="primary" class="button" round @click="to()"></van-button>
</div>
</template>
<script setup>
import {
onMounted,ref
onMounted,
ref
} from 'vue';
import { showToast } from 'vant';
import {
useRouter
} from "vue-router"
import {
UpFile
} from "@/api/api.js";
import {
usePiniaStore
} from '@/stores/index.js'
const pinia = usePiniaStore()
const router = useRouter();
const to = () => {
router.push('/selectDate')
//
let t_filelist=[]
let check_status=true
needinfo.value.fileList.forEach((v,k)=>{
t_filelist.push([])
if(v.fileurl.length==0){
showToast('第'+(k+1)+'项,不能为空');
check_status=false
}
v.fileurl.forEach((v1,k1)=>{
t_filelist[k].push(v1.upurl)
})
})
let info = pinia.yuyue_info
info.upfileList = t_filelist
pinia.ChangeYuYueInfo(info)
console.log(info);
if(check_status){
router.push('/selectDate')
}
}
let needinfo=ref([])//
let loading = ref(false)
let needinfo = ref([]) //
onMounted(() => {
console.log(pinia.yuyue_info)
if(pinia.yuyue_info.doc_id){
needinfo.value=pinia.hangyeInfo[pinia.yuyue_info.doc_id-1]
if (pinia.yuyue_info.doc_id) {
needinfo.value = pinia.hangyeInfo[pinia.yuyue_info.doc_id - 1]
}
})
const afterRead = (file,detail) => {
console.log(detail);
needinfo.value.fileList[detail.name].fileurl=file.file.name
console.log(needinfo.value);
const afterRead = (file, detail) => {
if (Array.isArray(file)) {
file.forEach(item => {
item.status = 'uploading'
item.message = '上传中...'
uploadMaterialImg(item,detail)
})
} else {
file.status = 'uploading'
file.message = '上传中...'
uploadMaterialImg(file,detail)
}
}
const uploadMaterialImg=(file,detail)=>{
var data = new FormData();
data.append('file', file.file);
loading.value = true
UpFile(data).then(res => {
loading.value = false
if (res.status == true) {
file.message = ''
file.status = ''
file.upurl=res.data
} else {
showToast(res.msg);
}
})
}
</script>
<style scoped>

Loading…
Cancel
Save