1.用Python写了一个进销存管理的软件~需求分析界面设计数据库设计技术路线选择~

news2024/11/28 4:47:40

一、需求分析

总体来说,就是一个在游泳馆使用的进销存管理软件,记录商品的入库、出库情况,以及统计销售的金额等~

整个系统有三类用户,系统管理员、公司管理员和公司销售员,系统管理员负责录入公司信息以及分配用户,每个公司的话,都有管理员和销售员之分,销售员只能看到销售界面,就负责出库,管理员负责库存管理、员工管理、销售统计等等~

还是有很多细节需要处理的,比如一个老板有多个游泳门店,每个门店的数据都需要隔离处理,这就需要有一个公司的概念~比如需要对员工进行管理,主要是因为销售的金额需要计入员工的提成~

这里我用mindmanager把需求梳理了一下:

二、界面设计

因为只有我一个人开发,而且我是完全没有前端经验的小白,所以没指望自己能把前端做的很好,界面设计尽量简洁,后面有时间再去慢慢优化即可~

界面设计没有用任何软件,就是和需求方在纸上简单绘制了一下,毕竟这是个帮忙的事情,能用就行~~

界面就不在这里贴了,别的帖子里面有

其中有个细节是,入库的操作只在“库存管理”界面里面完成,比如新录入了商品,同时录入数量,已有商品的新进入库操作,利用修改商品数量的方式来完成,但是后台数据库会记录每一次的数量变化,这样统计的时候,才能看到期初库存和期末库存~

三、数据库设计

根据需求设计了数据库表

这些表基本够用了,入库表主要是用于数据统计的~

四、技术路线的选择

1. 编程语言 Python

python-3.10.5-amd64.exe

链接:https://pan.baidu.com/s/1e6CrqfCKAhMDmU-vY13AmQ 
提取码:nu9t

2. 编程IDE VS 

VSCodeUserSetup-x64-1.69.2.exe

链接:https://pan.baidu.com/s/1865J6QZQqpjpkadnthwp4A 
提取码:adm8

这两个官方都可以随便下载,我也放到了百度网盘,有需要的可以自行下载,下载之后一步一步安装即可,安装Python的时候注意最后一步,选择“同时配置好环境变量”,这样比较方便

3. 前端

前端也打算用Python来写,查了很多的python库,大家比较推荐的是wxpython和QPython,之前接触过一点点的QT,确实非常强大,但是库比较重量级,自己写的这个东西明显配不上QT,又详细调研了一下wxpython,就是它了!

这个组件支持界面拖拽式编写,就是可视化的GUI,这个简直太又好了,小白轻松上手,需要安装一个软件wxFormBuilder

链接:https://pan.baidu.com/s/1L6c9rNxj8Dz0XTWtppXIrw 
提取码:pgz9

安装过程非常简单,不再赘述

打开之后的界面如下:

使用非常容易上手,先新建一个project,再创建一个Form,大的架子就搭出来了

frame里面放上layout,layout根据需要进行选择,横竖可以在右侧的参数区域进行设置

接下来非常关键,在layout里面先放panel,再放具体的组件,每个panel可以设计不同的背景色,这样设计出来的界面比较有层次~比如我的登录界面全部展开如下所示:

设计好界面之后,点击Python标签,得到代码:

# -*- coding: utf-8 -*-

###########################################################################
## Python code generated with wxFormBuilder (version 3.10.1-0-g8feb16b3)
## http://www.wxformbuilder.org/
##
## PLEASE DO *NOT* EDIT THIS FILE!
###########################################################################

import wx
import wx.xrc

###########################################################################
## Class loginFrame
###########################################################################

