吾用项目之记账程序finance

基于2021.2.4日志的安排,于2021.2.7完成了计划1和3,并开始任务5,于昨天完成,原预期5天完成,实际3.5天完成,功能超过最初预期,运行结果满意。

现对程序使用方法进行如下介绍:

finance 1.0
程序目录结构:

│ README.txt # 说明文档

├─bin # 执行目录
│ finance_GUI.py # 程序执行文件
│ MainPage.py # 程序视图
│ view.py # 程序视图

├─conf # 配置目录
│ settings.py # 程序配置文件

├─core # 程序功能模块目录
│ create_db.py # 创建数据库结构模块
│ excel.py # 读写excel模块
│ init_db.py # 初始化数据库表数据模块
│ logger.py # 日志模块
│ Mytools.py # 通用方法模块

├─db # 数据库文件目录
│ finance.db # 数据库文件

└─log # 日志目录
info.log # 程序日志

使用说明:
1.程序所需第三方包openpyxl
安装 pip install openpyxl

2.运行方式 python finance_GUI.py

注意事项:
1.程序输入日期的时候支持 20210211,2021-02-11,2021-2-11,2021.2.11 等输入方式,程序会自动检验日期是否正确并且输出”xxxx-xx-xx”日期格式
2.由于tkinter entry控件在中文输入法状态下无法输入小数点,故输入金额时请务必注意切换输入法为英文状态
3.初次使用建议手动执行 python core_db.py 和 python init_db.py

程序界面使用说明

界面说明1 操作界面

json写入中文字符并显示

想把一个字典{“name”:”张三“}形式的数据写入文本中,并且能显示中文字符

dict = {‘name’:’张三’}
with open(‘a.txt’,’w’,encoding=’utf-8′) as f:
    f.write(dict)

在python中如果这样直接写的话,会出现TypeError异常:写入的数据必须是字符串,不能是字典。

所以得将它转换成字符串的形式,用json格式来写入。但是在写入的文本中不能显示想看的中文字符{“name”: “\u5f20\u4e09”},在json中加一个ensure_ascii=False参数就能解决啦

import json
dict = {‘name’:’张三’}
with open(‘a.txt’,’w’,encoding=’utf-8′) as f:
    f.write(json.dumps(dict,ensure_ascii=False))

来自 <https://www.cnblogs.com/863652104kai/p/11352205.html#json%E5%86%99%E5%85%A5%E4%B8%AD%E6%96%87%E5%AD%97%E7%AC%A6%E5%B9%B6%E6%98%BE%E7%A4%BA>

with open(‘a.txt’,’w’,encoding=’utf-8′) as f:

    f.write(json.dumps(dict))

依旧不是中文,必须加ensure_ascii=False

官方文档:https://docs.python.org/3/library/json.html

If ensure_ascii is True (the default), the output is guaranteed to have all incoming non-ASCII characters escaped. If ensure_ascii is False, these characters will be output as-is.

如果ensure_ascii为True(默认值),则输出保证将所有输入的非ASCII字符转义。如果确保ensure_ascii为False,这些字符将原样输出。

来自 <https://www.liaoxuefeng.com/discuss/969955749132672/1288355859922978>

需要注意如果:

            with open(settings.NOTES_PATH, ‘w’) as f:

                json.dump(self.notes, f, ensure_ascii=False)

由于没有指定encoding=utf-8′,那么默认会用当前系统编码表进行编码,到时打开文档就会出现编码问题,故open()应指定encoding=’utf-8′

注意:指定编码格式时,所有读写json的文件open()都应指定encoding=’utf-8′,避免读写时候编码出错

SQL语句提要

SQL(全称:Structured Query Language)

SQL是结构化查询语言,是一种用来操作RDBMS(Relational Database Management System)的数据库语言,当前关系型数据库都支持使用SQL语言进行操作,也就是说可以通过 SQL 操作 oracle,sql server,mysql,sqlite 等等所有的关系型的数据库

    SQL语句主要分为:

        DQL:数据查询语言,用于对数据进行查询,如select

        DML:数据操作语言,对数据进行增加、修改、删除,如insert、udpate、delete

        TPL:事务处理语言,对事务进行处理,包括begin transaction、commit、rollback

        DCL:数据控制语言,进行授权与权限回收,如grant、revoke

        DDL:数据定义语言,进行数据库、表的管理等,如create、drop

        CCL:指针控制语言,通过控制指针完成表的操作,如declare cursor

    SQL 是一门特殊的语言,专门用来操作关系数据库不区分大小写

   

