☰
进销存管理系统课程设计:从库存流水到事务防超卖的数据库实战
2026/10/11 19:28:14 网站建设 项目流程

简介:这是一份《某商店进销存管理系统》课程设计报告 Word 文档,面向计算机、网络工程等需要完成数据库课程设计或管理系统类实训报告的学生,也适合作为撰写需求分析、概念结构与数据库设计文档的参考范本。报告围绕进销存业务展开,完整覆盖需求描述与系统功能、分 E-R 图与全局 E-R 图、关系模式建立、物理结构设计、数据实施与维护、总结心得等环节,并包含进货与销售业务流程图、数据流图及数据字典,能够对照常见课程设计要求使用。压缩包内共 1 个 docx 格式的 Word 文件,大小约 580KB,内容排版清晰、可直接编辑,便于查看章节结构并替换个人信息。报告以 Windows XP 平台和 Microsoft SQL Server 为背景,给出商品、供应商、进销存等核心数据项及建表思路,对理解数据库从概念模型、逻辑模型到实施维护的完整流程有实用价值。已有 118 人浏览学习。

1. 进销存管理系统课程设计报告:一份docx里最容易被虚写的是什么

拿到《某商店进销存管理系统-课程设计报告.docx》的人,十有八九是准备照着它写代码,或者正卡在答辩前的审查上。我见过太多这类报告:数据库只建了三张表,库存数字直接塞在商品表里,卖出的时候就 UPDATE 一下,等交作业一演示,库存变成负数,老师问一句“退货单怎么处理”,当场卡壳。进销存管理系统听起来是经典课设,但真正能跑通的版本,核心不是界面多好看,而是把入库、销售、退货、盘点这几条业务线串起来。这篇笔记就按一份合格课程设计的落地路径来讲:需求分析、表结构、代码事务、踩坑点,最后落到验收和答辩。适合正在写课程设计、或者想把报告里“设计”部分做实的学生,也适合刚接手这类进销存维护项目的开发。

2. 先把业务流程建模:进销存的需求分析从哪张表开始

很多课程设计报告一上来就贴CREATE TABLE,跳过需求分析。等代码写一半才发现缺了退货、缺了盘点,表结构推倒重来。进销存管理系统的业务其实不复杂,但它是一笔一笔流水堆起来的,只要有一张单据的流向没想清楚,后面所有功能都会跟着歪。

2.1 从采购入库到销售出库:用一张数据流表串起所有业务

我在动手写代码前,习惯把业务拆成七个动作:

  1. 采购订货:给供应商下采购单,此时商品还没到库。
  2. 采购入库:到货验收入库,库存增加。
  3. 销售开单:顾客买货,生成销售单。
  4. 销售出库:按销售单扣减库存。
  5. 退货处理:顾客退货或者供应商退货,库存反向调整。
  6. 盘点调整:账上库存和实物库存对不上,做差异修正。
  7. 库存预警:低于下限触发补货提醒。

把这七个动作整理成一张数据流表,比画箭头图更能指导建表。每一行都对应未来的一张单据、一个状态字段、一个库存变动方向。

业务动作前置单据库存变化参与者关键记录
采购订货采购订单无变化采购员订单头、订单明细
采购入库采购订单/入库单增加仓管员入库单、库存流水
销售开单销售单无变化收银员销售单头、明细
销售出库销售单减少收银员/仓管出库记录、库存流水
退货退货单增减反向售后/仓管退货单、库存流水
盘点盘点单修正差异财务/仓管盘点差异表
预警无无系统自动低于下限的商品列表

这张表里的“库存变化”一栏直接决定了库存表该有哪些字段。凡是会引起库存变化的动作,都必须同时写一条库存流水;只改库存不记流水的做法,是课程设计报告里最普遍的设计缺陷。

做完这七步之后,还要补几条业务规则,写进报告的“功能需求”里:

  • 库存不允许为负数,除非开启负库存销售开关。
  • 商品不允许物理删除,只能停用。
  • 销售单金额必须等于明细行金额之和。
  • 每笔库存流水必须能追溯到业务单号。

这些规则每条都能在后面的数据库约束或代码分支里找到对应,答辩时老师问“你怎么保证数据一致”,直接指规则就行。

2.2 用ER实体清单锁定四类核心对象