class loginFrame ( wx.Frame ):

	def __init__( self, parent ):
		wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"MGLite系统登陆", pos = wx.DefaultPosition, size = wx.Size( 500,300 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

		self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )
		self.SetBackgroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_INACTIVEBORDER ) )

		bSizer1 = wx.BoxSizer( wx.VERTICAL )

		self.loginPanel = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
		self.loginPanel.SetBackgroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_INACTIVEBORDER ) )

		bSizer12 = wx.BoxSizer( wx.VERTICAL )

		self.ddd1 = wx.StaticText( self.loginPanel, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
		self.ddd1.Wrap( -1 )

		self.ddd1.SetFont( wx.Font( wx.NORMAL_FONT.GetPointSize(), wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, False, wx.EmptyString ) )

		bSizer12.Add( self.ddd1, 0, wx.ALL, 5 )

		self.ddd = wx.StaticText( self.loginPanel, wx.ID_ANY, u"MGLite进销存管理系统", wx.DefaultPosition, wx.DefaultSize, 0 )
		self.ddd.Wrap( -1 )

		self.ddd.SetFont( wx.Font( 20, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, False, wx.EmptyString ) )

		bSizer12.Add( self.ddd, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 )

		bSizer411 = wx.BoxSizer( wx.HORIZONTAL )

		self.usernamelabel11 = wx.StaticText( self.loginPanel, wx.ID_ANY, u"角色      ", wx.DefaultPosition, wx.DefaultSize, 0 )
		self.usernamelabel11.Wrap( -1 )

		bSizer411.Add( self.usernamelabel11, 0, wx.ALL, 5 )

		m_choice31Choices = []
		self.m_choice31 = wx.Choice( self.loginPanel, wx.ID_ANY, wx.DefaultPosition, wx.Size( 150,-1 ), m_choice31Choices, 0 )
		self.m_choice31.SetSelection( 0 )
		bSizer411.Add( self.m_choice31, 0, wx.ALL, 5 )


		bSizer12.Add( bSizer411, 0, wx.ALIGN_CENTER_HORIZONTAL, 5 )

		bSizer4 = wx.BoxSizer( wx.HORIZONTAL )

		self.usernamelabel = wx.StaticText( self.loginPanel, wx.ID_ANY, u"用户名    ", wx.DefaultPosition, wx.DefaultSize, 0 )
		self.usernamelabel.Wrap( -1 )

		bSizer4.Add( self.usernamelabel, 0, wx.ALL, 5 )

		self.usernametext = wx.TextCtrl( self.loginPanel, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( 150,-1 ), 0 )
		bSizer4.Add( self.usernametext, 0, wx.ALL, 5 )


		bSizer12.Add( bSizer4, 0, wx.ALIGN_CENTER_HORIZONTAL, 5 )

		bSizer5 = wx.BoxSizer( wx.HORIZONTAL )

		self.passwordlabel = wx.StaticText( self.loginPanel, wx.ID_ANY, u"密码       ", wx.DefaultPosition, wx.DefaultSize, 0 )
		self.passwordlabel.Wrap( -1 )

		bSizer5.Add( self.passwordlabel, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )

		self.passwordtext = wx.TextCtrl( self.loginPanel, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( 150,-1 ), wx.TE_PASSWORD|wx.TE_PROCESS_ENTER )
		bSizer5.Add( self.passwordtext, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )


		bSizer12.Add( bSizer5, 0, wx.ALIGN_CENTER_HORIZONTAL, 5 )

		bSizer41 = wx.BoxSizer( wx.HORIZONTAL )

		self.usernamelabel1 = wx.StaticText( self.loginPanel, wx.ID_ANY, u"公司      ", wx.DefaultPosition, wx.DefaultSize, 0 )
		self.usernamelabel1.Wrap( -1 )

		bSizer41.Add( self.usernamelabel1, 0, wx.ALL, 5 )

		m_choice3Choices = []
		self.m_choice3 = wx.Choice( self.loginPanel, wx.ID_ANY, wx.DefaultPosition, wx.Size( 150,-1 ), m_choice3Choices, 0 )
		self.m_choice3.SetSelection( 0 )
		bSizer41.Add( self.m_choice3, 0, wx.ALL, 5 )


		bSizer12.Add( bSizer41, 0, wx.ALIGN_CENTER_HORIZONTAL, 5 )

		self.login = wx.Button( self.loginPanel, wx.ID_ANY, u"登  录", wx.DefaultPosition, wx.DefaultSize, 0 )
		self.login.SetForegroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_HIGHLIGHTTEXT ) )
		self.login.SetBackgroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_HIGHLIGHT ) )

		bSizer12.Add( self.login, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 )


		self.loginPanel.SetSizer( bSizer12 )
		self.loginPanel.Layout()
		bSizer12.Fit( self.loginPanel )
		bSizer1.Add( self.loginPanel, 1, wx.EXPAND |wx.ALL, 5 )


		self.SetSizer( bSizer1 )
		self.Layout()

		self.Centre( wx.BOTH )

		# Connect Events
		self.passwordtext.Bind( wx.EVT_TEXT_ENTER, self.loginFunction )
		self.login.Bind( wx.EVT_BUTTON, self.loginFunction )

	def __del__( self ):
		pass


	# Virtual event handlers, override them in your derived class
	def loginFunction( self, event ):
		event.Skip()

