后端-排坑
目录
1|0后端排坑
1|1一、SQL Server数据库
1|01. 时间字段的处理
1. CONVERT(VarChar(10), CREATE_TIME, 120)
# 对于时间类型是datetime的字段的值,将其处理为年-月-日格式
2. CONVERT(VarChar(7), CREATE_TIME, 120)
# 对于时间类型是datetime的字段的值,将其处理为年-月格式
3. 数据库的时间字段可以直接用相同格式的字符串类型的时间进行比较(大于,小于,等于,赋值...)
1|02. 分组查询出每组数据的第N行的所有数据
(SELECT USER_ID,SUM_DURATION FROM
( SELECT row_number() over(partition by user_id ORDER BY CREATE_TIME desc ) tn,* FROM SEODB.DBO.VIP_BUY_ORDER WHERE STATE=1 ) TB
WHERE TB.tn=1 )
# 表示以user_id 分组,以时间降序排序,查询出每个用户排序后的第一行数据
# tn, 后面的 * 为查询所有字段,可以随意更改,但需要注意的是最外层查询的字段在内层查询的字段中必须含有
# 注意筛选条件应该在 表名后面加,在TB.tn=1后面加条件是无用的
1|03. 数据库查询即时分页
# 原理: 从第多少行开始(不含开始的这一行), 再查询多少行,total_count为总数居条数
condition = ' 1=1 '
page = current_page - 1
page_size = 20
F""" SELECT WORD,NUM_BUYER,NUM_SELLER,CONVERT(VarChar(10), UPDATE_TIME, 120) AS DATE,total_count = COUNT(*) OVER() FROM solr.dbo.USER_VIP_SEAR WHERE {condition} order by UPDATE_TIME DESC, ID DESC offset {page} * {page_size} ROWS FETCH NEXT {page_size} ROWS ONLY"""
1|2二、简单的分页器
这种分页器只适用于数据量较小的数据的分页(原理是将数据全部查询出来后进行切片)
class PaginationPost(object):
def __init__(self, current_page, all_count, per_page_num=10, pager_count=5, url=''):
"""
封装分页相关数据
:param current_page: 当前页
:param all_count: 数据库中的数据总条数
:param per_page_num: 每页显示的数据条数
:param pager_count: 最多显示的页码个数
用法:
queryset = model.objects.all()
page_obj = Pagination(current_page,all_count)
page_data = queryset[page_obj.start:page_obj.end]
获取数据用page_data而不再使用原始的queryset
获取前端分页样式用page_obj.page_html
"""
try:
current_page = int(current_page)
except Exception as e:
current_page = 1
if current_page < 1:
current_page = 1
self.url = url
self.current_page = current_page
self.all_count = all_count
self.per_page_num = per_page_num
# 总页码
all_pager, tmp = divmod(all_count, per_page_num)
if tmp:
all_pager += 1
self.all_pager = all_pager
self.pager_count = pager_count
self.pager_count_half = int((pager_count - 1) / 2)
@property
def start(self):
return (self.current_page - 1) * self.per_page_num
@property
def end(self):
return self.current_page * self.per_page_num
def page_html(self):
# 如果总页码 < 11个:
if self.all_pager <= self.pager_count:
pager_start = 1
pager_end = self.all_pager + 1
# 总页码 > 11
else:
# 当前页如果<=页面上最多显示11/2个页码
if self.current_page <= self.pager_count_half:
pager_start = 1
pager_end = self.pager_count + 1
# 当前页大于5
else:
# 页码翻到最后
if (self.current_page + self.pager_count_half) > self.all_pager:
pager_end = self.all_pager + 1
pager_start = self.all_pager - self.pager_count + 1
else:
pager_start = self.current_page - self.pager_count_half
pager_end = self.current_page + self.pager_count_half + 1
page_html_list = []
# 添加前面的nav和ul标签
page_html_list.append('''
<nav aria-label='Page navigation>'
<ul class='pagination'>
''')
first_page = '<li><a onclick="page_data(\'%s?page=%s\')" style="cursor:pointer">首页</a></li>' % (self.url,1)
page_html_list.append(first_page)
if self.current_page <= 1:
prev_page = '<li class="disabled"><a href="#">上一页</a></li>'
else:
prev_page = '<li><a onclick="page_data(\'%s?page=%s\')" style="cursor:pointer">上一页</a></li>' % (self.url,self.current_page - 1,)
page_html_list.append(prev_page)
for i in range(pager_start, pager_end):
if i == self.current_page:
temp = '<li class="active"><a onclick="page_data(\'%s?page=%s\')" style="cursor:pointer">%s</a></li>' % (self.url,i, i,)
else:
temp = '<li><a onclick="page_data(\'%s?page=%s\')" style="cursor:pointer">%s</a></li>' % (self.url,i, i,)
page_html_list.append(temp)
if self.current_page >= self.all_pager:
next_page = '<li class="disabled"><a href="#">下一页</a></li>'
else:
next_page = '<li><a onclick="page_data(\'%s?page=%s\')" style="cursor:pointer">下一页</a></li>' % (self.url,self.current_page + 1,)
page_html_list.append(next_page)
last_page = '<li><a onclick="page_data(\'%s?page=%s\')" style="cursor:pointer">尾页</a></li>' % (self.url,self.all_pager,)
page_html_list.append(last_page)
# 尾部添加标签
page_html_list.append('''
</nav>
</ul>
''')
return ''.join(page_html_list)
# 函数内部调用
@bp.route('/activity/2020-08/data', methods=['POST'])
@verify_logined
def activity_2020_08_data():
data = g.restful.request('activity_2020_08_data', **request.form.to_dict())
if data['state'] == 0:
page_obj = Pagination(current_page=request.args.get('page', 1), all_count=len(data['data']),
url='/activity/2020-08/data')
data['data'] = data['data'][page_obj.start:page_obj.end]
data['page_html'] = page_obj.page_html()
return jsonify(data)
# 前端页面的调用
<div class="my_page"></div>
$('.my_page').html(data.page_html);
// 点击页码事件
function page_data(url) {
$('.overlay').removeClass('none');
$.ajax({
url: url,
type: 'post',
dataType: 'json',
data: params,
success: function (pagedata) {
if (pagedata.state === 0) {
load_list(data.data, data.page_html)
$('.overlay').addClass('none');
}
}
})
}
1|3三、flask框架
1|01. 蓝图
1|02. flask开启多线程或多进程
flask只能开启多进程或多线程的其中一个, 开启多线程: app.run(threaded=True) ; 开启多进程:app.run(processes=大于1的数字) ,processes默认下为1,threaded默认下为False
注意: 在DEBUG值为True,即DEBUG环境下,开启多线程是无效的;windows环境下,flask不支持开启多进程。
1|4四、python基础相关
1|01. 保留小数
-
round()
:低版本(3.6之前)的python解释器使用round()
方法被除数为整形时,结果不会保留小数。解决方法:将被除数用float
转成浮点型再做运算。使用round()
方法的好处是会四舍五入 -
格式化输出(不会四舍五入)
-
login_rate = '%.1f' % (curr_login_user['CURR_LOGIN_COUNT'] / all_diamond_user['DIAMOND_COUNT'] * 100)
-
1|5五、 时间与字符串的转换
# 字符串转时间:
datetime.datetime.strptime(str_time,'%Y-%m-%d %H:%M:%S')
# 时间转字符串
datetime.datetime.strftime(now_time,'%Y-%m-%d %H:%M:%S')
2|0六、 Linux系统基础命令
安装软件命令:
centor-os:
yum install net-tools
yum install nano
ubantu:
apt-get install net-tools
apt-get install -y nano
查看某端口的使用情况:
netstat -anp |grep 端口号
3|0七、 Docker 基础命令
下载安装镜像容器:
docker pull 镜像名:版本
docker ps -a 所有已安装的容器情况
docker images 所有镜像
进入容器:
docker exec -it 容器id /bin/bash
停止所有容器:docker stop $(docker ps -a -q)
卸载所有容器:docker rm $(docker ps -a -q)
删除所有镜像:docker rmi $(docker images -q)
__EOF__

本文作者:BigSun丶
本文链接:https://www.cnblogs.com/Mcoming/p/13609123.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/Mcoming/p/13609123.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构