进销存系统看起来页面很多,但核心实体只有四类:商品、往来单位、单据、流水。

商品实体包含商品档案和库存快照。档案记录名称、条码、规格、单位、进价、售价,库存快照记录当前数量和上下限。有的课程设计把这两者合并成一张表,商品信息里塞一个 stock 字段,后面盘点对不上账时又补一张盘点表,最后字段越加越乱。

往来单位是供应商和顾客的统称。小商店课设没必要分开建 supplier 和 customer 两张表,用一张 partner 表加一个 type 字段区分即可,省去大量重复字段。

单据实体包括采购订单、销售订单、退货单。每类单据都建议拆成头表和明细表,头表存单号、日期、往来单位、总金额,明细表存商品、数量、单价、行小计。拆开之后,一张单买十种商品就不会被塞进一个逗号拼接的字符串里。

流水实体是最容易被忽视的。库存流水应该记录每一次入库、出库、退货、盘点的数量变化,以及变化前后的库存值。有了流水,才能回答“这批货的库存是怎么变成这个数的”。课程设计报告里如果出现了“库存流水”这个词,整份报告的档次立刻不一样。

在需求分析阶段,我一般会让同学先做一次实体清单检查:把报告里提到的所有业务名词写出来,凡是能独立描述属性且有多条记录的,就作为一个潜在实体;凡是依附于某个实体的,就归为属性。比如“颜色”“尺码”在简单系统里是商品属性,但如果你要做服装店的尺码库存管理,它们必须抽成独立维度表。小商店进销存通常用不到变体,所以保持简单即可。

2.3 把需求写进用例表:入库、销售、盘点三个用例的模板

课程设计报告的需求章节不需要写成 IEEE 文档,但至少要有用例表。我常用的模板是四列:用例名称、参与者、前置条件、主流程与异常流程。下面这张表可以直接抄进报告里。

用例采购入库销售出库盘点调整
参与者采购员/仓管员收银员仓管员/财务
前置条件已登录且有入库权限;供应商已建档商品状态为在售;库存足够已进入盘点状态;商品库存已冻结
主流程选择供应商 → 录入商品与数量 → 提交生成入库单 → 库存增加 → 写流水选择商品 → 输入数量 → 计算金额 → 扣减库存 → 写流水录入实盘数量 → 对比账面数量 → 生成差异记录 → 审核后调整库存
异常流程商品未建档;数量小于等于0;入库单号重复库存不足;商品已停用;销售价格低于成本差异数量超过阈值;审核人未通过

用例表的价值在于,每一行主流程都对应后面代码里的一个 service 方法,每一个异常流都对应一个异常分支或一个界面提示。比如“库存不足”这个异常,落到代码里就是在扣减库存前做一次数量校验;落到数据库里,可以用一条带条件的 UPDATE 兜底。

写到这里,需求分析章节就可以收尾了。记住一点:报告里画多少个用例图都不如写清楚这三件套——七步数据流表、四类实体清单、三张用例模板。有了它们,后面第三章的建表语句就是顺水推舟的事。

3. 数据库设计:把进销存报告里的表结构还原成可执行的SQL

进销存管理系统课程设计报告里,数据库设计通常占最大篇幅,也最容易注水。很多报告贴了一堆建表语句,但表与表之间没有外键、没有索引,甚至连自增主键都没写清楚。这一章我按“能直接跑出系统”的标准,把需要落实的表结构拆开讲。

3.1 商品表与库存表拆开:别把库存数量写进商品字段

最常见的错误写法是:product表里有一个stock字段,销售时UPDATE product SET stock = stock - 1。这种设计在小数据量下看着能用,但有两个先天问题:一是商品资料被频繁更新,二是所有历史库存变动丢失。重则对账无据可查,轻则盘点时不知道库存怎么差出来的。

正确做法是拆成商品档案表和库存快照表。商品表保存静态信息,库存表保存动态数量。

CREATE TABLE product ( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, barcode VARCHAR(32) UNIQUE, spec VARCHAR(50), unit VARCHAR(10), sell_price DECIMAL(10,2) NOT NULL DEFAULT 0, purchase_price DECIMAL(10,2) NOT NULL DEFAULT 0, status TINYINT NOT NULL DEFAULT 1 COMMENT '1在售 0停用', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ) COMMENT '商品档案'; CREATE TABLE inventory ( product_id BIGINT PRIMARY KEY, quantity DECIMAL(12,3) NOT NULL DEFAULT 0, lower_limit DECIMAL(12,3) NOT NULL DEFAULT 0, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) COMMENT '库存快照';