操作数据库:

查:show databases;

用:use 数据库名;

查看当前使用数据库:select database();

查看数据库创建语句:show create database 数据库名;

增:create database 数据库名 charset=utf8;

删:drop database 数据库名;

操作数据表:

一.针对表结构

1.查:

查看当前数据库中所有表:show tables;

查看表结构:desc 表名;

2.增:

CREATE TABLE table_name(

    column1 datatype contrai,

    column2 datatype,

    column3 datatype,

    …..

    columnN datatype,

    PRIMARY KEY(one or more columns)

);

3.改:

3.1 修改表-添加字段

alter table 表名 add 列名 类型;

3.2 修改表-修改字段

3.2.1 修改表-修改字段-重命名

alter table 表名 change 列名 新名 类型及约束;

3.2.2 修改表-修改字段-不重命名

alter table 表名 modify 列名 类型及约束;

3.3 修改表-删除字段

alter table 表名 drop 列名;

4. 删

drop table 表名;

5. 查看表的创建语句

show create table 表名;

二.针对表数据的CURD

1.查

1.1 查询所有列

select * from 表名;

1.2 查询指定列

select 列1,列2… from 表名;

2.增

2.1 全列插入

insert into 表名 values(列数据1,列数据2,…);

注意:全列多行插入:值的顺序与给出的列顺序对应

2.2 部分列插入

insert into 表名(列1,列2…) values(列数据1,列数据2,…);

3.改

update 表名 set 列1=值1,列2=值2… where 条件;

4.删

delete from 表名 where 条件;

注意:一般使用逻辑删除,即定义一个字段is_delete

update 表名 set is_delete=1 where 条件;

关于无聊的代码的近期安排

近期计划:

1.准备检查完善一下Timer计时器代码和robot聊天机器人代码,然后提交github

预计时长2天完成

2.之前写的Filemanager程序,断断续续也写了好几个月,历经3个大版本,如今功能也完善了,一两个月下来使用体验也还可以,稳定性也不错,至少在主机了用了好多次,准备用2天时间重新排查一下代码,完善一下然后提交github

这个其实还是蛮舍不得的,毕竟一行行,敲了好久才完成的。提交的代码无特殊情况不再更新了。

预计时长2天完成

3.robot聊天机器人,将数据存储从json文件转为数据库,考虑到方便使用将选择sqlite3数据库,并在程序中提供数据导出的功能选项

预计时长1天完成

4.聊天机器人目前仍是有形无神,下一步进行聊天机器人的机器学习方面代码的实现,这个会首先参考github上星数较多的项目,先实现再自己写,了解结巴切词等,时间充足的话会尝试第三方公司提供的接口。

预计时长7天完成

5.完成记账程序的代码,熟悉python对excel文件读写

预计时长5天完成

一切顺利的话,现在已完成的几个代码在春节前就能完善完成,聊天机器人的机器学习训练和记账程序的代码实现在春节过后就能完成。

一切以实现为先

Timer程序和聊天机器人完成

robot3.0 简单版 2021.1.29
实现首页即聊天界面功能
1.备忘录尚有bug
重启程序后,在读取之前导出的便签内容json会报错
Traceback (most recent call last):
TypeError: not enough arguments for format string

2.重复创建Frame的问题有待解决
3.提醒功能和计时功能并未实现
4.聊天界面右侧部分,随着图片尺寸变化会出现布局变化问题有待解决,想办法将各部件位置定好
5.是否能实现拉伸窗口部件随着窗口大小变化自动填充
6.随着多次点击 《备忘》按钮,貌似不仅新建Frame而且也新建子线程,如果这样的话程序运行中就会不停新增Frame对象和子线程,能否实现单例?
点了6次按钮后:就会创建6个子线程

robot3.0.1 简单版 修复bug 2021.1.31
update:
1.修复上一个版本即2021.1.29 中的bug 1,2,6
其中bug1 是因为json中没有tuple类型会将python中的tuple对象类型转化为array类型,再转回python数据类型时候就会转换成list,解决方法,tuple() 数据类型转换一下就可以
bug2和bug6 已经重构代码,现在启动系统的时候会创建一次所有Frame之后就会调用之前的Frame而不是原来代码里面,点击一次就去新建一次Frame,代码结构优化,但是值得注意的是现在代码传递的是win窗口对象而不再是self.win这个窗口tk对象,即所有Frame获取到的是MainPage这个对象,而不再是MainPage.win这个tk对象,这样做是为了方便各个功能Frame页面可以直接调用父容器MainPage对象中的方法,提升代码复用

