- 2022.5.23 前端
- 2022.5.24 开发日志
- 2022.5.25 开发日志
- 2022.5.26 开发日志
- 2022.5.27 拆分订单
- instance是python的对象,并不会直接影响前端显示,所以应该用initial方法,而form是表单对象
- 金额关联的部分报这个错误
- 使用微信接口给微信好友发送消息, import itchat
- 自动登录方法,hotReload=True可以缓存,不用每次都登录,但是第一次执行时会出现一个二维码,需要手机微信扫码登录 itchat.auto_login(hotReload=False)
- 搜索好友,search_friends(“xxx”),其中”xxx”为好友昵称,备注或微信号不行 userfinfo = itchat.search_friends(“顾正”)
- “智能群管家014”为好友昵称 print(“userfinfo:”,userfinfo) # print(userfinfo),获取userinfo中的UserName参数 userid = userfinfo[0][“UserName”]
- 获取用户id
- 调用微信接口发送消息 itchat.send(“陈军是不是傻?”, userid)
- 通过用户id发送信息 # 或 itchat.send_msg(msg=’好像是的’, toUserName=userid)
- 发送纯文本信息
2022.5.23 前端
需求场景:前端显示列表,点击相应单元格替换为input框,输入内容,点击按钮保存当行数据
前端遇到的一些问题:
- js的字典新建 var a = new Object()
字典新键值 a.name = ‘alex’ ; a[‘age’]=10
删除键值 delete a.name
- js打开一个弹窗的语法,后面补充完整 (web基础篇里面有记载)
- 当表格内容多寡不一的时候,应该怎么保持排版整齐,研究中,其他问题先不管了
今天先把日期字段编辑和收集数据功能做完,然后把跟单数据导入到数据库,基本就算做完了。 后面再优化 ,表格内容溢出还没有好的解决方案。
2022.5.24 开发日志
一边用,一边开发,只有在用的过程中迭代才有实际意义
- 跟单记录保存按钮的权限控制 (单独做控制)
订单拆分 (今天完成这个功能 2022.5.24日 )
生成新的订单号,原订单设为无效,生成2个或者多个-1,-2订单号,数量货物拆分,金额拆分 批号递增,可以手动来做,状态与原来相同
2. 重新绑定收款关联,把原来的绑定关系删除,重新绑定到两个新的订单 (bingo)输入框,textarea可以换行,但是input对于字数多的,不能换行不友好
- 款没收齐的,已发货款没齐的,标为红色, 做一个弹窗窗口
- 用两天左右的时间,把近一年的订单导入到系统中
2022.5.25 开发日志
编辑框旁边显示小对钩和叉叉,并实现指向保存功能的按钮, 应该用
trigger的方法 $(`.save- sequence[pk=”${pk}“]`).trigger(‘click’); 让两个按钮之间产生关联,前提条件是用户有这个保存的权限,否则无法编辑,
完成显示日期,点击替换为input控件 完成存储日期,date只能以2022-05-01的格式存储
先把ETD ETA的编辑,等的编辑功能做出来
编辑框旁边显示小对钩和叉叉,并实现指向保存功能的按钮, 应该用trigger
拆分订单的功能晚上做。 先把逻辑弄清楚是第一要义,否则容易乱,这个牵涉到款项的重新关联和分配,
稍微复杂点
模糊搜索的不区分大小写
icontains 不区分大小写 尽量用这个,解决模糊搜索的问题
Blog.objects.get(name__contains=”blog”)
实验控制表格的显示宽度和内容,采用table layout: fixed, overflow 等等,不是太好用,再看看是什么问题,搞个实验网页先。
2022.5.26 开发日志
收款表需要整理一下,先从目前手里的订单,能不能批量处理一下, 开始。 从收款单开始整理
收款分配有问题,下一步过不去,检查一下。
给stark的自动筛选的选项Option设置一个默认default选项,读源码的时候有一点不太清楚,就是request.GET, 又温习了一遍
request.GET 就是query_dict, 解析了url中的参数条件,形成一个字典
排产表的保存按钮消失了为什么? 后来查是权限表没有更新,用户没有相应授权,再次自动发现一下就好了。
Add_InwardPay自动添加的时间 datetime.now() 差一天为什么 ,应该5月26,但是显示25日,正在查找问题
把状态的颜色,调整为跟单表的里面的颜色
后面要加入统计功能,应收账款的加总分析等
跟单状态要加一个异常的选项
2022.5.27 拆分订单
- 几个技术小问题
```
queryset可以继续.filter()
forloop.couter 是一个计数器,从1开始算,记录循环的次数 forloop.couter == 2
forloop.counter0 从0开始算
表格单元格不换行加nowrap
J4234-1json的序列化和反序列化 服务器端:data = json.dumps(list_data) HttpResponds(data) 客户端js代码 js_data_list = JSON.parse(data)
Js的if 语法, if esle if(不是elif), else
- 功能开发
- 拆分订单:
复制原订单,把新订单号的批号加1,复制除订舱,装箱信息以外的信息
新增一个页面,给一个加号按钮,分多批可以点击多次,饭
问题: 下单日期不能自动加载,这是什么原因了。 form实例化以后,用form.instance.confirm_date = ’‘ 不显示 原因:instance赋值以后,initial不起作用了,这两个有冲突,为什么,怎么办<a name="z2eGk"></a> ### 2022.5.28 确认订单的bug修复和简化
instance是python的对象,并不会直接影响前端显示,所以应该用initial方法,而form是表单对象
下面的解决方案可行: form = ConfirmApplyOrderModelForm(instance=order_obj,initial={‘confirm_date’:’2022-05-08’}) 但是下面的不行: form = ConfirmApplyOrderModelForm(instance=order_obj) form.fields[‘confirm_date’].initial = ‘2022-02-08’
下单部分进行了修改。 款项对应关系要进行修改,下午来搞定。
判断字符串包含关系,直接用in
金额关联的部分报这个错误
error invalid literal for int() with base 10: ‘26600.00’ amount字段从post里面获取的是字符串,带小数的只能用float不能用int()
要更新的文件: forms.py applyorder.py, inwardpay.py confirm_payment.html inwardpay.py inwardpay_add.html
<a name="kycwE"></a>
### 2022-5-29 收款关联bug修复
<a name="X3gV4"></a>
### 2022-5- 30 添加:下拉搜索功能
5.30 更新<br />在StarkForm中添加了自动对外键字段的统一功能添加:下拉搜索功能 <br />修正了新建收款中torelate_amount的自动更新
<a name="CGmQn"></a>
### 2022-5- 30 金额字段 手动新建订单
followorder添加了对发票字段的更新 <br />id='%s-id-%s' onclick='showInputBox(this)'<br />(\d+\.\d{2}) 正则表达式提取金额 放弃。 <br />更新二、 手动新建订单 <br />更新followorder.py <br />diapy/static/css js <br />更新 display followorder weeklyplan 更多的公共功能提到集中的文件 <br />发票金额不能为None,否则报错,至少应默认为0
<a name="F2iVq"></a>
### 6.1 更新
收款关联表应该把新订单放在前面,已经关联的订单放在后面,既可以关联,也可以查关联,一物二用 <br />导入已有老订单。<br />表格显示的问题,隐藏太长的内容的办法 (还有有问题,在没有更好的办法之前先维持目前的用法),一个可行的方案是使用div布局,模拟表格效果,但是css控制的难度比较大,还需要深入的研究才行。一时半会搞不定。
<a name="u0DDx"></a>
### 6.2 更新
拆分订单,原来订单信息被修改, 新订单复制了不应该要的信息。<br /> 状态也不对。 今天修正这个错误<br />今天把收款信息导入进去系统,彻底解决收款信息不准的问题
<a name="GUt3Y"></a>
### 6.3 更新
发送微信消息的: itchat工具
使用微信接口给微信好友发送消息, import itchat
自动登录方法,hotReload=True可以缓存,不用每次都登录,但是第一次执行时会出现一个二维码,需要手机微信扫码登录 itchat.auto_login(hotReload=False)
搜索好友,search_friends(“xxx”),其中”xxx”为好友昵称,备注或微信号不行 userfinfo = itchat.search_friends(“顾正”)
“智能群管家014”为好友昵称 print(“userfinfo:”,userfinfo) # print(userfinfo),获取userinfo中的UserName参数 userid = userfinfo[0][“UserName”]
获取用户id
调用微信接口发送消息 itchat.send(“陈军是不是傻?”, userid)
通过用户id发送信息 # 或 itchat.send_msg(msg=’好像是的’, toUserName=userid)
发送纯文本信息
<a name="puhDt"></a>
### 6.5日
一对一反向查询<br />order_obj.followorder, 如果不存在,会直接报错,而不是返回none <br />openpyxl能读的日期格式只能是YYYY-MM-DD的格式, 像是YYYY.MM.DD的不识别 <br />要承担现实世界的不完美,不试图搞定所有的潜在错误,而是包容他。在此基础上,加强程序的鲁棒性。完成大于完美,不求一步到位。 <br />把大任务分解成每日可完成的小任务,一点点往前走,成就感要好
<a name="hcETY"></a>
### 6.6 日
开发上传excel表 更新跟单数据
```python
跟单表的列号和对应字段名
0, order_number
1, salesperson
3, status
4, customer
6, goods
7, term
8, ports
9, confirmed_date
10, ETD
11,ETA
12, load_info
13, book_info
14, payterm
15, amount
16, deposit
17, balance_USD
18, balance_RMB
19, payment1
20, payment2
6.7 日
开发自动生成客户的followup sheet
上传收款记录
基本思路是这样:
1. 逐行读取,解析出订单号,付款人,银行,金额等信息
2. 在数据库中查询订单号,存在则增加收款记录,不存在则把行号和订单号存到errors列表
3. 对于收款存在要分配的情况,需要格外注意了。要根据实际情况来分解,这个部分要根据实际情况
4,然后添加收款记录和分配记录,如果这个过程失败,记录行号,订单号和错误提示,反馈给前台
反馈没有成功导入的数据的行号,这样方便再次处理
导入付款数据
create_date = create_date xxx
payer = None
keyin_user = 3
bank = xx
customer None
currency = xxx
amount = xxx
got_amount = xxxx
torelate_amount = 0
status = 1
confirm_status = 7
orders = None
remark = 信息都放在remark里面 xxx
解决方案:读取excel表达式的值
在openpyxl中,直接加载已存在Excel的方法load_excel(filePath)
该方法有一个data_only属性,当取值为True时,即可读取单元格的值。
即:
openpyxl.load_workbook(filePath, data_only=True)
导入一条数据,然后对应一条分配记录
# 先创建一条到款记录
然后创建一条分配记录
然后导入订单记录
如果没有单号创建一个订单号, customer 随便给个之,货物随便填一下。 confirm_date 空着
6.11 日更新 排产单加标签导航
排产表加上标签页
解决默认选择某个标签的问题
从数据源上面下功夫,比较直接一点
加上快速发邮件的功能
wongbrank@BrankdeMacBook-Air newpaycrm % git rebase -i HEAD~2
[分离头指针 801d180] 申请单号快速发邮件& 0611版本
Date: Sat Jun 11 17:12:07 2022 +0800
10 files changed, 104 insertions(+), 27 deletions(-)
rewrite dipay/views/pycache/weeklyplan.cpython-39.pyc (75%)
成功变基并更新 refs/heads/dev
快递发邮件的a标签写法
# 反馈给用户的信息,加上快速发邮件的功能,节约大家的时间
send_time = datetime.now().strftime("%Y-%m-%d")
subject = '申请合同号 %s %s %s' % (form.instance.customer.shortname, form.instance.goods, send_time)
content = '经理: %0A%0C%0A%0C请审核。' + form.instance.remark
mailto = f'<a href=
"mailto:brank@xxx.cn
?subject={subject}
&body={content}">
点击快速发申请邮件</a>'
备注:
%0A%0C可以在邮件里面换行,不知道在别的地方好不好使
写程序之前一定要先设计好思路,不能一头扎在代码里面出不来,迷失在细节里面无法自拔是不能提高的。
今天想给每个筛选加上一个第一次打开的默认筛选值,这样减少重复劳动,但想法有点简单,修修补补的方法错误比较多。暂时放弃,后面有精力在搞。 今天顺利搞定一个标签筛选的功能和默认选项,感觉还不错。
6.12 更新内容
解决boostrap-select中动态添加选项,实时更新的问题
症状是:js直接添加进去不能搜索,没有自动选中
自动获取汇率的方法,使用xmxl工具来解析页面获得数据
介绍原文地址:
https://djangopy.org/how-to/reverse-engineering-of-the-django-admin-foreign-keys-addedit-button/
#####################################
- 第一部分,显示popup窗口
前端的添加按钮,绑定点击事件,
<a href="/author/create" id="add_author" onclick="return showAddPopup(this);"> 添加 </a>
点击添加按钮后触发这段js代码
function showAddPopup(triggeringLink) {
# 获得html代码中id值 add_author, 并去掉add_, 这是name= author,这样做让代码具有通用性
var name = triggeringLink.id.replace(/^add_/, '');
# 获得html中的url地址
href = triggeringLink.href;
# 打开一个窗口,并向url发起的get请求,窗口名称name,宽高500x500,语法如下:
var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes');
# 新窗口获得聚焦
win.focus();
return false;
}
注意:
假设链接中同时存在 href 与 onclick,如果想让 href 属性下的动作不执行,onclick 必须得到一个 false 的返回值。不信,你可以将 goGoogle 函数中的 return false 注释掉;
这个可以解释为什么上面的showAddPopup return false,而且onclick里面有return
this: 触发的a标签
#####################################
第二部分 post提交新建的数据
# 服务器端的view.py 作者弹窗的返回数据,
def AuthorCreatePopup(request):
form = AuthorForm(request.POST or None)
# 如果有数据,说明是post请求,如果没有数据说明是get请求
if form.is_valid():
# 如果数据校验合格,存在数据库,返回instance
instance = form.save()
## Change the value of the "#id_author". This is the element id in the form
# 把下面这段js代码返回给前端,关键是author_id,这个值必须来自于数据库
# 我们看前端怎么处理这段代码
# 下面’%s‘要加引号,因为这段要显示在前端的时候,不加引号视为变量
return HttpResponse('<script>opener.closePopup(window, "%s", "%s", "#id_author");</script>' % (instance.pk, instance))
return render(request, "author_form.html", {"form" : form})
# 前端对这段代码的处理
# 记住前面已经弹窗了一个/author/create/的窗口,且把空数据的form渲染进去
# 填完数据以后,收到服务器返回的代码
<script>opener.closePopup(window, "%s", "%s", "#id_author");</script>' % (instance.pk, instance)
详解上面的js代码:
1. opener相当于 window.opener
这个window是本窗口,window.opener是其父窗口,调用父窗口中的closePopup函数来关闭本窗口,函数如下:
父窗口中函数:
function closePopup(win, newID, newRepr, id) {
$(id).children().attr('selected',false);
$(id).prepend('<option value=' + newID + ' selected >' + newRepr + '</option>')
win.close();
// 必须要刷新picker,否则不显示也搜不到
$(id).selectpicker('refresh');
$(id).selectpicker('render');
}
知识点:
必须要有这两句,才可以把新增的选项动态添加到options当中
$(id).selectpicker('refresh');
$(id).selectpicker('render');
6.14 日 添加清除搜索内容
html: ********************
<form action="" method="get" class="form-group pull-left">
<input name="q" type="text" value="{{ user_query }}" placeholder="{{ search_placeholder }}">
<button type="submit"><i class="fa fa-search"></i></button>
<button id="id-clear-search" onclick="return clearSearch()"><i class="fa fa-rotate-left"></i></button>
</form>
script: ********************
function clearSearch() {
$("input[name='q']").val('');
return false;
}
注意:
顺道搞定一个知识点:
上述方法可以去除button的默认事件
function func() {
return false;}
return false 就可以阻止默认事件的发生
实现清楚搜索的思路非常简单: js把input的内容清空然后提交给form。
6.15 计划更新内容
1. 把业务员留言加进去
2. 收款导入记录和对应关系
3. 控制单元格的编辑权限
怎么控制单元格编辑权限:
思路一:首先要认证身份,在render时不同身份,不能修改的字段onclick属性去掉。
从而达到控制点击的效果,
思路二:在前端判断用户身份,控制点击行为,这个比较难哦。
思路一的实现应该更靠谱一点。
所以编程的时候重要的是思路,想明白才能做明白,不能盲目进入编码。
记录问题,统一处理,一堆问题应该有一个主要原因,而不能是不同的原因,要把系统作为一个整体看待
编码的时候要考虑将来,适度超前,考虑通用性和可扩展性。
更新这两个文件:
做一下响应式布局,bootstrap的,好好研究一下在不同设备上显示的问题
提示最近更新过的记录,这样都能注意到,可以放在首页上显示
django的加载过程,回头好好总结一下一个项目的运作机理,和思考模式
明天修复排产单业务员的修改状态的权限 (状态权限,不能修改)
在status_display里面读取编辑权限列表即可,如果有就加上onclick=’showPopup()’
跟单表的权限没有控制(没有控制批量处理的菜单,没有控制保存按钮,不知道为什么。 明天修复。
解决方案:保存是特殊按钮要自定义权限控制
编辑按钮没有按要求显示是因为赋予了权限
排产的搜索,排除掉完成的。
解决方案 自定义get_queryset_data方法,加了is_search,可以单独为搜索单独指定数据集,组合筛选的数据是在search之后,需要清空搜索,点击清空
6. 16日更新
6.16日 修复boostrap-select动态添加到选项里面,js代码的没有同步更新的问题,对于同样的功能,务必要集中到同一个文件上,这样可以一改都改,避免重复劳动。
今天晚上更新到系统
自动筛选问题
发现followorder没有字段salesperson,而其一对一关联表里面有,不能用到自动筛选里面,改了model表,不能makemigrations,只有全部手动操作。
手动添加一个字段salesman_id bigint(20) , 然后给他手动添加外键
手动添加一个字段:
alter table dipay_followorder
add salesman_id
bigint(20) DEFAULT NULL;
手动添加外键:
alter table dipay_followorder
add CONSTRAINT dipay_followorder_salesman_id_d5070fde_fk_dipay_userinfo_id
FOREIGN KEY (salesman_id
) REFERENCES dipay_userinfo
(id
);
所以保持环境的一致性多么重要,避免很多手动的工作,以及迁移的麻烦。表的结构尽量不要改动。
这两条都运行成功了。
6.17 日 响应式布局和安全漏洞
响应式的导航栏
- 直接抄了响应式navbar的代码,其中注意一点。 navbar-header里面要放上三个span,这样才会显示三条杠。这段代码的位置是在layout_fullpage.html里面,想不起来进去看看即可
上述设置完了以后,还是不行的,仍然需要设置viewport才能让手机识别
<meta name=”viewport” content=”width=device-width, initial-scale=1”>
viewport相当于相框中的画,可能比相框小,可能比相框大,如果刚好一样就皆大欢喜 。是苹果最先开发出来的一个标签语言,改善小屏幕的显示效果。
谷歌浏览器的检查-元素左边有切换移动端,看移动端效果但是同时发现表格宽度大于显示屏幕宽度,导致显示问题,要彻底解决这个,只能用div替代表格,然后让他们可以层叠以一定的格式显示才可以。
- 后面还需要继续学习,如果在宽度不同的情况下,给元素设置不同的字体和大小,以及显示边框什么的
内容在小屏幕上的不显示:
如果div或者其他元素有类.hidden-xs则手机上不显示。其他功能在探索中。
不是什么logo之类的事情。待会儿仔细看一下代码。找出原因所在: vavbar-header里面的三个span是必须的。
需要修复两个安全漏洞,重新下载最新版本的bootstrap-select
漏洞标题:nodejs 资源管理错误漏洞
影响描述:nodejs是是一个基于ChromeV8引擎的JavaScript运行环境通过对Chromev8引擎进行了封装以及使用事件驱动和非阻塞IO的应用让Javascript开发高性能的后台应用成为了可能。nodejs-glob-parent 存在安全漏洞,该漏洞源于正则表达式拒绝服务。
CVE编号:CVE-2020-28469
国家漏洞库信息:
影响范围::(∞, 5.1.2)
最小修复版本:5.1.2
组件引入路径:bootstrap-select@1.13.13->grunt-eslint@22.0.0->eslint@6.8.0->glob-parent@5.1.1
漏洞详情:https://www.oscs1024.com/hd/MPS-2021-7827
缺陷组件:trim-newlines@1.0.0 - 间接引入
漏洞标题:trim-newlines 安全漏洞
影响描述:trim-newlines是一个修改换行符的npm包。trim-newlines 存在安全漏洞,该漏洞源于应用于Node.js在3.0.1与4.0.1版本及之前版本中.end()方法存在相关问题。
CVE编号:CVE-2021-33623
国家漏洞库信息:https://www.cnvd.org.cn/flaw/show/CNVD-2021-40508
影响范围::(∞, 3.0.1), [4.0.0, 4.0.1)
最小修复版本:3.0.1, 4.0.1
组件引入路径:bootstrap-select@1.13.13->grunt-version@2.0.0->grunt@1.1.0->dateformat@1.0.12->meow@3.7.0->trim-newlines@1.0.0
漏洞详情:https://www.oscs1024.com/hd/MPS-2021-7398
修正根据跟单记录已经存在的错误
下单的时候,如果发现kelly已经通过上传创建了跟单记录,就不再新建。 修正一下错误。
6.18 日更新
把收款文件的导入做完,读入文件,存入收款记录,做上关联记录,没什么难的,为什么会出各种问题呢?
还是考虑不周,需要把业务场景再好好捋一下。
6.19 更新
做一个分支,把表格形式替换为div形式,方便做响应式布局 (稍后再做)
openpyxl 对隐藏的行和列不算在内,编号从可见行开始算,如果没有隐藏,实际上从0开始起算
目前紧要的是收款匹配功能,实际过程中遇到的问题:
- 存在手工表格和系统表格之间的同步问题,如何避免重复导入,如何避免错配,所以给收款表和分配表各加了一个字段。收款表加了reference字段,记录每笔款的编码,手工表和线上表保持一致性。 分配表,记录分配编号,也是保持表格的一致性。
- 这个方法无疑会增加手工工作量,后面如何过渡到全线上,还需要探索方法。 全线上的话,记账应该怎么记?
- 线上直接录入的收款单的reference和dist_ref必须要自动递增,起始位置从10万起,避免与手工表格号重复
需要表current_number来记录最新的reference字段和dist_ref字段。
reference是收款记录的编号
dist_ref 是分配记录
感受: 从线下到线上的过程中除了想象的便利性,还有很多的不方便,所以这个迁移中需要一些创造性,而不简单的是照搬。 线上有一些新的特性,必须发挥线上新特性,才能弥补这种不足。 线上的新特性就是避免信息的重复录入,所有人可以共建,而不是只有一人在那里做,长期来看,查询的方便性大大增强。同时可以把王姐的作用发挥起来。 需要增量。全面发挥网络的共创性,实时性。
6.23 日 更新
makemigrations时因为导入文件的连续性破坏,只能手动导入,使用navicat来帮助实现手动导入
forms.Form在加添加select字段的choices时候好像有上限,这个问题自动发现url的更新三级权限的pid部分出现问题,后面在无人的时候跟进一下,为什么
django的modelformset在初始化时,select控件只能显示20条数据,其他的truncated, 多的选项显示不出来,overflow 这是django自,可以把choices列表化来解除这个限制 关于20条的问题解决
There is a limitation to display 20 the items. So, How can I get rid of this limitations and (remaining elements truncated) ? Is there a better way to get a field’s all values in a query without truncated ?
使用list方法可以解决这个限制
second_menu_choices = list( models.Permission.objects.filter(menu__isnull=False).values_list(“id”, “title”) )
收款文件导入的功能完成,还有一些预防性的工作需要做,比如手动导入的自动赋予编号,这个阶段除三个本人账户下的收款使用导入方法,其他的不再直接管理下的账户使用手动输入。避免出现不一致性。到完全线上化以后,就可以告别这种两线作战的方式了,或者使用导出功能来解决这个事情。
再下个阶段就是把水单文件贴到记录里面去的办法。 保证文件内容的可持续性保存
6月27日更新
a 手动添加时的收款编码和分配编码。 应该有直接编辑款项分配记录的入口。 把已有记录的收款编码和分配编码都手动改过来。然后后台系统加上自动添加的设置。
今天一定要把收款信息导入进去,不能再等了。
b 首页收款列表只列还没有关联的,已经关联完成的在另外一个表里面显示
c. 手动直接在系统中新增收款和分配收款时,需要自动填上收款编号和分配编号
d. 后台的货币名称加元改成了加拿大元修改,导致无法准确识别货币名称,怎么保持通用性是一个问题
mariaDB在某些语法上与mysql还是有一点区别,有时候会导致一些问题。还是应该保持开发和工作环境完全一致,避免这些纯手动的问题。
alter table dipay_inwardpay
change payer_id
payer_id
bigint(20) NULL;
6月28日更新
js打开新窗口的函数 open()
window.open(‘../seeImg/imgs.html‘,‘newWin‘,‘width=500,height=300,top=‘+t+‘,left=‘+l+‘,toolbar=no,menubar=no,location=no,status=yes‘);
注:1. left, top是对新弹出窗口的位置进行定位,他定位的依据是显示屏幕,而不是母窗口
- 以下加号的写法相当于${},字符串格式化代入
var win = window.open(href, name, ‘left=’+left+’,top=300,width=600,height=300’);
提升了starksite的search模糊搜索的功能,可以兼容对日期,字符,数字的混合模糊搜索,方便了用户
6.29 日更新
为了避免图片文件太大,影响加载,需要对图片进行压缩
from PIL import Image
import os
def get_size(file):
# 获取文件大小:KB
size = os.path.getsize(file)
return size / 1024
# 拼接文件地址
def get_outfile(infile, outfile):
if outfile:
return outfile
dir, suffix = os.path.splitext(infile)
outfile = '{}-out{}'.format(dir, suffix)
return outfile
def compress_image(infile, outfile='', mb=150, step=10, quality=80):
"""不改变图片尺寸压缩到指定大小
:param infile: 压缩源文件
:param outfile: 压缩文件保存地址
:param mb: 压缩目标,KB
:param step: 每次调整的压缩比率
:param quality: 初始压缩比率
:return: 压缩文件地址,压缩文件大小
"""
o_size = get_size(infile)
if o_size <= mb:
return infile
outfile = get_outfile(infile, outfile)
while o_size > mb:
im = Image.open(infile)
im.save(outfile, quality=quality)
if quality - step < 0:
break
quality -= step
o_size = get_size(outfile)
return outfile, get_size(outfile)
7.2 增加申请放单和审批放单功能
7.3日 更新
问题:父权限信息为什么不能及时进来,是什么原因,因为没有重新撞库吗?还是别的原因呢?
原因:
modelform的类定义里面写了查询父权限信息并赋予到变量pid_choices, 但是只会执行一次。而在类实例化时不会再执行。这个问题导致在权限发现和更新的时候, 新的二级菜单不能马上更新。
解决办法:
所以把查询父权限信息并赋予到变量pid_choices这个语句应该放在初始化中,就解决了。
7.4日 更新
查找水单无法上传的bug,原来那么多水单根本就没有传上去,傻子情况。
问题1, 前端的form标签里面没有定义enctype=’multipart/form-data’.
问题2, 上传文件太大的时候,怎么样进行压缩,采用PIL的im.save方法里面的quality参数,以及尺寸参数(x,y)
django的ImageField的方法
obj.ttcopy.name = ‘ttcopy/WechatIMG3608_Sjur5yK.png’
obj.ttcopy.path = 磁盘存储绝对路径
obj.ttcopy.url = url路径
7.5 更新 自动发邮件排除符号&
转发邮件的字符里面如果有& 要替换为and或者-,否则会有问题。
点击水单图标,自动弹出水单图片,应该怎么做?
7.6 更新 一个页面两个模态框
需求:有一个模态框用于弹出图片, 有一个模态框用于弹出收款明细(直接接受render的一个页面然后展示出来) ,
问题:但是问题是这两个模态框有点冲突,css部分有点串
解决方案: 把图片弹出的模态框的class名称都改掉,css部分做了区分,就没事了。
学到的知识点:
/* ***********弹窗图片的样式 *************/
/* 弹窗背景 */
.newmodal {
display: none; /* Hidden by default */
position: fixed; /* Stay in place */
z-index: 1; /* Sit on top */
padding-top: 100px; /* Location of the box */
left: 0;
top: 0;
width: 100%; /* Full width */
height: 100%; /* Full height */
overflow: auto; /* Enable scroll if needed */
background-color: rgb(0, 0, 0); /* Fallback color */
background-color: rgba(0, 0, 0, 0.6); /* Black w/ opacity */
}
/* 图片 */
.newmodal-content {
margin: auto;
display: block;
width: 100%;
max-width: 900px;
}
/* 添加动画 */
.newmodal-content, #caption {
-webkit-animation-name: zoom;
-webkit-animation-duration: 0.6s;
animation-name: zoom;
animation-duration: 0.6s;
}
/* 这部分是用于让模态框浮现在页面上面,且背景显示影院模式 具体实现原理不知道 */
@-webkit-keyframes zoom {
from {-webkit-transform: scale(0)}
to { -webkit-transform: scale(1) }
}
@keyframes zoom {
from {transform: scale(0)}
to { transform: scale(1) }
}
/* 关闭按钮 开始遇到按钮不显眼的问题,找了好久是opacity设置有问题 */
.close {
position: absolute;
top: 15px;
right: 35px;
color: #f1f1f1;
font-size: 40px;
font-weight: bold;
transition: 0.3s;
opacity: 2.2;
}
.close:hover, .close:focus {
color: #bbb;
text-decoration: none;
cursor: pointer;
}
/* 图片小图标上面的鼠标小手设置 */
img.ttcopy-small-img:hover {
cursor: pointer;
至于html部分 ,比较普通,就是定义了一个div,class设置为modal类,modal的css和js绑定的功能是自动隐藏,触发之后浮现在页面上方。
7.7 更新
- 2022.7.7日 修正格林尼治时间和北京时区的差别 搞定
关于nginx限制上传文件大小的错误提示: 搞定
413 Request Entity Too Large 搞定
解决方案:nginx的配件文件中, 在http{}中加入client_max_body_size 10m, xx根据需求改动 # 解决nginx限制上传文件大小 client_max_body_size 10m;
图片压缩的算法在服务器端没有起作用,不知道为什么,今天晚上查一下. 手动检查了一下,发现压缩算法还是起作用了,可能没那么及时。搞定 现在看没有什么问题,带回再试试。
- 收款列表的排序应该有限待关联金额大于零的,然后是时间
- 收款详情里面的电汇水单应该显示小图,点击modal显示大图。有待优化。审核的时候不显示详情,直接显示关联界面,比较好。
- 新增收款的水单应为必填项,报错提示 搞定
- 申请放单的,应该把等待审批的排在前面。 重复的订单号审核不过去。