这里有几个参数需要说明。quantity用DECIMAL(12,3)而不是FLOAT,是因为金额和数量都不该用浮点数存。小商店卖散装米面时按斤称重,数量可能是 1.235 斤,三位小数够用;如果你只卖整件整箱的饮料,改成DECIMAL(10,0)也行,但没留小数会限制以后扩展。

lower_limit字段是库存预警的下限阈值,它放在库存表而不是商品表,因为不同批次、不同门店可以有不同的警戒线。课程设计一般不做多门店,放在库存表里单独维护也方便后续改。product.status字段用于软删除,商品下架时置 0,不要物理删除,这个设计后面避坑章节还会再提。

3.2 盘点与预警:一条SQL撑起库存下限检查

库存预警模块在课程设计里经常被做成一个只读列表:把quantity < 5的商品显示出来。这个“5”如果写死在代码里,老师稍微改一个数量的临界值,你就得改代码重新部署。正确做法是把阈值放进数据库,然后建一个预警视图。

CREATE VIEW inventory_alert AS SELECT p.id AS product_id, p.name AS product_name, i.quantity, i.lower_limit, i.quantity - i.lower_limit AS exceed_diff FROM inventory i JOIN product p ON p.id = i.product_id WHERE i.quantity <= i.lower_limit;

视图的好处是:预警逻辑只写一次,Java、Python、报表模块都能查同一张视图。参数调整时只需更新inventory.lower_limit,前台展示自然跟着变化。

盘点功能也不能只靠一张库存表,需要一张盘点差异表来记录每次盘点的账面数、实盘数和差异原因。

CREATE TABLE stocktake ( id BIGINT PRIMARY KEY AUTO_INCREMENT, product_id BIGINT NOT NULL, book_quantity DECIMAL(12,3) NOT NULL, actual_quantity DECIMAL(12,3) NOT NULL, diff_quantity DECIMAL(12,3) NOT NULL, reason VARCHAR(200), status TINYINT NOT NULL DEFAULT 0 COMMENT '0待审核 1已生效', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ) COMMENT '盘点差异记录';

book_quantity在生成盘点单时从库存表带出来,actual_quantity由盘点人录入,diff_quantity用程序计算。审核通过后,再写一条change_qty为差异数的库存流水,并调整库存快照。这样做的目的是保证调整有据可查,避免盘点操作变成“拍脑袋改库存”。

3.3 单据表与流水表:用一条流水替代原地改库存

整个进销存系统里最值得认真设计的表,就是库存流水表。它就像是数据库的黑匣子,记录每一次库存变动的前因后果。

CREATE TABLE inventory_transaction ( id BIGINT PRIMARY KEY AUTO_INCREMENT, product_id BIGINT NOT NULL, change_qty DECIMAL(12,3) NOT NULL COMMENT '正数入库,负数出库', before_qty DECIMAL(12,3) NOT NULL, after_qty DECIMAL(12,3) NOT NULL, biz_type VARCHAR(20) NOT NULL COMMENT 'PURCHASE/SALE/RETURN/STOCKTAKE', biz_no VARCHAR(40) NOT NULL COMMENT '关联业务单号', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ) COMMENT '库存流水记录';

这四列是关键:before_qty、after_qty、change_qty、biz_type。change_qty表示本次变了多少,正负号代表方向;before_qty和after_qty记录变化前后的库存值,用于对账;biz_type表示这笔变动来自哪个业务;biz_no是关联的采购单号、销售单号或盘点单号。

有了这张表,库存表反而成了一个“冗余”的快照——真正可审计的是流水。每次做业务操作时,在同一事务里插入流水、更新库存快照。这个过程可以用一段 SQL 模板来描述。

