Python桌面应用之XX学院水卡报表查询系统(Tkinter+cx_Oracle)

news2024/11/16 8:29:38

一、功能样式

Python桌面应用之XX学院水卡报表查询系统功能:

连接Oracle数据库,查询XX学院水卡操作总明细报表,汇总数据报表,个人明细报表,进行预览并且支持导出报表

1.总明细报表样式
明细
2.汇总明细样式
汇总明细

3.个人明细样式
个人明细
4.导出报表样式
导出
5.错误提示样式
tip
tip2

二、核心点

1. 安装cx_Oracle:使用cx_Oracle三方库连接Oracle,该库使用的python版本略低,可以在[https://cx-oracle.readthedocs.io/en/latest/](https://cx-oracle.readthedocs.io/en/latest/进行查询,安装前先确定:python版本、Orale客户端版本(要不都是64位,要不都是32位),安装cx_Oracle的版本位数是跟python的位数相关的。
使用代码进行测试

import cx_Oracle
# 账户  密码  ip:1521/实例名
conn = cx_Oracle.connect('system','Yxq123456','127.0.0.1:1521/ecard'
# 挂载数据库连接游标
self.cursor = conn.cursor()
print('连接数据库成功!')

2. 多参数查询Sql: sql语句使用:参数名来定义参数,多参数使用cursor.execute(sql,(参数1,参数2)).fetchall()来查询

sql = "select a.outid ,a.name ,b.opfare,b.opdt,b.dscrp from base_customers a,rec_cust_acc b where a.customerid = b. customerid and b.opdt >= to_date(:preopdt,'yyyy-MM-dd HH24:mi:ss') and b.opdt <= to_date(:nextopdt,'yyyy-MM-dd HH24:mi:ss') order by b.opdt desc"
preopdt=self.pretimeInput.get()
nextopdt=self.nexttimeInput.get()
data = self.cursor.execute(sql,(preopdt,nextopdt)).fetchall()

**3. Treeview表格组件的使用:**这里使用了三个报表,其实可以将打开的Treeview做成一个表格class类,要使用的时候直接生成要使用的对象,传入该对象的大小,heading标题,data数据即可。

# 明细查询
    def Consumedetail(self):
        self.consumedetail = tk.Tk()
        self.consumedetail.title('XX学院明细查询')
        self.consumedetail.geometry("1000x600")
        # 加载滚动条
        scrollBar = tk.Scrollbar(self.consumedetail)
        scrollBar.pack(side = tk.RIGHT,fill = tk.Y)
        self.tree = ttk.Treeview(self.consumedetail, columns=('outid', 'name', 'opfare', 'opdt','dscrp'), show="headings", displaycolumns="#all",yscrollcommand = scrollBar.set)
        self.tree.pack()
        self.tree.heading('outid', text="学号", anchor=tk.W)
        self.tree.heading('name', text="姓名", anchor=tk.W)
        self.tree.heading('opfare', text="交易金额", anchor=tk.W)
        self.tree.heading('opdt', text="交易日期", anchor=tk.W)
        self.tree.heading('dscrp', text="交易类型", anchor=tk.W)
        # 设置关联
        scrollBar.config(command = self.tree.yview)
        # 每次打开清空页面
        for item in self.tree.get_children():
            self.consumedetail.tree.delete(item)
        sql = "select a.outid ,a.name ,b.opfare,b.opdt,b.dscrp from base_customers a,rec_cust_acc b where a.customerid = b. customerid and b.opdt >= to_date(:preopdt,'yyyy-MM-dd HH24:mi:ss') and b.opdt <= to_date(:nextopdt,'yyyy-MM-dd HH24:mi:ss') order by b.opdt desc"
        preopdt=self.pretimeInput.get()
        nextopdt=self.nexttimeInput.get()
        data = self.cursor.execute(sql,(preopdt,nextopdt)).fetchall()
        # print(data)
        # data = [['2013090101','张三','100','2023-10-19','PC存款']]
        for itm in data:
            self.tree.insert("",tk.END,values=itm)
            self.tree.pack(padx=10,pady=10, fill=tk.BOTH,expand=1)
        exportbtn = tk.Button(self.consumedetail,text='导出',width=8,command=self.export).pack()

4. 导出数据自定义文件名:报表里面导出数据,其实使用遍历treeview组件数据,在进行整理后写入csv文件,自定义文件名是使用filedialog.asksaveasfilename来打开文件框,里面的文件类型使用参数filetypes ,输入文件名后获取名称生成文件。这里导出的文件就只是csv文件,如果需要其他文件类型,可以自行导入其他三方库。

     def export(self):
        # 导出export        
         # 打开文件夹选择对话框
        
        # 更新标签文本
        # print(folder_path)
        list = []
        columns = []
        # 获取表格内容id
        for row_id in self.tree.get_children():
            list.append(self.tree.item(row_id)['values'])
        print(len(self.tree.get_children()))   
        # 通过第一行获取列数生成标题
        # print(self.tree.item)
        if len(self.tree.get_children()) != 0:
            print('ok')
            folder_path = filedialog.asksaveasfilename(title='请选择一个文件',filetypes=[("CSV", ".csv")]) 
            for i in range(0,len(self.tree.item('I001')['values'])):
                columns.append(self.tree.heading(column=i)['text'])
        # 导出csv
            with open(f'{folder_path}.csv','w',newline='') as csvfile:
                fieldnames = columns
                writer = csv.writer(csvfile)
                writer.writerow(fieldnames)
                writer.writerows(list)
        else:
            messagebox.showwarning("提示", "没有数据,无法导出")
            return

5.遍历Treeview表格数据与标题:获取Treeview里面的数据与标题,这里现获取id值,然后通过item获取[‘values’]值,获取标题这里先遍历了第一行有多少数据,然后使用self.tree.heading(column=i)['text']来获取标题。

 # 获取表格内容id
for row_id in self.tree.get_children():
    list.append(self.tree.item(row_id)['values'])
 # 通过第一行获取列数生成标题
for i in range(0,len(self.tree.item('I001')['values'])):
    columns.append(self.tree.heading(column=i)['text'])

三、完整代码

import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import cx_Oracle
import time
import csv
from tkinter import filedialog

# mainapp
class mainApp(object):
    def __init__(self,parent,**kwargs):
        self.root = parent
        current_timestamp = time.time()
         # 将时间戳转换为本地时间的struct_time对象
        local_time = time.localtime(current_timestamp)
         # 使用strftime()方法将struct_time对象格式化为指定的时间字符串  
        # 挂在self时间
        self.pretime = time.strftime("%Y-%m-%d 00:00:00", local_time)
        self.nexttime = time.strftime("%Y-%m-%d %H:%M:%S", local_time)

        conn = cx_Oracle.connect('system','Yxq123456','127.0.0.1:1521/ecard')
        # conn = cx_Oracle.connect('ccense','XCXY123*','127.0.0.1:1521/ecard')
        # 挂载数据库连接游标
        self.cursor = conn.cursor()
        print('连接数据库成功!')

        self.root.config(**kwargs)
        self.root.title('XX学院')
        self.root.resizable(False, False)
        self.create_widgets()
        # 获取屏幕尺寸
        screen_width = self.root.winfo_screenwidth()
        screen_height = self.root.winfo_screenheight()

        # 确定窗口位置,并设置大小
        x_coordinate = (screen_width / 2) - 300 # 300是窗口的宽度
        y_coordinate = (screen_height / 2) - 200 # 200是窗口的高度
        self.root.geometry('650x400+{}+{}'.format(int(x_coordinate), int(y_coordinate)))
        # self.root.geometry("600x400")
        
    # 创建UI
    def create_widgets(self):
        self.titleLab = tk.Label(self.root,text='XX学院水卡报表管理系统',font=("kaiti",18)).place(x=190,y=30)
        self.outidLab = tk.Label(self.root,text='学号:').place(x=80,y=100)
        self.outidInput = tk.Entry(self.root, width=20)
        self.outidInput.place(x=130,y=100)
        # 姓名
        # 学号
        self.nameLab = tk.Label(self.root,text='姓名:').place(x=380,y=100)
        self.nameInput = tk.Entry(self.root,width=20)
        self.nameInput.place(x=430,y=100)
        # 起始时间
        self.mustLabel1 = tk.Label(self.root,text='*',font=('Arial', 16),fg = 'red').place(x=45,y=160)

        self.pretimeLab = tk.Label(self.root,text='起始时间:').place(x=55,y=160)
        self.pretimeInput = tk.Entry(self.root, width=20)
        self.pretimeInput.place(x=130,y=160)
        self.pretimeInput.insert(0,self.pretime)
        # 终始时间
        self.mustLabel2 = tk.Label(self.root,text='*',font=('Arial', 16),fg = 'red').place(x=350,y=160)
        
        self.nexttimeLab = tk.Label(self.root,text='终止时间:').place(x=360,y=160)
        self.nexttimeInput = tk.Entry(self.root,width=20)
        self.nexttimeInput.place(x=430,y=160)
        self.nexttimeInput.insert(0,self.nexttime)
        self.consumeBtn = tk.Button(self.root,text='明细查询',command=self.Consumedetail,width=10).place(x=130,y=260)
        self.sumBtn = tk.Button(root,text='汇总查询',command=self.sumDetail,width=10).place(x=300,y=260)
        self.personBtn = tk.Button(root,text='个人查询',command=self.personDetail,width=10).place(x=480,y=260)

        

    # 明细查询
    def Consumedetail(self):
        self.consumedetail = tk.Tk()
        self.consumedetail.title('XX学院明细查询')
        self.consumedetail.geometry("1000x600")
    
        # 加载滚动条
        scrollBar = tk.Scrollbar(self.consumedetail)
        scrollBar.pack(side = tk.RIGHT,fill = tk.Y)
        self.tree = ttk.Treeview(self.consumedetail, columns=('outid', 'name', 'opfare', 'opdt','dscrp'), show="headings", displaycolumns="#all",yscrollcommand = scrollBar.set)
        self.tree.pack()
        self.tree.heading('outid', text="学号", anchor=tk.W)
        self.tree.heading('name', text="姓名", anchor=tk.W)
        self.tree.heading('opfare', text="交易金额", anchor=tk.W)
        self.tree.heading('opdt', text="交易日期", anchor=tk.W)
        self.tree.heading('dscrp', text="交易类型", anchor=tk.W)
        # 设置关联
        scrollBar.config(command = self.tree.yview)
        # 每次打开清空页面
        for item in self.tree.get_children():
            self.consumedetail.tree.delete(item)
        sql = "select a.outid ,a.name ,b.opfare,b.opdt,b.dscrp from base_customers a,rec_cust_acc b where a.customerid = b. customerid and b.opdt >= to_date(:preopdt,'yyyy-MM-dd HH24:mi:ss') and b.opdt <= to_date(:nextopdt,'yyyy-MM-dd HH24:mi:ss') order by b.opdt desc"
        preopdt=self.pretimeInput.get()
        nextopdt=self.nexttimeInput.get()
        data = self.cursor.execute(sql,(preopdt,nextopdt)).fetchall()
        # print(data)
        # data = [['2013090101','张三','100','2023-10-19','PC存款']]
        for itm in data:
            self.tree.insert("",tk.END,values=itm)
            self.tree.pack(padx=10,pady=10, fill=tk.BOTH,expand=1)
        exportbtn = tk.Button(self.consumedetail,text='导出',width=8,command=self.export).pack()

    # 汇总查询
    def sumDetail(self):
        sql = "select sum(opfare),count(acccode),dscrp from rec_cust_acc where opdt >= to_date(:preopdt,'yyyy-MM-dd HH24:mi:ss') and opdt <= to_date(:nextopdt,'yyyy-MM-dd HH24:mi:ss') group by dscrp"
        self.sumtail = tk.Tk()
        self.sumtail.title('XX学院汇总查询')
        self.sumtail.geometry("800x600")
   
        # 加载滚动条
        # exportbtn = Button(sumtail,text='导出',width=8,command=export).pack()
        scrollBar = tk.Scrollbar(self.sumtail)
        scrollBar.pack(side = tk.RIGHT,fill = tk.Y)
        self.tree = ttk.Treeview(self.sumtail, columns=('sum', 'count', 'dscrp'), show="headings", displaycolumns="#all",yscrollcommand = scrollBar.set)
        self.tree.pack()
        self.tree.heading('sum', text="总金额", anchor=tk.W)
        self.tree.heading('count', text="总次数", anchor=tk.W)
        self.tree.heading('dscrp', text="交易类型", anchor=tk.W)
        # 设置关联
        scrollBar.config(command = self.tree.yview)
        # 每次打开清空页面
        for item in self.tree.get_children():
            self.tree.delete(item)
        # sql = "select a.outid ,a.name ,b.opfare,b.opdt,b.dscrp from base_customers a,rec_cust_acc b where a.customerid = b. customerid and b.opdt >= to_date(:preopdt,'yyyy-MM-dd HH24:mi:ss') and b.opdt <= to_date(:nextopdt,'yyyy-MM-dd HH24:mi:ss') order by b.opdt desc"
        preopdt=self.pretimeInput.get()
        nextopdt=self.nexttimeInput.get()
        data = self.cursor.execute(sql,(preopdt,nextopdt)).fetchall()
        # print(data)
        for itm in data:
            self.tree.insert("",tk.END,values=itm)
            self.tree.pack(padx=10,pady=10, fill=tk.BOTH,expand=1)

        exportbtn = tk.Button(self.sumtail,text='导出',width=8,command=self.export).pack()

    # 个人明细
    def personDetail(self):
        if(self.outidInput.get()):
            print('outid not is null')
            sql="select a.outid ,a.name ,b.opfare,b.oddfare,b.opdt,b.dscrp from base_customers a,rec_cust_acc b where a.customerid = b. customerid and b.opdt >= to_date(:preopdt,'yyyy-MM-dd HH24:mi:ss') and b.opdt <= to_date(:nextopdt,'yyyy-MM-dd HH24:mi:ss') and a.outid = :outid order by b.opdt desc"
            outidname = self.outidInput.get()
        elif(self.nameInput.get()):
            sql="select a.outid ,a.name ,b.opfare,b.oddfare,b.opdt,b.dscrp from base_customers a,rec_cust_acc b where a.customerid = b. customerid and b.opdt >= to_date(:preopdt,'yyyy-MM-dd HH24:mi:ss') and b.opdt <= to_date(:nextopdt,'yyyy-MM-dd HH24:mi:ss') and a.name like :name order by b.opdt desc"
            outidname = self.nameInput.get()
        else:
            messagebox.showwarning("提示", "请输入学号或者姓名!")
            return
        self.persontail = tk.Tk()
        self.persontail.title('XX学院个人查询')
        self.persontail.geometry("1200x600")
    
        # 加载滚动条
        # exportbtn = Button(persontail,text='导出',width=8,command=export).pack()
        scrollBar = tk.Scrollbar(self.persontail)
        scrollBar.pack(side = tk.RIGHT,fill = tk.Y)
        self.tree = ttk.Treeview(self.persontail, columns=('outid', 'name', 'opfare','oddfare', 'opdt','dscrp'), show="headings", displaycolumns="#all",yscrollcommand = scrollBar.set)
        self.tree.pack()
        self.tree.heading('outid', text="学号", anchor=tk.W)
        self.tree.heading('name', text="姓名", anchor=tk.W)
        self.tree.heading('opfare', text="交易金额", anchor=tk.W)
        self.tree.heading('oddfare', text="账户余额", anchor=tk.W)
        self.tree.heading('opdt', text="交易日期", anchor=tk.W)
        self.tree.heading('dscrp', text="交易类型", anchor=tk.W)
        # 设置关联
        scrollBar.config(command = self.tree.yview)
        # 每次打开清空页面
        for item in self.tree.get_children():
            self.tree.delete(item)
        # sql = "select a.outid ,a.name ,b.opfare,b.opdt,b.dscrp from base_customers a,rec_cust_acc b where a.customerid = b. customerid and b.opdt >= to_date(:preopdt,'yyyy-MM-dd HH24:mi:ss') and b.opdt <= to_date(:nextopdt,'yyyy-MM-dd HH24:mi:ss') order by b.opdt desc"
        preopdt=self.pretimeInput.get()
        nextopdt=self.nexttimeInput.get()
        # print(outidname)
        data = self.cursor.execute(sql,(preopdt,nextopdt,outidname)).fetchall()
        # print(data)
        for itm in data:
            self.tree.insert("",tk.END,values=itm)
            self.tree.pack(padx=10,pady=10, fill=tk.BOTH,expand=1)
        def export():
        # 导出export        
             # 打开文件夹选择对话框
            folder_path = filedialog.asksaveasfilename(title='请选择一个文件',filetypes=[("CSV", ".csv")]) 
            # 更新标签文本
            print(folder_path)
            list = []
            for row_id in self.tree.get_children():
                list.append(self.tree.item(row_id)['values'])
            with open(f'{folder_path}.csv','w',newline='') as csvfile:
                fieldnames = ['学号', '姓名', '交易金额','账户余额','交易日期','交易类型']
                writer = csv.writer(csvfile)
                writer.writerow(fieldnames)
                writer.writerows(list)

        exportbtn = tk.Button(self.persontail,text='导出',width=8,command=self.export).pack()


    def export(self):
        # 导出export        
         # 打开文件夹选择对话框
        
        # 更新标签文本
        # print(folder_path)
        list = []
        columns = []
        # 获取表格内容id
        for row_id in self.tree.get_children():
            list.append(self.tree.item(row_id)['values'])
        print(len(self.tree.get_children()))   
        # 通过第一行获取列数生成标题
        # print(self.tree.item)
        if len(self.tree.get_children()) != 0:
            print('ok')
            folder_path = filedialog.asksaveasfilename(title='请选择一个文件',filetypes=[("CSV", ".csv")]) 
            for i in range(0,len(self.tree.item('I001')['values'])):
                columns.append(self.tree.heading(column=i)['text'])
        # 导出csv
            with open(f'{folder_path}.csv','w',newline='') as csvfile:
                fieldnames = columns
                writer = csv.writer(csvfile)
                writer.writerow(fieldnames)
                writer.writerows(list)
        else:
            messagebox.showwarning("提示", "没有数据,无法导出")
            return

if __name__ == "__main__":
    root = tk.Tk()
    app =  mainApp(root)
    root.mainloop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1125722.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Proteus仿真--VB上位机程序控制DS1302时钟仿真(Proteus仿真+程序)

本文主要介绍基于51单片机的VB上位机程序控制DS1302时钟仿真设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 简介 硬件电路主要分为单片机主控模块、DS1302模块、LCD1602液晶显示模块以及串口模块 &#xff08;1&#xff09;单片机主控模块&#xff1a;单片机选…

Unity编辑器扩展 --- AssetPostprocessor资源导入自动设置

unity导入资源的编辑器设置: 防止策划资源乱导入,资源导入需要的格式&#xff0c;统一资源管理 AssetPostprocessor资源导入管线 AssetPostprocessor用于在资源导入时自动做一些设置&#xff0c;比如当导入大量图片时&#xff0c;自动设置图片的类型&#xff0c;大小等。Ass…

volatile-读写屏障插入策略

6.2.4 困难内容 JMM就将内存屏障插入策略分为4种规则 读屏障&#xff1a; 写屏障&#xff1a;

图像语义分割 pytorch复现DeepLab v1图像分割网络详解以及pytorch复现(骨干网络基于VGG16、ResNet50、ResNet101)

图像语义分割 pytorch复现DeepLab v1图像分割网络详解以及pytorch复现&#xff08;骨干网络基于VGG16、ResNet50、ResNet101&#xff09; 背景介绍2、 网络结构详解2.1 LarFOV效果分析 2.2 DeepLab v1-LargeFOV 模型架构2.3 MSc&#xff08;Multi-Scale&#xff0c;多尺度(预测…

Docker Swarm 节点维护

Docker Swarm Mode Docker Swarm 集群搭建 Docker Swarm 节点维护 Docker Service 创建 1.角色转换 Swarm 集群中节点的角色只有 manager 与 worker&#xff0c;所以其角色也只是在 manager 与worker 间的转换。即 worker 升级为 manager&#xff0c;或 manager 降级为 worke…

软件测试 (用例篇)

前言 上一篇博客讲述的是一次基本的测试过程。 在我们开始做了一段时间基础测试&#xff0c;熟悉了业务之后&#xff0c;往往会分配来写测试用例&#xff0c;并且在日常测试中&#xff0c;有时也需要补充测试用例到现有的案例库中。 在这里我们将回答以下问题 1、测试用例的…

Pytorch深度学习快速入门—LeNet简单介绍(附代码)

一、网络模型结构 LeNet是具有代表性的CNN&#xff0c;在1998年被提出&#xff0c;是进行手写数字识别的网络&#xff0c;是其他深度学习网络模型的基础。如下图所示&#xff0c;它具有连狙的卷积层和池化层&#xff0c;最后经全连接层输出结果。 二、各层参数详解 2.1 INPUT层…

上门预约洗鞋小程序开发;

上门洗鞋小程序服务小程序是一款方便用户与服务提供者进行交流和预约的平台&#xff0c;覆盖多个行业&#xff0c;包括家政清洁、洗衣洗鞋&#xff0c;维修服务等&#xff0c;满足用户在生活中各种需求的上门服务。用户可以在小程序中选择服务项目、预约时间&#xff0c;服务人…

JDK的配置及运行过程

文章目录 介绍JDK编译运行过程为什么要配置环境变量配置环境变量的作用 配置JDK验证ps: 介绍JDK 【面试题】JDK、JRE、JVM之间的关系&#xff1f; JDK(Java Development Kit):Java开发工具包&#xff0c;提供给Java程序员使用&#xff0c;包含了JRE&#xff0c;同时还包含了编译…

Mysql如何理解Sql语句?MySql分析器

1. 什么是 MySQL 分析器? MySQL 分析器是 MySQL 数据库系统中的一个关键组件&#xff0c;它负责解析 SQL 查询语句&#xff0c;确定如何执行这些查询&#xff0c;并生成查询执行计划。分析器将 SQL 语句转换为内部数据结构&#xff0c;以便 MySQL 可以理解和执行查询请求。 …

数据集特征预处理

1、什么是特征预处理 1.1、什么是特征预处理 scikit-learn的解释 provides several common utility functions and transformer classes to change raw feature vectors into a representation that is more suitable for the downstream estimators. 翻译过来&#xff1a;通…

VRPTW(MATLAB):斑马优化算法ZOA求解带时间窗的车辆路径问题VRPTW(提供参考文献及MATLAB代码)

一、VRPTW简介 带时间窗的车辆路径问题(Vehicle Routing Problem with Time Windows, VRPTW)是车辆路径问题(VRP)的一种拓展类型。VRPTW一般指具有容量约束的车辆在客户指定的时间内提供配送或取货服务&#xff0c;在物流领域应用广泛&#xff0c;具有重要的实际意义。VRPTW常…

嵌入式系统设计中时钟抖动的基础

嵌入式开发时钟抖动是时钟沿偏离其理想位置的偏差。了解时钟抖动在应用中非常重要&#xff0c;因为它在系统的时序预算中起着关键作用。它有助于嵌入式开发工程师了解系统时序裕度。 随着系统数据速率的提高&#xff0c;时序抖动已成为系统设计中的关键&#xff0c;因为在某些…

[资源推荐]看到一篇关于agent的好文章

链接在此&#xff1a;Chat 向左&#xff0c;Agent 向右 - 李博杰的文章 - 知乎 https://zhuanlan.zhihu.com/p/662704254当时在电脑知乎上看了一半&#xff0c;打开手机微信公众号&#xff0c;就给我推了同样的&#xff0c;这推荐算法&#x1f625;今年关于大模型的想法经历了几…

短视频矩阵系统源码搭建/技术应用开发/源头独立搭建

短视频剪辑矩阵系统开发源码----源头搭建 矩阵系统源码主要有三种框架&#xff1a;Spring、Struts和Hibernate。Spring框架是一个全栈式的Java应用程序开发框架&#xff0c;提供了IOC容器、AOP、事务管理等功能。Struts框架是一个MVC架构的Web应用程序框架&#xff0c;用于将数…

功能基础篇8——图形用户界面

图形用户界面 Graphics User Interface&#xff0c;GUI&#xff0c;图形用户界面 Ubuntu GUI Command Line Interface&#xff0c;CLI&#xff0c;命令行界面 Centos CLI tkinter GUI&#xff0c;Python标准库 from tkinter import ttk, Tkroot Tk() frm ttk.Frame(…

网络工程师最强入职指南

大家好&#xff0c;我是老杨。 秋招即将进入尾声&#xff0c;各位都找到心仪的工作了吗&#xff1f; 今年的春秋招的热度好像不是很高&#xff0c;而且很多网工都是在“全年找工作”的状态里持续着&#xff0c;字里行间无不透露出对行业和自身的焦虑。 毕竟“今年是未来10年…

vue3 elementPlus 表格实现行列拖拽及列检索功能

1、安装vuedraggable npm i -S vuedraggablenext 2、完整代码 <template> <div classcontainer><div class"dragbox"><el-table row-key"id" :data"tableData" :border"true"><el-table-columnv-for"…

Qt 资源系统(Qt Resource System)

1. Qt Resource System是什么&#xff1f; Qt 资源系统&#xff08;Qt Resource System&#xff09;是一种将图片、数据存储在二进制文件中的一套系统。构建应用程序需要的不仅仅是代码。通常你的界面会需要图标来做动作&#xff0c;你可能想要添加插图或品牌标识&#xff0c;或…

Spring Boot中RedisTemplate的使用

当前Spring Boot的版本为2.7.6&#xff0c;在使用RedisTemplate之前我们需要在pom.xml中引入下述依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><vers…