robot3.0.2 实现计时器功能模块 2021.2.1
update:
1.实现计时模块功能,分两种办法一种lisdtbox控件做,第二种label标签做。
使用listbox控件显示,反正功能实现了,但是不好用。
用label去做很麻烦,在变量指向的时候没想通,最开始想法是限定同时只能开启7个计时任务,一开始就写死7组标签,然后创建任务的时候,将任务信息填充到这7组预制标签内,但是发现这样代码重复厉害而且low,但是要实时修改label内容就必须获取到该label的变量对象,这个想了很久都没想通,有考虑过java中的反射原理,后期也想过这种情况也类似前端网页的实时增减标签的那部分内容。
最终没实现用label控件完成计时模块,准备去复习一下前端关于实时增减标签的内容

耳机煲机记录程序 2021.2.2
update:
1.由于买的耳机听感并不是太好,所以准备继续煲机,决定煲机300小时,于是需要时间计算,最开始是2021.1.31 04点开始,用手机便签记录,感觉稍微不便,而且不够精准。于是自己动手写了一个耳机煲机时长记录程序,每次任务点击开始,点击停止结束,会将本次煲机信息记录到json文件中,包含本次任务开始时间,本次任务运行时间(以秒数记录),总任务时长等,自己写的函数将秒数转换为“xx小时xx分钟xx秒”,程序GUI界面会直观一点
2.然后学习git使用,GitHub绑定本地公钥直接push代码等内容
3.写了remake_time_human, remake_time_sec 用于将时间信息在“xx年xx天xx小时xx秒” 与 纯秒数之间转化
心得:发现创建一个子线程专门实时计算时间输出时间,会比较占用cpu资源,于是设定程序每隔一秒刷新一次时长,cpu占用率从16%下降到0.1%

robot3.0.3 实现完全功能 2021.2.3
update:
1.在2021.2.2的基础上,参照耳机煲机记录程序的代码,进行Timer计时器代码的实现,完成了一个自己相当满意的Timer计时器程序,输出依旧是json,
数据格式为:# 数据格式{“current_id”:$current_id, $id:{“time_start”:$time_start, “cal_time”:$cal_time,”title”:$title,”remark”:$remark},}
注意:
1) label的实现方式,创建时候实时生成label控件的任务信息,定义一个newJob函数,内部实现实时生成label控件,实时输出任务信息到这些label控件中,然后每点击一次新建任务就创建一次子进程执行该函数
在如何结束该子进程是遇到困难,因为Button(command=xxx),想用lambda 解决,发现也不行,最后用的最后用的将任务id从active_list中移除,然后newJob实时监测自己的id是否在active_list中实现点击“停止”按钮,结束任务的功能
2) 为了防止计时任务正在执行中关闭程序导致数据丢失,绑定窗口关闭事件
self.win.protocol(‘WM_DELETE_WINDOW’, self.closeWindow) # 绑定窗口关闭事件,防止计时器正在工作导致数据丢失
但是,有两点注意,一是这个绑定的只是点击窗口x关闭按钮,并不能防止程序直接被终结进程造成的损失,二是protocol是tkinter.Tk()的方法,下面的Frame等控件没有

2.在完善Timer程序后,将其代码并入robot程序中的计时模块,实现robot程序的计时模块功能,并参照代码实现提醒(倒计时)模块功能,以及优化便签模块功能
3.实现查找聊天记录,变更便签内容的功能代码
4.实现主页实时提示目前正在进行的计时任务和提醒任务
5.修复部分可能出现的bug
6.写了changeStrToTime, changeStrToDate 用于匹配 三种时间格式20210201,2021.2.1,2021-2-1 统一转换成 2021-02-01 并判断输入是否合理(包含闰年以及月份天数是否合理)

todo:
1.研究pack、grid布局,想办法美化程序界面
2.完善程序,测试是否有没发现的bug

json与python对象转换中会出现的bug

1.json存取数据有bug?
疑似存储时候有数据结构损坏,是的,因为json中没有tuple类型,会转换成array,在读取json文件转换回python类型时候就会转换成list
写程序谨记,json数据类型和python有出入

    notes= [(1,2,3),(1,2,3)]
    with open(settings.NOTES_PATH, 'w') as f:
        json.dump(notes, f)