START TRANSACTION; -- 锁定商品库存,防止并发下超卖 SELECT quantity INTO @cur_quantity FROM inventory WHERE product_id = 1 FOR UPDATE; -- 写入流水:销售出库 2 件 INSERT INTO inventory_transaction (product_id, change_qty, before_qty, after_qty, biz_type, biz_no) VALUES (1, -2, @cur_quantity, @cur_quantity - 2, 'SALE', 'SO20250001'); -- 更新库存快照 UPDATE inventory SET quantity = @cur_quantity - 2 WHERE product_id = 1; COMMIT;

注意FOR UPDATE的作用:当一个事务读取库存并准备扣减时,其他事务必须等它提交后才能再读。这是防止超卖的最基本手段。如果你的课程设计选用的是 SQLite 而不是 MySQL,SQLite 没有FOR UPDATE,那就改用带条件的更新语句,这一点留到避坑章节展开。

3.4 外键与索引:课程设计评分里看不见的加分项

表结构写完,最后要加索引和外键。进销存查询最常见的条件是:按商品查流水、按单号查单据、按时间统计销售。所以inventory_transaction表至少要给product_id和created_at建联合索引,给biz_no建普通索引。

ALTER TABLE inventory_transaction ADD INDEX idx_txn_product_time (product_id, created_at); ALTER TABLE inventory_transaction ADD INDEX idx_txn_biz_no (biz_no);

外键方面,我建议在小商店课设里加上。虽然很多生产环境为了性能会去掉外键,但课程设计的数据量很小,外键能防止程序里写出“订单明细指向不存在的商品”这种脏数据。

ALTER TABLE inventory_transaction ADD CONSTRAINT fk_txn_product FOREIGN KEY (product_id) REFERENCES product(id);

外键带来一个连带要求:删除商品时数据库会拦截,必须先将商品状态置为停用。这个约束恰恰是业务上需要的。不会有人真的想删除一条带着历史流水的商品记录,那等于销毁账本。报告里如果能在“数据库设计”部分写一句“外键约束用于保证引用完整性,同时配合软删除策略”,老师就知道你不是随手复制建表脚本。

4. 代码实现:从Java/Swing到WebFlask,怎么落地这套系统

数据库设计完成,接下来就是落地实现。课程设计最常见的两种路线:Java Swing 桌面程序 + MySQL,以及 Python Flask 网页 + MySQL。前者是传统课设路线,界面控件拖动方便;后者开发速度快,答辩时浏览器打开就能演示。我一般建议动手能力一般、还要抽时间复习期末考试的同学选 Flask。

4.1 选型:为什么课程设计最常见的还是三层结构

不管用哪种语言,系统都要拆成三层:界面层、业务层、数据访问层。很多课程设计报告只有一个页面和一个大杂烩的clickButton方法,所有 SQL 写在按钮事件里,看起来功能都实现了,但老师问“退货逻辑能不能复用”就没有答案。

下面是一个 Flask 项目的推荐目录,可以直接照搬进报告作为“系统实现结构”。

shop_ess/ ├── app.py # 路由与页面跳转 ├── db.py # 数据库连接 ├── models/ # 数据访问封装 │ ├── product.py │ ├── order.py │ └── transaction.py ├── services/ # 业务逻辑层 │ ├── sale_service.py │ ├── purchase_service.py │ └── stocktake_service.py ├── templates/ # HTML页面 └── static/ # CSS/JS

对应到 Java Swing,三层结构就是:界面类放在view包,逻辑代码写在service包,JDBC 操作写在dao包。界面层绝对不直接执行 UPDATE 语句,这一点写进报告的“系统架构”章节里,比贴十个页面截图更有说服力。

4.2 用户登录与权限:报告里必须有的模块

登录模块是进销存系统必备的门面,但很多课程设计只做一个“用户名密码正确就跳转”,没有任何权限区分。进销存里,普通收银员不应该能改商品进价,采购员不应该能看销售利润。user 表至少需要保留一个role字段。

from flask import Flask, session, request, redirect app = Flask(__name__) @app.post("/login") def login(): username = request.form.get("username") password = request.form.get("password") user = db.query_one( "SELECT id, username, role " "FROM user WHERE username=%s AND password=%s", (username, password) ) if user is None: return "用户名或密码错误", 401 session["user_id"] = user["id"] session["role"] = user["role"] return redirect("/index")