在vscode中,新建一个py文件,并把代码粘贴进去,注意之后这段代码对你来说就是一个黑盒子,除非报错,否则每次修改就从GUI里面改,改完之后再贴回来

再新建一个py文件,调用这个界面

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
from asyncio.windows_events import NULL
from calendar import setfirstweekday
import wx
 
import loginFrame
import pymysql
 
class CalcFrame(loginFrame.loginFrame):
    def __init__(self,parent, id=-1):
        loginFrame.loginFrame.__init__(self,parent)
        
 
app = wx.App(False)
 
frame = CalcFrame(None)
 
frame.Show(True)
 
start the applications
app.MainLoop()

 运行就可以了! 

4. 数据库 MySQL

建议安装的是 mysql-installer-community-5.7.39.0.msi

链接:https://pan.baidu.com/s/14io2k-OVYWHrpI08q-fD5w 
提取码:gwzo

 安装过程挺麻烦的,会有各种依赖,检测完依赖之后,点击全部安装就行了

MySQL对应的GUI操作软件,很多人会选择Navicat,但是注册比较难,你懂的。。。所以我选了相对友好的SQLYog,注册码百度一大堆

链接:https://pan.baidu.com/s/1cU5g4N1k5rxGqW6_4iLevw 
提取码:we9c

这基本上就是全部的技术路线了~~

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

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

相关文章

ActiveMQ、RabbitMQ、RocketMQ、Kafka区别

1、4种消息中间件比较 特性ActiveMQRabbitMQRocketMQKafka开发语⾔javaerlangjavascala单机吞吐量万级万级10万级10万级时效性ms级us级ms级ms级以内可⽤性⾼(主从架构)⾼(主从架构)⾮常⾼(分布式架构)⾮常⾼(分布式架构)功能特性 成熟的产品, 在很多公司得到应⽤&a…

FFmpeg - Windows下使用ShiftMediaProject方法编译FFmpeg

文章目录一、创建一个ShiftMediaProject文件夹二、下载ShiftMediaProject源码 (以下操作最好都要翻墙)三、下载其他头文件四、编译五、参考资料一、创建一个ShiftMediaProject文件夹 我创建在: C:\ShiftMediaProject 二、下载ShiftMediaPro…

【LeetCode题目详解】(一)27.原地移除元素、88.合并两个有序数组

目录 一、力扣第27题:原地移除元素 1.思路一: 2.思路二 3.思路三 二、力扣第88题:合并两个有序数组 1.思路一: 2.思路二: 3.思路三: 总结 一、力扣第27题:原地移除元素 题目链接&#xf…

基于YOLOv3的车辆号牌定位

01 OCR原理分析 本文中采用的车辆号牌识别部分的是采用CNNLSTMCTC组合而成,整个网络部分可以分为三个部分,首先是主干网络CNN用于提取字符的特征信息,其次采用深层双向LSTM网络在卷积特征的基础上提取文字或字符的序列特征,最终引…

基于java+springboot+mybatis+vue+mysql的校园台球厅人员与设备管理系统

项目介绍 校园台球厅人员与设备管理系统采用java技术,基于springboot框架,前端使用vue技术,mysql数据库进行开发,实现了以下功能: 本系统主要包括管理员和用户两个角色组成,主要包括以下功能:…

m基于LMMSE+turbo算法的信道估计均衡器误码率仿真,对比LS,DEF以及LMMSE三种均衡算法误码率

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 本文推导了符号间干扰(ISI)信道的矢量形状因子图表示。结果图具有树形结构,避免了现有图方法中的短周期问题。基于联合高斯近似,我们在LLR&#xf…

