@@ -0,0 +1,2 @@ | |||
import pymysql | |||
pymysql.install_as_MySQLdb() |
@@ -0,0 +1,5 @@ | |||
from django.apps import AppConfig | |||
class BackendConfig(AppConfig): | |||
name = 'backend' |
@@ -0,0 +1,21 @@ | |||
from django.http import HttpResponse | |||
from django.http import HttpResponseRedirect | |||
from backend.model import product | |||
from django.conf import settings | |||
import json | |||
def home(request): | |||
home_url = settings.STATIC_URL | |||
return HttpResponseRedirect(home_url + 'home/index.html') | |||
def get_product(request): | |||
result = product.get() | |||
returns_list = {'cnt': product.get_cnt(), 'page_arr': {'current_page': 1, 'page_size': 10}, 'list': result} | |||
return HttpResponse(json.dumps(returns_list)) | |||
def curl_test(request): | |||
result = product.curl_test() | |||
return HttpResponse(json.dumps(result)) |
@@ -0,0 +1,32 @@ | |||
from backend.models import FxUser | |||
from django.core import serializers | |||
from common import util | |||
from common import curl_interface | |||
def get(): | |||
""" | |||
获取列表 | |||
:return: list | |||
""" | |||
opera_product = FxUser.objects.all().filter(phone='13795379620') | |||
opera_product = util.sql_array(opera_product, ['uid', 'nickname','phone']) | |||
return opera_product | |||
def get_cnt(): | |||
""" | |||
获取去记录总数 | |||
:rtype: int | |||
""" | |||
get_cnt = FxUser.objects.count() | |||
return get_cnt | |||
def curl_test(): | |||
body = { | |||
'cms_category_id': '114' | |||
} | |||
curl = curl_interface.CurlInterface(body, 4) | |||
result = curl.exec('http://wxtest/zzcx/home/destination/init','POST') | |||
return result |
@@ -0,0 +1,578 @@ | |||
# This is an auto-generated Django model module. | |||
# You'll have to do the following manually to clean this up: | |||
# * Rearrange models' order | |||
# * Make sure each model has one field with primary_key=True | |||
# * Make sure each ForeignKey has `on_delete` set to the desired behavior. | |||
# * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table | |||
# Feel free to rename the models, but don't rename db_table values or field names. | |||
from __future__ import unicode_literals | |||
from django.db import models | |||
class AdmUser(models.Model): | |||
uid = models.AutoField(primary_key=True) | |||
u_name = models.CharField(unique=True, max_length=100) | |||
pwd = models.CharField(max_length=255) | |||
phone = models.CharField(max_length=22, blank=True, null=True) | |||
create_time = models.DateTimeField() | |||
status = models.IntegerField() | |||
last_login = models.CharField(max_length=20, blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'adm_user' | |||
class BaseArea(models.Model): | |||
id = models.IntegerField(db_column='ID', primary_key=True) # Field name made lowercase. | |||
parent_id = models.IntegerField(db_column='PARENT_ID') # Field name made lowercase. | |||
cancel_flag = models.IntegerField(db_column='CANCEL_FLAG') # Field name made lowercase. | |||
create_user_id = models.IntegerField(db_column='CREATE_USER_ID') # Field name made lowercase. | |||
create_time = models.CharField(db_column='CREATE_TIME', max_length=20) # Field name made lowercase. | |||
update_user_id = models.IntegerField(db_column='UPDATE_USER_ID') # Field name made lowercase. | |||
update_time = models.CharField(db_column='UPDATE_TIME', max_length=20) # Field name made lowercase. | |||
area_name = models.CharField(db_column='AREA_NAME', max_length=100) # Field name made lowercase. | |||
postcode = models.CharField(db_column='POSTCODE', max_length=20) # Field name made lowercase. | |||
poi_type = models.CharField(db_column='POI_TYPE', max_length=20) # Field name made lowercase. | |||
poi_type1 = models.IntegerField(db_column='POI_TYPE1') # Field name made lowercase. | |||
poi_type2 = models.CharField(db_column='POI_TYPE2', max_length=255) # Field name made lowercase. | |||
class Meta: | |||
managed = False | |||
db_table = 'base_area' | |||
class BaseCategory(models.Model): | |||
category_id = models.AutoField(primary_key=True) | |||
category_name = models.CharField(max_length=255) | |||
parent_id = models.IntegerField() | |||
delete_flag = models.IntegerField() | |||
create_time = models.DateTimeField() | |||
update_time = models.DateTimeField() | |||
update_user = models.CharField(max_length=50) | |||
class Meta: | |||
managed = False | |||
db_table = 'base_category' | |||
class BusTicket(models.Model): | |||
ticket_id = models.IntegerField(unique=True) | |||
start_area_id = models.IntegerField() | |||
start_area_name = models.CharField(max_length=50) | |||
end_area_id = models.IntegerField() | |||
end_area_name = models.CharField(max_length=50) | |||
start_res_id = models.IntegerField() | |||
start_res_name = models.CharField(max_length=50) | |||
end_res_id = models.IntegerField() | |||
end_res_name = models.CharField(max_length=50) | |||
line_id = models.IntegerField() | |||
line_type = models.IntegerField() | |||
prod_price = models.DecimalField(max_digits=10, decimal_places=0) | |||
line_name = models.CharField(max_length=255) | |||
start_res_longitude = models.FloatField(blank=True, null=True) | |||
start_res_latitude = models.FloatField(blank=True, null=True) | |||
end_res_longitude = models.FloatField(blank=True, null=True) | |||
end_res_latitude = models.FloatField(blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'bus_ticket' | |||
class ClientOpinion(models.Model): | |||
name = models.CharField(max_length=255) | |||
e_mail = models.CharField(db_column='e-mail', max_length=255) # Field renamed to remove unsuitable characters. | |||
opinion = models.CharField(max_length=1000) | |||
client_ip = models.CharField(db_column='client _ip', max_length=255) # Field renamed to remove unsuitable characters. | |||
create_time = models.DateTimeField() | |||
class Meta: | |||
managed = False | |||
db_table = 'client_opinion' | |||
class CmsCategory(models.Model): | |||
cms_category_id = models.AutoField(primary_key=True) | |||
category_name = models.CharField(max_length=50) | |||
show_sort = models.IntegerField() | |||
delete_flag = models.IntegerField() | |||
create_time = models.DateTimeField() | |||
update_time = models.DateTimeField() | |||
update_user = models.CharField(max_length=50) | |||
category_code = models.CharField(max_length=255) | |||
system = models.IntegerField(blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'cms_category' | |||
class CmsCategoryExtra(models.Model): | |||
category_id = models.IntegerField(unique=True) | |||
category_name = models.CharField(max_length=50) | |||
category_describe = models.CharField(max_length=255) | |||
img_url = models.CharField(max_length=255) | |||
area_id = models.IntegerField() | |||
class Meta: | |||
managed = False | |||
db_table = 'cms_category_extra' | |||
class CmsCategoryProd(models.Model): | |||
prod_cate_id = models.IntegerField() | |||
cms_cate_id = models.IntegerField() | |||
show_sort = models.IntegerField() | |||
delete_flag = models.IntegerField() | |||
create_time = models.DateTimeField() | |||
update_time = models.DateTimeField() | |||
update_user = models.CharField(max_length=50) | |||
system = models.IntegerField() | |||
class Meta: | |||
managed = False | |||
db_table = 'cms_category_prod' | |||
class DjangoMigrations(models.Model): | |||
app = models.CharField(max_length=255) | |||
name = models.CharField(max_length=255) | |||
applied = models.DateTimeField() | |||
class Meta: | |||
managed = False | |||
db_table = 'django_migrations' | |||
class FxCommissionApply(models.Model): | |||
fx_uid = models.IntegerField() | |||
apply_money = models.DecimalField(max_digits=10, decimal_places=0) | |||
status = models.IntegerField() | |||
remit_time = models.CharField(max_length=50) | |||
auth_time = models.CharField(max_length=50) | |||
auth_memo = models.CharField(max_length=255) | |||
auth_uid = models.IntegerField() | |||
remit_uid = models.IntegerField() | |||
delete_flag = models.IntegerField() | |||
create_time = models.DateTimeField() | |||
update_time = models.DateTimeField() | |||
update_user = models.CharField(max_length=50) | |||
class Meta: | |||
managed = False | |||
db_table = 'fx_commission_apply' | |||
class FxCommissionInfo(models.Model): | |||
fx_uid = models.IntegerField() | |||
total_money = models.DecimalField(max_digits=10, decimal_places=0) | |||
order_id = models.IntegerField() | |||
status = models.IntegerField() | |||
delete_flag = models.IntegerField() | |||
create_time = models.DateTimeField() | |||
update_time = models.DateTimeField() | |||
update_user = models.CharField(max_length=50) | |||
class Meta: | |||
managed = False | |||
db_table = 'fx_commission_info' | |||
class FxUser(models.Model): | |||
uid = models.AutoField(primary_key=True) | |||
user_name = models.CharField(max_length=100, blank=True, null=True) | |||
openid = models.CharField(unique=True, max_length=120) | |||
phone = models.CharField(max_length=11) | |||
nickname = models.CharField(max_length=21, blank=True, null=True) | |||
headimgurl = models.CharField(max_length=255, blank=True, null=True) | |||
sex = models.IntegerField(blank=True, null=True) | |||
country = models.CharField(max_length=255, blank=True, null=True) | |||
province = models.CharField(max_length=255, blank=True, null=True) | |||
city = models.CharField(max_length=255, blank=True, null=True) | |||
status = models.IntegerField() | |||
reg_time = models.DateTimeField() | |||
delete_flag = models.IntegerField() | |||
wx_openid = models.CharField(max_length=120, blank=True, null=True) | |||
main_user_id = models.IntegerField() | |||
change_price_power = models.IntegerField() | |||
user_area = models.CharField(max_length=255, blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'fx_user' | |||
class FxUserAccount(models.Model): | |||
fx_uid = models.IntegerField(unique=True) | |||
available_commission = models.DecimalField(max_digits=10, decimal_places=0) | |||
closed_commission = models.DecimalField(max_digits=10, decimal_places=0) | |||
total_commission = models.DecimalField(max_digits=10, decimal_places=0) | |||
apply_commission = models.DecimalField(max_digits=10, decimal_places=0) | |||
remaining_sum = models.DecimalField(max_digits=10, decimal_places=0) | |||
create_time = models.DateTimeField() | |||
update_time = models.DateTimeField() | |||
status = models.IntegerField() | |||
delete_flag = models.IntegerField() | |||
class Meta: | |||
managed = False | |||
db_table = 'fx_user_account' | |||
class FxUserAmountLog(models.Model): | |||
log_id = models.AutoField(primary_key=True) | |||
fx_uid = models.IntegerField() | |||
trade_type = models.IntegerField() | |||
amount = models.DecimalField(max_digits=10, decimal_places=0) | |||
remaining_sum = models.DecimalField(max_digits=10, decimal_places=0) | |||
msg = models.CharField(max_length=255, blank=True, null=True) | |||
create_time = models.DateTimeField() | |||
update_time = models.DateTimeField(blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'fx_user_amount_log' | |||
class FxUserAmountOrder(models.Model): | |||
fx_uid = models.IntegerField() | |||
amount = models.DecimalField(max_digits=10, decimal_places=0) | |||
status = models.IntegerField() | |||
recharge_order = models.CharField(max_length=100) | |||
pay_type = models.IntegerField() | |||
create_time = models.DateTimeField(blank=True, null=True) | |||
update_time = models.DateTimeField(blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'fx_user_amount_order' | |||
class FxUserArea(models.Model): | |||
area_id = models.AutoField(primary_key=True) | |||
area_name = models.CharField(max_length=100) | |||
class Meta: | |||
managed = False | |||
db_table = 'fx_user_area' | |||
class FxUserOpenid(models.Model): | |||
open_id = models.CharField(unique=True, max_length=255) | |||
fx_uid = models.IntegerField() | |||
reg_time = models.DateTimeField() | |||
class Meta: | |||
managed = False | |||
db_table = 'fx_user_openid' | |||
class FxUserQrcode(models.Model): | |||
fx_uid = models.IntegerField(blank=True, null=True) | |||
qr_id = models.IntegerField(unique=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'fx_user_qrcode' | |||
class LogOrder(models.Model): | |||
name = models.CharField(max_length=20) | |||
order_id = models.IntegerField() | |||
time = models.DateTimeField() | |||
uid = models.IntegerField() | |||
u_type = models.IntegerField() | |||
log_type = models.IntegerField() | |||
class Meta: | |||
managed = False | |||
db_table = 'log_order' | |||
class LogUserOperation(models.Model): | |||
title = models.CharField(max_length=120) | |||
memo = models.TextField() | |||
uid = models.IntegerField() | |||
user_type = models.IntegerField() | |||
user_name = models.CharField(max_length=255) | |||
resources_id = models.IntegerField(blank=True, null=True) | |||
resources_type = models.IntegerField(blank=True, null=True) | |||
resources_name = models.CharField(max_length=255, blank=True, null=True) | |||
phpsessid = models.CharField(max_length=255, blank=True, null=True) | |||
user_agent = models.CharField(max_length=255, blank=True, null=True) | |||
create_time = models.DateTimeField() | |||
last_login = models.CharField(max_length=255, blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'log_user_operation' | |||
class MainCorpUser(models.Model): | |||
user_name = models.CharField(max_length=255) | |||
main_corp_id = models.IntegerField() | |||
main_corp_name = models.CharField(max_length=255) | |||
class Meta: | |||
managed = False | |||
db_table = 'main_corp_user' | |||
class OrderContacts(models.Model): | |||
order_id = models.IntegerField() | |||
contacts_name = models.CharField(max_length=120) | |||
contacts_phone = models.CharField(max_length=20) | |||
contacts_id = models.CharField(db_column='contacts_ID', max_length=20, blank=True, null=True) # Field name made lowercase. | |||
contacts_type = models.IntegerField() | |||
update_time = models.DateTimeField() | |||
create_time = models.DateTimeField() | |||
delete_flag = models.IntegerField() | |||
bus_run_id = models.IntegerField(blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'order_contacts' | |||
class OrderInfo(models.Model): | |||
order_id = models.IntegerField() | |||
prod_id = models.IntegerField() | |||
count = models.IntegerField() | |||
unit_price = models.DecimalField(max_digits=10, decimal_places=0) | |||
total_price = models.DecimalField(max_digits=10, decimal_places=0) | |||
delete_flag = models.IntegerField() | |||
commission = models.IntegerField() | |||
prod_name = models.CharField(max_length=255) | |||
class Meta: | |||
managed = False | |||
db_table = 'order_info' | |||
class OrderMain(models.Model): | |||
order_id = models.AutoField(primary_key=True) | |||
order_name = models.CharField(max_length=255) | |||
spider_order_id = models.CharField(max_length=255) | |||
total_money = models.DecimalField(max_digits=10, decimal_places=0) | |||
category_id = models.IntegerField() | |||
prod_cate_id = models.IntegerField() | |||
prod_source = models.IntegerField() | |||
prod_cnt = models.IntegerField() | |||
sh_uid = models.IntegerField() | |||
fx_uid = models.IntegerField() | |||
start_time = models.TimeField(blank=True, null=True) | |||
end_time = models.TimeField(blank=True, null=True) | |||
start_date = models.DateField() | |||
end_date = models.DateField() | |||
order_status = models.IntegerField() | |||
update_time = models.DateTimeField() | |||
create_time = models.DateTimeField() | |||
delete_flag = models.IntegerField() | |||
system = models.IntegerField() | |||
start_area = models.CharField(max_length=255, blank=True, null=True) | |||
end_area = models.CharField(max_length=255, blank=True, null=True) | |||
main_user_id = models.IntegerField() | |||
original_price = models.DecimalField(max_digits=10, decimal_places=0) | |||
class Meta: | |||
managed = False | |||
db_table = 'order_main' | |||
class OrderTravel(models.Model): | |||
travel_id = models.AutoField(primary_key=True) | |||
start_time = models.DateTimeField() | |||
end_time = models.DateTimeField() | |||
u_id = models.IntegerField() | |||
cs_order_id = models.IntegerField() | |||
prod_id = models.CharField(max_length=255, blank=True, null=True) | |||
start_res_id = models.IntegerField(blank=True, null=True) | |||
start_res = models.CharField(max_length=255, blank=True, null=True) | |||
end_res_id = models.IntegerField(blank=True, null=True) | |||
end_res = models.CharField(max_length=255, blank=True, null=True) | |||
start_area_name = models.CharField(max_length=255, blank=True, null=True) | |||
end_area_name = models.CharField(max_length=255, blank=True, null=True) | |||
start_longitude = models.FloatField(blank=True, null=True) | |||
start_latitude = models.FloatField(blank=True, null=True) | |||
contacts_name = models.CharField(max_length=120, blank=True, null=True) | |||
contacts_phone = models.CharField(max_length=120, blank=True, null=True) | |||
contacts_id = models.CharField(db_column='contacts_ID', max_length=120, blank=True, null=True) # Field name made lowercase. | |||
class Meta: | |||
managed = False | |||
db_table = 'order_travel' | |||
class PayMain(models.Model): | |||
pay_type = models.IntegerField() | |||
order_money = models.DecimalField(max_digits=10, decimal_places=0, blank=True, null=True) | |||
amount_money = models.DecimalField(max_digits=10, decimal_places=0, blank=True, null=True) | |||
pay_time = models.DateTimeField() | |||
pay_user = models.IntegerField() | |||
order_id = models.IntegerField() | |||
delete_flag = models.IntegerField() | |||
pay_order_id = models.CharField(max_length=255) | |||
app_id = models.CharField(max_length=255, blank=True, null=True) | |||
open_id = models.CharField(max_length=255, blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'pay_main' | |||
class PayRefush(models.Model): | |||
order_id = models.IntegerField() | |||
pay_order_id = models.CharField(max_length=255) | |||
pay_type = models.IntegerField() | |||
refush_money = models.DecimalField(max_digits=10, decimal_places=0) | |||
amount_money = models.DecimalField(max_digits=10, decimal_places=0) | |||
fx_uid = models.IntegerField() | |||
sh_uid = models.IntegerField() | |||
status = models.IntegerField() | |||
create_time = models.DateTimeField() | |||
refund_time = models.DateTimeField() | |||
delete_flag = models.IntegerField() | |||
category_id = models.IntegerField() | |||
app_id = models.CharField(max_length=255, blank=True, null=True) | |||
open_id = models.CharField(max_length=255, blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'pay_refush' | |||
class ProdCategory(models.Model): | |||
pro_cate_id = models.AutoField(primary_key=True) | |||
sign = models.CharField(max_length=255, blank=True, null=True) | |||
pro_cate_name = models.CharField(max_length=100) | |||
prod_des = models.TextField(blank=True, null=True) | |||
category_id = models.IntegerField() | |||
show_price = models.DecimalField(max_digits=10, decimal_places=0) | |||
original_price = models.DecimalField(max_digits=10, decimal_places=0) | |||
show_img = models.CharField(max_length=255) | |||
sales_count = models.IntegerField() | |||
memo = models.TextField(blank=True, null=True) | |||
trip_desc = models.TextField(blank=True, null=True) | |||
feature = models.TextField(blank=True, null=True) | |||
commission = models.DecimalField(max_digits=10, decimal_places=0) | |||
create_user_id = models.IntegerField() | |||
is_recom = models.IntegerField() | |||
start_area = models.CharField(max_length=255, blank=True, null=True) | |||
address = models.CharField(max_length=255, blank=True, null=True) | |||
close_sale_time = models.CharField(max_length=50) | |||
star = models.CharField(max_length=4) | |||
create_time = models.DateTimeField() | |||
update_time = models.DateTimeField() | |||
delete_flag = models.IntegerField() | |||
update_user = models.CharField(max_length=50) | |||
bus_ticket_id = models.IntegerField() | |||
bus_line_type = models.IntegerField() | |||
class Meta: | |||
managed = False | |||
db_table = 'prod_category' | |||
class ProdCategoryInfo(models.Model): | |||
pro_cate_id = models.IntegerField(primary_key=True) | |||
comment_cnt = models.IntegerField() | |||
class Meta: | |||
managed = False | |||
db_table = 'prod_category_info' | |||
class ProdComment(models.Model): | |||
travel_id = models.IntegerField(blank=True, null=True) | |||
prod_id = models.CharField(max_length=255, blank=True, null=True) | |||
star = models.IntegerField() | |||
title = models.CharField(max_length=30) | |||
content = models.TextField() | |||
u_name = models.CharField(max_length=100) | |||
u_id = models.IntegerField(blank=True, null=True) | |||
create_time = models.DateTimeField() | |||
look_over = models.IntegerField() | |||
type = models.IntegerField() | |||
comment_id = models.IntegerField() | |||
parent_id = models.IntegerField() | |||
cancel_flag = models.IntegerField() | |||
class Meta: | |||
managed = False | |||
db_table = 'prod_comment' | |||
class ProdImg(models.Model): | |||
pro_cate_id = models.IntegerField() | |||
img_url = models.CharField(max_length=255) | |||
redirect_url = models.CharField(max_length=255, blank=True, null=True) | |||
memo = models.CharField(max_length=255, blank=True, null=True) | |||
img_type = models.IntegerField() | |||
create_time = models.DateTimeField() | |||
class Meta: | |||
managed = False | |||
db_table = 'prod_img' | |||
class ProdMain(models.Model): | |||
prod_id = models.AutoField(primary_key=True) | |||
prod_cate_id = models.IntegerField() | |||
prod_name = models.CharField(max_length=100) | |||
prod_price = models.DecimalField(max_digits=10, decimal_places=0) | |||
create_user = models.CharField(max_length=50) | |||
create_time = models.DateTimeField() | |||
update_time = models.DateTimeField() | |||
delete_flag = models.IntegerField() | |||
update_user = models.CharField(max_length=50) | |||
bus_id = models.CharField(max_length=255) | |||
commission = models.DecimalField(max_digits=10, decimal_places=0) | |||
class Meta: | |||
managed = False | |||
db_table = 'prod_main' | |||
class ShUser(models.Model): | |||
uid = models.AutoField(primary_key=True) | |||
user_name = models.CharField(max_length=100, blank=True, null=True) | |||
phone = models.CharField(unique=True, max_length=20, blank=True, null=True) | |||
head_img = models.CharField(max_length=255, blank=True, null=True) | |||
status = models.IntegerField(blank=True, null=True) | |||
reg_time = models.DateTimeField(blank=True, null=True) | |||
last_login = models.DateTimeField(blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'sh_user' | |||
class SysItinerary(models.Model): | |||
category_id = models.IntegerField() | |||
category_name = models.CharField(max_length=50) | |||
scenc_introduce = models.TextField(blank=True, null=True) | |||
scenc_play = models.TextField(blank=True, null=True) | |||
folk_customs = models.TextField(blank=True, null=True) | |||
local_specialities = models.TextField(blank=True, null=True) | |||
travel_tips = models.TextField(blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'sys_itinerary' | |||
class ZzNews(models.Model): | |||
class_id = models.IntegerField() | |||
news_title = models.CharField(max_length=100) | |||
navi_content = models.CharField(max_length=255) | |||
content = models.TextField() | |||
create_user = models.CharField(max_length=50) | |||
create_time = models.DateTimeField() | |||
update_time = models.DateTimeField() | |||
delete_flag = models.IntegerField() | |||
class Meta: | |||
managed = False | |||
db_table = 'zz_news' |
@@ -0,0 +1,10 @@ | |||
from django.conf.urls import url | |||
from backend import views | |||
from backend.controller import home | |||
urlpatterns = [ | |||
url(r'^index/', views.index), | |||
url(r'^home/product', home.get_product), | |||
url(r'^home/curl_test', home.curl_test) | |||
] |
@@ -0,0 +1,6 @@ | |||
# Create your views here. | |||
from django.shortcuts import render | |||
def index(request): | |||
return render(request, 'index.html') |
@@ -0,0 +1,10 @@ | |||
<!DOCTYPE html> | |||
<html lang="en"> | |||
<head> | |||
<meta charset="UTF-8"> | |||
<title>Title</title> | |||
</head> | |||
<body> | |||
</body> | |||
</html> |
@@ -0,0 +1,135 @@ | |||
#!/usr/bin/env python | |||
# encoding: utf-8 | |||
""" | |||
* | |||
* ============================================================================ | |||
* * 版权所有 蜘蛛出行 * * | |||
* 网站地址: http://www.zhizhuchuxing.com | |||
* ---------------------------------------------------------------------------- | |||
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和 | |||
* 使用;不允许对程序代码以任何形式任何目的的再发布。 | |||
* ============================================================================ | |||
* Author By: 倪宗锋 | |||
* FileName curl_interface.py | |||
* Create By 2017/12/12 13:53 $ | |||
""" | |||
import json | |||
import pycurl | |||
from io import * | |||
from urllib.parse import urlencode | |||
import time | |||
import logging | |||
from django.conf import settings | |||
import os | |||
class CurlInterface: | |||
__body = '' # 报文体 | |||
__type = 1 # 报文数据类型 1:json 2:xml 3 发送原数据接收xml 4 发送原数据 接收json 5:都是原数据 | |||
__response = '' # 返回值 | |||
__time_out = 200 # 超时时间 | |||
__url = '' # 接口地址 | |||
__verb = 'get' # 传值方式 | |||
__curl_get_info = '' # 校验概要 | |||
__log_msg = '' # 日志 | |||
__curl = '' # curl对象 | |||
__total_time = 0 # 总耗时 | |||
def __init__(self, body, type): | |||
""" | |||
初始化curl类 | |||
:param body: 报文体 | |||
:param type: 报文数据类型 1:json 2:xml 3 发送原数据接收xml 4 发送原数据 接收json 5:都是原数据 | |||
""" | |||
self.__type = type | |||
self.__set_body(body) | |||
def __set_body(self, body): | |||
""" | |||
设置报文体 | |||
:param body: | |||
:return: array|string | |||
""" | |||
if self.__type == 1: | |||
self.__body = json.dumps(body) | |||
elif self.__type == 2: | |||
self.__body = body | |||
elif self.__type == 3: | |||
self.__body = urlencode(body) | |||
elif self.__type == 4: | |||
self.__body = urlencode(body) | |||
else: | |||
self.__body = urlencode(body) | |||
def exec(self, url, verb): | |||
""" | |||
curl执行 | |||
:param url: 接口地址 | |||
:param verb: post|get 传值方式 | |||
:return: | |||
""" | |||
try: | |||
self.__verb = verb | |||
self.__url = url | |||
self.__curl = pycurl.Curl() | |||
b = BytesIO() | |||
self.__curl.setopt(pycurl.WRITEFUNCTION, b.write) | |||
self.__curl.setopt(pycurl.URL, url) # 路径 | |||
self.__curl.setopt(pycurl.ENCODING, 'gzip,deflate') # 编码格式 | |||
self.__curl.setopt(pycurl.FOLLOWLOCATION, 1) | |||
# self.__curl.setopt(pycurl.VERBOSE, 1) # 打印调试信息 | |||
# self.__curl.setopt(pycurl.HEADER, 1)#输出头部信息 | |||
self.__curl.setopt(pycurl.FOLLOWLOCATION, 1) | |||
self.__curl.setopt(pycurl.MAXREDIRS, 5) # 指定HTTP重定向的最大数 | |||
self.__curl.setopt(pycurl.DNS_CACHE_TIMEOUT, 60 * 60 * 24) # DNS解析缓存时间 不要调低 第一次可能时间很长 故需要长时间缓存dns解析 | |||
if self.__verb == 'POST': | |||
self.__curl.setopt(pycurl.POST, 1) | |||
self.__curl.setopt(pycurl.POSTFIELDS, self.__body) | |||
else: | |||
self.__curl.setopt(pycurl.HTTPGET, 1) | |||
self.__curl.perform() | |||
self.__response = b.getvalue().decode("utf-8") | |||
self.__total_time = self.__curl.getinfo(pycurl.TOTAL_TIME) | |||
b.close() | |||
self.__curl.close() | |||
return self.__set_return() | |||
except BaseException as e: | |||
return {'code': 1, 'msg': '接口返回异常', 'data': ''} | |||
def __set_return(self): | |||
""" | |||
设置返回值 | |||
:return: | |||
""" | |||
if self.__type == 1: # 返回json | |||
result = json.loads(self.__response) | |||
elif self.__type == 2: # 返回xml | |||
result = self.__response | |||
elif self.__type == 3: # 返回xml | |||
result = self.__response | |||
elif self.__type == 4: # 返回json数据 | |||
result = json.loads(self.__response) | |||
else: # 返回原数据 | |||
result = self.__response | |||
res = result | |||
return res | |||
def __del__(self): | |||
""" | |||
记录访问日志 | |||
:return: | |||
""" | |||
self.__log_msg = '' | |||
self.__log_msg += time.strftime('%Y-%m-%d %H:%I:%S', time.localtime(time.time())) + '\n' | |||
self.__log_msg += 'curl:' + self.__url + ' method:' + self.__verb + '\n' | |||
self.__log_msg += 'body:' + self.__body + '\n' | |||
self.__log_msg += 'response:' + self.__response + '\n\n' | |||
date = time.strftime('%Y-%m-%d', time.localtime(time.time())) | |||
log_file = settings.BASE_DIR + '/log/curl/' + date + '.log' # 日志路径 | |||
if os.path.exists(log_file) is False: # 日志文件不存在则创建 | |||
fobj = open(log_file, 'w') | |||
fobj.close() | |||
logging.basicConfig(filename=log_file, filemode='w', level=logging.INFO) | |||
logging.info(self.__log_msg) |
@@ -0,0 +1,213 @@ | |||
""" | |||
通用方法类 | |||
""" | |||
from django.http import HttpResponse | |||
import json | |||
from datetime import date, datetime | |||
from django.db import connection | |||
from django.conf import settings | |||
import hashlib | |||
import decimal | |||
class CJsonEncoder(json.JSONEncoder): | |||
def default(self, obj): | |||
if isinstance(obj, datetime): | |||
return obj.strftime('%Y-%m-%d %H:%M:%S') | |||
elif isinstance(obj, date): | |||
return obj.strftime('%Y-%m-%d') | |||
elif isinstance(obj, decimal.Decimal): # python无法json_dumps decimal类型,转成float型 | |||
return float(obj) | |||
else: | |||
return json.JSONEncoder.default(self, obj) | |||
def sql_array(result, select): | |||
""" | |||
sql数据查询转换为数组 | |||
:param result:查询结果 | |||
:param select:查询的字段 | |||
:return: | |||
""" | |||
return_list = [] | |||
for i in result: | |||
val_list = {} | |||
for j in select: | |||
val_list[j] = i.__getattribute__(j) # 获取字段的值 | |||
return_list.append(val_list) | |||
return return_list | |||
def re_su(msg='', data='', url='', code=0): | |||
""" | |||
返回成功信息 | |||
:param msg: | |||
:param data: | |||
:param url: | |||
:param code: | |||
:return: | |||
""" | |||
if data == '': | |||
data = {} | |||
result = { | |||
'flag': True, | |||
'msg': msg, | |||
'data': data, | |||
'url': url, | |||
'code': code | |||
} | |||
return result | |||
def re_err(msg, data='', url='', code=1): | |||
""" | |||
返回报错信息到上一层 | |||
:param msg: | |||
:param data: | |||
:param url: | |||
:param code: | |||
:return: | |||
""" | |||
if data == '': | |||
data = {} | |||
result = { | |||
'flag': False, | |||
'msg': msg, | |||
'data': data, | |||
'url': url, | |||
'code': code | |||
} | |||
return result | |||
def re_json_su(msg='', data='', url='', code=0): | |||
""" | |||
返回 失败错误信息 | |||
:param msg: | |||
:param data: | |||
:param url: | |||
:param code: | |||
:return: | |||
""" | |||
if data == '': | |||
data = {} | |||
result = { | |||
'flag': True, | |||
'msg': msg, | |||
'data': data, | |||
'url': url, | |||
'code': code | |||
} | |||
return HttpResponse(json.dumps(result, cls=CJsonEncoder)) | |||
def re_json_err(msg, data='', url='', code=1): | |||
""" | |||
返回json报错信息到前端 | |||
:param msg: | |||
:param data: | |||
:param url: | |||
:param code: | |||
:return: | |||
""" | |||
if data == '': | |||
data = {} | |||
result = { | |||
'flag': False, | |||
'msg': msg, | |||
'data': data, | |||
'url': url, | |||
'code': code | |||
} | |||
return HttpResponse(json.dumps(result, cls=CJsonEncoder)) | |||
def re_json(data): | |||
""" | |||
返回字符串 | |||
:param data: | |||
:return: | |||
""" | |||
return HttpResponse(json.dumps(data, cls=CJsonEncoder)) | |||
def select_all(sql, param): | |||
""" | |||
select查询 | |||
:param sql: | |||
:return: | |||
""" | |||
cursor = connection.cursor() | |||
cursor.execute(sql, param) | |||
items = cursor.fetchall() # 读取所有 | |||
desc = cursor.description | |||
li = [] | |||
if items: | |||
for item in items: | |||
d = {} | |||
i = 0 | |||
for de in desc: | |||
d[de[0]] = str(item[i]) | |||
i = i + 1 | |||
li.append(d) | |||
return li | |||
else: | |||
return li | |||
def select_row(sql, param): | |||
""" | |||
select查询 | |||
:param sql: | |||
:return: | |||
""" | |||
cursor = connection.cursor() | |||
cursor.execute(sql, param) | |||
items = cursor.fetchall() # 读取所有 | |||
desc = cursor.description | |||
li = [] | |||
if items: | |||
for item in items: | |||
d = {} | |||
i = 0 | |||
for de in desc: | |||
d[de[0]] = item[i] | |||
i = i + 1 | |||
li.append(d) | |||
return li[0] | |||
else: | |||
return li | |||
def auth_code_for_cs(request_time): | |||
""" | |||
cs接口调用加密函数 | |||
:param request_time: | |||
:return: | |||
""" | |||
request_time = str(request_time) | |||
user = settings.ADM_USER | |||
user_key = settings.ADM_USER_KEY | |||
# 加密规则为 request_time(linux时间戳)前三位作为种子+ user + user_key+后三位,进行MD5加密后,换成大写字母 | |||
auth_code = ( | |||
request_time[0:3] + "|" + user + "|" + user_key + "|" + request_time[(len(request_time) - 3):len(request_time)]) | |||
m2 = hashlib.md5() # 进行md5加密 | |||
m2.update(auth_code.encode("utf-8")) | |||
return m2.hexdigest().upper() | |||
def get_client_ip(request): | |||
""" | |||
获取用户ip | |||
:param request: | |||
:return: | |||
""" | |||
try: | |||
real_ip = request.META['HTTP_X_FORWARDED_FOR'] | |||
regip = real_ip.split(",")[0] | |||
except: | |||
try: | |||
regip = request.META['REMOTE_ADDR'] | |||
except: | |||
regip = "" | |||
return regip |
@@ -0,0 +1,10 @@ | |||
<!DOCTYPE html> | |||
<html lang="en"> | |||
<head> | |||
<meta charset="UTF-8"> | |||
<title>Title</title> | |||
</head> | |||
<body> | |||
手机官网 | |||
</body> | |||
</html> |
@@ -0,0 +1,22 @@ | |||
#!/usr/bin/env python | |||
import os | |||
import sys | |||
if __name__ == "__main__": | |||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ulb_manage.settings") | |||
try: | |||
from django.core.management import execute_from_command_line | |||
except ImportError: | |||
# The above import may fail for some other reason. Ensure that the | |||
# issue is really that Django is missing to avoid masking other | |||
# exceptions on Python 2. | |||
try: | |||
import django | |||
except ImportError: | |||
raise ImportError( | |||
"Couldn't import Django. Are you sure it's installed and " | |||
"available on your PYTHONPATH environment variable? Did you " | |||
"forget to activate a virtual environment?" | |||
) | |||
raise | |||
execute_from_command_line(sys.argv) |
@@ -0,0 +1,2 @@ | |||
import pymysql | |||
pymysql.install_as_MySQLdb() |
@@ -0,0 +1,5 @@ | |||
from django.apps import AppConfig | |||
class OfficialConfig(AppConfig): | |||
name = 'official' |
@@ -0,0 +1,46 @@ | |||
from official.model import FxUser | |||
from common import util | |||
from official.model import ZzNews | |||
from django.conf import settings | |||
from django.http import HttpResponseRedirect | |||
from official.logic import client_opinion | |||
def index(request): | |||
home_url = settings.STATIC_URL | |||
return HttpResponseRedirect(home_url + 'official/index.html') | |||
def get_list(request): | |||
returns_list = FxUser.get_list() # 获取用户列表 | |||
return util.re_json_su('', returns_list) # 返回json数组 | |||
def get_news(request): | |||
page = request.POST.get('page', 1) | |||
page_size = request.POST.get('page_size', 8) # 每页条数 | |||
news_list = ZzNews.get_news(page, page_size) | |||
return util.re_json_su('', {'news_list': news_list}) | |||
def get_news_by_class(request): | |||
class_id = request.POST.get('class_id', 1) | |||
page = request.POST.get('page', 1) | |||
page_size = request.POST.get('page_size', 8) # 每页条数 | |||
news_list = ZzNews.get_news_by_class(class_id, page, page_size) | |||
return util.re_json_su('', news_list) | |||
def get_news_content(request): | |||
news_id = request.POST.get('id', 1) | |||
data = ZzNews.get_news_content(news_id) | |||
return util.re_json_su('', data) | |||
def addOpinion(request): | |||
name = request.POST.get('userName', '') | |||
mail = request.POST.get('userEmail', '') | |||
opinion = request.POST.get('userText', '') | |||
ip = util.get_client_ip(request) | |||
rst = client_opinion.addOpinion(name, mail, opinion, ip) | |||
return util.re_json(rst) |
@@ -0,0 +1,24 @@ | |||
from official.logic import order_logic as logic | |||
from common import util | |||
def make_order(request): | |||
""" | |||
下单接口 | |||
:param request: | |||
:return: | |||
""" | |||
params = logic.get_make_order_params(request) | |||
result = logic.make_order(params) | |||
return util.re_json(result) | |||
def check_order(request): | |||
""" | |||
校验订单状态 | |||
:param request: | |||
:return: | |||
""" | |||
order_id = request.POST.get('order_id', '11493') # order_id | |||
result = logic.check_order(order_id) | |||
return util.re_json(result) |
@@ -0,0 +1,24 @@ | |||
from official.logic import cms_category_prod_logic as cmslogic | |||
from common import util | |||
def get_cms_list(request): | |||
res = cmslogic.getCmsProdcateList() | |||
return util.re_json(res) | |||
def get_prod_list(request): | |||
""" | |||
获取产品列表 | |||
:param request: | |||
:return: | |||
""" | |||
cms_cate_id = request.POST.get('cms_cate_id', 0) | |||
content = request.POST.get('content', '') | |||
page = request.POST.get('page', 1) | |||
page_size = request.POST.get('page_size', 6) | |||
if cms_cate_id == '167': | |||
res = cmslogic.get_www_hotel_list(content, page, page_size) | |||
else: | |||
res = cmslogic.getProdList(cms_cate_id, content, page, page_size) | |||
return util.re_json(res) |
@@ -0,0 +1,37 @@ | |||
from official.logic import reserve_bus_logic as logic | |||
from common import util | |||
def get_prod_info(request): | |||
""" | |||
巴士产品获取 | |||
:param request: | |||
:return: | |||
""" | |||
# 获取参数 | |||
prod_id = request.POST.get('prod_id', '') # 产品ID | |||
get_info = logic.get_prod_info(prod_id) # 获取产品信息 | |||
return util.re_json(get_info) | |||
def get_line_stock(request): | |||
""" | |||
获取主线路库存信息 | |||
:param request: | |||
:return: | |||
""" | |||
prod_id = request.POST.get('prod_id', '') # 产品ID | |||
date = request.POST.get('date', '') # 日期 | |||
get_stock = logic.get_line_stock(prod_id, date) | |||
return util.re_json(get_stock) | |||
def get_prod_array(request): | |||
""" | |||
获取产品数组 | |||
:param request: | |||
:return: | |||
""" | |||
prod_id = request.POST.get('prod_id', '') # 子线路产品ID | |||
get_prod = logic.get_prod_array(prod_id) | |||
return util.re_json(get_prod) |
@@ -0,0 +1,76 @@ | |||
from official.logic import reserve_hotel_logic as logic | |||
from common import util | |||
def get_info(request): | |||
""" | |||
获取酒店产品信息 | |||
:param request: | |||
:return: | |||
""" | |||
data = { | |||
'hotel_id': request.POST.get('hotel_id', ''), # 酒店ID | |||
'start_date': request.POST.get('start_date', ''), # 入住日期 | |||
'end_date': request.POST.get('end_date', '') # 离店日期 | |||
} | |||
res = logic.get_info(data) # 获取产品信息 | |||
return util.re_json(res) | |||
def get_room_list(request): | |||
""" | |||
获取酒店房型列表 | |||
:param request: | |||
:return: | |||
""" | |||
data = { | |||
'hotel_id': request.POST.get('hotel_id', ''), # 酒店ID | |||
'start_date': request.POST.get('start_date', ''), # 入住日期 | |||
'end_date': request.POST.get('end_date', ''), # 离店日期 | |||
'room_id': request.POST.get('room_id', '') # 指定房型ID (非必传) | |||
} | |||
res = logic.get_room_list(data) # 获取产品信息 | |||
return util.re_json(res) | |||
def check_hotel(request): | |||
""" | |||
校验酒店数据 | |||
:param request: | |||
:return: | |||
""" | |||
data = { | |||
'total_details': request.POST.get('total_details', ''), # 单价列表 | |||
'hotel_id': request.POST.get('hotel_id', ''), # 酒店ID | |||
'start_date': request.POST.get('start_date', ''), # 入住日期 | |||
'end_date': request.POST.get('end_date', ''), # 离店日期 | |||
'room_id': request.POST.get('room_id', ''), # 指定房型ID | |||
'prod_cnt': request.POST.get('prod_cnt', ''), # 产品数量 | |||
} | |||
res = logic.check_hotel(data) # 获取产品信息 | |||
return util.re_json(res) | |||
def make_order(request): | |||
""" | |||
酒店下单 | |||
:param request: | |||
:return: | |||
""" | |||
data = { | |||
'hotel_id': request.POST.get('hotel_id', ''), # 酒店ID | |||
'start_date': request.POST.get('start_date', ''), # 入住日期 | |||
'end_date': request.POST.get('end_date', ''), # 离店日期 | |||
'room_id': request.POST.get('room_id', ''), # 指定房型ID | |||
'prod_cnt': request.POST.get('prod_cnt', ''), # 产品数量 | |||
'contacts_name': request.POST.get('contacts_name', ''), # 联系人名称 | |||
'contacts_phone': request.POST.get('contacts_phone', ''), # 手机 | |||
'in_time': request.POST.get('in_time', ''), # 入住时间 | |||
'hotel_name': request.POST.get('hotel_name', ''), # 酒店名称 | |||
'remarks': request.POST.get('remarks', ''), # 备注 | |||
'passanger_arr': request.POST.get('passanger_arr', ''), # 入住人 | |||
'system': request.POST.get('system', '3') #系统编号 | |||
} | |||
res = logic.make_order(data) # 获取产品信息 | |||
return util.re_json(res) |
@@ -0,0 +1,25 @@ | |||
from official.logic import reserve_ticket_logic as logic | |||
from common import util | |||
def get_prod_info(request): | |||
""" | |||
获取门票产品信息 | |||
:param request: | |||
:return: | |||
""" | |||
prod_id = request.POST.get('prod_id', '') # 产品ID | |||
get_info = logic.get_prod_info(prod_id) # 获取产品信息 | |||
return util.re_json(get_info) | |||
def get_stock(request): | |||
""" | |||
获取票种信息 | |||
:param request: | |||
:return: | |||
""" | |||
prod_id = request.POST.get('prod_id', '') # 产品ID | |||
date = request.POST.get('date', '') # 产品ID | |||
get_info = logic.get_stock(prod_id, date) # 获取票种信息 | |||
return util.re_json(get_info) |
@@ -0,0 +1,38 @@ | |||
from official.logic import reserve_tourist_logic as logic | |||
from common import util | |||
def get_prod_info(request): | |||
""" | |||
获取门票产品信息 | |||
:param request: | |||
:return: | |||
""" | |||
prod_id = request.POST.get('prod_id', '') # 产品ID | |||
get_info = logic.get_prod_info(prod_id) # 获取产品信息 | |||
return util.re_json(get_info) | |||
def get_stock(request): | |||
""" | |||
获取票种信息 | |||
:param request: | |||
:return: | |||
""" | |||
prod_id = request.POST.get('prod_id', '') # 产品ID | |||
date = request.POST.get('date', '') # 日期 | |||
get_info = logic.get_stock(prod_id, date) # 获取票种信息 | |||
return util.re_json(get_info) | |||
def get_price(request): | |||
""" | |||
获取订单价格 | |||
:param request: | |||
:return: | |||
""" | |||
prod_id = request.POST.get('prod_id', '') # 产品ID | |||
prod_array = request.POST.get('prod_array', []) # //产品数组 | |||
date = request.POST.get('date', '') # 日期 | |||
get_info = logic.get_price(prod_id, date, prod_array) # 获取订单价格 | |||
return util.re_json(get_info) |
@@ -0,0 +1,12 @@ | |||
from official.model import ClientOpinion | |||
from common import util | |||
def addOpinion(name, mail, opinion, ip): | |||
if name == '' and mail == '' and opinion == '': | |||
return util.re_err('缺少参数') | |||
result = ClientOpinion.addOpinion(name, mail, opinion, ip) | |||
if result: | |||
return util.re_su('增加成功') | |||
else: | |||
return util.re_err('添加失败') |
@@ -0,0 +1,76 @@ | |||
from common import util | |||
from official.model import CmsCategory | |||
from official.model import CmsCategoryProd | |||
import math | |||
from common import curl_interface | |||
from django.conf import settings | |||
def getCmsProdcateList(): | |||
""" | |||
获取官网的产品分类 | |||
:return: | |||
""" | |||
result = CmsCategory.getCmsCategory() | |||
res = { | |||
'cms_category_list': result, | |||
} | |||
return util.re_su('', res) | |||
def getProdList(cms_cate_id, content, page, page_size): | |||
""" | |||
根据产品分类id获取产品列表 | |||
:param cms_cate_id: 分类id | |||
:param content: 搜索关键字 | |||
:param page: 当前页 | |||
:param page_size: 每页的条数 | |||
:return: | |||
""" | |||
prod_list = CmsCategoryProd.getProdByCms(cms_cate_id, content, page, page_size) | |||
num = CmsCategoryProd.getProdNumByCms(cms_cate_id, content) | |||
for item in prod_list: | |||
item['show_img'] = item['show_img'] + '.370x326.jpg' | |||
if num['num'] is None: | |||
number = 0 | |||
else: | |||
number = int(num['num']) | |||
paper = { | |||
'total': number, | |||
'current': int(page), | |||
'page_size': int(page_size), | |||
'total_pages': math.ceil(number / int(page_size)) | |||
} | |||
res = { | |||
'prod_list': prod_list, | |||
'page': paper | |||
} | |||
return util.re_su('', res) | |||
def get_www_hotel_list(content, page, page_size): | |||
""" | |||
获取官网酒店数据 | |||
:return: | |||
""" | |||
curl = curl_interface.CurlInterface('', 4) | |||
lists = curl.exec(settings.WX_HOST + '/zzcx/home/hotel/get-www-hotel-list', 'get') | |||
result = [] | |||
for hotel in lists: | |||
if content in hotel['pro_cate_name']: | |||
result.append(hotel) | |||
number = len(result) | |||
start = (int(page) - 1) * int(page_size) | |||
end = int(page) * int(page_size) | |||
prod_list = result[start:end] | |||
paper = { | |||
'total': number, | |||
'current': int(page), | |||
'page_size': int(page_size), | |||
'total_pages': math.ceil(number / int(page_size)) | |||
} | |||
res = { | |||
'prod_list': prod_list, | |||
'page': paper | |||
} | |||
return util.re_su('', res) |
@@ -0,0 +1,53 @@ | |||
from common import curl_interface | |||
from django.conf import settings | |||
from urllib import parse | |||
def get_make_order_params(request): | |||
params = { | |||
'days': request.POST.get('days', '1'), # 经历的天数 | |||
'pro_cate_id': request.POST.get('pro_cate_id', ''), # 去的产品品类ID | |||
'start_date': request.POST.get('start_date', ''), # 出发日期 | |||
'start_time': request.POST.get('start_time', '00:00:00'), # 去程出发时间 | |||
'run_id': request.POST.get('run_id', ''), # 去除班次ID | |||
# 巴士才有的参数 | |||
'prod_arr': request.POST.get('prod_arr', ''), # 去的产品列表 | |||
'contacts_name': request.POST.get('contacts_name', ''), # 联系人名称 | |||
'contacts_phone': request.POST.get('contacts_phone', ''), # 联系人手机 | |||
'contacts_ID': request.POST.get('contacts_ID', ''), # 联系人身份证 | |||
'is_buy_insurance': request.POST.get('is_buy_insurance', '0'), # 是否购买保险,0:不购买,1:购买 | |||
'insurance_list': request.POST.get('insurance_list', '[]'), # 保险受保人数组 | |||
'insurance_price': request.POST.get('insurance_price', 2), # 保险价格 | |||
'passanger_arr': request.POST.get('passanger_arr', '[]'), # 出行人数组 | |||
'system': request.POST.get('system', 2), # 系统ID | |||
} | |||
return params | |||
def make_order(params): | |||
""" | |||
调用下单接口 | |||
:param params: | |||
:return: | |||
""" | |||
curl = curl_interface.CurlInterface(params, 4) | |||
result = curl.exec(settings.WX_HOST + '/zzcx/order/order/make-order', 'POST') | |||
if result['flag'] is True: | |||
result['data']['pay_url'] = settings.FX_HOST + '/fx/?r=weChat/we-chat/q-code&qCode=' + parse.quote_plus( | |||
result['data']['pay_url']) | |||
return result | |||
def check_order(order_id): | |||
""" | |||
校验订单状态 | |||
:param order_id: | |||
:return: | |||
""" | |||
params = { | |||
'order_id': order_id, | |||
'money': 1 | |||
} | |||
curl = curl_interface.CurlInterface(params, 4) | |||
result = curl.exec(settings.WX_HOST + '/zzcx/order/order/check-order-status', 'POST') | |||
return result |
@@ -0,0 +1,72 @@ | |||
import re | |||
from common import util | |||
from official.model import ProdCategory | |||
from django.conf import settings | |||
from common import curl_interface | |||
import time | |||
def get_prod_info(prod_id): | |||
""" | |||
获取巴士产品信息 | |||
:param prod_id: | |||
:return: | |||
""" | |||
# 参数校验 | |||
if re.match('^[1-9][0-9]{0,10}', prod_id) is None: | |||
return util.re_err('参数错误') | |||
# 数据获取 | |||
get_info = ProdCategory.get_bus_line_prod(prod_id) | |||
if get_info['category_id'] != 1: | |||
return util.re_err('该产品不是巴士产品') | |||
# 获取价格日历 | |||
date_price = get_date_price(prod_id) | |||
if date_price['flag'] is False: | |||
return date_price | |||
res = { | |||
'prod_info': get_info, | |||
'date_list': date_price['data']['list'] | |||
} | |||
return util.re_su('', res) | |||
def get_line_stock(prod_id, date): | |||
""" | |||
获取产品库存 | |||
:param prod_id: | |||
:param date: | |||
:return: | |||
""" | |||
send_data = { | |||
'pro_cate_id': prod_id, | |||
'date': date | |||
} | |||
curl = curl_interface.CurlInterface(send_data, 4) | |||
get_stock = curl.exec(settings.WX_HOST + '/zzcx/home/bus/get-line-bus-stock', 'POST') | |||
return get_stock | |||
def get_date_price(prod_id): | |||
""" | |||
获取价格日历 | |||
:param line_id: | |||
:return: | |||
""" | |||
send_data = { | |||
'pro_cate_id': prod_id, | |||
} | |||
curl = curl_interface.CurlInterface(send_data, 4) | |||
ticket_arr_cs = curl.exec(settings.WX_HOST + '/zzcx/home/bus/get-line-sale-date', 'POST') | |||
return ticket_arr_cs | |||
def get_prod_array(prod_id): | |||
""" | |||
获取票种数组 | |||
:param prod_id: | |||
:return: | |||
""" | |||
get_arr = ProdCategory.get_prod_array(prod_id) | |||
return util.re_su('', {'list': get_arr}) |
@@ -0,0 +1,50 @@ | |||
from common import curl_interface | |||
from django.conf import settings | |||
from urllib import parse | |||
def get_info(send_data): | |||
""" | |||
获取酒店详情 | |||
:param send_data: | |||
:return: | |||
""" | |||
curl = curl_interface.CurlInterface(send_data, 4) | |||
result = curl.exec(settings.WX_HOST + '/zzcx/home/hotel/get-info', 'POST') | |||
return result | |||
def get_room_list(send_data): | |||
""" | |||
获取房型列表 | |||
:param send_data: | |||
:return: | |||
""" | |||
curl = curl_interface.CurlInterface(send_data, 4) | |||
result = curl.exec(settings.WX_HOST + '/zzcx/home/hotel/get-room-list', 'POST') | |||
return result | |||
def check_hotel(send_data): | |||
""" | |||
校验酒店 | |||
:param send_data: | |||
:return: | |||
""" | |||
curl = curl_interface.CurlInterface(send_data, 4) | |||
result = curl.exec(settings.WX_HOST + '/zzcx/home/hotel/check-hotel', 'POST') | |||
return result | |||
def make_order(send_data): | |||
""" | |||
酒店下单 | |||
:param send_data: | |||
:return: | |||
""" | |||
curl = curl_interface.CurlInterface(send_data, 4) | |||
result = curl.exec(settings.WX_HOST + '/zzcx/home/hotel/make-order', 'POST') | |||
if result['flag'] is True: | |||
result['data']['pay_url'] = settings.FX_HOST + '/fx/?r=weChat/we-chat/q-code&qCode=' + parse.quote_plus( | |||
result['data']['pay_url']) | |||
return result |
@@ -0,0 +1,35 @@ | |||
import re | |||
from common import util | |||
from common import curl_interface | |||
from django.conf import settings | |||
def get_prod_info(prod_id): | |||
# 参数校验 | |||
if re.match('^[1-9][0-9]{0,10}', prod_id) is None: | |||
return util.re_err('参数错误') | |||
send_data = { | |||
'pro_cate_id': prod_id | |||
} | |||
curl = curl_interface.CurlInterface(send_data, 4) | |||
get_info = curl.exec(settings.WX_HOST + '/zzcx/home/men-p/initialize', 'POST') | |||
return get_info | |||
def get_stock(prod_id, date): | |||
""" | |||
获取门票票种信息 | |||
:param prod_id: | |||
:param date: | |||
:return: | |||
""" | |||
# 参数校验 | |||
if re.match('^[1-9][0-9]{0,10}', prod_id) is None: | |||
return util.re_err('参数错误') | |||
send_data = { | |||
'prod_cate_id': prod_id, | |||
'date': date | |||
} | |||
curl = curl_interface.CurlInterface(send_data, 4) | |||
result = curl.exec(settings.WX_HOST + '/zzcx/home/men-p/get-prod-arr', 'POST') | |||
return result |
@@ -0,0 +1,56 @@ | |||
import re | |||
from common import util | |||
from common import curl_interface | |||
from django.conf import settings | |||
def get_prod_info(prod_id): | |||
# 参数校验 | |||
if re.match('^[1-9][0-9]{0,10}', prod_id) is None: | |||
return util.re_err('参数错误') | |||
send_data = { | |||
'pro_cate_id': prod_id | |||
} | |||
curl = curl_interface.CurlInterface(send_data, 4) | |||
get_info = curl.exec(settings.WX_HOST + '/zzcx/home/free-walker/initialize', 'POST') | |||
return get_info | |||
def get_stock(prod_id, date): | |||
""" | |||
获取门票票种信息 | |||
:param prod_id: | |||
:param date: | |||
:return: | |||
""" | |||
# 参数校验 | |||
if re.match('^[1-9][0-9]{0,10}', prod_id) is None: | |||
return util.re_err('参数错误') | |||
send_data = { | |||
'prod_cate_id': prod_id, | |||
'date': date | |||
} | |||
curl = curl_interface.CurlInterface(send_data, 4) | |||
result = curl.exec(settings.WX_HOST + '/zzcx/home/free-walker/get-prod-arr', 'POST') | |||
return result | |||
def get_price(prod_id, date, prod_array): | |||
""" | |||
获取自由行订单价格 | |||
:param prod_id: | |||
:param date: | |||
:param prod_array: | |||
:return: | |||
""" | |||
# 参数校验 | |||
if re.match('^[1-9][0-9]{0,10}', prod_id) is None: | |||
return util.re_err('参数错误') | |||
send_data = { | |||
'pro_cate_id': prod_id, | |||
'start_date': date, | |||
'prod_arr': prod_array | |||
} | |||
curl = curl_interface.CurlInterface(send_data, 4) | |||
result = curl.exec(settings.WX_HOST + '/zzcx/home/free-walker/get-price', 'POST') | |||
return result |
@@ -0,0 +1,19 @@ | |||
from official.models import ClientOpinion | |||
import datetime | |||
def addOpinion(name, mail, opinion, ip): | |||
""" | |||
:param name:名字 | |||
:param mail:邮箱 | |||
:param opinion:建议 | |||
:param ip:客户端ip | |||
:return: | |||
""" | |||
now_time = datetime.datetime.now() | |||
try: | |||
obj = ClientOpinion(name=name, e_mail=mail, opinion=opinion, client_ip=ip, create_time=now_time) | |||
obj.save() | |||
return True | |||
except: | |||
return False |
@@ -0,0 +1,12 @@ | |||
from official.models import CmsCategory | |||
from common import util | |||
def getCmsCategory(): | |||
""" | |||
获取产品的分类 | |||
:return: list | |||
""" | |||
cms_list = CmsCategory.objects.filter(delete_flag=0, system=3).order_by("-show_sort") | |||
cms_list = util.sql_array(cms_list, ['cms_category_id', 'category_name']) | |||
return cms_list |
@@ -0,0 +1,54 @@ | |||
from official.models import CmsCategoryProd | |||
from common import util | |||
def getProdByCms(cms_cate_id, content, page, page_size): | |||
""" | |||
根据cms_category_id查找对应的产品列表 | |||
:param cms_cate_id: 品类id | |||
:param content: 搜索关键字 | |||
:param page: 当前页 | |||
:param page_size: 一页的数量 | |||
:return:list | |||
""" | |||
condition_list = [] | |||
page_size = int(page_size) | |||
start_point = (int(page) - 1) * page_size | |||
sql = """SELECT c.pro_cate_id, c.sign, c.pro_cate_name, c.prod_des, c.show_price,c.show_img, c.category_id, | |||
(SELECT d.end_area_id from bus_ticket d where d.line_id = c.sign order by d.ticket_id desc limit 1) 'poi_id' | |||
FROM cms_category_prod AS b JOIN prod_category AS c ON c.pro_cate_id = b.prod_cate_id AND c.delete_flag = 0 WHERE b.system = 3 AND b.delete_flag = 0 """ | |||
if cms_cate_id != 0 and content == '': | |||
sql += ' AND b.cms_cate_id = %s ' | |||
condition_list.append(cms_cate_id) | |||
if content != '': | |||
sql += ' and c.pro_cate_name LIKE %s' | |||
content = '%' + content + '%' | |||
condition_list.append(content) | |||
sql += 'limit %s,%s' | |||
condition_list.append(start_point) | |||
condition_list.append(page_size) | |||
prod_list = util.select_all(sql, condition_list) | |||
return prod_list | |||
def getProdNumByCms(cms_cate_id, content): | |||
""" | |||
获取对应的分类下的产品的数量 | |||
:param cms_cate_id: 品类id | |||
:return: | |||
""" | |||
condition_list = [] | |||
sql = """SELECT sum(if(c.pro_cate_id,1,0)) as num FROM cms_category_prod AS b JOIN prod_category AS c ON c.pro_cate_id = b.prod_cate_id AND c.delete_flag = 0 WHERE b.system = 3 AND b.delete_flag = 0""" | |||
if cms_cate_id != 0 and content == '': | |||
sql += ' AND b.cms_cate_id = %s' | |||
condition_list.append(cms_cate_id) | |||
if content != '': | |||
sql += ' and c.pro_cate_name LIKE %s' | |||
content = '%' + content + '%' | |||
condition_list.append(content) | |||
num = util.select_row(sql, condition_list) | |||
return num |
@@ -0,0 +1,9 @@ | |||
from official.models import FxUser | |||
from common import util | |||
def get_list(): | |||
select = ['uid', 'nickname', 'phone'] # 查询的字段 | |||
opera_product = FxUser.objects.all().filter(phone='13795379620') # 查询的结果 | |||
opera_product = util.sql_array(opera_product, select) | |||
return opera_product |
@@ -0,0 +1,35 @@ | |||
from common import util | |||
def get_bus_line_prod(prod_id): | |||
""" | |||
获取主线路产品信息 | |||
:param prod_id: | |||
:return: | |||
""" | |||
sql = """SELECT | |||
a.pro_cate_id, | |||
a.pro_cate_name, | |||
a.category_id, | |||
(SELECT category_name from base_category b where a.category_id = category_id) 'category_name', | |||
ifnull(a.sign,'') 'sign' | |||
from prod_category a | |||
WHERE a.pro_cate_id = %s""" | |||
get_info = util.select_row(sql, [prod_id]) | |||
return get_info | |||
def get_prod_array(prod_id): | |||
""" | |||
获取产品票种数组 | |||
:param prod_id: | |||
:return: | |||
""" | |||
sql = """SELECT | |||
prod_id,prod_name,prod_price,0 as 'prod_count',99 as 'prod_stock' | |||
from prod_main | |||
WHERE prod_cate_id = %s""" | |||
get_info = util.select_all(sql, [prod_id]) | |||
return get_info | |||
@@ -0,0 +1,127 @@ | |||
from backend.models import ZzNews | |||
from common import util | |||
from django.db import connection | |||
from django.db.models import Sum, Count | |||
import math | |||
def get_news(page, page_size): | |||
""" | |||
根据页数获取新闻列表 | |||
:param page: 当前页数,默认1 | |||
:param page_size: 每页条数,默认8 | |||
:return: | |||
""" | |||
# start_point = (int(page) - 1) * offset | |||
# news_list = ZzNews.objects.filter(delete_flag=0).order_by("-create_time")[start_point:offset] | |||
# news_list = util.sql_array(news_list, | |||
# ['id', 'class_id', 'news_title', 'navi_content', 'create_user', 'create_time']) | |||
# return news_list | |||
start_point = (int(page) - 1) * page_size | |||
date_format = "%Y-%m-%d" | |||
cursor = connection.cursor() | |||
cursor.execute( | |||
'select id,class_id,if(class_id=1,"公司新闻",if(class_id=2,"媒体报道",if(class_id=3,"行业动态",""))) as class_name, news_title,navi_content,create_user,date_format(create_time,%s) as create_time from zz_news where delete_flag=0 ORDER BY create_time DESC limit %s,%s ', | |||
[date_format, start_point, page_size]) | |||
items = cursor.fetchall() # 读取所有 | |||
desc = cursor.description | |||
li = [] | |||
if items: | |||
for item in items: | |||
d = {} | |||
i = 0 | |||
for de in desc: | |||
d[de[0]] = item[i] | |||
i = i + 1 | |||
li.append(d) | |||
return li | |||
else: | |||
return li | |||
def get_news_by_class(class_id, page, page_size): | |||
""" | |||
根据分类获取新闻列表以及数量 | |||
:param class_id: 当前分类, 默认1 | |||
:param page: 当前页数,默认1 | |||
:param page_size: 每页数量,默认8 | |||
:return: | |||
""" | |||
page_size = int(page_size) | |||
start_point = (int(page) - 1) * page_size | |||
# news_list = ZzNews.objects.filter(delete_flag=0, class_id=class_id).order_by("-create_time")[start_point:offset] | |||
# news_list = util.sql_array(news_list, | |||
# ['id', 'class_id', 'news_title', 'navi_content', 'create_user', 'create_time']) | |||
date_format = "%Y-%m-%d" | |||
cursor = connection.cursor() | |||
cursor.execute( | |||
'select id,class_id,news_title,navi_content,content,create_user,date_format(create_time,%s) as create_time from zz_news WHERE delete_flag=0 and class_id = %s ORDER BY create_time DESC limit %s,%s ', | |||
[date_format, class_id, start_point, page_size]) | |||
items = cursor.fetchall() # 读取所有 | |||
desc = cursor.description | |||
news_list = [] | |||
if items: | |||
for item in items: | |||
d = {} | |||
i = 0 | |||
for de in desc: | |||
d[de[0]] = item[i] | |||
i = i + 1 | |||
news_list.append(d) | |||
num = ZzNews.objects.filter(delete_flag=0, class_id=class_id).order_by("-create_time").aggregate(Count("id")) | |||
num = dict(num) | |||
paper = {} | |||
num['news_list'] = news_list | |||
paper['current'] = int(page) | |||
paper['page_size'] = int(page_size) | |||
paper['total'] = int(num['id__count']) | |||
paper['total_pages'] = math.ceil(int(num['id__count']) / int(page_size)) | |||
num['page'] = paper | |||
return num | |||
def get_news_content(news_id): | |||
""" | |||
根据id获取新闻的内容 | |||
:param news_id: | |||
:return: list | |||
""" | |||
news = {} | |||
news_content = ZzNews.objects.filter(pk=news_id) | |||
news_content = util.sql_array(news_content, | |||
['id', 'class_id', 'news_title', 'navi_content', 'content', 'create_user', | |||
'create_time']) | |||
cursor = connection.cursor() | |||
sql='select * from zz_news WHERE delete_flag=0 and class_id = %s and create_time < "%s" order by create_time desc limit 1' %(news_content[0]['class_id'],news_content[0]['create_time']) | |||
cursor.execute(sql) | |||
items = cursor.fetchall() # 读取所有 | |||
desc = cursor.description | |||
prev_content = [] | |||
if items: | |||
for item in items: | |||
d = {} | |||
i = 0 | |||
for de in desc: | |||
d[de[0]] = item[i] | |||
i = i + 1 | |||
prev_content.append(d) | |||
cursor = connection.cursor() | |||
sql='select * from zz_news WHERE delete_flag=0 and class_id = %s and create_time > "%s" order by create_time limit 1' %(news_content[0]['class_id'],news_content[0]['create_time']) | |||
cursor.execute(sql) | |||
items = cursor.fetchall() # 读取所有 | |||
desc = cursor.description | |||
next_content = [] | |||
if items: | |||
for item in items: | |||
d = {} | |||
i = 0 | |||
for de in desc: | |||
d[de[0]] = item[i] | |||
i = i + 1 | |||
next_content.append(d) | |||
news['prev_news'] = prev_content | |||
news['current_news'] = news_content | |||
news['next_news'] = next_content | |||
return news |
@@ -0,0 +1,596 @@ | |||
# This is an auto-generated Django model module. | |||
# You'll have to do the following manually to clean this up: | |||
# * Rearrange models' order | |||
# * Make sure each model has one field with primary_key=True | |||
# * Make sure each ForeignKey has `on_delete` set to the desired behavior. | |||
# * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table | |||
# Feel free to rename the models, but don't rename db_table values or field names. | |||
from __future__ import unicode_literals | |||
from django.db import models | |||
class AdmUser(models.Model): | |||
uid = models.AutoField(primary_key=True) | |||
u_name = models.CharField(unique=True, max_length=100) | |||
pwd = models.CharField(max_length=255) | |||
phone = models.CharField(max_length=22, blank=True, null=True) | |||
create_time = models.DateTimeField() | |||
status = models.IntegerField() | |||
last_login = models.CharField(max_length=20, blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'adm_user' | |||
class BaseArea(models.Model): | |||
id = models.IntegerField(db_column='ID', primary_key=True) # Field name made lowercase. | |||
parent_id = models.IntegerField(db_column='PARENT_ID') # Field name made lowercase. | |||
cancel_flag = models.IntegerField(db_column='CANCEL_FLAG') # Field name made lowercase. | |||
create_user_id = models.IntegerField(db_column='CREATE_USER_ID') # Field name made lowercase. | |||
create_time = models.CharField(db_column='CREATE_TIME', max_length=20) # Field name made lowercase. | |||
update_user_id = models.IntegerField(db_column='UPDATE_USER_ID') # Field name made lowercase. | |||
update_time = models.CharField(db_column='UPDATE_TIME', max_length=20) # Field name made lowercase. | |||
area_name = models.CharField(db_column='AREA_NAME', max_length=100) # Field name made lowercase. | |||
postcode = models.CharField(db_column='POSTCODE', max_length=20) # Field name made lowercase. | |||
poi_type = models.CharField(db_column='POI_TYPE', max_length=20) # Field name made lowercase. | |||
poi_type1 = models.IntegerField(db_column='POI_TYPE1') # Field name made lowercase. | |||
poi_type2 = models.CharField(db_column='POI_TYPE2', max_length=255) # Field name made lowercase. | |||
class Meta: | |||
managed = False | |||
db_table = 'base_area' | |||
class BaseCategory(models.Model): | |||
category_id = models.AutoField(primary_key=True) | |||
category_name = models.CharField(max_length=255) | |||
parent_id = models.IntegerField() | |||
delete_flag = models.IntegerField() | |||
create_time = models.DateTimeField() | |||
update_time = models.DateTimeField() | |||
update_user = models.CharField(max_length=50) | |||
class Meta: | |||
managed = False | |||
db_table = 'base_category' | |||
class BusTicket(models.Model): | |||
ticket_id = models.IntegerField(unique=True) | |||
start_area_id = models.IntegerField() | |||
start_area_name = models.CharField(max_length=50) | |||
end_area_id = models.IntegerField() | |||
end_area_name = models.CharField(max_length=50) | |||
start_res_id = models.IntegerField() | |||
start_res_name = models.CharField(max_length=50) | |||
end_res_id = models.IntegerField() | |||
end_res_name = models.CharField(max_length=50) | |||
line_id = models.IntegerField() | |||
line_type = models.IntegerField() | |||
prod_price = models.DecimalField(max_digits=10, decimal_places=0) | |||
line_name = models.CharField(max_length=255) | |||
start_res_longitude = models.FloatField(blank=True, null=True) | |||
start_res_latitude = models.FloatField(blank=True, null=True) | |||
end_res_longitude = models.FloatField(blank=True, null=True) | |||
end_res_latitude = models.FloatField(blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'bus_ticket' | |||
class ClientOpinion(models.Model): | |||
name = models.CharField(max_length=255) | |||
e_mail = models.CharField(db_column='e-mail', max_length=255) # Field renamed to remove unsuitable characters. | |||
opinion = models.CharField(max_length=1000) | |||
client_ip = models.CharField(db_column='client _ip', max_length=255) # Field renamed to remove unsuitable characters. | |||
create_time = models.DateTimeField() | |||
class Meta: | |||
managed = False | |||
db_table = 'client_opinion' | |||
class CmsCategory(models.Model): | |||
cms_category_id = models.AutoField(primary_key=True) | |||
category_name = models.CharField(max_length=50) | |||
show_sort = models.IntegerField() | |||
delete_flag = models.IntegerField() | |||
create_time = models.DateTimeField() | |||
update_time = models.DateTimeField() | |||
update_user = models.CharField(max_length=50) | |||
category_code = models.CharField(max_length=255) | |||
system = models.IntegerField(blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'cms_category' | |||
class CmsCategoryExtra(models.Model): | |||
category_id = models.IntegerField(unique=True) | |||
category_name = models.CharField(max_length=50) | |||
category_describe = models.CharField(max_length=255) | |||
img_url = models.CharField(max_length=255) | |||
area_id = models.IntegerField() | |||
class Meta: | |||
managed = False | |||
db_table = 'cms_category_extra' | |||
class CmsCategoryProd(models.Model): | |||
prod_cate_id = models.IntegerField() | |||
cms_cate_id = models.IntegerField() | |||
show_sort = models.IntegerField() | |||
delete_flag = models.IntegerField() | |||
create_time = models.DateTimeField() | |||
update_time = models.DateTimeField() | |||
update_user = models.CharField(max_length=50) | |||
system = models.IntegerField() | |||
class Meta: | |||
managed = False | |||
db_table = 'cms_category_prod' | |||
class DjangoMigrations(models.Model): | |||
app = models.CharField(max_length=255) | |||
name = models.CharField(max_length=255) | |||
applied = models.DateTimeField() | |||
class Meta: | |||
managed = False | |||
db_table = 'django_migrations' | |||
class FxCommissionApply(models.Model): | |||
fx_uid = models.IntegerField() | |||
apply_money = models.DecimalField(max_digits=10, decimal_places=2) | |||
status = models.IntegerField() | |||
remit_time = models.CharField(max_length=50) | |||
auth_time = models.CharField(max_length=50) | |||
auth_memo = models.CharField(max_length=255) | |||
auth_uid = models.IntegerField() | |||
remit_uid = models.IntegerField() | |||
delete_flag = models.IntegerField() | |||
create_time = models.DateTimeField() | |||
update_time = models.DateTimeField() | |||
update_user = models.CharField(max_length=50) | |||
class Meta: | |||
managed = False | |||
db_table = 'fx_commission_apply' | |||
class FxCommissionInfo(models.Model): | |||
fx_uid = models.IntegerField() | |||
total_money = models.DecimalField(max_digits=10, decimal_places=2) | |||
order_id = models.IntegerField() | |||
status = models.IntegerField() | |||
delete_flag = models.IntegerField() | |||
create_time = models.DateTimeField() | |||
update_time = models.DateTimeField() | |||
update_user = models.CharField(max_length=50) | |||
class Meta: | |||
managed = False | |||
db_table = 'fx_commission_info' | |||
class FxUser(models.Model): | |||
uid = models.AutoField(primary_key=True) | |||
user_name = models.CharField(max_length=100, blank=True, null=True) | |||
openid = models.CharField(unique=True, max_length=120) | |||
phone = models.CharField(max_length=11) | |||
nickname = models.CharField(max_length=21, blank=True, null=True) | |||
headimgurl = models.CharField(max_length=255, blank=True, null=True) | |||
sex = models.IntegerField(blank=True, null=True) | |||
country = models.CharField(max_length=255, blank=True, null=True) | |||
province = models.CharField(max_length=255, blank=True, null=True) | |||
city = models.CharField(max_length=255, blank=True, null=True) | |||
status = models.IntegerField() | |||
reg_time = models.DateTimeField() | |||
delete_flag = models.IntegerField() | |||
wx_openid = models.CharField(max_length=120, blank=True, null=True) | |||
main_user_id = models.IntegerField() | |||
change_price_power = models.CharField(max_length=4) | |||
user_area = models.CharField(max_length=255, blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'fx_user' | |||
class FxUserAccount(models.Model): | |||
fx_uid = models.IntegerField(unique=True) | |||
available_commission = models.DecimalField(max_digits=10, decimal_places=2) | |||
closed_commission = models.DecimalField(max_digits=10, decimal_places=2) | |||
total_commission = models.DecimalField(max_digits=10, decimal_places=2) | |||
apply_commission = models.DecimalField(max_digits=10, decimal_places=2) | |||
remaining_sum = models.DecimalField(max_digits=10, decimal_places=2) | |||
create_time = models.DateTimeField() | |||
update_time = models.DateTimeField() | |||
status = models.IntegerField() | |||
delete_flag = models.IntegerField() | |||
class Meta: | |||
managed = False | |||
db_table = 'fx_user_account' | |||
class FxUserAmountLog(models.Model): | |||
log_id = models.AutoField(primary_key=True) | |||
fx_uid = models.IntegerField() | |||
trade_type = models.IntegerField() | |||
amount = models.DecimalField(max_digits=10, decimal_places=2) | |||
remaining_sum = models.DecimalField(max_digits=10, decimal_places=2) | |||
msg = models.CharField(max_length=255, blank=True, null=True) | |||
create_time = models.DateTimeField() | |||
update_time = models.DateTimeField(blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'fx_user_amount_log' | |||
class FxUserAmountOrder(models.Model): | |||
fx_uid = models.IntegerField() | |||
amount = models.DecimalField(max_digits=10, decimal_places=2) | |||
status = models.IntegerField() | |||
recharge_order = models.CharField(max_length=100) | |||
pay_type = models.IntegerField() | |||
create_time = models.DateTimeField(blank=True, null=True) | |||
update_time = models.DateTimeField(blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'fx_user_amount_order' | |||
class FxUserArea(models.Model): | |||
area_id = models.AutoField(primary_key=True) | |||
area_name = models.CharField(max_length=100) | |||
class Meta: | |||
managed = False | |||
db_table = 'fx_user_area' | |||
class FxUserOpenid(models.Model): | |||
open_id = models.CharField(unique=True, max_length=255) | |||
fx_uid = models.IntegerField() | |||
reg_time = models.DateTimeField() | |||
class Meta: | |||
managed = False | |||
db_table = 'fx_user_openid' | |||
class FxUserQrcode(models.Model): | |||
fx_uid = models.IntegerField(blank=True, null=True) | |||
qr_id = models.IntegerField(unique=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'fx_user_qrcode' | |||
class LogOrder(models.Model): | |||
name = models.CharField(max_length=20) | |||
order_id = models.IntegerField() | |||
time = models.DateTimeField() | |||
uid = models.IntegerField() | |||
u_type = models.IntegerField() | |||
log_type = models.IntegerField() | |||
class Meta: | |||
managed = False | |||
db_table = 'log_order' | |||
class LogUserOperation(models.Model): | |||
title = models.CharField(max_length=120) | |||
memo = models.TextField() | |||
uid = models.IntegerField() | |||
user_type = models.IntegerField() | |||
user_name = models.CharField(max_length=255) | |||
resources_id = models.IntegerField(blank=True, null=True) | |||
resources_type = models.IntegerField(blank=True, null=True) | |||
resources_name = models.CharField(max_length=255, blank=True, null=True) | |||
phpsessid = models.CharField(max_length=255, blank=True, null=True) | |||
user_agent = models.CharField(max_length=255, blank=True, null=True) | |||
create_time = models.DateTimeField() | |||
last_login = models.CharField(max_length=255, blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'log_user_operation' | |||
class MainCorpUser(models.Model): | |||
user_name = models.CharField(max_length=255) | |||
main_corp_id = models.IntegerField() | |||
main_corp_name = models.CharField(max_length=255) | |||
class Meta: | |||
managed = False | |||
db_table = 'main_corp_user' | |||
class OrderContacts(models.Model): | |||
order_id = models.IntegerField() | |||
contacts_name = models.CharField(max_length=120) | |||
contacts_phone = models.CharField(max_length=20) | |||
contacts_id = models.CharField(db_column='contacts_ID', max_length=20, blank=True, null=True) # Field name made lowercase. | |||
contacts_type = models.IntegerField() | |||
update_time = models.DateTimeField() | |||
create_time = models.DateTimeField() | |||
delete_flag = models.IntegerField() | |||
bus_run_id = models.IntegerField(blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'order_contacts' | |||
class OrderHotelExtra(models.Model): | |||
main_order_id = models.IntegerField() | |||
hotel_id = models.IntegerField() | |||
room_id = models.IntegerField() | |||
hotel_name = models.CharField(max_length=255) | |||
room_name = models.CharField(max_length=255) | |||
breakfast = models.CharField(max_length=20) | |||
total_details = models.CharField(max_length=255) | |||
remarks = models.CharField(max_length=255) | |||
is_gift = models.IntegerField() | |||
gift_describe = models.TextField() | |||
is_confirm = models.IntegerField() | |||
class Meta: | |||
managed = False | |||
db_table = 'order_hotel_extra' | |||
class OrderInfo(models.Model): | |||
order_id = models.IntegerField() | |||
prod_id = models.IntegerField() | |||
count = models.IntegerField() | |||
unit_price = models.DecimalField(max_digits=10, decimal_places=2) | |||
total_price = models.DecimalField(max_digits=10, decimal_places=2) | |||
delete_flag = models.IntegerField() | |||
commission = models.DecimalField(max_digits=10, decimal_places=2) | |||
prod_name = models.CharField(max_length=255) | |||
class Meta: | |||
managed = False | |||
db_table = 'order_info' | |||
class OrderMain(models.Model): | |||
order_id = models.AutoField(primary_key=True) | |||
order_name = models.CharField(max_length=255) | |||
spider_order_id = models.CharField(max_length=255) | |||
total_money = models.DecimalField(max_digits=10, decimal_places=2) | |||
category_id = models.IntegerField() | |||
prod_cate_id = models.IntegerField() | |||
prod_source = models.IntegerField() | |||
prod_cnt = models.IntegerField() | |||
sh_uid = models.IntegerField() | |||
fx_uid = models.IntegerField() | |||
start_time = models.TimeField(blank=True, null=True) | |||
end_time = models.TimeField(blank=True, null=True) | |||
start_date = models.DateField() | |||
end_date = models.DateField() | |||
order_status = models.IntegerField() | |||
update_time = models.DateTimeField() | |||
create_time = models.DateTimeField() | |||
delete_flag = models.IntegerField() | |||
system = models.IntegerField() | |||
start_area = models.CharField(max_length=255, blank=True, null=True) | |||
end_area = models.CharField(max_length=255, blank=True, null=True) | |||
main_user_id = models.IntegerField() | |||
original_price = models.DecimalField(max_digits=10, decimal_places=2) | |||
class Meta: | |||
managed = False | |||
db_table = 'order_main' | |||
class OrderTravel(models.Model): | |||
travel_id = models.AutoField(primary_key=True) | |||
start_time = models.DateTimeField() | |||
end_time = models.DateTimeField() | |||
u_id = models.IntegerField() | |||
cs_order_id = models.IntegerField() | |||
prod_id = models.CharField(max_length=255, blank=True, null=True) | |||
start_res_id = models.IntegerField(blank=True, null=True) | |||
start_res = models.CharField(max_length=255, blank=True, null=True) | |||
end_res_id = models.IntegerField(blank=True, null=True) | |||
end_res = models.CharField(max_length=255, blank=True, null=True) | |||
start_area_name = models.CharField(max_length=255, blank=True, null=True) | |||
end_area_name = models.CharField(max_length=255, blank=True, null=True) | |||
start_longitude = models.FloatField(blank=True, null=True) | |||
start_latitude = models.FloatField(blank=True, null=True) | |||
contacts_name = models.CharField(max_length=120, blank=True, null=True) | |||
contacts_phone = models.CharField(max_length=120, blank=True, null=True) | |||
contacts_id = models.CharField(db_column='contacts_ID', max_length=120, blank=True, null=True) # Field name made lowercase. | |||
class Meta: | |||
managed = False | |||
db_table = 'order_travel' | |||
class PayMain(models.Model): | |||
pay_type = models.IntegerField() | |||
order_money = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True) | |||
amount_money = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True) | |||
pay_time = models.DateTimeField() | |||
pay_user = models.IntegerField() | |||
order_id = models.IntegerField() | |||
delete_flag = models.IntegerField() | |||
pay_order_id = models.CharField(max_length=255) | |||
app_id = models.CharField(max_length=255, blank=True, null=True) | |||
open_id = models.CharField(max_length=255, blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'pay_main' | |||
class PayRefush(models.Model): | |||
order_id = models.IntegerField() | |||
pay_order_id = models.CharField(max_length=255) | |||
pay_type = models.IntegerField() | |||
refush_money = models.DecimalField(max_digits=10, decimal_places=2) | |||
amount_money = models.DecimalField(max_digits=10, decimal_places=2) | |||
fx_uid = models.IntegerField() | |||
sh_uid = models.IntegerField() | |||
status = models.IntegerField() | |||
create_time = models.DateTimeField() | |||
refund_time = models.DateTimeField() | |||
delete_flag = models.IntegerField() | |||
category_id = models.IntegerField() | |||
app_id = models.CharField(max_length=255, blank=True, null=True) | |||
open_id = models.CharField(max_length=255, blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'pay_refush' | |||
class ProdCategory(models.Model): | |||
pro_cate_id = models.AutoField(primary_key=True) | |||
sign = models.CharField(max_length=255, blank=True, null=True) | |||
pro_cate_name = models.CharField(max_length=100) | |||
prod_des = models.TextField(blank=True, null=True) | |||
category_id = models.IntegerField() | |||
show_price = models.DecimalField(max_digits=10, decimal_places=2) | |||
original_price = models.DecimalField(max_digits=10, decimal_places=2) | |||
show_img = models.CharField(max_length=255) | |||
sales_count = models.IntegerField() | |||
memo = models.TextField(blank=True, null=True) | |||
trip_desc = models.TextField(blank=True, null=True) | |||
feature = models.TextField(blank=True, null=True) | |||
commission = models.DecimalField(max_digits=10, decimal_places=0) | |||
create_user_id = models.IntegerField() | |||
is_recom = models.IntegerField() | |||
start_area = models.CharField(max_length=255, blank=True, null=True) | |||
address = models.CharField(max_length=255, blank=True, null=True) | |||
close_sale_time = models.CharField(max_length=50) | |||
star = models.CharField(max_length=4) | |||
create_time = models.DateTimeField() | |||
update_time = models.DateTimeField() | |||
delete_flag = models.IntegerField() | |||
update_user = models.CharField(max_length=50) | |||
bus_ticket_id = models.IntegerField() | |||
bus_line_type = models.IntegerField() | |||
class Meta: | |||
managed = False | |||
db_table = 'prod_category' | |||
class ProdCategoryInfo(models.Model): | |||
pro_cate_id = models.IntegerField(primary_key=True) | |||
comment_cnt = models.IntegerField() | |||
class Meta: | |||
managed = False | |||
db_table = 'prod_category_info' | |||
class ProdComment(models.Model): | |||
travel_id = models.IntegerField(blank=True, null=True) | |||
prod_id = models.CharField(max_length=255, blank=True, null=True) | |||
star = models.IntegerField() | |||
title = models.CharField(max_length=30) | |||
content = models.TextField() | |||
u_name = models.CharField(max_length=100) | |||
u_id = models.IntegerField(blank=True, null=True) | |||
create_time = models.DateTimeField() | |||
look_over = models.IntegerField() | |||
type = models.IntegerField() | |||
comment_id = models.IntegerField() | |||
parent_id = models.IntegerField() | |||
cancel_flag = models.IntegerField() | |||
class Meta: | |||
managed = False | |||
db_table = 'prod_comment' | |||
class ProdImg(models.Model): | |||
pro_cate_id = models.IntegerField() | |||
img_url = models.CharField(max_length=255) | |||
redirect_url = models.CharField(max_length=255, blank=True, null=True) | |||
memo = models.CharField(max_length=255, blank=True, null=True) | |||
img_type = models.IntegerField() | |||
create_time = models.DateTimeField() | |||
class Meta: | |||
managed = False | |||
db_table = 'prod_img' | |||
class ProdMain(models.Model): | |||
prod_id = models.AutoField(primary_key=True) | |||
prod_cate_id = models.IntegerField() | |||
prod_name = models.CharField(max_length=100) | |||
prod_price = models.DecimalField(max_digits=10, decimal_places=2) | |||
create_user = models.CharField(max_length=50) | |||
create_time = models.DateTimeField() | |||
update_time = models.DateTimeField() | |||
delete_flag = models.IntegerField() | |||
update_user = models.CharField(max_length=50) | |||
bus_id = models.CharField(max_length=255) | |||
commission = models.DecimalField(max_digits=10, decimal_places=2) | |||
class Meta: | |||
managed = False | |||
db_table = 'prod_main' | |||
class ShUser(models.Model): | |||
uid = models.AutoField(primary_key=True) | |||
user_name = models.CharField(max_length=100, blank=True, null=True) | |||
phone = models.CharField(unique=True, max_length=20, blank=True, null=True) | |||
head_img = models.CharField(max_length=255, blank=True, null=True) | |||
status = models.IntegerField(blank=True, null=True) | |||
reg_time = models.DateTimeField(blank=True, null=True) | |||
last_login = models.DateTimeField(blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'sh_user' | |||
class SysItinerary(models.Model): | |||
category_id = models.IntegerField() | |||
category_name = models.CharField(max_length=50) | |||
scenc_introduce = models.TextField(blank=True, null=True) | |||
scenc_play = models.TextField(blank=True, null=True) | |||
folk_customs = models.TextField(blank=True, null=True) | |||
local_specialities = models.TextField(blank=True, null=True) | |||
travel_tips = models.TextField(blank=True, null=True) | |||
class Meta: | |||
managed = False | |||
db_table = 'sys_itinerary' | |||
class ZzNews(models.Model): | |||
class_id = models.IntegerField() | |||
news_title = models.CharField(max_length=100) | |||
navi_content = models.CharField(max_length=255) | |||
content = models.TextField() | |||
create_user = models.CharField(max_length=50) | |||
create_time = models.DateTimeField() | |||
update_time = models.DateTimeField() | |||
delete_flag = models.IntegerField() | |||
class Meta: | |||
managed = False | |||
db_table = 'zz_news' |
@@ -0,0 +1,34 @@ | |||
from django.conf.urls import url | |||
from official.controller import Home | |||
from official.controller import reserve_bus | |||
from official.controller import prod | |||
from official.controller import Order | |||
from official.controller import reserve_ticket | |||
from official.controller import reserve_tourist | |||
from official.controller import reserve_hotel | |||
urlpatterns = [ | |||
url(r'^home/get_list', Home.get_list), | |||
url(r'^home/get_news$', Home.get_news), | |||
url(r'^home/get_class_news', Home.get_news_by_class), # 新闻动态页面,根据分类获取新闻列表 | |||
url(r'^home/add_opinion', Home.addOpinion), # 增加建议 | |||
url(r'^home/get_news_content', Home.get_news_content), # 新闻详情页面根据id获取新闻详情 | |||
url(r'^prod/get_cms_list', prod.get_cms_list), # 产品页获取产品分类 | |||
url(r'^prod/get_prod_list', prod.get_prod_list), # 产品页获取产品列表 | |||
# 下单流程接口 | |||
url(r'^reserve_bus/get_prod_info', reserve_bus.get_prod_info), # 巴士获取产品信息 | |||
url(r'^reserve_bus/get_line_stock', reserve_bus.get_line_stock), # 巴士获取价格日历 | |||
url(r'^reserve_bus/get_prod_array', reserve_bus.get_prod_array), # 巴士获取票种数据 | |||
url(r'^reserve_ticket/get_prod_info', reserve_ticket.get_prod_info), # 门票获取产品信息 | |||
url(r'^reserve_ticket/get_stock', reserve_ticket.get_stock), # 门票获取票种及库存 | |||
url(r'^reserve_tourist/get_prod_info', reserve_tourist.get_prod_info), # 自由行获取产品信息 | |||
url(r'^reserve_tourist/get_stock', reserve_tourist.get_stock), # 自由行获取票种信息 | |||
url(r'^reserve_tourist/get_price', reserve_tourist.get_price), # 自由行获取价格列表 | |||
url(r'^reserve_hotel/get_info', reserve_hotel.get_info), # 获取酒店详情 | |||
url(r'^reserve_hotel/get_room_list', reserve_hotel.get_room_list), # 获取酒店房型列表 | |||
url(r'^reserve_hotel/check_hotel', reserve_hotel.check_hotel), # 获取酒店房型列表 | |||
url(r'^reserve_hotel/make_order', reserve_hotel.make_order), # 获取酒店房型列表 | |||
url(r'^order/make_order', Order.make_order), # 下单接口 | |||
url(r'^order/check_order', Order.check_order) # 校验订单状态 | |||
] |
@@ -0,0 +1,18 @@ | |||
{ | |||
"presets": [ | |||
["env", { | |||
"modules": false, | |||
"targets": { | |||
"browsers": ["> 1%", "last 4 versions", "not ie <= 8"] | |||
} | |||
}], | |||
"stage-2" | |||
], | |||
"plugins": ["transform-runtime"], | |||
"env": { | |||
"test": { | |||
"presets": ["es2015"], | |||
"plugins": ["istanbul"] | |||
} | |||
} | |||
} |
@@ -0,0 +1,9 @@ | |||
root = true | |||
[*] | |||
charset = utf-8 | |||
indent_style = space | |||
indent_size = 4 | |||
end_of_line = lf | |||
insert_final_newline = true | |||
trim_trailing_whitespace = true |
@@ -0,0 +1,13 @@ | |||
.DS_Store | |||
node_modules/ | |||
npm-debug.log* | |||
yarn-debug.log* | |||
yarn-error.log* | |||
# Editor directories and files | |||
.idea | |||
.vscode | |||
*.suo | |||
*.ntvs* | |||
*.njsproj | |||
*.sln |
@@ -0,0 +1,9 @@ | |||
// https://github.com/michael-ciniawsky/postcss-load-config | |||
module.exports = { | |||
"plugins": { | |||
// to edit target browsers: use "browserslist" field in package.json | |||
"postcss-import": {}, | |||
"autoprefixer": {} | |||
} | |||
} |
@@ -0,0 +1,21 @@ | |||
# official | |||
> officialWebsite | |||
## Build Setup | |||
``` bash | |||
# install dependencies | |||
npm install | |||
# serve with hot reload at localhost:8080 | |||
npm run dev | |||
# build for production with minification | |||
npm run build | |||
# build for production and view the bundle analyzer report | |||
npm run build --report | |||
``` | |||
For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader). |
@@ -0,0 +1,41 @@ | |||
'use strict' | |||
require('./check-versions')() | |||
process.env.NODE_ENV = 'production' | |||
const ora = require('ora') | |||
const rm = require('rimraf') | |||
const path = require('path') | |||
const chalk = require('chalk') | |||
const webpack = require('webpack') | |||
const config = require('../config') | |||
const webpackConfig = require('./webpack.prod.conf') | |||
const spinner = ora('building for production...') | |||
spinner.start() | |||
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { | |||
if (err) throw err | |||
webpack(webpackConfig, function (err, stats) { | |||
spinner.stop() | |||
if (err) throw err | |||
process.stdout.write(stats.toString({ | |||
colors: true, | |||
modules: false, | |||
children: false, | |||
chunks: false, | |||
chunkModules: false | |||
}) + '\n\n') | |||
if (stats.hasErrors()) { | |||
console.log(chalk.red(' Build failed with errors.\n')) | |||
process.exit(1) | |||
} | |||
console.log(chalk.cyan(' Build complete.\n')) | |||
console.log(chalk.yellow( | |||
' Tip: built files are meant to be served over an HTTP server.\n' + | |||
' Opening index.html over file:// won\'t work.\n' | |||
)) | |||
}) | |||
}) |
@@ -0,0 +1,49 @@ | |||
'use strict' | |||
const chalk = require('chalk') | |||
const semver = require('semver') | |||
const packageConfig = require('../package.json') | |||
const shell = require('shelljs') | |||
function exec (cmd) { | |||
return require('child_process').execSync(cmd).toString().trim() | |||
} | |||
const versionRequirements = [ | |||
{ | |||
name: 'node', | |||
currentVersion: semver.clean(process.version), | |||
versionRequirement: packageConfig.engines.node | |||
} | |||
] | |||
if (shell.which('npm')) { | |||
versionRequirements.push({ | |||
name: 'npm', | |||
currentVersion: exec('npm --version'), | |||
versionRequirement: packageConfig.engines.npm | |||
}) | |||
} | |||
module.exports = function () { | |||
const warnings = [] | |||
for (let i = 0; i < versionRequirements.length; i++) { | |||
const mod = versionRequirements[i] | |||
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { | |||
warnings.push(mod.name + ': ' + | |||
chalk.red(mod.currentVersion) + ' should be ' + | |||
chalk.green(mod.versionRequirement) | |||
) | |||
} | |||
} | |||
if (warnings.length) { | |||
console.log('') | |||
console.log(chalk.yellow('To use this template, you must update following to modules:')) | |||
console.log() | |||
for (let i = 0; i < warnings.length; i++) { | |||
const warning = warnings[i] | |||
console.log(' ' + warning) | |||
} | |||
console.log() | |||
process.exit(1) | |||
} | |||
} |
@@ -0,0 +1,10 @@ | |||
/* eslint-disable */ | |||
'use strict' | |||
require('eventsource-polyfill') | |||
var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true') | |||
hotClient.subscribe(function (event) { | |||
if (event.action === 'reload') { | |||
window.location.reload() | |||
} | |||
}) |
@@ -0,0 +1,105 @@ | |||
'use strict' | |||
require('./check-versions')() | |||
const config = require('../config') | |||
if (!process.env.NODE_ENV) { | |||
process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV) | |||
} | |||
const opn = require('opn') | |||
const path = require('path') | |||
const express = require('express') | |||
const webpack = require('webpack') | |||
const proxyMiddleware = require('http-proxy-middleware') | |||
const webpackConfig = require('./webpack.dev.conf') | |||
// default port where dev server listens for incoming traffic | |||
const port = process.env.PORT || config.dev.port | |||
// automatically open browser, if not set will be false | |||
const autoOpenBrowser = !!config.dev.autoOpenBrowser | |||
// Define HTTP proxies to your custom API backend | |||
// https://github.com/chimurai/http-proxy-middleware | |||
const proxyTable = config.dev.proxyTable | |||
const app = express() | |||
const compiler = webpack(webpackConfig) | |||
const devMiddleware = require('webpack-dev-middleware')(compiler, { | |||
publicPath: webpackConfig.output.publicPath, | |||
quiet: true | |||
}) | |||
const hotMiddleware = require('webpack-hot-middleware')(compiler, { | |||
log: false, | |||
heartbeat: 2000 | |||
}) | |||
// force page reload when html-webpack-plugin template changes | |||
// currently disabled until this is resolved: | |||
// https://github.com/jantimon/html-webpack-plugin/issues/680 | |||
// compiler.plugin('compilation', function (compilation) { | |||
// compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) { | |||
// hotMiddleware.publish({ action: 'reload' }) | |||
// cb() | |||
// }) | |||
// }) | |||
// enable hot-reload and state-preserving | |||
// compilation error display | |||
app.use(hotMiddleware) | |||
// proxy api requests | |||
Object.keys(proxyTable).forEach(function (context) { | |||
let options = proxyTable[context] | |||
if (typeof options === 'string') { | |||
options = { target: options } | |||
} | |||
app.use(proxyMiddleware(options.filter || context, options)) | |||
}) | |||
// handle fallback for HTML5 history API | |||
app.use(require('connect-history-api-fallback')()) | |||
// serve webpack bundle output | |||
app.use(devMiddleware) | |||
// serve pure static assets | |||
const staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory) | |||
app.use(staticPath, express.static('./static')) | |||
const uri = 'http://localhost:' + port | |||
var _resolve | |||
var _reject | |||
var readyPromise = new Promise((resolve, reject) => { | |||
_resolve = resolve | |||
_reject = reject | |||
}) | |||
var server | |||
var portfinder = require('portfinder') | |||
portfinder.basePort = port | |||
console.log('> Starting dev server...') | |||
devMiddleware.waitUntilValid(() => { | |||
portfinder.getPort((err, port) => { | |||
if (err) { | |||
_reject(err) | |||
} | |||
process.env.PORT = port | |||
var uri = 'http://localhost:' + port | |||
console.log('> Listening at ' + uri + '\n') | |||
// when env is testing, don't need open it | |||
if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') { | |||
opn(uri) | |||
} | |||
server = app.listen(port) | |||
_resolve() | |||
}) | |||
}) | |||
module.exports = { | |||
ready: readyPromise, | |||
close: () => { | |||
server.close() | |||
} | |||
} |
@@ -0,0 +1,98 @@ | |||
'use strict' | |||
const path = require('path') | |||
const config = require('../config') | |||
const ExtractTextPlugin = require('extract-text-webpack-plugin') | |||
const pkg = require('../package.json') | |||
exports.assetsPath = function (_path) { | |||
const assetsSubDirectory = process.env.NODE_ENV === 'production' | |||
? config.build.assetsSubDirectory | |||
: config.dev.assetsSubDirectory | |||
return path.posix.join(assetsSubDirectory, _path) | |||
} | |||
exports.cssLoaders = function (options) { | |||
options = options || {} | |||
const cssLoader = { | |||
loader: 'css-loader', | |||
options: { | |||
sourceMap: options.sourceMap | |||
} | |||
} | |||
var postcssLoader = { | |||
loader: 'postcss-loader', | |||
options: { | |||
sourceMap: options.sourceMap | |||
} | |||
} | |||
// generate loader string to be used with extract text plugin | |||
function generateLoaders (loader, loaderOptions) { | |||
const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader] | |||
if (loader) { | |||
loaders.push({ | |||
loader: loader + '-loader', | |||
options: Object.assign({}, loaderOptions, { | |||
sourceMap: options.sourceMap | |||
}) | |||
}) | |||
} | |||
// Extract CSS when that option is specified | |||
// (which is the case during production build) | |||
if (options.extract) { | |||
return ExtractTextPlugin.extract({ | |||
use: loaders, | |||
fallback: 'vue-style-loader' | |||
}) | |||
} else { | |||
return ['vue-style-loader'].concat(loaders) | |||
} | |||
} | |||
// https://vue-loader.vuejs.org/en/configurations/extract-css.html | |||
return { | |||
css: generateLoaders(), | |||
postcss: generateLoaders(), | |||
less: generateLoaders('less'), | |||
sass: generateLoaders('sass', { indentedSyntax: true }), | |||
scss: generateLoaders('sass'), | |||
stylus: generateLoaders('stylus'), | |||
styl: generateLoaders('stylus') | |||
} | |||
} | |||
// Generate loaders for standalone style files (outside of .vue) | |||
exports.styleLoaders = function (options) { | |||
const output = [] | |||
const loaders = exports.cssLoaders(options) | |||
for (const extension in loaders) { | |||
const loader = loaders[extension] | |||
output.push({ | |||
test: new RegExp('\\.' + extension + '$'), | |||
use: loader | |||
}) | |||
} | |||
return output | |||
} | |||
exports.createNotifierCallback = function () { | |||
const notifier = require('node-notifier') | |||
return (severity, errors) => { | |||
if (severity !== 'error') { | |||
return | |||
} | |||
const error = errors[0] | |||
const filename = error.file && error.file.split('!').pop() | |||
notifier.notify({ | |||
title: pkg.name, | |||
message: severity + ': ' + error.name, | |||
subtitle: filename || '', | |||
icon: path.join(__dirname, 'logo.png') | |||
}) | |||
} | |||
} |
@@ -0,0 +1,23 @@ | |||
'use strict' | |||
const utils = require('./utils') | |||
const config = require('../config') | |||
const isProduction = process.env.NODE_ENV === 'production' | |||
const sourceMapEnabled = isProduction | |||
? config.build.productionSourceMap | |||
: config.dev.cssSourceMap | |||
module.exports = { | |||
loaders: utils.cssLoaders({ | |||
sourceMap: sourceMapEnabled, | |||
extract: isProduction | |||
}), | |||
cssSourceMap: sourceMapEnabled, | |||
cacheBusting: config.dev.cacheBusting, | |||
transformToRequire: { | |||
video: 'src', | |||
source: 'src', | |||
img: 'src', | |||
image: 'xlink:href' | |||
} | |||
} |
@@ -0,0 +1,79 @@ | |||
'use strict' | |||
const path = require('path') | |||
const utils = require('./utils') | |||
const config = require('../config') | |||
const vueLoaderConfig = require('./vue-loader.conf') | |||
function resolve (dir) { | |||
return path.join(__dirname, '..', dir) | |||
} | |||
module.exports = { | |||
context: path.resolve(__dirname, '../'), | |||
entry: { | |||
app: './src/main.js' | |||
}, | |||
output: { | |||
path: config.build.assetsRoot, | |||
filename: '[name].js', | |||
publicPath: process.env.NODE_ENV === 'production' | |||
? config.build.assetsPublicPath | |||
: config.dev.assetsPublicPath | |||
}, | |||
resolve: { | |||
extensions: ['.js', '.vue', '.json'], | |||
alias: { | |||
'vue$': 'vue/dist/vue.esm.js', | |||
'@': resolve('src'), | |||
} | |||
}, | |||
module: { | |||
rules: [ | |||
{ | |||
test: /\.sass$/, | |||
loader:'style!css!sass' | |||
}, | |||
{ | |||
test: /\.less$/, | |||
loader:'style!css!less' | |||
}, | |||
{ | |||
test: /\.vue$/, | |||
loader: 'vue-loader', | |||
options: vueLoaderConfig | |||
}, | |||
{ | |||
test: /\.js$/, | |||
loader: 'babel-loader', | |||
include: [resolve('src'), resolve('test')] | |||
}, | |||
{ | |||
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, | |||
loader: 'url-loader', | |||
options: { | |||
limit: 10000, | |||
name: utils.assetsPath('img/[name].[hash:7].[ext]') | |||
} | |||
}, | |||
{ | |||
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, | |||
loader: 'url-loader', | |||
options: { | |||
limit: 10000, | |||
name: utils.assetsPath('media/[name].[hash:7].[ext]') | |||
} | |||
}, | |||
{ | |||
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, | |||
loader: 'url-loader', | |||
options: { | |||
limit: 10000, | |||
name: utils.assetsPath('fonts/[name].[hash:7].[ext]') | |||
} | |||
} | |||
] | |||
} | |||
} | |||
@@ -0,0 +1,78 @@ | |||
'use strict' | |||
const utils = require('./utils') | |||
const webpack = require('webpack') | |||
const config = require('../config') | |||
const merge = require('webpack-merge') | |||
const baseWebpackConfig = require('./webpack.base.conf') | |||
const HtmlWebpackPlugin = require('html-webpack-plugin') | |||
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') | |||
const portfinder = require('portfinder') | |||
const devWebpackConfig = merge(baseWebpackConfig, { | |||
module: { | |||
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }) | |||
}, | |||
// cheap-module-eval-source-map is faster for development | |||
devtool: config.dev.devtool, | |||
// these devServer options should be customized in /config/index.js | |||
devServer: { | |||
clientLogLevel: 'warning', | |||
historyApiFallback: true, | |||
hot: true, | |||
compress: true, | |||
host: process.env.HOST || config.dev.host, | |||
port: process.env.PORT || config.dev.port, | |||
open: config.dev.autoOpenBrowser, | |||
overlay: config.dev.errorOverlay ? { | |||
warnings: false, | |||
errors: true, | |||
} : false, | |||
publicPath: config.dev.assetsPublicPath, | |||
proxy: config.dev.proxyTable, | |||
quiet: true, // necessary for FriendlyErrorsPlugin | |||
watchOptions: { | |||
poll: config.dev.poll, | |||
} | |||
}, | |||
plugins: [ | |||
new webpack.DefinePlugin({ | |||
'process.env': require('../config/dev.env') | |||
}), | |||
new webpack.HotModuleReplacementPlugin(), | |||
new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update. | |||
new webpack.NoEmitOnErrorsPlugin(), | |||
// https://github.com/ampedandwired/html-webpack-plugin | |||
new HtmlWebpackPlugin({ | |||
filename: 'index.html', | |||
template: 'index.html', | |||
inject: true | |||
}), | |||
] | |||
}) | |||
module.exports = new Promise((resolve, reject) => { | |||
portfinder.basePort = process.env.PORT || config.dev.port | |||
portfinder.getPort((err, port) => { | |||
if (err) { | |||
reject(err) | |||
} else { | |||
// publish the new Port, necessary for e2e tests | |||
process.env.PORT = port | |||
// add port to devServer config | |||
devWebpackConfig.devServer.port = port | |||
// Add FriendlyErrorsPlugin | |||
devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({ | |||
compilationSuccessInfo: { | |||
messages: [`Your application is running here: http://${config.dev.host}:${port}`], | |||
}, | |||
onErrors: config.dev.notifyOnErrors | |||
? utils.createNotifierCallback() | |||
: undefined | |||
})) | |||
resolve(devWebpackConfig) | |||
} | |||
}) | |||
}) |
@@ -0,0 +1,142 @@ | |||
'use strict' | |||
const path = require('path') | |||
const utils = require('./utils') | |||
const webpack = require('webpack') | |||
const config = require('../config') | |||
const merge = require('webpack-merge') | |||
const baseWebpackConfig = require('./webpack.base.conf') | |||
const CopyWebpackPlugin = require('copy-webpack-plugin') | |||
const HtmlWebpackPlugin = require('html-webpack-plugin') | |||
const ExtractTextPlugin = require('extract-text-webpack-plugin') | |||
const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') | |||
const env = require('../config/prod.env') | |||
const webpackConfig = merge(baseWebpackConfig, { | |||
module: { | |||
rules: utils.styleLoaders({ | |||
sourceMap: config.build.productionSourceMap, | |||
extract: true, | |||
usePostCSS: true | |||
}) | |||
}, | |||
devtool: config.build.productionSourceMap ? config.build.devtool : false, | |||
output: { | |||
path: config.build.assetsRoot, | |||
filename: utils.assetsPath('js/[name].[chunkhash].js'), | |||
chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') | |||
}, | |||
plugins: [ | |||
// http://vuejs.github.io/vue-loader/en/workflow/production.html | |||
new webpack.DefinePlugin({ | |||
'process.env': env | |||
}), | |||
// UglifyJs do not support ES6+, you can also use babel-minify for better treeshaking: https://github.com/babel/minify | |||
new webpack.optimize.UglifyJsPlugin({ | |||
compress: { | |||
warnings: false | |||
}, | |||
sourceMap: config.build.productionSourceMap, | |||
parallel: true | |||
}), | |||
// extract css into its own file | |||
new ExtractTextPlugin({ | |||
filename: utils.assetsPath('css/[name].[contenthash].css'), | |||
// set the following option to `true` if you want to extract CSS from | |||
// codesplit chunks into this main css file as well. | |||
// This will result in *all* of your app's CSS being loaded upfront. | |||
allChunks: false, | |||
}), | |||
// Compress extracted CSS. We are using this plugin so that possible | |||
// duplicated CSS from different components can be deduped. | |||
new OptimizeCSSPlugin({ | |||
cssProcessorOptions: config.build.productionSourceMap | |||
? { safe: true, map: { inline: false } } | |||
: { safe: true } | |||
}), | |||
// generate dist index.html with correct asset hash for caching. | |||
// you can customize output by editing /index.html | |||
// see https://github.com/ampedandwired/html-webpack-plugin | |||
new HtmlWebpackPlugin({ | |||
filename: config.build.index, | |||
template: 'index.html', | |||
inject: true, | |||
minify: { | |||
removeComments: true, | |||
collapseWhitespace: true, | |||
removeAttributeQuotes: true | |||
// more options: | |||
// https://github.com/kangax/html-minifier#options-quick-reference | |||
}, | |||
// necessary to consistently work with multiple chunks via CommonsChunkPlugin | |||
chunksSortMode: 'dependency' | |||
}), | |||
// keep module.id stable when vender modules does not change | |||
new webpack.HashedModuleIdsPlugin(), | |||
// enable scope hoisting | |||
new webpack.optimize.ModuleConcatenationPlugin(), | |||
// split vendor js into its own file | |||
new webpack.optimize.CommonsChunkPlugin({ | |||
name: 'vendor', | |||
minChunks: function (module) { | |||
// any required modules inside node_modules are extracted to vendor | |||
return ( | |||
module.resource && | |||
/\.js$/.test(module.resource) && | |||
module.resource.indexOf( | |||
path.join(__dirname, '../node_modules') | |||
) === 0 | |||
) | |||
} | |||
}), | |||
// extract webpack runtime and module manifest to its own file in order to | |||
// prevent vendor hash from being updated whenever app bundle is updated | |||
new webpack.optimize.CommonsChunkPlugin({ | |||
name: 'manifest', | |||
minChunks: Infinity | |||
}), | |||
// This instance extracts shared chunks from code splitted chunks and bundles them | |||
// in a separate chunk, similar to the vendor chunk | |||
// see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk | |||
new webpack.optimize.CommonsChunkPlugin({ | |||
name: 'app', | |||
async: 'vendor-async', | |||
children: true, | |||
minChunks: 3 | |||
}), | |||
// copy custom static assets | |||
new CopyWebpackPlugin([ | |||
{ | |||
from: path.resolve(__dirname, '../static'), | |||
to: config.build.assetsSubDirectory, | |||
ignore: ['.*'] | |||
} | |||
]) | |||
] | |||
}) | |||
if (config.build.productionGzip) { | |||
const CompressionWebpackPlugin = require('compression-webpack-plugin') | |||
webpackConfig.plugins.push( | |||
new CompressionWebpackPlugin({ | |||
asset: '[path].gz[query]', | |||
algorithm: 'gzip', | |||
test: new RegExp( | |||
'\\.(' + | |||
config.build.productionGzipExtensions.join('|') + | |||
')$' | |||
), | |||
threshold: 10240, | |||
minRatio: 0.8 | |||
}) | |||
) | |||
} | |||
if (config.build.bundleAnalyzerReport) { | |||
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin | |||
webpackConfig.plugins.push(new BundleAnalyzerPlugin()) | |||
} | |||
module.exports = webpackConfig |
@@ -0,0 +1,7 @@ | |||
'use strict' | |||
const merge = require('webpack-merge') | |||
const prodEnv = require('./prod.env') | |||
module.exports = merge(prodEnv, { | |||
NODE_ENV: '"development"' | |||
}) |
@@ -0,0 +1,82 @@ | |||
'use strict' | |||
// Template version: 1.2.4 | |||
// see http://vuejs-templates.github.io/webpack for documentation. | |||
const path = require('path') | |||
module.exports = { | |||
dev: { | |||
// Paths | |||
assetsSubDirectory: 'static', | |||
assetsPublicPath: '/', | |||
proxyTable: {}, | |||
// Various Dev Server settings | |||
host: 'localhost', // can be overwritten by process.env.HOST | |||
port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined | |||
autoOpenBrowser: false, | |||
errorOverlay: true, | |||
notifyOnErrors: true, | |||
poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- | |||
// Use Eslint Loader? | |||
// If true, your code will be linted during bundling and | |||
// linting errors and warnings will be shown in the console. | |||
useEslint: true, | |||
// If true, eslint errors and warnings will also be shown in the error overlay | |||
// in the browser. | |||
showEslintErrorsInOverlay: false, | |||
/** | |||
* Source Maps | |||
*/ | |||
// https://webpack.js.org/configuration/devtool/#development | |||
// devtool: 'eval-source-map', | |||
devtool: 'inline-source-map', //dev safari SockJS not find , 改为这个即可 | |||
// If you have problems debugging vue-files in devtools, | |||
// set this to false - it *may* help | |||
// https://vue-loader.vuejs.org/en/options.html#cachebusting | |||
cacheBusting: true, | |||
// CSS Sourcemaps off by default because relative paths are "buggy" | |||
// with this option, according to the CSS-Loader README | |||
// (https://github.com/webpack/css-loader#sourcemaps) | |||
// In our experience, they generally work as expected, | |||
// just be aware of this issue when enabling this option. | |||
cssSourceMap: false, | |||
}, | |||
build: { | |||
// Template for index.html | |||
index: path.resolve(__dirname, '../dist/index.html'), | |||
// Paths | |||
assetsRoot: path.resolve(__dirname, '../dist'), | |||
assetsSubDirectory: 'static', | |||
assetsPublicPath: '', | |||
/** | |||
* Source Maps | |||
*/ | |||
productionSourceMap: true, | |||
// https://webpack.js.org/configuration/devtool/#production | |||
devtool: '#source-map', | |||
// Gzip off by default as many popular static hosts such as | |||
// Surge or Netlify already gzip all static assets for you. | |||
// Before setting to `true`, make sure to: | |||
// npm install --save-dev compression-webpack-plugin | |||
productionGzip: false, | |||
productionGzipExtensions: ['js', 'css'], | |||
// Run the build command with an extra argument to | |||
// View the bundle analyzer report after build finishes: | |||
// `npm run build --report` | |||
// Set to `true` or `false` to always turn it on or off | |||
bundleAnalyzerReport: process.env.npm_config_report | |||
} | |||
} |
@@ -0,0 +1,4 @@ | |||
'use strict' | |||
module.exports = { | |||
NODE_ENV: '"production"' | |||
} |
@@ -0,0 +1,13 @@ | |||
<!DOCTYPE html> | |||
<html lang="en"> | |||
<head> | |||
<meta charset="UTF-8"> | |||
<title>这是广告页</title> | |||
</head> | |||
<body class="ub ub-ac ub-pc"> | |||
<div class="ub ub-ac ub-pc">这是测试广告页</div> | |||
<!--<script src="http://wm.lrswl.com/page/?s=271647"></script>--> | |||
<!--<script src="http://wm.lrswl.com/page/s.php?s=271651&w=70&h=70"></script>--> | |||
<script src="http://wm.lrswl.com/page/s.php?s=271653&w=950&h=90"></script> | |||
</body> | |||
</html> |
@@ -0,0 +1,92 @@ | |||
<!DOCTYPE html><html><script src=https://hm.baidu.com/hm.js?4b3fd515907f4daca589f0137bc04349 type=text/javascript></script><head><meta charset=utf-8><link rel="shortcut icon" href=./static/image/favicon.ico><meta name=viewport content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"><style>.ub | |||
{ | |||
display: -webkit-box; | |||
display: -moz-box; | |||
position:relative; | |||
} | |||
/*以反方向显示 div 框的子元素*/ | |||
.ub-rev | |||
{ | |||
-webkit-box-direction:reverse; | |||
-moz-box-direction:reverse; | |||
} | |||
.ub-fh | |||
{ | |||
width:100%; | |||
} | |||
.ub-fv | |||
{ | |||
height:100%; | |||
} | |||
.ub-con | |||
{ | |||
position:absolute; | |||
width:100%; | |||
height:100%; | |||
} | |||
/*通过使用 box-align and box-pack 属性,居中 div 框的子元素*/ | |||
.ub-ac | |||
{ | |||
-webkit-box-align:center; | |||
-moz-box-align:center; | |||
} | |||
/*通过使用 box-align and box-pack :end属性,右下 div 框的子元素*/ | |||
.ub-ae | |||
{ | |||
-webkit-box-align:end; | |||
-moz-box-align:end; | |||
} | |||
.ub-pc | |||
{ | |||
-webkit-box-pack:center; | |||
-moz-box-pack:center; | |||
} | |||
.ub-pe | |||
{ | |||
-webkit-box-pack:end; | |||
-moz-box-pack:end; | |||
} | |||
/*不知道*/ | |||
.ub-pj | |||
{ | |||
-webkit-box-pack:justify; | |||
-moz-box-pack:justify; | |||
} | |||
/*从上向下垂直排列子元素。*/ | |||
.ub-ver | |||
{ | |||
-webkit-box-orient:vertical; | |||
-moz-box-orient:vertical; | |||
} | |||
/*box-flex主要让子容器针对父容器的宽度按一定规则进行划分*/ | |||
.ub-f1 | |||
{ | |||
position:relative; | |||
-webkit-box-flex: 1; | |||
-moz-box-flex: 1; | |||
} | |||
.ub-f2 | |||
{ | |||
position:relative; | |||
-webkit-box-flex: 2; | |||
-moz-box-flex: 2; | |||
} | |||
.ub-f3 | |||
{ | |||
position:relative; | |||
-webkit-box-flex: 3; | |||
-moz-box-flex: 3; | |||
} | |||
.ub-f4 | |||
{ | |||
position:relative; | |||
-webkit-box-flex: 4; | |||
-moz-box-flex: 4; | |||
}</style><title>蜘蛛出行 安全、舒适、便捷</title><link href=static/css/app.88bca33d05c6b79bed7638b34361f37b.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=static/js/manifest.212547e5e7dea60f8371.js></script><script type=text/javascript src=static/js/vendor.c9c81e203af81029f4c0.js></script><script type=text/javascript src=static/js/app.daafdd1eba22e6b94885.js></script></body></html> |