这段代码里的role字段建议使用固定字符串,比如admin、clerk、manager。不要在数据库里存数字 1、2、3,除非你在代码里写好注释“1管理员 2收银 3采购”。否则过两周自己都分不清。实际课程设计里,密码可以明文存,因为不涉及真实生产环境;但为了面子上好看一点,建议用 MD5 加盐或者直接把 password 写成md5(password)再入库。注意,这里只是为了让课设演示合规,并不是教你设计生产级认证。

4.3 进货单和销售单:事务边界放在哪里

销售出库是进销存里最需要“较真”的地方。它不是一个 UPDATE,而是三步操作必须同时成功:校验库存、写流水、更新库存。任何一步失败都要全部回滚,否则就会出现“库存没减但是流水记了”或者反过来。

下面这段代码是销售出库业务的核心逻辑,可以直接改造成 MySQL 版本。

def create_sale_order(product_id, qty, biz_no): if qty <= 0: raise ValueError("销售数量必须为正") with db.conn.begin(): # 开启事务 # 锁定该商品库存行 inv = db.query_one( "SELECT quantity FROM inventory " "WHERE product_id=%s FOR UPDATE", (product_id,) ) if inv is None or inv["quantity"] < qty: raise ValueError("库存不足") before = inv["quantity"] after = before - qty # 写入库存流水 db.execute( "INSERT INTO inventory_transaction " "(product_id, change_qty, before_qty, after_qty, " "biz_type, biz_no) " "VALUES (%s, %s, %s, %s, 'SALE', %s)", (product_id, -qty, before, after, biz_no) ) # 更新库存快照 db.execute( "UPDATE inventory SET quantity=%s " "WHERE product_id=%s", (after, product_id) )

代码里有两个细节值得写进报告。第一是FOR UPDATE,它把商品对应的库存行锁住,防止两个销售单并发时都读到同一个库存数。第二是-qty的符号含义,库存流水表用正负号区分方向,所有下游报表都依赖这个约定。如果进货单也要做类似操作,业务类型换成PURCHASE,change_qty变成正数,校验逻辑从“库存不足”改成“商品是否存在”,其余部分完全一样。

如果你不想用行锁,可以使用一条带条件的更新语句,写法更简单:UPDATE inventory SET quantity = quantity - %s WHERE product_id = %s AND quantity >= %s,然后检查返回的影响行数,为 0 就说明库存不足。两种做法都能防超卖,前者适合下面的代码控制复杂度,后者适合写进报告作为“数据库防超卖”的备选方案。

4.4 库存预警与报表:最后一个模块别写成摆设

课程设计报告通常把“统计报表”放在最后一个模块,很多同学只做一个“商品列表”,排序都没有。实际上销售报表是老师爱问的地方,因为一张报表 SQL 就能看出你到底懂不懂多表关联和聚合。

下面这条 SQL 统计最近七天销量最高的十个商品:

SELECT p.name AS product_name, SUM(-t.change_qty) AS sold_qty, SUM(-t.change_qty * p.sell_price) AS sales_amount FROM inventory_transaction t JOIN product p ON t.product_id = p.id WHERE t.biz_type = 'SALE' AND t.created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY) GROUP BY p.id, p.name ORDER BY sales_amount DESC LIMIT 10;

这条 SQL 的关键是-t.change_qty。库存流水的出库数量是负数,取相反数就是正数的销售量。sales_amount用的是商品当前售价,没把历史价格快照加进来,这在课程设计里可以接受;但如果商品价格经常变动,销售明细就还需要同时保存成交价,否则报表会失真。这个点写进报告,可以展示你对表结构的思考深度。

报表模块实现完,整个系统的功能闭环就结束了。从用户登录、采购入库、销售出库、库存预警到统计报表,每一层都对应前面设计的表。接下来聊聊最容易让人翻车的细节。

5. 避坑:进销存课程设计最容易翻车的5个细节

写代码的过程基本不会顺风顺水。下面这五个坑,是我看课设代码时最常见的,按“现象 → 原因 → 解决”的顺序列出。

5.1 现象:库存越卖越负,预警一直弹

明明系统里没有那么多货,收银员还能继续下单,库存表变成负数。检查 SQL 发现是直接UPDATE inventory SET quantity = quantity - 1 WHERE product_id = 1,压根没有判断库存够不够。

原因:业务层只写了“查库存 → 够就减、不够就提示”,但查和减之间没有做原子性保护。另一个可能原因是测试数据自己把库存改成负数了。