结果再读取时候
    with open(settings.NOTES_PATH, 'r') as f:
        notes = json.load(f)
        pring("type of note from json", type(notes))

结果为?
    type of note from json: <class 'list'>
    [[1, 2, 3], [3, 2, 1]]

而
    notes = [[1, 2, 3], [3, 2, 1]]
    with open(settings.NOTES_PATH, 'w') as f:
        json.dump(notes, f)
再读取时候
    with open(settings.NOTES_PATH, 'r') as f:
        notes = json.load(f)
        pring("type of note from json", type(notes))
结果为:
    type of note from json: <class 'list'>
    [[1, 2, 3], [3, 2, 1]]
    疑似自动拆包?数据结构出错?


有bug?存储过程出错?
查资料发现:对象类型转换,python中的list和tuple都会转换为array,这就导致再转换回来的时候元组就变成了list,于是就出现这个bug
数据类型:
Python          JSON
dict            object
list, tuple     array
解决方法:
转换回来之后在tuple([1,2,3]) 转换成tuple

2.关于list.append(tuple)
notes = []
note_item = (1,2,3)
notes.append(note_item, )
print(“type of note_item:”, type(note_item))
print(“type of notes:”, type(notes))
print(notes)
结果为:
type of note_item:
type of notes:
[(1,2,3)]

notes = []
note_item = (1,2,3)
notes.append((note_item, ))
print(“type of note_item:”, type(note_item))
print(“type of notes:”, type(notes))
print(notes)
结果为:
type of note_item:
type of notes:
[((‘1’, ‘2’, ‘3’),)]

总结:一个成熟的产品和框架本身出现bug的概率并不高,遇见自己的代码中引用第三方的模块或者库的时候出现了奇奇怪怪的bug,首先应考虑是否各个模块之间的数据结构和数据定义不同导致的兼容性bug

Python写GUI聊天窗口,部分笔记

1.range(i,j) 包左不包右, 即range(1,5) 结果为[1,2,3,4]

2.想要动态修改label 图片image 需要保证引用不变 即photo的引用一开始就是全局变量 否则只能通过传参解决 详见https://blog.csdn.net/u012343179/article/details/82892600
将photo属性改为self.photo 也可以 只要保证指向图片变量对象引用不变即可(注意是图片对象变量而不是具体图片)

3.禁止用户删除Tkinter scrolledtext中的文本
通过将状态设置为来禁用用户输入和删除state=”disabled”或者tk.DISABLED,将文本区域变为只读。
需要修改文本内容的时候将state属性修改为state=”normal”或者tk.NORMAL即可恢复读写
text_area = ScrolledText(master = root, wrap = tk.WORD, state = tk.DISABLED)
text_area.pack(side = tk.TOP, fill = tk.BOTH, expand = True)
text_area.insert(tk.INSERT, some_text_here) #No longer works

解决方案:最简单的解决方案是将状态从“禁用”设置为“正常”,插入文本,然后再将其设置为“禁用”。

4.Button,Entry 等控件的state属性可以控制该控件是否可用,设置为”disabled”时该控件为灰色锁定状态,”normal”恢复正常

5.Label.config(text=””) 用于修改文本,Label.config(image=PhotoImage对象)用于修改填充图片

6.Entry(textvariable=xxx) 而RadioButton(value=xx,variable=xxx)

7.在一个Frame中或者说同一个父容器下只能有一种布局模式!

8.设置守护线程,可以避免主线程结束后,子线程依旧在执行的过程中访问主线程资源导致报错
报错类型为:
# RuntimeError: main thread is not in main loop
# Tcl_AsyncDelete: async handler deleted by the wrong thread

9.ScrolledText.insert(tk.END, msg, ‘green’) 可以将 msg文字变为绿色
插入内容:ScrolledText.insert(tk.END, msg, ‘green’) 效果等同ScrolledText.insert(tk.INSERT, msg, ‘green’)
清空内容:ScrolledText.delete(“0.0”, tk.END) 效果等同ScrolledText.delete(0.0, “end”)

10.关于获取屏幕分辨率,并将程序窗口设置到屏幕中间
Tk对象的winfo_screenwidth()和winfo_screenheight()可以获取屏幕分辨率

    self.win = tk.Tk()
    self.win.title("rina3.0")
    # 设置窗口大小
    winWidth = 790
    winHeight = 600
    # 获取屏幕分辨率
    screenWidth = self.win.winfo_screenwidth()
    screenHeight = self.win.winfo_screenheight()
    x = int((screenWidth - winWidth) / 2)
    y = int((screenHeight - winHeight) / 2)

    # 设置窗口初始位置在屏幕居中
    self.win.geometry("%sx%s+%s+%s" % (winWidth, winHeight, x, y))

