PHP 기반 웨이신 마이크로앱용 문산 관광지 숙박 시설 관리 시스템

시스템 개요

본 프로젝트는 웨이신 마이크로앱을 기반으로 한 문산 관광지 숙소 운영 관리 시스템입니다. 백엔드는 PHP를 사용하며, 전면은 Vue.js 프레임워크로 구현되어 있으며, 모바일 기기에서의 접근성을 고려한 반응형 인터페이스를 제공합니다. 주요 기능으로는 사용자 인증, 객실 예약, 예약 조회, 관리자 대시보드, 게시판 등이 포함됩니다.

기술 스택

  • 백엔드: PHP 8.1 이상, MySQL 8.0, RESTful API 설계
  • 프론트엔드: Vue.js 3, Vite 빌드 시스템, Axios 통신
  • 인증 및 보안: JWT 기반 토큰 인증, 비밀번호 암호화 (bcrypt)
  • 지도 서비스: Baidu 지도 API 연동 (위치 기반 예약 처리)
  • 파일 업로드: 서버에 저장된 이미지/사진 관리, 경로 기반 접근 제어

핵심 기능 모듈

  1. 사용자 인증 시스템: 이메일 또는 이름 기반 로그인, 비밀번호 재설정, 역할 기반 접근 제어 (관리자/일반 사용자)
  2. 객실 예약 관리: 실시간 가용성 확인, 날짜 선택, 예약 내역 조회 및 수정
  3. 관리자 대시보드: 전체 예약 현황, 매출 분석, 사용자 통계, 게시물 관리
  4. 게시판 기능: 사용자 댓글 작성, 관리자 답변, 신고 기능 포함
  5. 위치 기반 검색: GPS 좌표를 통해 근처 숙소 자동 검색 및 표시

데이터베이스 설계

CREATE TABLE `user` (
  `id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `username` VARCHAR(100) NOT NULL UNIQUE,
  `password_hash` VARCHAR(255) NOT NULL,
  `full_name` VARCHAR(100) DEFAULT NULL,
  `gender` ENUM('male', 'female', 'other') DEFAULT NULL,
  `phone` VARCHAR(20) DEFAULT NULL,
  `id_card` VARCHAR(20) DEFAULT NULL,
  `avatar_url` VARCHAR(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='사용자 정보';

CREATE TABLE `reservation` (
  `id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `user_id` BIGINT NOT NULL,
  `room_id` INT NOT NULL,
  `check_in_date` DATE NOT NULL,
  `check_out_date` DATE NOT NULL,
  `status` ENUM('pending', 'confirmed', 'cancelled', 'completed') DEFAULT 'pending',
  `total_price` DECIMAL(10,2) NOT NULL,
  `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='예약 정보';

CREATE TABLE `comment` (
  `id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `user_id` BIGINT NOT NULL,
  `content` TEXT NOT NULL,
  `reply_content` TEXT DEFAULT NULL,
  `is_reported` BOOLEAN DEFAULT FALSE,
  `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='사용자 댓글';

API 예제 코드 (서버 측)

<?php

class LocationController {
    private $apiKey;
    private static $client;

    public function __construct() {
        // 설정 파일에서 API 키 로드
        $config = include 'config.php';
        $this->apiKey = $config['baidu_map_ak'];
    }

    public function getCityByCoordinates($longitude, $latitude) {
        if (!$this->apiKey) {
            return json_encode(['status' => 'error', 'message' => 'Baidu Map API 키 미설정']);
        }

        $url = "http://api.map.baidu.com/reverse_geocoding/v3/?ak={$this->apiKey}&output=json&coordtype=wgs84ll&location={$latitude},{$longitude}";
        
        $client = new GuzzleHttp\Client();
        try {
            $response = $client->get($url);
            $data = json_decode($response->getBody(), true);
            return json_encode(['status' => 'ok', 'data' => $data]);
        } catch (Exception $e) {
            return json_encode(['status' => 'error', 'message' => '좌표 변환 실패']);
        }
    }

    public function verifyUserLogin($username, $password) {
        // DB에서 사용자 조회 및 비밀번호 검증
        $db = new PDO("mysql:host=localhost;dbname=guesthouse", 'root', 'password');
        $stmt = $db->prepare("SELECT id, username, password_hash FROM user WHERE username = ?");
        $stmt->execute([$username]);
        $user = $stmt->fetch(PDO::FETCH_ASSOC);

        if (!$user || !password_verify($password, $user['password_hash'])) {
            return ['status' => 'error', 'message' => '로그인 정보가 올바르지 않습니다'];
        }

        // JWT 토큰 생성
        $token = bin2hex(random_bytes(32));
        $expireTime = date('Y-m-d H:i:s', strtotime('+1 hour'));

        // 토큰 저장 (예: Redis 또는 데이터베이스)
        // ...

        return [
            'status' => 'ok',
            'message' => '로그인 성공',
            'token' => $token,
            'user_id' => $user['id'],
            'role' => 'guest'
        ];
    }
}

테스트 사례

테스트 항목 입력 값 기대 결과 실제 결과 결과 분석
로그인 실패 (잘못된 비밀번호) 사용자: admin, 비밀번호: wrongpass 에러 메시지 표시 비밀번호가 일치하지 않습니다 정상 작동
예약 중복 체크 동일한 날짜에 예약 요청 이미 예약된 날짜입니다 경고 예약 불가 안내 메시지 출력 정상 작동
비회원 댓글 등록 로그인 없이 댓글 작성 시도 로그인 필요 안내 로그인 페이지 리다이렉트 정상 작동

배포 및 실행 가이드

모든 소스 코드와 데이터베이스 스크립트는 공개되며, 실행을 위한 단계별 설명서와 함께 제공됩니다. 다음은 기본적인 배포 절차입니다:

  1. Apache 또는 Nginx 서버 설치
  2. PHP 8.1 이상 및 확장 모듈 설치 (pdo_mysql, mbstring, json 등)
  3. MySQL 데이터베이스 생성 및 스크립트 적용
  4. 루트 폴더에 소스 파일 복사 후 config.php 파일 수정
  5. 웹 브라우저에서 http://localhost/guesthouse 접속
  6. 관리자 계정 생성 (초기 계정: admin / admin123)

또한, 본 시스템은 마이크로앱 환경에서도 정상 작동하도록 최적화되었으며, 웨이신 마이크로앱 개발 도구를 통해 직접 배포 가능합니다.

태그: PHP Vue.js WeChat Mini Program MySQL jwt

5월 31일 13:57에 게시됨