--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
Create 3D Animation and Video In 3 Clicks...know more 1) Introduction:
Airline Ticket Reservation is a sample web application which could be use to search flights based on the specified airports (departure airport, arrival airport) and dates (departure date and return date).
2) References:
- For basic DB preparations please refer to notes titled "Installation and Testing of MySQL DB from Java"
- For basic Java EE setup for Airline Ticket Reservation Project refer to notes titled "Build and Deployment of Java EE Web Application (Airline Ticket Reservation)"
3) Database Preparations:
i) Create a Database : airlinedb and set it current
mysql>CREATE DATABASE airlinedb;
USE airlinedb;
ii) Create table to store Sector information as described below
CREATE TABLE SECTOR (
DEPARTURE_AP VARCHAR(100),
ARRIVAL_AP VARCHAR(100),
DEPARTURE_DT DATE,
ARRIVAL_DT DATE,
DEPARTURE_TM TIME,
ARRIVAL_TM TIME,
SID INT,
PID INT,
PRIMARY KEY (SID)
)
Insert 5 sample records:
INSERT INTO SECTOR (DEPARTURE_AP, ARRIVAL_AP, DEPARTURE_DT,ARRIVAL_DT, DEPARTURE_TM, ARRIVAL_TM, SID, PID ) values ('NRT','LAX','2012-05-15','2012-05-15','10:05','19:01',1, 1);
INSERT INTO SECTOR (DEPARTURE_AP, ARRIVAL_AP, DEPARTURE_DT,ARRIVAL_DT, DEPARTURE_TM, ARRIVAL_TM, SID, PID ) values ('NRT','LAX','2012-05-15','2012-05-15','14:00','23:15',2, 2);
INSERT INTO SECTOR (DEPARTURE_AP, ARRIVAL_AP, DEPARTURE_DT,ARRIVAL_DT, DEPARTURE_TM, ARRIVAL_TM, SID, PID ) values ('NRT','LAX','2012-05-16','2012-05-16','14:00','23:15',3, 2);
INSERT INTO SECTOR (DEPARTURE_AP, ARRIVAL_AP, DEPARTURE_DT,ARRIVAL_DT, DEPARTURE_TM, ARRIVAL_TM, SID, PID ) values ('LAX','NRT','2012-05-25','2012-05-25','06:15','15:01',4, 1);
INSERT INTO SECTOR (DEPARTURE_AP, ARRIVAL_AP, DEPARTURE_DT,ARRIVAL_DT, DEPARTURE_TM, ARRIVAL_TM, SID, PID ) values ('LAX','NRT','2012-05-27','2012-05-27','08:05','17:31',5, 2);
iii) Create table to store Price information as described below
CREATE TABLE PRICE (
PID INTEGER,
BASIC DECIMAL(10,2),
SURCHARGE DECIMAL(10,2),
TAX DECIMAL(10,2),
DISCOUNT DECIMAL(10,2),
CURR VARCHAR(3),
PRIMARY KEY (PID)
);
PID INTEGER,
BASIC DECIMAL(10,2),
SURCHARGE DECIMAL(10,2),
TAX DECIMAL(10,2),
DISCOUNT DECIMAL(10,2),
CURR VARCHAR(3),
PRIMARY KEY (PID)
);
Insert 2 sample records:
INSERT INTO PRICE (PID,BASIC,SURCHARGE,TAX,DISCOUNT,CURR) VALUES (1,1200,110,50,75,'USD');
INSERT INTO PRICE (PID,BASIC,SURCHARGE,TAX,DISCOUNT,CURR) VALUES (2,1800,200,145,105,'USD');
4) Java Source Preparations (refer above section 2 for creating web project):
- Add mySQL JDBC driver to the newly created Eclipse Web Project
[/WEB-INF/lib/mysql-connector-java-5.1.18-bin.jar]
- Add below source files to the project and finally create war file and deploy it to JBoss
------------------------------------------------------------------------------
[Java Resources]
/controller/SearchController.java
/controller/SearchDAO.java
/model/Criteria.java
/model/Price.java
/model/Result.java
/model/Sector.java
[WebContent]
/resultView.jsp
/searchView.html
/image/airline.png
/WEB-INF/lib/mysql-connector-java-5.1.18-bin.jar
/WEB-INF/web.xml
------------------------------------------------------------------------------
-Project structure
------------------------------------------------------------------------------
5) Output
- Use below url to access the application
http://localhost:8080/AirlineTicketReservation/
- Enter below criteria and press [Search] button
- System will display below results
6) Source Reference
/controller/SearchController.java
package controller;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Calendar;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import model.Criteria;
import model.Result;
public class SearchController extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("Calling doPost...");
String fromAirport = req.getParameter("fromAirport");
String toAirport = req.getParameter("toAirport");
String fromDay = req.getParameter("fromDay");
String fromMonth = req.getParameter("fromMonth");
String fromYear = req.getParameter("fromYear");
String toDay = req.getParameter("toDay");
String toMonth = req.getParameter("toMonth");
String toYear = req.getParameter("toYear");
Criteria criteria = new Criteria();
Calendar departureCalendar = Calendar.getInstance();
departureCalendar.set(Integer.parseInt(fromYear), Integer.parseInt(fromMonth) - 1, Integer.parseInt(fromDay)); // month starts from 0 in Calendar
Calendar returnCalendar = Calendar.getInstance();
if (toYear.length() > 0 && toMonth.length() > 0 && toDay.length() > 0) {
returnCalendar.set(Integer.parseInt(toYear), Integer.parseInt(toMonth) - 1, Integer.parseInt(toDay));
}
criteria.setDepartureAirport(fromAirport);
criteria.setArrivalAirport(toAirport);
criteria.setDepartureDate(departureCalendar);
criteria.setReturnDate(returnCalendar);
System.out.println("From airport =" + fromAirport);
System.out.println("To airport =" + toAirport);
Result[] resultsForward = null;
Result[] resultsReturn = null;
try {
resultsForward = new SearchDAO().getResultsForward(criteria);
System.out.println("Results Forward ["+ resultsForward +"] ");
resultsReturn = new SearchDAO().getResultsReturn(criteria);
System.out.println("Results Return ["+ resultsReturn +"] ");
} catch (SQLException e) {
e.printStackTrace();
}
HttpSession session = req.getSession();
session.setAttribute("ATTR_RESULTS_FORWARD", resultsForward);
session.setAttribute("ATTR_RESULTS_RETURN", resultsReturn);
RequestDispatcher dis = req.getRequestDispatcher("resultView.jsp");
dis.forward(req, resp);
}
}
/controller/SearchDAO.java
package controller;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import model.Criteria;
import model.Price;
import model.Result;
import model.Sector;
/**
* Data Access Object to communicate with underlying data source.
* @author santosh lawoo
*/
public class SearchDAO {
static Connection connection = null;
/**
* Method to return existing database connection, else returns new connection
* @return database connection
*/
public static Connection getConnection() {
if (connection != null) {
return connection;
} else {
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/airlinedb",
"root", "");
} catch (Exception ex) {
ex.printStackTrace();
}
}
return connection;
}
/**
* Returns results containing sector information for forward flight
* @param criteria the search conditions based on the User inputs
* @return result array containing information on multiple sectors and related price
* @throws SQLException
*/
public Result[] getResultsForward(Criteria criteria) throws SQLException {
PreparedStatement prepStmt = null;
ResultSet rs = null;
java.sql.Date departDt = new java.sql.Date(criteria.getDepartureDate().getTimeInMillis());
ArrayList<Result> results = new ArrayList<Result>();
String selectStatement = "select * from SECTOR where DEPARTURE_AP = ? AND ARRIVAL_AP = ? AND DEPARTURE_DT = ? ";
prepStmt = getConnection().prepareStatement(selectStatement);
prepStmt.setString(1, criteria.getDepartureAirport());
prepStmt.setString(2, criteria.getArrivalAirport());
prepStmt.setDate(3, departDt);
rs = prepStmt.executeQuery();
while (rs.next()) {
Result result = new Result();
Sector sector = new Sector();
sector.setDepartureAirport(rs.getString("DEPARTURE_AP"));
sector.setArrivalAirport(rs.getString("ARRIVAL_AP"));
Calendar calendarDepart = Calendar.getInstance();
calendarDepart.setTime(rs.getDate("DEPARTURE_DT"));
sector.setDepartureDate(calendarDepart);
Calendar calendarArrival = Calendar.getInstance();
calendarArrival.setTime(rs.getDate("ARRIVAL_DT"));
sector.setArrivalDate(calendarArrival);
sector.setDepartureTime(String.valueOf(rs.getTime("DEPARTURE_TM")));
sector.setArrivalTime(String.valueOf(rs.getTime("ARRIVAL_TM")));
sector.setSid(rs.getLong("SID"));
sector.setPid(rs.getLong("PID"));
result.setSector(sector);
setPriceInfo(result);
results.add(result);
}
return (Result[]) results.toArray(new Result[results.size()]);
}
/**
* Returns results containing sector information for return flight
* @param criteria the search conditions based on the User inputs
* @return result array containing information on multiple sectors and related price
* @throws SQLException
*/
public Result[] getResultsReturn(Criteria criteria) throws SQLException {
PreparedStatement prepStmt = null;
ResultSet rs = null;
java.sql.Date returntDt = new java.sql.Date(criteria.getReturnDate().getTimeInMillis());
ArrayList<Result> results = new ArrayList<Result>();
String selectStatement ="select * from SECTOR where DEPARTURE_AP = ? AND ARRIVAL_AP = ? AND DEPARTURE_DT = ? ";
prepStmt = getConnection().prepareStatement(selectStatement);
prepStmt.setString(1, criteria.getArrivalAirport());
prepStmt.setString(2, criteria.getDepartureAirport());
prepStmt.setDate(3, returntDt);
rs = prepStmt.executeQuery();
while (rs.next()) {
Result result = new Result();
Sector sector = new Sector();
sector.setDepartureAirport(rs.getString("DEPARTURE_AP"));
sector.setArrivalAirport(rs.getString("ARRIVAL_AP"));
Calendar calendarDepart = Calendar.getInstance();
calendarDepart.setTime(rs.getDate("DEPARTURE_DT"));
sector.setDepartureDate(calendarDepart);
Calendar calendarArrival = Calendar.getInstance();
calendarArrival.setTime(rs.getDate("ARRIVAL_DT"));
sector.setArrivalDate(calendarArrival);
sector.setDepartureTime(String.valueOf(rs.getTime("DEPARTURE_TM")));
sector.setArrivalTime(String.valueOf(rs.getTime("ARRIVAL_TM")));
sector.setSid(rs.getLong("SID"));
sector.setPid(rs.getLong("PID"));
result.setSector(sector);
setPriceInfo(result);
results.add(result);
}
return (Result[]) results.toArray(new Result[results.size()]);
}
/**
* Method to add price information to the result, which already contains sector information
* (No need to return updated result as java passes parameter by object's reference copy)
* @param result to set price information
* @throws SQLException
*/
private void setPriceInfo(Result result) throws SQLException {
PreparedStatement prepStmt = null;
ResultSet rs = null;
String selectStatement = "select * from PRICE where PID = ? ";
prepStmt =
getConnection().prepareStatement(selectStatement);
prepStmt.setLong(1, result.getSector().getPid());
rs = prepStmt.executeQuery();
if (rs.next()) {
Price price = new Price();
price.setBasic(rs.getFloat("BASIC"));
price.setSurcharge(rs.getFloat("SURCHARGE"));
price.setTax(rs.getFloat("TAX"));
price.setDiscount(rs.getFloat("DISCOUNT"));
price.setCurr(rs.getString("CURR"));
result.setPrice(price);
}
}
}
/model/Criteria.java
package model;
import java.util.Calendar;
/**
* Model to hold Criteria information
* @author santosh lawoo
*/
public class Criteria {
private String departureAirport;
private String arrivalAirport;
private Calendar departureDate; //arrivalDate wil be provided by system based on the sector
private Calendar returnDate;// blank for one-way flights
/**
* @return the departureAirport
*/
public String getDepartureAirport() {
return departureAirport;
}
/**
* @param departureAirport the departureAirport to set
*/
public void setDepartureAirport(String departureAirport) {
this.departureAirport = departureAirport;
}
/**
* @return the arrivalAirport
*/
public String getArrivalAirport() {
return arrivalAirport;
}
/**
* @param arrivalAirport the arrivalAirport to set
*/
public void setArrivalAirport(String arrivalAirport) {
this.arrivalAirport = arrivalAirport;
}
/**
* @return the departureDate
*/
public Calendar getDepartureDate() {
return departureDate;
}
/**
* @param departureDate the departureDate to set
*/
public void setDepartureDate(Calendar departureDate) {
this.departureDate = departureDate;
}
/**
* @return the returnDate
*/
public Calendar getReturnDate() {
return returnDate;
}
/**
* @param returnDate the returnDate to set
*/
public void setReturnDate(Calendar returnDate) {
this.returnDate = returnDate;
}
}
/model/Price.java
package model;
/**
* Model to hold Price information
* @author santosh lawoo
*/
public class Price {
private float basic;
private float surcharge;
private float tax;
private float discount;
private String curr;
/**
* @return the basic
*/
public float getBasic() {
return basic;
}
/**
* @param basic the basic to set
*/
public void setBasic(float basic) {
this.basic = basic;
}
/**
* @return the surcharge
*/
public float getSurcharge() {
return surcharge;
}
/**
* @param surcharge the surcharge to set
*/
public void setSurcharge(float surcharge) {
this.surcharge = surcharge;
}
/**
* @return the tax
*/
public float getTax() {
return tax;
}
/**
* @param tax the tax to set
*/
public void setTax(float tax) {
this.tax = tax;
}
/**
* @return the discount
*/
public float getDiscount() {
return discount;
}
/**
* @param discount the discount to set
*/
public void setDiscount(float discount) {
this.discount = discount;
}
/**
* @return the curr
*/
public String getCurr() {
return curr;
}
/**
* @param curr the curr to set
*/
public void setCurr(String curr) {
this.curr = curr;
}
}
/model/Result.java
package model;
/**
* Model to hold Result information
* @author santosh lawoo
*/
public class Result {
private Price price;
private Sector sector;
/**
* @return the sector
*/
public Sector getSector() {
return sector;
}
/**
* @param sector the sector to set
*/
public void setSector(Sector sector) {
this.sector = sector;
}
/**
* @return the price
*/
public Price getPrice() {
return price;
}
/**
* @param price the price to set
*/
public void setPrice(Price price) {
this.price = price;
}
}
/model/Sector.java
package model;
import java.util.Calendar;
/**
* Model to hold Sector information
* @author santosh lawoo
*/
public class Sector {
private String departureAirport;
private String arrivalAirport;
private Calendar departureDate;
private Calendar arrivalDate;
private String departureTime;
private String arrivalTime;
private long sid;
private long pid;
/**
* @return the departureAirport
*/
public String getDepartureAirport() {
return departureAirport;
}
/**
* @param departureAirport the departureAirport to set
*/
public void setDepartureAirport(String departureAirport) {
this.departureAirport = departureAirport;
}
/**
* @return the arrivalAirport
*/
public String getArrivalAirport() {
return arrivalAirport;
}
/**
* @param arrivalAirport the arrivalAirport to set
*/
public void setArrivalAirport(String arrivalAirport) {
this.arrivalAirport = arrivalAirport;
}
/**
* @return the departureDate
*/
public Calendar getDepartureDate() {
return departureDate;
}
/**
* @param departureDate the departureDate to set
*/
public void setDepartureDate(Calendar departureDate) {
this.departureDate = departureDate;
}
/**
* @return the arrivalDate
*/
public Calendar getArrivalDate() {
return arrivalDate;
}
/**
* @param arrivalDate the arrivalDate to set
*/
public void setArrivalDate(Calendar arrivalDate) {
this.arrivalDate = arrivalDate;
}
/**
* @return the departureTime
*/
public String getDepartureTime() {
return departureTime;
}
/**
* @param departureTime the departureTime to set
*/
public void setDepartureTime(String departureTime) {
this.departureTime = departureTime;
}
/**
* @return the arrivalTime
*/
public String getArrivalTime() {
return arrivalTime;
}
/**
* @param arrivalTime the arrivalTime to set
*/
public void setArrivalTime(String arrivalTime) {
this.arrivalTime = arrivalTime;
}
/**
* @return the sid
*/
public long getSid() {
return sid;
}
/**
* @param sid the sid to set
*/
public void setSid(long sid) {
this.sid = sid;
}
/**
* @return the pid
*/
public long getPid() {
return pid;
}
/**
* @param pid the pid to set
*/
public void setPid(long pid) {
this.pid = pid;
}
}
/resultView.jsp
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="model.Result" %>
<%
Result[] resultsForward = (Result[])session.getAttribute("ATTR_RESULTS_FORWARD");
Result[] resultsReturn = (Result[])session.getAttribute("ATTR_RESULTS_RETURN");
SimpleDateFormat sf = new SimpleDateFormat("yyyy/MM/dd");
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Result</title>
</head>
<body>
<table border = "1" align="center">
<% if (resultsForward.length <= 0) { %>
<tr>
<td>
<font size="3" color="GRAY">Forward Flight Details</font>
</td>
</tr>
<tr>
<td align ="left" valign="bottom" bgcolor="RED">
<font size="2" color="#FFFFFF">Sorry!!! no flights found. Please try again.</font>
</td>
</tr>
<% } else {%>
<tr>
<td>
<font size="3" color="GRAY">Forward Flight Details</font>
</td>
</tr>
<tr>
<td align ="left" valign="bottom" bgcolor="#000080">
<font size="2" color="#FFFFFF"><b><%=resultsForward[0].getSector().getDepartureAirport() %></b></font> -
<font size="2" color="#FFFFFF"><b><%= resultsForward[0].getSector().getArrivalAirport() %></b></font>
</td>
</tr>
<% for (int i = 0; i < resultsForward.length; i++) { %>
<tr>
<td align ="left" valign="bottom" >
<font size="2" >Date: <%= sf.format(resultsForward[i].getSector().getDepartureDate().getTime()) %></font>
<font size="2" >Departure: <%= resultsForward[i].getSector().getDepartureTime() %></font>
<font size="2" >Arrival: <%= resultsForward[i].getSector().getArrivalTime() %></font>
</td>
</tr>
<tr>
<td align ="left" valign="bottom" >
<font size="2" >Price <%= resultsForward[i].getPrice().getBasic() + " " + resultsForward[i].getPrice().getCurr() %></font>
</td>
</tr>
<% } }%>
</table>
<br/>
<table border = "1" align="center">
<% if (resultsReturn.length <= 0) { %>
<tr>
<td>
<font size="3" color="GRAY">Return Flight Details</font>
</td>
</tr>
<tr>
<td align ="left" valign="bottom" bgcolor="RED">
<font size="2" color="#FFFFFF">Sorry!!! no flights found. Please try again.</font>
</td>
</tr>
<% } else {%>
<tr>
<td>
<font size="3" color="GRAY">Return Flight Details</font>
</td>
</tr>
<tr>
<tr>
<td align ="left" valign="bottom" bgcolor="#000080">
<font size="2" color="#FFFFFF"><b><%=resultsReturn[0].getSector().getDepartureAirport() %></b></font> -
<font size="2" color="#FFFFFF"><b><%= resultsReturn[0].getSector().getArrivalAirport() %></b></font>
</td>
</tr>
<% for (int i = 0; i < resultsReturn.length; i++) { %>
<tr>
<td align ="left" valign="bottom" >
<font size="2" >Date: <%= sf.format(resultsReturn[i].getSector().getDepartureDate().getTime()) %></font>
<font size="2" >Departure: <%= resultsReturn[i].getSector().getDepartureTime() %></font>
<font size="2" >Arrival: <%= resultsReturn[i].getSector().getArrivalTime() %></font>
</td>
</tr>
<% } }%>
</table>
</body>
</html>
/searchView.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Search Flight</title>
</head>
<body>
<form action="searchController.do" method="post">
<table border = "1" align="center">
<tr>
<td align ="center" valign="bottom" bgcolor="#000080">
<font size="4" color="#FFFFFF"><b>Airline Ticket Reservation</b></font>
</td>
</tr>
<tr>
<td>
<img src="image/airline.png" alt="Airline" width=100% height=100%>
</td>
</tr>
<tr>
<td>
<b>Airport</b> <br/>
From <SELECT NAME="fromAirport">
<OPTION VALUE="NRT">Narita, Tokyo
<OPTION VALUE="LAX">Los Angeles, California
</SELECT>
To <SELECT NAME="toAirport">
<OPTION VALUE="LAX">Los Angeles, California
<OPTION VALUE="NRT">Narita, Tokyo
</SELECT>
</td>
</tr>
<tr>
<td align="left">
<b>Date</b>[yyyy-mm-dd]<br/>
Depart <input type="text" name="fromYear" size="4">-<input type="text" name="fromMonth" size="2">-<input type="text" name="fromDay" size="2">
Return* <input type="text" name="toYear" size="4" >-<input type="text" name="toMonth" size="2" >-<input type="text" name="toDay" size="2">
<br/>
<font size="2" color="#808080">*For one-way flight keep "Return" date blank</font>
</td>
</tr>
<tr>
<td align="right">
<input type="submit" value="Search">
</td>
</tr>
</table>
</form>
</body>
</html>
/image/airline.png
/WEB-INF/web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<welcome-file-list>
<welcome-file>searchView.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>searchController</servlet-name>
<servlet-class>controller.SearchController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>searchController</servlet-name>
<url-pattern>/searchController.do</url-pattern>
</servlet-mapping>
</web-app>
Hi my dears I happy for found this site very helpful !!!
ReplyDeleteتیک بان سایت خرید آنلاین بلیط هواپیما [airline tickets] ست که بلیط استاتبول و بلیط
هواپیما لندن را می توانید به صورت بلیط چارتر از آن خریداری کنید.فرآیند خرید بلیط قطار اینترنتی تیک بان و تهیه بلیط اتویوس و حتا تهیه بلیط هواپیما خارجی به حدی آسان است که همه مسافران با دسترسی به اینترنت می توانند بدون محدودیت زمانی و مکانی آن را تهیه کنند. تیک بان بهترین سایت برای بررسی قیمت بلیط هواپیما داخلی و خارجی است.
Hi my dears I happy for found this site very helpful !!!
ReplyDeleteخرید آنلاین بلیط هواپیما
بلیط استاتبول
بلیط هواپیما لندن
بلیط چارتر
خرید بلیط قطار
بلیط اتویوس
بلیط هواپیما خارجی
قیمت بلیط هواپیما داخلی
Your site is excellent. We and our colleagues are very happy with your site and we would love to see your site in the world, hoping for the days of success that are close.
ReplyDeleteسایت بزرگ تورباتو علاوه بر امکان خرید تور لحظه آخری
خارجی این امکان را به تمامی متقاضیان عزیز میدهد که تور هایی مانند تور مشهد را به صورت لحظه آخری خریداری کنید، شما با مراجعه به سایت تور با تو و با وارد شدن به قسمت تور داخلی میتوانید تمام تور های لحظه آخری داخلی یا خارجی مثل
تور گرجستان
را مشاهده کنید و از تمامی هزینه های آن مطلع شوید. در سایت تور باتو شما میتوانید تور هایی نظیر تور دبی و همینطور تور استانبول را به صورت لحظه آخری و دقیقه نودی خریداری نمایید زیرا سایت ما شما را مطلع میسازد که در چه زمان هایی امکان این را دارید که اینگونه تور ها مثل تور ارمنستان لحظه آخری را به صورت لحظه آخری و دقیقه نودی با کمترین مبلغ تهیه کنید..
This comment has been removed by the author.
ReplyDeleteبردگیم
ReplyDeleteI bought a Telegram member from Adsmember and I am satisfied
ReplyDeletereal member telegram from adsmember
buy fake telegram users
انیمیشن های جالبی میشه باهاش درست کرد و خیلی جذاب در میاد.من چون شغلم سئو هست به فکر این افتادم که درمورد بهترین مشاور سئو یک انیمیشن با java و mysql بسازم
ReplyDelete