11.可以给某个部件或者Frame绑定键盘事件
比如:self.txt_msgSend.bind(“”, func=self.run_sendMsg) # 绑定键盘事件 ctrl + enter为发送消息

12.父容器可以通过grid_slaves(),pack_slaves()等方法获取该父容器下的子部件
例如:
# 将除了recordFrame之外的其他容器部件隐藏,只显示recordFrame
frame_list = self.win.pack_slaves()
for item in frame_list:
item.pack_forget()
recordFrame.pack()

13.计算两个时间之间差了多少天

def calDate(date1, date2):
    """获取两个时间差多少天"""
    # date1 = time.strptime(date1, "%Y-%m-%d")
    # date2 = time.strptime(date2, "%Y-%m-%d")
    date1 = time.strptime(date1, "%Y-%m-%d %H:%M:%S")
    date2 = time.strptime(date2, "%Y-%m-%d %H:%M:%S")
    # 根据上面需要计算日期还是日期时间,来确定需要几个数组段。下标0表示年,小标1表示月,依次类推...
    # date1 = datetime.datetime(date1[0], date1[1], date1[2], date1[3], date1[4], date1[5])
    # date2 = datetime.datetime(date2[0], date2[1], date2[2], date2[3], date2[4], date2[5])
    date1 = datetime.datetime(date1[0], date1[1], date1[2])
    date2 = datetime.datetime(date2[0], date2[1], date2[2])
    # 返回两个变量相差的值,就是相差天数
    return (date2 - date1).days

14.使用PIL自动缩放图片

from PIL import Image, ImageTk
def resize(w_box, h_box, pil_image):  # 参数是:要适应的窗口宽、高、Image.open后的图片
    """调整图像大小"""
    # 对一个pil_image对象进行缩放,让它在一个矩形框内,还能保持比例
    w, h = pil_image.size  # 获取图像的原始大小
    f1 = 1.0 * w_box / w
    f2 = 1.0 * h_box / h
    factor = min([f1, f2])
    width = int(w * factor)
    height = int(h * factor)
    return pil_image.resize((width, height), Image.ANTIALIAS)

def getImg():
    """获取随机图片,并缩放到合适尺寸 """
    # resize函数使用过程:
    # ==================================================================
    w_box = 180  # 期望图像显示的大小(窗口大小)
    h_box = 180
    pil_image = Image.open(choice_img())  # 以一个PIL图像对象打开  【调整待转图片格式】
    pil_image_resized = resize(w_box, h_box, pil_image)  # 缩放图像让它保持比例,同时限制在一个矩形框范围内  【调用函数,返回整改后的图片】
    photo = ImageTk.PhotoImage(pil_image_resized)  # 把PIL图像对象转变为Tkinter的PhotoImage对象  【转换格式,方便在窗口展示】
    # ====================================================================
    return photo

关于kindle看txt格式电子书乱码和串页问题

2018-7-26  从骚鹏处入手一台kindle paperwhite,然后情怀么,因为小说在过去几年都看得差不多了 几百本,温习温习,kindle设备阅读txt文本有好几种方式,比较简单的有两种,一种直接通过数据线连接电脑,将文件拷贝至kindle设备documents文件夹中;另一种是登陆Amazon.cn,我的账户–>管理内容和设备,在这里可以管理内容和设备,可以看到设备对应一个邮箱*@kindle.cn,然后绑定信任邮箱,就可以通过刚才绑定的信任邮箱发送文档到之前看到的kindle设备对应的邮箱地址(即*@kindle.cn),一般等几分钟之后kindle设备上就会推送,推送失败会有邮件反馈至发信邮箱。

推送略显麻烦,一直用第一种直接拷贝的方法,结果发现每本txt,全都出现乱码和串页的问题,即每隔几章内容段落文本内容出现乱码,点击屏幕向上向下翻页结果都会出现串页(一般串页只出现在乱码文本内容的那几章)。今天尝试了推送,通过发送邮件推送的文档,不会出现乱码和串页,(直接拷贝到documents文件夹,格式不变,通过邮件推送,下载之后格式变为azw3)。

推送试验几次:

1.直接用绑定的信任邮箱发送到设备的邮箱地址即*@kindle.cn,大概两三分钟之后推送到kindle设备,文件格式为azw3,文档正常,未出现乱码和串页。