CUDA入门和网络加速学习(二)

0. 简介 最近作者希望系统性的去学习一下CUDA加速的相关知识,正好看到深蓝学院有这一门课程。所以这里作者以此课程来作为主线来进行记录分享,方便能给CUDA网络加速学习的萌新们去提供一定的帮助。 1. 基础矩阵乘法 下图是矩阵乘法的示意图&#xff0…

MySQL表的增删查改(上)

作者:~小明学编程 文章专栏:MySQL 格言:目之所及皆为回忆,心之所想皆为过往 前面给大家分享了关于数据库的一些基本的操作,今天分享的是数据库的核心内容,那就是我们常说的增删查改,也是我们数…

达梦数据库,备份目录冲突

问题描述 达梦数据库执行全库备份,BACKUP DATABASE FULL BACKUPSET ‘/data_share/data_back’; 提示备份目录冲突 解决办法 指定的目录必须为一个空目录。 下图,我指定的目录下有一个test文件夹,所以导致失败,把test文件删除m

[附源码]Python计算机毕业设计SSM基于WEB的网上零食销售系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Python OpenCV中的图像阈值处理

1 前言 上一篇介绍了用C如何对一幅图像进行阈值处理,本篇接着用python来做同样的事情。 图像阈值处理是很多高级算法的底层逻辑之一,比如在做图形检测,轮廓识别时,常常会先对图像进行阈值处理,然后再进行具体的检测或…

FreeRTOS使用 — 合理使用内存 “ 任务中创建任务 ”

前言 在我们学习 RTOS 的过程中,很多朋友都不会遇到内存不够的问题,因为大部分的开发板使用的芯片对学习来说,内存 “足够大” 。所以基本上很多人学会了基本功能,到了实际工作中使用,往往会遇到内存不够的问题&#…

pikachu靶场-10 XXE漏洞

XXE漏洞 概述 XXE -“xml external entity injection” 既"xml外部实体注入漏洞"。 概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题" 也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严…

shell语法总结一(持续补充)

文章目录一、变量1、变量的命名规则2、查看变量3、删除命令4、变量的作用域4.1、局部变量4.2、全局变量4.3、环境变量5、自定义变量6、只读变量二、字符串1、单引号2、双引号(用的多)3、拼接字符串4、获取字符串的长度5、提取子字符串三、shell数组1、定…

必须掌握的数据库面试问题

一、为什么用自增列作为主键 1、如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引。 如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引。 如果也没有这样的唯一索引,则InnoDB会选择内置…

1990-2021年全国各省产业高级化 数据

1990-2021年全国各省产业高级化数据 1、来源为:统计NJ、各省NJ 2、包括:全国31个省份 3、时间:1990-2021年 4、指标包括: 各地区经纬度、第三产业增加值、第二产业增加值、高级化水平 高级化水平第三产业增加值(亿元) / 第二…

HTTP协议【报文格式】

文章目录HTTP协议什么是HTTP协议HTTP协议格式抓包工具的使用HTTP请求URLURL的组成URL encodeHTTP请求的报文格式HTTP响应的报文格式HTTP方法GET方法POST方法POST方法与GET方法的区别请求报头HTTP响应状态码状态码的组成状态码的类别HTTP协议 什么是HTTP协议 HTTP协议即Hyper T…

m基于GA遗传优化的多因素加权竞价博弈频谱分配算法matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 假设有M个用户均为MIMO Full Duplex&#xff0c;N个频率&#xff0c;1<N<M&#xff0c;设计算法实现M个用户与N个频率的匹配。 由于在一个MIMO系统中&#xff0c;用户数量M大于可用的频谱个…

web自动化测试入门篇04——selenium+python基础方法封装

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

记录一次解决centos不定时触发oom的经历

前言 前一段时间&#xff0c;业务部门的系统不定时的反馈&#xff0c;系统打开不了&#xff0c;提示&#xff1a; 等技术开发同学反应过来去查看业务状态时&#xff0c;服务又恢复了&#xff0c;由于不是核心的业务&#xff0c;并且出问题差不多1分钟左右&#xff0c;没太在意…