2022.5.23 前端

需求场景:前端显示列表,点击相应单元格替换为input框,输入内容,点击按钮保存当行数据
前端遇到的一些问题:

  1. js的字典新建 var a = new Object()

字典新键值 a.name = ‘alex’ ; a[‘age’]=10
删除键值 delete a.name

  1. js打开一个弹窗的语法,后面补充完整 (web基础篇里面有记载)
  2. 当表格内容多寡不一的时候,应该怎么保持排版整齐,研究中,其他问题先不管了

今天先把日期字段编辑和收集数据功能做完,然后把跟单数据导入到数据库,基本就算做完了。 后面再优化 ,表格内容溢出还没有好的解决方案。

2022.5.24 开发日志

一边用,一边开发,只有在用的过程中迭代才有实际意义

  1. 跟单记录保存按钮的权限控制 (单独做控制)
  2. 订单拆分 (今天完成这个功能 2022.5.24日 )

  3. 生成新的订单号,原订单设为无效,生成2个或者多个-1,-2订单号,数量货物拆分,金额拆分 批号递增,可以手动来做,状态与原来相同
    2. 重新绑定收款关联,把原来的绑定关系删除,重新绑定到两个新的订单 (bingo)

  4. 输入框,textarea可以换行,但是input对于字数多的,不能换行不友好

  5. 款没收齐的,已发货款没齐的,标为红色, 做一个弹窗窗口
  6. 用两天左右的时间,把近一年的订单导入到系统中

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-1

json的序列化和反序列化 服务器端:data = json.dumps(list_data) HttpResponds(data) 客户端js代码 js_data_list = JSON.parse(data)

Js的if 语法, if esle if(不是elif), else

  1. - 功能开发
  1. 拆分订单: 复制原订单,把新订单号的批号加1,复制除订舱,装箱信息以外的信息 新增一个页面,给一个加号按钮,分多批可以点击多次,饭
    <a name="z2eGk"></a>
    ### 2022.5.28 确认订单的bug修复和简化
    
    问题: 下单日期不能自动加载,这是什么原因了。 form实例化以后,用form.instance.confirm_date = ’‘ 不显示 原因:instance赋值以后,initial不起作用了,这两个有冲突,为什么,怎么办

    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 日 响应式布局和安全漏洞

响应式的导航栏

  1. 直接抄了响应式navbar的代码,其中注意一点。 navbar-header里面要放上三个span,这样才会显示三条杠。这段代码的位置是在layout_fullpage.html里面,想不起来进去看看即可
  2. 上述设置完了以后,还是不行的,仍然需要设置viewport才能让手机识别

    <meta name=”viewport” content=”width=device-width, initial-scale=1”>
    viewport相当于相框中的画,可能比相框小,可能比相框大,如果刚好一样就皆大欢喜 。是苹果最先开发出来的一个标签语言,改善小屏幕的显示效果。
    谷歌浏览器的检查-元素左边有切换移动端,看移动端效果

  3. 但是同时发现表格宽度大于显示屏幕宽度,导致显示问题,要彻底解决这个,只能用div替代表格,然后让他们可以层叠以一定的格式显示才可以。

  4. 后面还需要继续学习,如果在宽度不同的情况下,给元素设置不同的字体和大小,以及显示边框什么的

内容在小屏幕上的不显示:
如果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开始起算

目前紧要的是收款匹配功能,实际过程中遇到的问题:

  1. 存在手工表格和系统表格之间的同步问题,如何避免重复导入,如何避免错配,所以给收款表和分配表各加了一个字段。收款表加了reference字段,记录每笔款的编码,手工表和线上表保持一致性。 分配表,记录分配编号,也是保持表格的一致性。
  2. 这个方法无疑会增加手工工作量,后面如何过渡到全线上,还需要探索方法。 全线上的话,记账应该怎么记?
  3. 线上直接录入的收款单的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是对新弹出窗口的位置进行定位,他定位的依据是显示屏幕,而不是母窗口

  1. 以下加号的写法相当于${},字符串格式化代入

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 更新

  1. 2022.7.7日 修正格林尼治时间和北京时区的差别 搞定
  2. 关于nginx限制上传文件大小的错误提示: 搞定

    413 Request Entity Too Large 搞定

    解决方案:nginx的配件文件中, 在http{}中加入client_max_body_size 10m, xx根据需求改动
    # 解决nginx限制上传文件大小
    client_max_body_size 10m;
    
  3. 图片压缩的算法在服务器端没有起作用,不知道为什么,今天晚上查一下. 手动检查了一下,发现压缩算法还是起作用了,可能没那么及时。搞定 现在看没有什么问题,带回再试试。

  4. 收款列表的排序应该有限待关联金额大于零的,然后是时间
  5. 收款详情里面的电汇水单应该显示小图,点击modal显示大图。有待优化。审核的时候不显示详情,直接显示关联界面,比较好。
  6. 新增收款的水单应为必填项,报错提示 搞定
  7. 申请放单的,应该把等待审批的排在前面。 重复的订单号审核不过去。