2.在推送的邮件主题处填写convert,结果同上一条一样无变化。

3.用邮件推送的方式,推送zip压缩包。无法推送,Amazon反馈格式错误,但是他自己也说支持将多个文档打包成zip推送的。

4.推送zip压缩包,在邮件主题处填写convert,结果同上一条,无法推送,反馈格式错误邮件。

5.将txt文本转化为mobi格式,直接用数据线连接电脑,拷贝至documents文件夹,文本未出现乱码和串页,但是文档文件名混乱(疑似编码加密,像有时从网上下载中文文件,结果下下来变成一堆符号和数字文件名)

6.将txt文本另存为“utf-8”编码格式,直接用数据线连接电脑,拷贝至documents文件夹,文本未出现乱码和串页,文档正常

 

问:kindle系统用的什么编码?

关于服务器崩溃的糟心事

2017.12.12
关于服务器崩溃的糟心事

前几个月觉得好奇,买了vps搭了wordpress结果几个月下来也才写了二十多篇,基本没怎么用,毕竟现在已经不是上学的时候了,那时候一天能发好几条心情状态、说说和日志。没有曾经的那种轻松,过了这么多年都不怎么爱说什么了,基本上也很少有人去写博客和日志了。一年三百多元的费用怎么说呢觉得还行吧,偶尔心有所感,写点日志。

12.9上午7点多骚鹏在微信上给我发消息,我的网站访问不了了,第一反应就是被“墙”了。然后去看了一下即使是挂梯子都连接不了,那应该就是服务器出啥问题了。试着连接Centos Web Panel (CWP),结果也是链接不上,“拒绝了我们的连接”,然后试了一下直接访问CWP主页,浏览器一直在转圈圈,然后提示连接失败,挂梯子才连上的,当时以为CWP被墙了,还觉得很奇怪。

12.10中午再次尝试连接CWP依旧无法连接,于是只能去空间商那里重启了服务器,然后连接网站可以连上,想要连接CWP依旧是“拒绝了我们的连接”。登陆wordpress查看了一下备份的控件,备份记录,就是没有12.9的,也就是那天服务器挂了。到晚上的时候CWP主页能连,但是服务器2030端口(CWP登陆默认端口2030)还是“拒绝了我们的连接”。

12.11再次尝试CWP登陆服务器,依旧无法连接。晚上下班之后,用putty连接服务器,发现服务器防火墙消失了,于是稳妥起见选择重装系统。重装CWP过程中第二步要更新系统,yum -y update,下载四个文件,重装两次发现到第四个文件时候速度会直线掉到几KB甚至是几十B,安装过程中出现几次卡顿,骚鹏说有可能服务器硬盘有坏道,可以让客服检查一下。重装好之后恢复原来的wordpress数据,出现网站无法连接的情况。SSL证书也安不了。。。折腾一晚上没弄好。而且Apache服务器出现错误,莫名其妙文件丢失,无法启动。

12.12中午回家吃饭时候重装了一次,依旧和昨晚情况一样。晚上下班回来重装一次,依旧如此。于是rpm -e移除Apache服务器,yum重装一次,结果貌似是和CWP有兼容问题,访问域名只能去到Apache的demo页面,即使在CWP上设置好,也无法启动wordpress,新装wordpress也不行。

后来多次尝试终于解决:

流程:

1.(怀疑是否OS版本有问题)重装低版本CentOS6.9,安装CWP(CentOS7默认安装的是CWP7,CentOS默认安装的是CWP6,结果chrome浏览器在登陆CWP6的时候出现了非常严重的排版错乱的问题,换firefox之后好了)——->新装wordpress正常——–>用备份的文件覆盖,然后数据库导入,出现无法访问域名情况——–>想起来htaccess文件前三行有重定向将访问请求重定向到https上,于是将那三行用“#”注释掉,依旧无法连接,清空浏览器缓存依旧无法连接———->去CWP中将SSL证书搞定(恢复备份,证书,安装一次卸载一次在安装一次),然后解除重定向注释,网站wordpress恢复到12.11备份的状态成功。

2.验证CentOS6.9正常之后重装OS 装CentOS7.3,恢复备份,证书,安装一次卸载一次在安装一次,然后也OK。发消息给骚鹏,说搞定了。

开始写日志,总结流程,准备去看看装证书时候的选项,发现CWP又连不上了,“拒绝了我们的连接”。。。。要不要这样。。。。。崩溃啊。。。。