解决:在业务层先SELECT quantity FROM inventory WHERE product_id=%s FOR UPDATE,或者直接用条件更新UPDATE inventory SET quantity = quantity - %s WHERE product_id = %s AND quantity >= %s。用条件更新时,cursor.rowcount返回 0 就说明库存不足。

5.2 现象:并发点击销售按钮,库存超卖

这张单明明只剩一件商品,两个收银员同时点“提交”,系统都显示成功。原因是两条请求同时读到quantity=1,各自算完after=0,再分别写回,库存变成 0,但卖出了两件。

原因:没有锁。先SELECT再UPDATE的代码天然存在竞态条件。

解决:一个是前面说过的FOR UPDATE行锁,另一个是把“检查库存”和“扣减库存”合并成一条 UPDATE。后者更适合课设的代码简洁度,不用改原 SQL,只需要给 UPDATE 加一个AND quantity >= 2条件,并判断返回影响行数。

5.3 现象:商品一删,历史销售单的报表全乱了

删除商品之后,销售明细和库存流水里还留着product_id,但商品表里已经没有对应记录了。查询报表时JOIN product查不到名称,页面直接报错或者显示空值。

原因:直接发了DELETE FROM product WHERE id = 1,没有意识到商品是主数据,被订单和流水引用。

解决:不要物理删除,把product.status改成 0。代码查询商品列表时默认加WHERE status = 1,但查询历史报表时只 join 商品表的 id 和 name,不管 status。如果商品有停用状态,库存表里仍然保留它的库存数据,盘点时也还能看到。

5.4 现象:金额对不上账,差几分钱

销售统计显示 100.85,人工打完单据一合计是 100.84,就差一分。排查后发现数据库字段用的是FLOAT(10,2),Java 或 Python 里又用浮点数做乘法:2.55 * 39得到 99.449999999。

原因:浮点数二进制表示导致精度丢失。金额不是整数,绝对不能存成 FLOAT 或 DOUBLE。

解决:数据库字段统一DECIMAL(10,2),代码里用Decimal('39.00')计算,最后存入数据库时再转字符串。报表统计时同样用SUM()由数据库计算,不要取出来自己逐个+=。

5.5 现象:报告里的SQL和运行时的SQL不是同一份

答辩的时候老师打开报告,看到建表语句,随后打开你的项目跑了一遍,发现表名不一样,字段缺了好几个。原因多半是报告从网上复制了整套 SQL,自己实际上用CREATE TABLE IF NOT EXISTS重建了一套缩水版。

解决:做完功能后,用数据库工具mysqldump导出真实表结构,替换报告里的附录。更稳妥的做法是项目里只保留一份db.sql,代码启动时按顺序执行它建库建表,报告里写的也是这一份。这样无论老师怎么查,表和代码都是一一对应的。

6. 把报告写到能直接答辩:验证用例与文档排版技巧

报告写到最后,别急着交。先用一张验收用例表跑一遍,确认每个模块都能正常响应异常输入,再处理排版和交付物。

用例组输入预期结果
登录错误密码拒绝登录并提示
登录正确账号无权限登录成功但菜单不含入库入口
进货数量为0或负拒绝并提示
进货正常入库库存增加,流水出现 PURCHASE
销售库存不足拒绝出库并提示
销售正常出库库存减少,流水出现 SALE
退货退货数量大于订单数量拒绝并提示
盘点盘点差异审核生效库存快照修正,流水出现 STOCKTAKE
报表无数据期间显示空报表而不是报错

答辩时,别急着展示界面,先讲“库存流水表怎么设计”,再演示一次销售出库,强调事务回滚和防超卖。老师最想听的,是你对数据一致性的理解,而不是按钮漂不漂亮。

交付物里,docx 之外放一个db.sql、一个README.md、一份项目源码压缩包。README 里写清楚怎么建库、怎么启动、默认管理员账号密码。这样老师复现时不用东找西找,印象分会好很多。

我每次交课程设计前,一定会把数据库删掉,从零执行一遍db.sql,然后跑一遍上面的用例表。这个过程能发现大量“在自己机器上才能跑”的隐性依赖。能坐在答辩现场的同学,基本都是被这个习惯救过命的。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询