diff --git a/doc/1.一般工业固废管理台账和日常记录表 (1).docx b/doc/1.一般工业固废管理台账和日常记录表 (1).docx
deleted file mode 100644
index 26b87a8e..00000000
Binary files a/doc/1.一般工业固废管理台账和日常记录表 (1).docx and /dev/null differ
diff --git a/doc/2.危废相关台账(1).docx b/doc/2.危废相关台账(1).docx
deleted file mode 100644
index 6424a479..00000000
Binary files a/doc/2.危废相关台账(1).docx and /dev/null differ
diff --git a/doc/3.污染物排放台账(1).docx b/doc/3.污染物排放台账(1).docx
deleted file mode 100644
index 92114c7e..00000000
Binary files a/doc/3.污染物排放台账(1).docx and /dev/null differ
diff --git a/doc/个人安全绩效等功能.txt b/doc/个人安全绩效等功能.txt
deleted file mode 100644
index 30b147f5..00000000
--- a/doc/个人安全绩效等功能.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-1.事故隐患界面增加无图片导出excel(支持一次性导出1000条)
-2.增加应急预案
-3.安全绩效下的个人安全绩效统计数字可点击链接查看
\ No newline at end of file
diff --git a/doc/安全培训系统建议.docx b/doc/安全培训系统建议.docx
deleted file mode 100644
index 500a71bb..00000000
Binary files a/doc/安全培训系统建议.docx and /dev/null differ
diff --git a/doc/安全清单使用文档.docx b/doc/安全清单使用文档.docx
deleted file mode 100644
index 6236f31a..00000000
Binary files a/doc/安全清单使用文档.docx and /dev/null differ
diff --git a/doc/惠东需求.xlsx b/doc/惠东需求.xlsx
deleted file mode 100644
index 7c09669b..00000000
Binary files a/doc/惠东需求.xlsx and /dev/null differ
diff --git a/doc/灰色预测模型.cs b/doc/灰色预测模型.cs
deleted file mode 100644
index 341b99ce..00000000
--- a/doc/灰色预测模型.cs
+++ /dev/null
@@ -1,132 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace YOMIFrameWork.Common
-{
- ///
- /// 灰色预测
- ///
- public class GrayModel
- {
- private static GrayModel _Instrance = null;
- public static GrayModel Instrance
- {
- get { if (_Instrance == null) return new GrayModel(); else return _Instrance; }
- }
- public double GetNext(List data)
- {
- //开始计算
- //一次累加begin
- int number = data.Count;
- double[] aArray = new double[number];//原始数据
- double[] bArray = new double[number];//一次累加的结果
- for (int i = 0; i < number; i++)
- {
- aArray[i] = data[i];
- }
- bArray[0] = aArray[0];
- for (int x = 1; x < number; x++)
- {
- bArray[x] = bArray[x - 1] + aArray[x];
- }
- //end
- //计算均值系列begin
-
- double[] cArray = new double[number]; //均值计算的结果
-
- cArray[0] = 0.0;
-
- for (int x = 1; x < number; x++)
- {
-
- cArray[x] = bArray[x - 1] / 2 + bArray[x] / 2;
- }
- //end
-
- //计算C,D,E,F
- //计算C
- double[] dArray = new double[number];
- dArray[1] = cArray[1];
- for (int x = 1; x < number; x++)
- {
-
- dArray[x] = cArray[x] + dArray[x - 1];
-
- }
-
- double C;
- C = dArray[number - 1];
- //end
-
- //计算D
- double[] fArray = new double[number];
- fArray[1] = aArray[1];
-
- for (int x = 1; x < number; x++)
- {
-
- fArray[x] = aArray[x] + fArray[x - 1];
-
- }
- double D;
- D = fArray[number - 1];
- //end
-
- //计算E
- double[] gArray = new double[number];
- gArray[1] = aArray[1] * cArray[1];
- for (int x = 1; x < number; x++)
- {
-
- gArray[x] = aArray[x] * cArray[x] + gArray[x - 1];
-
- }
- double E;
- E = gArray[number - 1];
- //end
-
- //计算F
- double[] hArray = new double[number];
- hArray[1] = cArray[1] * cArray[1];
- for (int x = 1; x < number; x++)
- {
-
- hArray[x] = cArray[x] * cArray[x] + hArray[x - 1];
-
- }
- double F;
- F = hArray[number - 1];
- //end
-
- //计算a,b
- //计算发展系数a begin
-
- //textBox2.Text = "";
- double a;
-
- a = (C * D - (number - 1) * E) / ((number - 1) * F - C * C);
- //textBox2.Text = a.ToString();
- //end
-
- //计算灰作用量b begin
- //textBox3.Text = "";
- double b;
- b = (D * F - C * E) / ((number - 1) * F - C * C);
- //textBox3.Text = b.ToString();
- //end
-
- //计算q
- double q;
- q = b / a;
- //end
-
- //istBox4.Items.Clear();
- double ssn1 = (aArray[0] - q) * Math.Exp(-a * (number)) + q;
- double ssn = (aArray[0] - q) * Math.Exp(-a * (number - 1)) + q;
-
- return (ssn1 - ssn);
- }
- }
-
-}
\ No newline at end of file
diff --git a/doc/违章举报使用文档.docx b/doc/违章举报使用文档.docx
deleted file mode 100644
index c60719a5..00000000
Binary files a/doc/违章举报使用文档.docx and /dev/null differ
diff --git a/doc/隐患跟踪模块使用文档.docx b/doc/隐患跟踪模块使用文档.docx
deleted file mode 100644
index 687e546e..00000000
Binary files a/doc/隐患跟踪模块使用文档.docx and /dev/null differ
diff --git a/doc/风险管控模块使用文档.docx b/doc/风险管控模块使用文档.docx
deleted file mode 100644
index a672d5f7..00000000
Binary files a/doc/风险管控模块使用文档.docx and /dev/null differ
diff --git a/safesite/daoru.py b/safesite/daoru.py
index 45975c82..d8ef2c48 100644
--- a/safesite/daoru.py
+++ b/safesite/daoru.py
@@ -65,6 +65,15 @@ def makeqr_safelist(data):
img.save(filepath)
return filepath
+def makeqr_(data):
+ upload_folder = 'media/qr_other'
+ if not os.path.exists(upload_folder):
+ os.mkdir(upload_folder)
+ img = qrcode.make(data=data)
+ filepath = os.path.join(upload_folder, data.split('=')[1]+'.png').replace('\\','/')
+ img.save(filepath)
+ return filepath
+
def drquestions(companyid,path,userid):
wb = load_workbook(path)
sheet = wb.worksheets[0]
diff --git a/safesite/mgt/views.py b/safesite/mgt/views.py
index 51392ae5..e80a9a7e 100644
--- a/safesite/mgt/views.py
+++ b/safesite/mgt/views.py
@@ -13,7 +13,7 @@ from django.db.models import F,Count,Sum
import requests
from ..tasks import send_wechatmsgs,send_wechatmsg,yjjs,gettime,yjjs_px,yjjs_yl,updateTzzs,updateAqzs
from ..export import exportdoc,exportxlsx,exportyjdoc,exportsimplexlsx,exportdoc2
-from ..daoru import drusers,drequipments,drrisks
+from ..daoru import drusers,drequipments,drrisks, makeqr_
from django.forms.models import model_to_dict
from ..safespider import getTzzs,getAqzs
#from duibiao import calsim
@@ -71,7 +71,8 @@ def api(req):
obj.publisdate=data['publisdate']
obj.usecomp=Partment.objects.get(partid=companyid)
obj.createuser=User.objects.get(userid=userid)
-
+ obj.qrcode = makeqr_(
+ 'https://safeyun.ctcshe.com/miniprogram/mgt?id='+str(obj.id))
obj.save()
return JsonResponse({"code":1})
diff --git a/safesite/models.py b/safesite/models.py
index 1588ce79..ccb24971 100644
--- a/safesite/models.py
+++ b/safesite/models.py
@@ -1306,6 +1306,7 @@ class Mgtsystem(models.Model):
publisdate = models.DateTimeField(default = timezone.now)
createuser = models.ForeignKey(User,on_delete=models.CASCADE)
deletemark = models.IntegerField(default=1)
+ qrcode = models.CharField(max_length=200, blank=True, null=True) # 管理制度二维码
@@ -1322,7 +1323,8 @@ class Resbility(models.Model):
usecomp = models.ForeignKey(Partment,related_name='resbgs',on_delete=models.CASCADE,null=True,blank=True)#所属公司
deletemark = models.IntegerField(default=1)#是否删除
filepath=models.CharField(max_length=200,null=True,blank=True)
- reads = models.IntegerField(default='0')
+ reads = models.IntegerField(default=0)
+ qrcode = models.CharField(max_length=200, blank=True, null=True) # 责任制度二维码
#操作规程
class Operproce(models.Model):
id = models.AutoField(primary_key=True)#主键
@@ -1337,6 +1339,7 @@ class Operproce(models.Model):
deletemark = models.IntegerField(default=1)#是否删除
filepath=models.CharField(max_length=200,null=True,blank=True)
reads = models.IntegerField(default='0')
+ qrcode = models.CharField(max_length=200, blank=True, null=True) # 操作规程二维码
#责任阅读表
class Readerblility(models.Model):
readid = models.ForeignKey(Resbility, on_delete=models.CASCADE)#主键
diff --git a/safesite/urls.py b/safesite/urls.py
index e77940ef..d6535459 100644
--- a/safesite/urls.py
+++ b/safesite/urls.py
@@ -182,6 +182,7 @@ urlpatterns = [
path('gchandle',views.gchandle),
path('menutree',views.menutree),
path('setup',views.setup),
+ path('api/login', views.apilogin),
path('api/company',views.apicompany),
path('drapi',views.drapi),
path('api/miss',views.apimiss),
diff --git a/safesite/views.py b/safesite/views.py
index 382b64b1..8b612b66 100644
--- a/safesite/views.py
+++ b/safesite/views.py
@@ -144,18 +144,22 @@ def check_session(req):
# 存储文件
-
+@apicheck_login
def upfile(req):
username = User.objects.get(userid=req.session['userid']).username
+ try:
+ upfile = req.FILES['upfile']
+ except KeyError:
+ return JsonResponse({"code": 0, "msg": "未获取到文件"})
file_name = (time.strftime('%Y%m%d%H%M%S') + '_' +
- req.FILES['upfile'].name).replace('#', '号')
+ upfile.name).replace('#', '号')
user_upload_folder = os.path.join('media', username)
if not os.path.exists(user_upload_folder):
os.mkdir(user_upload_folder)
filepath = os.path.join(user_upload_folder, file_name)
filepath = filepath.replace('\\', '/')
with open(filepath, 'wb') as f:
- f.write(req.FILES['upfile'].read())
+ f.write(upfile.read())
return JsonResponse({"code": 1, "filename": file_name, "filepath": filepath})
# html页面
@@ -663,8 +667,27 @@ def init_permission(user,req):
})
req.session['permissions'] = permission_dict
-
-
+def apilogin(req):
+ """
+ json登录
+ """
+ data = json.loads(req.body.decode('utf-8'))
+ username = data['username']
+ password = data['password']
+ user = User.objects.filter(username=username, deletemark=1, usecomp__enabled=True)
+ if user.exists():
+ if check_password(password, user[0].epassword):
+ req.session['userid'] = user[0].userid
+ req.session.set_expiry(60*40)
+ init_permission(user[0],req)
+ return JsonResponse({'code':1})
+ else:
+ msg = '密码错误'
+ return JsonResponse({'code':0, 'msg':msg})
+ else:
+ msg = '用户不存在或被禁用'
+ return JsonResponse({'code':0, 'msg':msg})
+
def login(req):
if req.session.get('userid', None):
return redirect('index')
@@ -1988,7 +2011,7 @@ def grouphandle(req):
else:
return JsonResponse({"code": 0})
-
+@apicheck_login
def troublehandle(req):
a = req.GET.get('a')
if a == 'detail':
@@ -4448,9 +4471,9 @@ def apisafecert(req):
return HttpResponse(transjson(total, a), content_type="application/json")
elif a == 'listself':
userid = req.session['userid']
- cardnum = Userprofile.objects.get(user__userid=userid).cardnum
+ # cardnum = Userprofile.objects.get(user__userid=userid).cardnum
a = Safecert.objects.filter(
- cardnum=cardnum).order_by('id') # 无deletemark
+ user__userid=userid).order_by('id') # 无deletemark
total = a.count()
if req.GET.get('sort'):
a = a.order_by(req.GET.get('sort'))
@@ -5488,6 +5511,7 @@ def apinotice(req):
@transaction.atomic
def apioperation(req):
a = req.GET.get('a')
+ logger.info(req.get_full_path())
userid = req.session['userid']
if a == 'add':
userid = req.session['userid']
@@ -7015,36 +7039,36 @@ def apiexamtestrate(req):
i['totaluser'] = usersattend.count()
i['avgscore'] = round(i['avgscore'],1)
with open('ratedata.dat','wb') as f:
- pickle.dump({'total':total,'rows':objslist,'rows2':orgsCallist,'updatetime':datetime.now().strftime('%Y-%m-%d %H:%M')},f)
- from openpyxl import Workbook, load_workbook
- wb = load_workbook('e:/个人总排名.xlsx')
- sheet = wb.active
- for i in objslist:
- num = str(objslist.index(i)+3)
- sheet['a'+num] = i['user__name']
- sheet['b'+num] = i['user__ubelongpart__partname']
- sheet['c'+num] = i['testnum']
- sheet['d'+num] = i['totalscore']
- sheet['e'+num] = convertseconds(i['totaltook'])
- nowtime = datetime.now().strftime('%Y%m%d')
- sheet['b1'] = nowtime
- filename = '个人总排名' + nowtime
- filepath = 'e:/' + filename +'.xlsx'
- wb.save(filepath)
+ pickle.dump({'total':total,'rows':objslist,'rows2':orgsCallist,'updatetime':'2020-03-01 10:00'},f)
+ # from openpyxl import Workbook, load_workbook
+ # wb = load_workbook('e:/个人总排名.xlsx')
+ # sheet = wb.active
+ # for i in objslist:
+ # num = str(objslist.index(i)+3)
+ # sheet['a'+num] = i['user__name']
+ # sheet['b'+num] = i['user__ubelongpart__partname']
+ # sheet['c'+num] = i['testnum']
+ # sheet['d'+num] = i['totalscore']
+ # sheet['e'+num] = convertseconds(i['totaltook'])
+ # nowtime = datetime.now().strftime('%Y%m%d')
+ # sheet['b1'] = nowtime
+ # filename = '个人总排名' + nowtime
+ # filepath = 'e:/' + filename +'.xlsx'
+ # wb.save(filepath)
- wb2 = load_workbook('e:/机构总排名.xlsx')
- sheet = wb2.active
- for i in orgsCallist:
- num = str(orgsCallist.index(i)+3)
- sheet['a'+num] = i['user__ubelongpart__partname']
- sheet['b'+num] = i['totaluser']
- sheet['c'+num] = i['totaltest']
- sheet['d'+num] = i['avgscore']
- nowtime = datetime.now().strftime('%Y%m%d')
- sheet['b1'] = nowtime
- filename = '机构总排名' + nowtime
- filepath = 'e:/' + filename +'.xlsx'
- wb2.save(filepath)
+ # wb2 = load_workbook('e:/机构总排名.xlsx')
+ # sheet = wb2.active
+ # for i in orgsCallist:
+ # num = str(orgsCallist.index(i)+3)
+ # sheet['a'+num] = i['user__ubelongpart__partname']
+ # sheet['b'+num] = i['totaluser']
+ # sheet['c'+num] = i['totaltest']
+ # sheet['d'+num] = i['avgscore']
+ # nowtime = datetime.now().strftime('%Y%m%d')
+ # sheet['b1'] = nowtime
+ # filename = '机构总排名' + nowtime
+ # filepath = 'e:/' + filename +'.xlsx'
+ # wb2.save(filepath)
return JsonResponse({"code": 1})
@@ -8599,6 +8623,7 @@ def equipmentfig(req):
#责任制
+@apicheck_login
def getresbilitydata(req):
a = req.GET.get('a')
userid = req.session['userid']
@@ -8695,6 +8720,7 @@ def getresbilitydata(req):
#操作规程
+@apicheck_login
def getprodata(req):
a = req.GET.get('a')
userid = req.session['userid']
@@ -8785,6 +8811,7 @@ def getprodata(req):
a = ReaderOperproce.objects.filter(readid=id).values('id','readeruser__name','readertime')
total = a.count()
return HttpResponse(transjson(total,a),content_type="application/json")
+
def checkprojects(req):
a = req.GET.get('a')
userid = req.session['userid']
diff --git a/ssl证书/ctcshe.com.crt b/ssl证书/ctcshe.com.crt
new file mode 100644
index 00000000..9edcffb5
--- /dev/null
+++ b/ssl证书/ctcshe.com.crt
@@ -0,0 +1,40 @@
+-----BEGIN CERTIFICATE-----
+MIIG+DCCBeCgAwIBAgIQORiViTRLGZHnMRemVq6ndTANBgkqhkiG9w0BAQsFADBE
+MQswCQYDVQQGEwJDTjEaMBgGA1UECgwRV29TaWduIENBIExpbWl0ZWQxGTAXBgNV
+BAMMEFdvU2lnbiBEViBTU0wgQ0EwHhcNMTgwNTA3MDQwMTEyWhcNMTkwNTA3MDQw
+MTEyWjAiMQswCQYDVQQGEwJDTjETMBEGA1UEAwwKY3Rjc2hlLmNvbTCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBALYdcmn2kUtF9itKvgMiNYVHgXpjCZLG
+/hpn+VB00wlvr9fpr2t9qKQ9gnHmjaDCheCT6w8D9uDRLn/LigkVUfVhLr9fy2E+
+rPswcPfHizMIQI0BYs7OZCfrH5EGuejvc15CM48uLkH+qFheI9ZfCsKICBQ/BXxP
+WLH9ZLTPcy7OVDokZsUWNzUAU331UcdgiFXo9G+gKUfIlqbsUJLBeypD0czcdsJO
+bjXe3QeQmmnIUUVH9vvTuWf3HbJAbP4TAYyPMzSBuBt8aSVyzEfYeCfCxyZqRcyA
+BwnCNRnjPA5xOMHZT0C4QjnhjFVj0H0t5L+Au3ds11KAiO+/BEdcHu8CAwEAAaOC
+BAYwggQCMAwGA1UdEwEB/wQCMAAwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL3dv
+c2lnbi5jcmwuY2VydHVtLnBsL3dvc2lnbi1kdmNhLmNybDB3BggrBgEFBQcBAQRr
+MGkwLgYIKwYBBQUHMAGGImh0dHA6Ly93b3NpZ24tZHZjYS5vY3NwLWNlcnR1bS5j
+b20wNwYIKwYBBQUHMAKGK2h0dHA6Ly9yZXBvc2l0b3J5LmNlcnR1bS5wbC93b3Np
+Z24tZHZjYS5jZXIwHwYDVR0jBBgwFoAUypuNLkRQQorZAmUyGp6A84gEKrUwHQYD
+VR0OBBYEFN7UfqVFqxsyV7XFrztS/ByLfYtQMA4GA1UdDwEB/wQEAwIFoDCCASAG
+A1UdIASCARcwggETMAgGBmeBDAECATCCAQUGDCqEaAGG9ncCBQEPAzCB9DCB8QYI
+KwYBBQUHAgIwgeQwHxYYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMAMCAQEagcBV
+c2FnZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN0cmljdGx5IHN1YmplY3RlZCB0
+byB0aGUgQ0VSVFVNIENlcnRpZmljYXRpb24gUHJhY3RpY2UgU3RhdGVtZW50IChD
+UFMpIGluY29ycG9yYXRlZCBieSByZWZlcmVuY2UgaGVyZWluIGFuZCBpbiB0aGUg
+cmVwb3NpdG9yeSBhdCBodHRwczovL3d3dy5jZXJ0dW0ucGwvcmVwb3NpdG9yeS4w
+HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMCUGA1UdEQQeMByCCmN0Y3No
+ZS5jb22CDnd3dy5jdGNzaGUuY29tMIIBfwYKKwYBBAHWeQIEAgSCAW8EggFrAWkA
+dgCkuQmQtBhYFIe7E6LMZ3AKPDWYBPkb37jjd80OyA3cEAAAAWM4vmW0AAAEAwBH
+MEUCIGwokcf31c7dBmdrXqzfKYMhRh3YipleM4upC5qA5v+iAiEAtFFDw0rpRELA
+DUld8W7tEiowQxBkdrgvAH8C+baQxIIAdgDuS723dc5guuFCaR+r4Z5mow9+X7By
+2IMAxHuJeqj9ywAAAWM4vmNKAAAEAwBHMEUCIQCT4RodP2ykt9JWc1zaXb/0WVHV
+Clsam2EGuJ5y1yPd/wIgB1m9csxrjQCNMtWgicuZDsiOgcdoF0n5bVEGNEkFsn8A
+dwDd6x0reg1PpiCLga2BaHB+Lo6dAdVciI09EcTNtuy+zAAAAWM4vmSiAAAEAwBI
+MEYCIQDLS+g4ybNBMhfgbQu3dhHbiNa9MvWGtsCjHV1wJtrpxgIhAJKn5HNLuahO
+dkn44CP4t821ISPX/5ia5H+sCgkQJcasMA0GCSqGSIb3DQEBCwUAA4IBAQAszqhe
+hbnFECcgGLUUOYmq7HBcH/c4DBrxDrcJ/E4xeV2Mg+T+Cq4Ada+yV7OxPE9mOZlQ
+6oM77UeHTMUVe8NsoCdvYUki6WlRPg343VRwrB4r5KwAinA3aLRxOzBXEM7hCPdH
+vhjb3ET536Ma3WupBiqvUGZwFD2YGht42WPukyf/+UXbpwFTvREaqTqEBDCDIxB5
+CwyTQuE2UbTczOLHCUaA/5MvPHcxOd1DH8fqOMX1OZyS9W6TiZBGPNG8pSnOKFQV
+sKSKl35c6jqV/ohZrWjxRzuxE1Rlcbl1EHX2tZhp2SX5c7CNIXtpug5uvqBnJMx4
+ctTr8V70liDiSHjt
+-----END CERTIFICATE-----
diff --git a/ssl证书/ctcshe.com.csr b/ssl证书/ctcshe.com.csr
new file mode 100644
index 00000000..c5f61bb1
--- /dev/null
+++ b/ssl证书/ctcshe.com.csr
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIIC/zCCAecCAQAwgagxEzARBgNVBAMMCmN0Y3NoZS5jb20xOTA3BgNVBAoMMOS4
+reWbveW7uuadkOajgOmqjOiupOivgembhuWbouiCoeS7veaciemZkOWFrOWPuDEn
+MCUGA1UECwwe5a6J5YWo5LiO546v5L+d56eR5a2m56CU56m26ZmiMQswCQYDVQQG
+EwJDTjEPMA0GA1UECAwG5YyX5LqsMQ8wDQYDVQQHDAbljJfkuqwwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2HXJp9pFLRfYrSr4DIjWFR4F6YwmSxv4a
+Z/lQdNMJb6/X6a9rfaikPYJx5o2gwoXgk+sPA/bg0S5/y4oJFVH1YS6/X8thPqz7
+MHD3x4szCECNAWLOzmQn6x+RBrno73NeQjOPLi5B/qhYXiPWXwrCiAgUPwV8T1ix
+/WS0z3MuzlQ6JGbFFjc1AFN99VHHYIhV6PRvoClHyJam7FCSwXsqQ9HM3HbCTm41
+3t0HkJppyFFFR/b707ln9x2yQGz+EwGMjzM0gbgbfGklcsxH2HgnwscmakXMgAcJ
+wjUZ4zwOcTjB2U9AuEI54YxVY9B9LeS/gLt3bNdSgIjvvwRHXB7vAgMBAAGgETAP
+BgkqhkiG9w0BCQ4xAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCDUa2ZGCZDcE2oYsXp
+pddM9R4fasFBesZRJdKyXe6oo6zM6vbUAzMNkTillTQaCMQmrv8Eu//8A5MjvdsZ
+r4ldZrX7UAX/4LE7pDcK7iBDlMIB0FyiNxDDAgFJ9I+wReXM2fSmlYuuhgIFcNaI
+G3WMjoF5KLvCQOFZavi+9P8q/weQM0lChSVvzPo5Zqh8wv66sWmRXKmnlN8PAkJV
+L0oku0c5xyFli827rGqcBvt/aUebcRvdjxGr2tylRH8c7uY0nQ07mzbe8cmMbVEE
+o6Rf5abr5SU55gZfACNJzJ3tGnrMESH3pSBLKDbmDHIA33c6exI9FOTIJB2lw33u
+LqXH
+-----END CERTIFICATE REQUEST-----
diff --git a/ssl证书/ctcshe.com.key b/ssl证书/ctcshe.com.key
new file mode 100644
index 00000000..40d37a62
--- /dev/null
+++ b/ssl证书/ctcshe.com.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEAth1yafaRS0X2K0q+AyI1hUeBemMJksb+Gmf5UHTTCW+v1+mv
+a32opD2CceaNoMKF4JPrDwP24NEuf8uKCRVR9WEuv1/LYT6s+zBw98eLMwhAjQFi
+zs5kJ+sfkQa56O9zXkIzjy4uQf6oWF4j1l8KwogIFD8FfE9Ysf1ktM9zLs5UOiRm
+xRY3NQBTffVRx2CIVej0b6ApR8iWpuxQksF7KkPRzNx2wk5uNd7dB5CaachRRUf2
++9O5Z/cdskBs/hMBjI8zNIG4G3xpJXLMR9h4J8LHJmpFzIAHCcI1GeM8DnE4wdlP
+QLhCOeGMVWPQfS3kv4C7d2zXUoCI778ER1we7wIDAQABAoIBACYonWSeiWsgSahg
+jNfTPyuiA/tE7SiYEX4u8wpssBt2D35KNLttJPzk9oQvLtXUbIDV/Zaz2fLZYcjd
+ORsWIIotxsHKrK6/lzc6uzDv2rbir8Pb2nxCurGyjnaw1ht8sMu7S1pg7shdN6Ds
+eM3eND72idrUKa4WYhtJYOSR4yyXLD+Lpf+KVIgFR4Qz1b46SEb5GKd5YPVIywrm
+Xq3Su3bvWLrhh+zjL4x01P/onoPgAZnS/m44bHkL/K5X1MiyY/42RpOp8u04MsWZ
+Oc38yq3MaKj7cBTGKAvTjofNAoEnBfn/uH+KIMkkBFZWRv2slr9ps4i5OGGbL7AQ
+9gepMGECgYEA6gWmiTF/71GWq025nliRsTrxZbXD0/teaCN1UPWBxMI3IHO8Ek5Z
+ZaZKvOR5ws8LFUKaxkgOcIzLJyaPIGvcNx3DussbIYwOyKTJxgK0RovIl9wBii+C
+hLjUIPRB1OeASkmDTTTTIuKhpjYfLRL3a0JkW89N0YB1233mIPCOA/sCgYEAxzfZ
+aL1qNVnfChJXs/2vLPyqdW+gEoIluFNEHLFuXpsnBbhiohPaQSqab9bGCY6vtazV
+wHODKkE//YMIad4RRN22k3HRP//liUcXjILpa4CNalMOtOXg29aRRO2P6RaB1oOQ
+f8kuHugzC5ZO53+fUAcOvzXwno/6/l4S8HOtqp0CgYEAzPzSGY5wX/L5pWfZ1agD
+Rlk5JjyHImInGdUlaBsE5pKwsw5tiSN0DyQQh1Eijs/JB4BmDpUDgPby5IJUELQq
+G2VJE4/hXgtOz9X4oCeyPbEnrk2aU662BwfXWF5cY9+8clXeW3yQDRizO+JggJ0C
+eMOZIQp/Qanikra/I89Sto0CgYAvY+O9/MEVK+nY1YAzevd+9iP+h61GedtLO9OK
+F9Mvgi0IOVKNR7e1pNLUI/08LMszpoe6nj/nf1ofjlokBQWKoktaS8sBNHh/7X92
+l3W7cvsw/c0Tz1NsOGCaSwDe69G7G9T18P+drpLmAL2IaF2XhfZGGijBL3L/q5VJ
+ydrYKQKBgHdoVpHWdhKlZEyaHU3H6wdWiXpKjGSP985bUX2pNwtCtym/8vd1YAnA
+/hKge5uJP+vUQN2/R9VfyvSzaVDG0077tZK6Skuae8w8IH9ZvkhG9EAIvafxSjQp
+scD55oIv5oeojIiZRI0pru27uJJ1D1KTlpbt3eivLOU4h0Q8IptS
+-----END RSA PRIVATE KEY-----
diff --git a/ssl证书/root_bundle.crt b/ssl证书/root_bundle.crt
new file mode 100644
index 00000000..be980ad8
--- /dev/null
+++ b/ssl证书/root_bundle.crt
@@ -0,0 +1,56 @@
+-----BEGIN CERTIFICATE-----
+MIIEtTCCA52gAwIBAgIRAOIaIRqokeLTVFn/020nxCYwDQYJKoZIhvcNAQELBQAw
+fjELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu
+QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEiMCAG
+A1UEAxMZQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQTAeFw0xNzA1MTgwNzQ2MTRa
+Fw0yNzA1MTgwNzQ2MTRaMEQxCzAJBgNVBAYTAkNOMRowGAYDVQQKDBFXb1NpZ24g
+Q0EgTGltaXRlZDEZMBcGA1UEAwwQV29TaWduIERWIFNTTCBDQTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAMhQeIUezKdIBlpnoWm0+HG5nu8859lksQEG
+OIeNiayAqhlxG5b4+wVEJ8DmCP77qDOoKVjW5owTIvZHc4F2MEqTOt6/XL3+P6an
+bKdPN5/nhKghN+45ywgFYn1AcI5kYdPFQmNfNYGC3jaHISHttC2xz8NQHyHRI3sy
+g3hkPdyNeLC+4rTOLs5SYZT+vHr3biOipBO5n68A0Ho86RQ6d0RmBRArAJskD+U/
+Qco3F2pl7T0CDOuCXZ/ld3Ga7Bvb1G/lAbM/cEr6endnaLaHmI+6gYWRZVqOELVi
+T9dkYnpspHxtcgsVUl1lFf3GSfWAX/Jvnd3IstCa9E3dmAWm8IUCAwEAAaOCAWYw
+ggFiMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFMqbjS5EUEKK2QJlMhqe
+gPOIBCq1MB8GA1UdIwQYMBaAFAh2zcsH/yT2xc3tu5C84oQ3RnX3MA4GA1UdDwEB
+/wQEAwIBBjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwNQYDVR0fBC4w
+LDAqoCigJoYkaHR0cDovL3N1YmNhLmNybC5jZXJ0dW0ucGwvY3RuY2EuY3JsMGsG
+CCsGAQUFBwEBBF8wXTAoBggrBgEFBQcwAYYcaHR0cDovL3N1YmNhLm9jc3AtY2Vy
+dHVtLmNvbTAxBggrBgEFBQcwAoYlaHR0cDovL3JlcG9zaXRvcnkuY2VydHVtLnBs
+L2N0bmNhLmNlcjA5BgNVHSAEMjAwMC4GBFUdIAAwJjAkBggrBgEFBQcCARYYaHR0
+cDovL3d3dy5jZXJ0dW0ucGwvQ1BTMA0GCSqGSIb3DQEBCwUAA4IBAQAAn17fM+SE
+dRJdtuP6BtLY4kfJu/xPVpFlTpl1Wq2GlzSOBWEIvqsrvSz141D5mmPZ1hqMIdbn
+4uq0sC48tAD3Mi18RLbfitm3o0tjYxsbI27tltVMbvyld/k3JOyj0wVljju9fDHc
+yIK6akmE/C6UDLtqvRAx0m7xc5z+YIJRabXi33x4AmV7HTyVs6Lm6AGb+KqaJzDd
+X9Qqj24EuP/noicvKYP9g9Uf6aGPB5TWliIoEpJWz6qD/PophMB4nuj3ccO0LMJ+
+k5QFRWs2hZmev1M8hpqBoMwpoG/jy5AOwntqRqRsSkbR+6tZ3aCWKU1hNnkZcfHJ
+11ozB0OSfC7K
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEtDCCA5ygAwIBAgIRAJOShUABZXFflH8oj+/JmygwDQYJKoZIhvcNAQELBQAw
+PjELMAkGA1UEBhMCUEwxGzAZBgNVBAoTElVuaXpldG8gU3AuIHogby5vLjESMBAG
+A1UEAxMJQ2VydHVtIENBMB4XDTA4MTAyMjEyMDczN1oXDTI3MDYxMDEwNDYzOVow
+fjELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu
+QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEiMCAG
+A1UEAxMZQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAOP7faNyusLwyRSH9WsBTuFuQAe6bSddf/dbLbNax1Ff
+q6QypmGHtm4PhtIwApf412lXoRg5XWpkecYBWaw8MUo4fNIE0kso6CBfOweizE1z
+2/OuT8dW1Vqnlon686to1COGWSfPCSe8rG5ygxwwct/gounS4XR1Gb0qnnsVVAQb
+10M5rVUoxeIau/TA5K44STPMdoWfOUXSpJ7yEoxR+HzkLX/1rF/rFp+xLdG6zJFC
+d0wlyZA4b9vwzPuOHpdZPtVgTuYFKO1JeRNLukjbL/ly0znK/h/YNHL1tEDPMQHD
+7N4RLRddH7hQ0V4Zp2neBzMoylCV+adUy1SGUEWp+UkCAwEAAaOCAWswggFnMA8G
+A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFAh2zcsH/yT2xc3tu5C84oQ3RnX3MFIG
+A1UdIwRLMEmhQqRAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNw
+LiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQYIDAQAgMA4GA1UdDwEB/wQEAwIB
+BjAsBgNVHR8EJTAjMCGgH6AdhhtodHRwOi8vY3JsLmNlcnR1bS5wbC9jYS5jcmww
+aAYIKwYBBQUHAQEEXDBaMCgGCCsGAQUFBzABhhxodHRwOi8vc3ViY2Eub2NzcC1j
+ZXJ0dW0uY29tMC4GCCsGAQUFBzAChiJodHRwOi8vcmVwb3NpdG9yeS5jZXJ0dW0u
+cGwvY2EuY2VyMDkGA1UdIAQyMDAwLgYEVR0gADAmMCQGCCsGAQUFBwIBFhhodHRw
+Oi8vd3d3LmNlcnR1bS5wbC9DUFMwDQYJKoZIhvcNAQELBQADggEBAI3m/UBmo0yc
+p6uh2oTdHDAH5tvHLeyDoVbkHTwmoaUJK+h9Yr6ydZTdCPJ/KEHkgGcCToqPwzXQ
+1aknKOrS9KsGhkOujOP5iH3g271CgYACEnWy6BdxqyGVMUZCDYgQOdNv7C9C6kBT
+Yr/rynieq6LVLgXqM6vp1peUQl4E7Sztapx6lX0FKgV/CF1mrWHUdqx1lpdzY70a
+QVkppV4ig8OLWfqaova9ML9yHRyZhpzyhTwd9yaWLy75ArG1qVDoOPqbCl60BMDO
+TjksygtbYvBNWFA0meaaLNKQ1wmB1sCqXs7+0vehukvZ1oaOGR+mBkdCcuBWCgAc
+eLmNzJkEN0k=
+-----END CERTIFICATE-----