parent
50424b7505
commit
87cad64b18
@ -0,0 +1,337 @@
|
||||
<?php
|
||||
namespace app\appapi\controller\v1;
|
||||
|
||||
use app\appapi\ApiController;
|
||||
use think\facade\Db;
|
||||
use think\facade\Session;
|
||||
use think\facade\Log;
|
||||
|
||||
use Lcobucci\JWT\Parser;
|
||||
use thans\jwt\facade\JWTAuth;
|
||||
|
||||
use GuzzleHttp\Client;
|
||||
|
||||
use app\common\lib\Vcard;
|
||||
use app\common\lib\Aes;
|
||||
|
||||
class Auth extends ApiController
|
||||
{
|
||||
/**
|
||||
* return 200 成功
|
||||
* 201 不是會員
|
||||
*/
|
||||
public function login(){
|
||||
$id_token = input('token');
|
||||
$line_id = input('line_id');
|
||||
|
||||
|
||||
// $profile = (new Parser())->parse($id_token);
|
||||
// print_r($token->getClaim('name'));
|
||||
|
||||
//驗證id_token
|
||||
|
||||
|
||||
$user=Db::name('user')
|
||||
->where('line_id',$line_id)
|
||||
->find();
|
||||
|
||||
if(!$user){
|
||||
return $this->success('非會員',201);
|
||||
}
|
||||
|
||||
|
||||
$token = JWTAuth::builder(
|
||||
[
|
||||
'id' => $user['id'],
|
||||
'user_id' => $user['user_id'],
|
||||
'level' => $user['level']
|
||||
]);
|
||||
|
||||
|
||||
|
||||
if(empty($user['uniqid'])){
|
||||
return $this->success(['uid'=>$user['user_id'],'token'=>'Bearer '.$token],202);
|
||||
}
|
||||
|
||||
return $this->success(['uid'=>$user['user_id'],'token'=>'Bearer '.$token]);
|
||||
}
|
||||
|
||||
public function bindCard(){
|
||||
$uid = input('uid');
|
||||
$verify = input('verify');
|
||||
|
||||
try{
|
||||
Db::name('user')
|
||||
->where('user_id',$uid)
|
||||
->update(['uniqid'=>$verify]);
|
||||
|
||||
Db::name('precard')
|
||||
->where('verify_code',$verify)
|
||||
->update(['status'=>2]);
|
||||
|
||||
return $this->success('綁定成功');
|
||||
}catch(\Exception $e){
|
||||
return $this->error('綁定失敗');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public function checkLineId(){
|
||||
$line_id=input('lineid');
|
||||
|
||||
$user = Db::name('user')
|
||||
->where('line_id',$line_id)
|
||||
->find();
|
||||
|
||||
if($user){
|
||||
return $this->error('會員已存在');
|
||||
}
|
||||
|
||||
return $this->success('檢查成功');
|
||||
}
|
||||
|
||||
public function register(){
|
||||
$data = input();
|
||||
|
||||
unset($data['version']);
|
||||
unset($data['controller']);
|
||||
unset($data['action']);
|
||||
unset($data['uid']);
|
||||
unset($data['userid']);
|
||||
unset($data['verify']);
|
||||
unset($data['token']);
|
||||
|
||||
$data=array_map('asc_trim',$data);
|
||||
|
||||
//檢查line id是否己經是會員
|
||||
//TODO
|
||||
$user=Db::name('user')
|
||||
->where('line_id',input('line_id'))
|
||||
->find();
|
||||
|
||||
if($user){
|
||||
return $this->error('已是會員',501);
|
||||
}
|
||||
|
||||
|
||||
//驗證id_token
|
||||
$verify_line = $this->verifyIdToken(input('token'));
|
||||
|
||||
if(!$verify_line){
|
||||
return $this->error('id token expire',500);
|
||||
}
|
||||
|
||||
|
||||
$data['line_name'] = $verify_line['name'];
|
||||
$data['line_picture'] = $verify_line['picture'];
|
||||
|
||||
//推薦人
|
||||
// if(strlen($data['refer'])>0){
|
||||
// $pid = decodeRefer($data['refer']);
|
||||
// $data['parent_id'] = $pid;
|
||||
// }else{
|
||||
// $data['parent_id'] = 0;
|
||||
// }
|
||||
// unset($data['refer']);
|
||||
|
||||
if(input('verify')){
|
||||
$action = 'openright';
|
||||
|
||||
$user_id=genUniqid();
|
||||
$data['user_id'] = $user_id;
|
||||
|
||||
$data['uniqid'] = input('verify');
|
||||
|
||||
$precard = Db::name('precard')
|
||||
->where('verify_code',input('verify'))
|
||||
->find();
|
||||
|
||||
if(!$precard){
|
||||
return $this->error('查無預開卡',401);
|
||||
}
|
||||
|
||||
$data['agent_id'] = $precard['agent_id'];
|
||||
//TODO
|
||||
}else{
|
||||
$action = 'register';
|
||||
if(!isset($data['aid'])){
|
||||
$data['agent_id'] = 1;
|
||||
}else{
|
||||
$data['agent_id'] = Db::name('agent')->where('prefix',$data['aid'])->value('id');
|
||||
unset($data['aid']);
|
||||
}
|
||||
|
||||
$user_id=genUniqid();
|
||||
$data['user_id'] = $user_id;
|
||||
}
|
||||
|
||||
$avatar=$this->saveLineImage($data['line_picture'],$data['user_id']);
|
||||
$data['line_picture']= getUrl().'/storage/'.$data['user_id'].'/'.$avatar;
|
||||
|
||||
if(!isset($data['avatar'])){
|
||||
$data['avatar']=$data['line_picture'];
|
||||
}else{
|
||||
$file_path = $_SERVER['DOCUMENT_ROOT'].'/storage/'.$data['user_id'].'/'.date('Ymd').'/';
|
||||
if(!is_dir($file_path)){
|
||||
mkdir($file_path, 0777, true);
|
||||
}
|
||||
$temp_file = str_replace(getUrl(),"",$data['avatar']);
|
||||
$avatar_file = $file_path.basename($temp_file);
|
||||
if(!rename($_SERVER['DOCUMENT_ROOT'].$temp_file, $avatar_file)){
|
||||
return $this->error('搬移檔案失敗');
|
||||
}
|
||||
$data['avatar']=getUrl().'/storage/'.$data['user_id'].'/'.date('Ymd').'/'.basename($temp_file);
|
||||
}
|
||||
|
||||
$agent = Db::name('agent')->where('id',$data['agent_id'])->find();
|
||||
|
||||
if($agent['try_days']==0){
|
||||
$data['status'] = 1;
|
||||
$data['level'] = $agent['base_level'];
|
||||
$data['overdue_time'] = strtotime(date('Y-m-d',time() + (60 * 60 * 24 * $agent['base_days'])));
|
||||
}else{
|
||||
$data['status'] = 2;
|
||||
$data['level'] = $agent['try_level'];
|
||||
$data['overdue_time'] = strtotime(date('Y-m-d',time() + (60 * 60 * 24 * $agent['try_days'])));
|
||||
}
|
||||
|
||||
if($agent['parent_id']==0){
|
||||
$data['agent_id'] = $agent['id'];
|
||||
}else{
|
||||
$data['agent_id'] = $agent['parent_id'];
|
||||
}
|
||||
|
||||
$level_option = Db::name('user_level')
|
||||
->where('agent_id',$data['agent_id'])
|
||||
->where('level_id',$data['level'])
|
||||
->find();
|
||||
|
||||
$data['nc_type']=$level_option['nc_type'];
|
||||
$data['nc_func']=$level_option['nc_func'];
|
||||
|
||||
$data['cus_card'] = '';
|
||||
$data['create_time'] = date('Y-m-d H:i:s');
|
||||
|
||||
|
||||
try{
|
||||
$id = Db::name('user')
|
||||
->insertGetId($data);
|
||||
|
||||
$refer_code = encodeRefer($id);
|
||||
|
||||
|
||||
$result = Db::name('user')
|
||||
->where('id',$id)
|
||||
->update(['code'=>$refer_code]);
|
||||
|
||||
|
||||
$qrcodeUrl = genQrCode('https://'.$_SERVER['HTTP_HOST'].'/home/?aid='.$agent['prefix'],$data['user_id'],'refer');
|
||||
|
||||
$aes = new Aes([]);
|
||||
|
||||
$params = urlencode($aes->encrypt('user_id='.$data['user_id'].'&verify_code='.input('verify')));
|
||||
|
||||
$nfcUrl = genQrCode('https://'.$_SERVER['HTTP_HOST'].'/card/?params='.$params,$data['user_id'],'nfc');
|
||||
|
||||
Vcard::genVcf($data['user_id']);
|
||||
|
||||
$token = JWTAuth::builder(
|
||||
[
|
||||
'id' => $id,
|
||||
'user_id' => $data['user_id'],
|
||||
'level' => 0
|
||||
]);
|
||||
|
||||
if($action == 'openright'){
|
||||
Db::name('precard')
|
||||
->where('verify_code',input('verify'))
|
||||
->update(['status'=>2]);
|
||||
}
|
||||
|
||||
return $this->success(['uid'=>$data['user_id'],'token'=>'Bearer'.$token]);
|
||||
|
||||
}catch(\Exception $e){
|
||||
print_r($e);
|
||||
return $this->error('註冊失敗');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private function verifyIdToken($token){
|
||||
try{
|
||||
$client = new Client();
|
||||
$response = $client->request('POST', 'https://api.line.me/oauth2/v2.1/verify', [
|
||||
'form_params' => [
|
||||
'id_token' => $token,
|
||||
'client_id'=> env('utel.line_channel_id')
|
||||
]
|
||||
]);
|
||||
|
||||
$body = $response->getBody()->getContents();
|
||||
return json_decode($body, true);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// print_r($response);
|
||||
// $body = $response->getBody()->getContents();
|
||||
|
||||
// print_r($body);
|
||||
|
||||
}
|
||||
|
||||
private function saveLineImage($pictureUrl,$uid)
|
||||
{
|
||||
if($pictureUrl){
|
||||
$curl = curl_init($pictureUrl);
|
||||
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
|
||||
$imageData=curl_exec($curl);
|
||||
curl_close($curl);
|
||||
|
||||
$filename=$uid."_line.jpg";
|
||||
$filedir=$_SERVER['DOCUMENT_ROOT'].'/storage/'.$uid;
|
||||
if (!file_exists($filedir)) {
|
||||
mkdir($filedir , 0777 , true);
|
||||
}
|
||||
$fp=fopen($filedir.'/'.$filename,'a');
|
||||
fwrite($fp,$imageData);
|
||||
fclose($fp);
|
||||
|
||||
return $filename;
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public function getSiteConfig(){
|
||||
$result = Db::name('site_config')
|
||||
->where('parent_id','<>',0)
|
||||
->select();
|
||||
|
||||
foreach($result as $key => $val){
|
||||
$rtn[$val['code']]=$val['value'];
|
||||
}
|
||||
|
||||
return $this->success($rtn);
|
||||
}
|
||||
|
||||
public function uploadAvatar(){
|
||||
|
||||
$files = request()->file('file');
|
||||
$savename = \think\facade\Filesystem::disk('public')->putFile( 'temp' , $files);
|
||||
|
||||
$avatar = getUrl().'/storage/'.$savename;
|
||||
|
||||
|
||||
// Db::name('user')
|
||||
// ->where('user_id',input('user_id'))
|
||||
// ->update(['avatar'=>$avatar]);
|
||||
|
||||
return $this->Success($avatar);
|
||||
}
|
||||
|
||||
public function test(){
|
||||
Vcard::genVcf('mc63de2a162b218');
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,246 @@
|
||||
<?php
|
||||
namespace app\appapi\controller\v1;
|
||||
|
||||
use app\appapi\ApiController;
|
||||
use think\facade\Db;
|
||||
|
||||
use app\common\lib\Aes;
|
||||
use app\common\lib\Vcard;
|
||||
|
||||
|
||||
class Card extends ApiController
|
||||
{
|
||||
/**
|
||||
* 檢查nfc用户
|
||||
*
|
||||
* @author wayne <wwayne.hsu@gmail.com>
|
||||
*
|
||||
* @param string token 加密參數
|
||||
*
|
||||
* @return json
|
||||
*/
|
||||
public function checkUser(){
|
||||
$token = input('token');
|
||||
|
||||
if(!$token){
|
||||
return $this->error('參數錯誤');
|
||||
}
|
||||
|
||||
$aes = new Aes([]);
|
||||
parse_str($aes->descrypt($token),$params);
|
||||
|
||||
if(!isset($params['verify_code'])){
|
||||
if(!isset($params['user_id'])){
|
||||
return $this->error('參數錯誤');
|
||||
}
|
||||
$user_id = $params['user_id'];
|
||||
}else{
|
||||
if(strlen($params['verify_code'])>0){
|
||||
$user_id = getUseridByCuid(strtoupper($params['verify_code']));
|
||||
}else{
|
||||
return $this->error('參數錯誤');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if($user_id){
|
||||
Db::name('user')
|
||||
->where('user_id',$user_id)
|
||||
->inc('nfc_count')
|
||||
->update();
|
||||
|
||||
return $this->success($user_id);
|
||||
}
|
||||
|
||||
//檢查是否為預開卡會員
|
||||
$is_precard=Db::name('precard')
|
||||
->where('verify_code',strtoupper($params['verify_code']))
|
||||
->count();
|
||||
|
||||
|
||||
if($is_precard){
|
||||
return $this->success(['verify'=>strtoupper($params['verify_code'])],201);
|
||||
}
|
||||
|
||||
return $this->error('請求錯誤');
|
||||
}
|
||||
|
||||
public function getCard(){
|
||||
$do=Db::name('user');
|
||||
|
||||
if(input('userid')){
|
||||
$do->where('user_id',input('userid'));
|
||||
}elseif(input('line_id')){
|
||||
$do->where('line_id',input('line_id'));
|
||||
}else{
|
||||
return $this->error('查無會員資料');
|
||||
}
|
||||
|
||||
|
||||
$user = $do->find();
|
||||
if(!$user){
|
||||
return $this->error('查無會員資料');
|
||||
}
|
||||
|
||||
$aes = new Aes([]);
|
||||
|
||||
if(strlen($user['uniqid'])>0){
|
||||
$params = urlencode($aes->encrypt('verify_code='.$user['uniqid']));
|
||||
}else{
|
||||
$params = urlencode($aes->encrypt('user_id='.$user['user_id']));
|
||||
}
|
||||
|
||||
$user['nfcurl'] = getUrl().'/card/?params='.$params;
|
||||
|
||||
|
||||
$result = [
|
||||
"address" => $user['address']?$user['address']:' ',
|
||||
"company" => $user['company']?$user['company']:' ',
|
||||
"email" => $user['email']?$user['email']:' ',
|
||||
"logo" => "https://i.imgur.com/GclvYFK.png",
|
||||
"maps" => "https://www.google.com/maps/search/?api=1&query_place_id=ChIJAaZEqCYWaTQRMv6fuIsJEuo&query=%E5%BE%AE%E7%A8%8B%E5%BC%8F%E8%B3%87%E8%A8%8A&openExternalBrowser=1",
|
||||
"name" => $user['real_name']?$user['real_name']:' ',
|
||||
"phone" => $user['phone']?$user['phone']:' ',
|
||||
"tel" => $user['tel']?$user['tel']:' ',
|
||||
"title" => $user['title']?$user['title']:' ',
|
||||
"url" => $user['url']?$user['url']:' ',
|
||||
"line" => $user['line']?$user['line']:'',
|
||||
"facebook" => $user['facebook']?$user['facebook']:'',
|
||||
"youtube" => $user['youtube']?$user['youtube']:'',
|
||||
"ig" => $user['ig']?$user['ig']:'',
|
||||
"level" => $user['level']?$user['level']:0,
|
||||
"user_id" => $user['user_id']?$user['user_id']:'',
|
||||
"line_picture" => $user['line_picture']?$user['line_picture']:'',
|
||||
"avatar" => $user['avatar']?$user['avatar']:'',
|
||||
"card_title" => $user['card_title']?$user['card_title']:'',
|
||||
"has_cuscard" => strlen($user['cus_card'])?1:0,
|
||||
"nc_type" => $user['nc_type']?$user['nc_type']:0,
|
||||
"nc_func" => explode(',',$user['nc_func']),
|
||||
"nc_template" => $user['nc_template'],
|
||||
"mark" => nl2br($user['mark']),
|
||||
"nfcurl" => $user['nfcurl'],
|
||||
"show_cus" => $user['show_cus'],
|
||||
"nfc_addon" => json_decode($user['nfc_addon'])
|
||||
];
|
||||
|
||||
|
||||
return $this->Success($result);
|
||||
}
|
||||
|
||||
public function getCusCard(){
|
||||
$data=input();
|
||||
unset($data['version']);
|
||||
unset($data['controller']);
|
||||
unset($data['action']);
|
||||
|
||||
try{
|
||||
|
||||
$do=Db::name('user');
|
||||
if(input('userid')){
|
||||
$do->where('user_id',input('userid'));
|
||||
}elseif(input('line_id')){
|
||||
$do->where('line_id',input('line_id'));
|
||||
}else{
|
||||
return $this->error('查無會員資料');
|
||||
}
|
||||
|
||||
$card = $do->field('cus_card,card_title')
|
||||
->find();
|
||||
|
||||
|
||||
}catch(Exception $e){
|
||||
return $this->error('操作失敗');
|
||||
}
|
||||
return $this->success($card);
|
||||
}
|
||||
|
||||
public function getVipCard(){
|
||||
$data=input();
|
||||
unset($data['version']);
|
||||
unset($data['controller']);
|
||||
unset($data['action']);
|
||||
|
||||
try{
|
||||
$do=Db::name('user_card');
|
||||
if(input('userid')){
|
||||
$id = getIdByUid(input('userid'));
|
||||
}elseif(input('line_id')){
|
||||
$id = getIdByUid(input('lineid'));
|
||||
}else{
|
||||
return $this->error('查無會員資料');
|
||||
}
|
||||
$do->where('user_id',$id);
|
||||
$card = $do->field('*')
|
||||
->select();
|
||||
|
||||
}catch(Exception $e){
|
||||
return $this->error('操作失敗');
|
||||
}
|
||||
return $this->success($card);
|
||||
}
|
||||
|
||||
public function updateCard(){
|
||||
$data=input();
|
||||
unset($data['uid']);
|
||||
unset($data['version']);
|
||||
unset($data['controller']);
|
||||
unset($data['action']);
|
||||
unset($data['nfcurl']);
|
||||
unset($data['agent_prefix']);
|
||||
unset($data['level_name']);
|
||||
unset($data['addon']);
|
||||
unset($data['delete_time']);
|
||||
|
||||
if(!empty(input('addon'))){
|
||||
$data['nfc_addon']=json_encode(input('addon'));
|
||||
}else{
|
||||
$data['nfc_addon']='';
|
||||
}
|
||||
|
||||
try{
|
||||
Db::name('user')
|
||||
->where('user_id',$data['user_id'])
|
||||
->update($data);
|
||||
|
||||
Vcard::genVcf($data['user_id']);
|
||||
|
||||
|
||||
}catch(Exception $e){
|
||||
return $this->error('操作失敗');
|
||||
}
|
||||
return $this->success(['code'=>200]);
|
||||
}
|
||||
|
||||
public function updateCusCard(){
|
||||
|
||||
$data=input();
|
||||
unset($data['version']);
|
||||
unset($data['controller']);
|
||||
unset($data['action']);
|
||||
|
||||
$data['show_cus'] = input('show_cus')?1:0;
|
||||
|
||||
try{
|
||||
Db::name('user')
|
||||
->where('user_id',$data['user_id'])
|
||||
->update(['card_title'=>$data['card_title'],'show_cus'=>$data['show_cus'],'cus_card'=>$data['cus_card']]);
|
||||
|
||||
}catch(Exception $e){
|
||||
return $this->error('操作失敗');
|
||||
}
|
||||
return $this->success(['code'=>200]);
|
||||
}
|
||||
|
||||
|
||||
public function uploadFile(){
|
||||
// print_r(input());
|
||||
$files = request()->file('file');
|
||||
|
||||
$savename = \think\facade\Filesystem::disk('public')->putFile( 'card', $files);;
|
||||
|
||||
$image_url = getUrl().'/storage/'.$savename;
|
||||
|
||||
return $this->success($image_url);
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,82 @@
|
||||
<?php
|
||||
namespace app\appapi\controller\v1;
|
||||
|
||||
use app\appapi\ApiController;
|
||||
use think\facade\Db;
|
||||
|
||||
use app\common\lib\Aes;
|
||||
|
||||
class User extends ApiController
|
||||
{
|
||||
public function getUserInfo(){
|
||||
$user=Db::name('user')
|
||||
->where('user_id',$this->uid)
|
||||
->find();
|
||||
|
||||
$aes = new Aes([]);
|
||||
if(strlen(trim($user['uniqid']))>0){
|
||||
$params = urlencode($aes->encrypt('verify_code='.$user['uniqid']));
|
||||
}else{
|
||||
$params = urlencode($aes->encrypt('user_id='.$user['user_id']));
|
||||
}
|
||||
|
||||
$user['level_name'] = Db::name('user_level')->where('agent_id',$user['agent_id'])->where('level_id',$user['level'])->value('name');
|
||||
|
||||
$user['nfcurl'] = getUrl().'/card/?params='.$params;
|
||||
|
||||
$user['nc_func'] = explode(',',$user['nc_func']);
|
||||
|
||||
$user['agent_prefix'] = Db::name('agent')->where('id',$user['agent_id'])->value('prefix');
|
||||
|
||||
return $this->Success($user);
|
||||
}
|
||||
|
||||
public function setUserLevel(){
|
||||
$result=Db::name('user')
|
||||
->where('user_id',$this->uid)
|
||||
->update(['level'=>input('level')]);
|
||||
|
||||
|
||||
return $this->Success($result);
|
||||
}
|
||||
|
||||
public function setUserTpl(){
|
||||
try{
|
||||
$result=Db::name('user')
|
||||
->where('user_id',$this->uid)
|
||||
->update(['nc_template'=>input('tpl')]);
|
||||
}catch(\Excenption $e){
|
||||
return $this->Error('更新失敗');
|
||||
}
|
||||
|
||||
return $this->Success($result);
|
||||
}
|
||||
|
||||
public function uploadAvatar(){
|
||||
|
||||
$files = request()->file('file');
|
||||
$savename = \think\facade\Filesystem::disk('public')->putFile( input('user_id'), $files);
|
||||
|
||||
$avatar = getUrl().'/storage/'.$savename;
|
||||
|
||||
|
||||
// Db::name('user')
|
||||
// ->where('user_id',input('user_id'))
|
||||
// ->update(['avatar'=>$avatar]);
|
||||
|
||||
return $this->Success($avatar);
|
||||
}
|
||||
|
||||
public function updateSendCount(){
|
||||
$user_id = input('userid');
|
||||
|
||||
Db::name('user')
|
||||
->where('user_id',input('userid'))
|
||||
->exp('send_count', 'send_count+1')
|
||||
->update();
|
||||
// ->inc('send_count',1);
|
||||
|
||||
return $this->Success('更新成功');
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,6 @@
|
||||
<?php
|
||||
return [
|
||||
\think\middleware\SessionInit::class,
|
||||
\think\middleware\AllowCrossDomain::class,
|
||||
// app\api\middleware\CheckSiteCode::class
|
||||
];
|
||||
@ -0,0 +1,10 @@
|
||||
<?php
|
||||
use think\facade\Route;
|
||||
|
||||
|
||||
Route::group(function () {
|
||||
// Route::rule(':version/user/:action', 'appapi/:version.user/:action');
|
||||
// Route::rule(':version/user/:action', 'api/:version.user/:action');
|
||||
})->middleware(\app\api\middleware\JWT::class);
|
||||
|
||||
Route::rule(':version/:controller/:action','appapi/:version.:controller/:action');
|
||||
@ -0,0 +1,15 @@
|
||||
<?php
|
||||
namespace app\common\lib;
|
||||
|
||||
use Firebase\JWT\JWT;
|
||||
use Firebase\JWT\Key;
|
||||
|
||||
class Token{
|
||||
/**
|
||||
* 構造方法
|
||||
*/
|
||||
public function __construct(){
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in new issue