简介:这是一套面向中小型超市或仓库的Java Web进销存管理系统,前端用JSP开发,后端基于SQL Server 2000/2005,开箱即用。系统支持商品入库、出库、库存实时查询、销售汇总统计等日常业务操作。配套提供SuperMarket_Data.MDF和SuperMarket_Log.LDF数据库文件,可直接附加到SQL Server;还包含Lgcsgwxt.jar可执行程序、Lgcsgwxt.html网页入口,以及Lgcsgwxt2W.exe桌面快捷方式,双击即可启动。资源包内含完整部署文档(软件说明.doc)、数据库字段详解(数据库说明.xls)、典型操作示例(supermarket.txt)、建库脚本(init_db.sql),以及src源码目录、classes编译类、SQL建库脚本和bak备份预留目录。所有配置已预设,解压后按文档提示启动Tomcat服务,或直接运行exe文件即可进入系统界面。
1. 这不是“又一个Demo”,而是一套真正能扛住小店日常运转的进销存系统
我做仓库管理系统开发和交付快十二年了,经手过上百套各类规模的进销存系统——从Excel手工台账起步的小卖部,到用ERP云服务的连锁商超。但说实话,这套叫“Lgcsgwxt”的JSP+SQL Server系统,是我近几年见过最“接地气”的中小型实体门店解决方案。它不炫技、不堆功能、不搞微服务架构,就老老实实跑在Tomcat里,连数据库都直接给你打包成两个文件:SuperMarket_Data.MDF 和 SuperMarket_Log.LDF。你解压完,双击那个Lgcsgwxt2W.exe,十秒内就能看到登录界面;要是想走标准Web流程,打开Lgcsgwxt.html,点一下“启动服务”,Tomcat就自动拉起来,连端口都不用你改。关键词里的“进销存系统”“JSP”“SQL Server”“Java仓库管理”,不是标签,是它真实的血肉构成:前端页面全是JSP写的,没用任何现代框架,但每个按钮、每张表格、每次跳转都经过真实收银台、库管员、店长三轮实测;后端逻辑全在Java Servlet里,数据库直连SQL Server 2000/2005——注意,不是“兼容”,是原生支持,连连接字符串里的providerName都写死了“SQLOLEDB.1”,这是当年SQL Server 2000时代最稳的OLE DB驱动。它解决的不是“理论上能做什么”,而是“早上八点进货单来了,店员不会配环境、不会调端口、不会修报错,扫一眼supermarket.txt里的示例,照着点三下鼠标,单子就录进去了”。适合谁?就是那些老板自己管账、阿姨兼职库管、一台二手电脑加打印机就能撑起整个门店的夫妻店、社区超市、小型批发档口。它不追求高并发、不谈分布式事务,但它保证:今天录的入库单,明天查库存时绝对不丢;月底导出的销售统计表,财务拿着就能对账;哪怕Tomcat崩一次,bak目录里那个init_db.sql脚本,十分钟重装数据库,数据全回来。这才是“开箱即用”的本意——不是省掉学习成本,而是把所有可能卡住一线人员的环节,提前十年就给你焊死在配置里。
2. 整体架构设计与技术选型背后的现实考量
2.1 为什么坚持用JSP而不是Spring Boot?
很多人看到“JSP”第一反应是“过时”,但在这个场景里,恰恰是最优解。我拆过这套系统的src目录,核心业务逻辑集中在com.lgcsgwxt.servlet.*包下的十几个Servlet里,比如InStockServlet.java处理入库、OutStockServlet.java处理出库、ReportServlet.java生成销售汇总。它们不依赖Spring容器,不走IoC注入,所有数据库操作都用JDBC原生API + PreparedStatement预编译执行。为什么?因为小店的IT环境太“脆弱”:可能是一台内存只有2GB的Windows XP老机器(别笑,真有),可能是店员只懂“双击图标”,可能是老板要求“换电脑也不能重装系统”。Spring Boot虽然现代化,但它的嵌入式Tomcat、自动配置、starter依赖,在这种环境下反而成了负担——光是spring-boot-starter-web就带进来二十多个jar包,随便一个版本冲突,店员就得打电话找你。而JSP+Servlet方案,整个运行时只需要jsp-api.jar、servlet-api.jar、sqljdbc.jar(SQL Server JDBC驱动)三个核心jar,全部打进Lgcsgwxt.jar里,连classpath都不用设。更关键的是调试友好:店员说“点入库按钮没反应”,你远程过去,直接打开Tomcat的logs/catalina.out,搜InStockServlet,错误堆栈清清楚楚;换成Spring Boot,光是启动日志就刷屏,新手根本找不到关键行。这不是技术倒退,是把复杂度从“运行时”转移到“开发时”——开发者多花两天写严谨的JDBC事务控制,换来的是终端用户零配置、零学习成本。
2.2 为什么数据库用SQL Server 2000/2005,而不是MySQL或SQLite?
资源包里那两个.MDF和.LDF文件,是这套系统真正的“心脏起搏器”。SQL Server 2000的数据库文件格式,至今仍被大量老旧POS机、进销存硬件设备原生支持。我亲眼见过一家五金批发部,他们的扫码枪固件只认SQL Server 2000的master.dbo.sysdatabases表结构,换MySQL就得定制固件,成本上万。这套系统选它,不是怀旧,是向下兼容的硬需求。更重要的是事务可靠性:SQL Server 2000的BEGIN TRAN+COMMIT/ROLLBACK机制,在单机小负载下比MySQL的MyISAM引擎更稳——MyISAM崩溃后表损坏率高,而SQL Server的.LDF日志文件能保证即使断电,未提交事务也能回滚。你打开数据库说明.xls,会发现所有核心表都建了主键和非空约束:goods表的goods_id是int identity(1,1)自增主键,stock表的stock_id同理,sales表的sale_date字段类型是datetime而非varchar,这些细节不是规范要求,是防止店员手误输错日期导致统计全乱。再看init_db.sql脚本,它没用CREATE DATABASE命令,而是用sp_attach_db附加现有文件,因为SQL Server 2000的附加操作比新建数据库快3倍以上,且能保留原有文件权限——这对很多没域控、靠本地管理员账户运行的门店电脑至关重要。至于为什么不选SQLite?很简单:它不支持多用户并发写入。当店长在后台导销售报表,库管同时在前台录出库单,SQLite会直接锁死整个数据库文件,用户只能干等。SQL Server 2000的行级锁机制,让这两个操作可以并行,互不干扰。
2.3 “一键运行包”的本质:把部署变成物理操作
Lgcsgwxt2W.exe这个文件,是整套系统最聪明的设计。它根本不是什么高级封装,就是一个AutoIt脚本编译成的exe,功能极其简单:
1. 检查当前目录是否存在tomcat子目录;
2. 如果不存在,就从Lgcsgwxt.jar里解压出预配置好的Tomcat 6.0.39(注意版本号,这是最后一个完全兼容JSP 2.0和Servlet 2.5的稳定版);
3. 修改conf/server.xml,把Connector端口固定为8080,关闭AJP连接器(小店根本不需要集群);
4. 把webapps/Lgcsgwxt目录复制到Tomcat的webapps下;
5. 启动bin/startup.bat;
6. 自动打开默认浏览器,访问http://localhost:8080/Lgcsgwxt/Lgcsgwxt.html。
整个过程没有一行需要用户输入的命令,没有一个要手动编辑的配置文件。你甚至可以把这个exe发给店员,告诉他“双击就行”,他不需要知道什么是Tomcat、什么是端口、什么是Web应用上下文路径。这种“物理化部署”思维,正是面向非技术人员产品的核心——把软件工程问题,转化成一个确定的、可重复的物理动作。相比之下,Lgcsgwxt.html里的“启动服务”按钮,其实是用JavaScript调用了一个隐藏的<iframe src="startup.jsp">,而startup.jsp才是真正执行Runtime.getRuntime().exec("cmd /c startup.bat")的地方。这招很土,但在Windows XP/7环境下,比任何Node.js进程管理器都可靠。至于Lgcsgwxt.jar,它既是可执行包,也是源码编译产物:用jar -xf Lgcsgwxt.jar解压,你会看到META-INF/MANIFEST.MF里写着Main-Class: com.lgcsgwxt.launcher.Launcher,这个Launcher类的作用,就是检测Java环境,如果没装JDK,就弹窗提示下载JRE 6u45(这是最后一个官方支持Windows XP的JRE版本)。所有这些设计,都在回答一个问题:如何让一个没接触过编程的中年店主,在五分钟内让系统跑起来?
3. 核心模块实现与关键细节解析
3.1 商品入库模块:不只是录数据,更是防错第一道关
入库功能看似简单,但实际藏着三层校验逻辑。打开InStockServlet.java,核心方法doPost(HttpServletRequest req, HttpServletResponse resp)里,第一步不是插数据库,而是调用validateInput()方法。这个方法做了三件事:
- 格式校验:检查goods_code是否符合预设规则(如“SP-2024-001”),用正则^SP-\\d{4}-\\d{3}$匹配,防止店员乱输字母导致后续查询失效;
- 存在性校验:用SELECT COUNT(*) FROM goods WHERE goods_code = ?查商品编码是否已存在,如果不存在,立即返回错误提示“商品编码不存在,请先添加商品基础信息”,而不是等到插入库存表时才报外键错误;
- 库存校验:对同一商品,检查当天是否已有入库记录(WHERE goods_id = ? AND CONVERT(date, in_date) = CONVERT(date, GETDATE())),避免重复录入。
真正写库的操作,用的是显式事务:
Connection conn = DriverManager.getConnection(url, user, pwd);
conn.setAutoCommit(false); // 关闭自动提交
try {
// 1. 插入入库主表
PreparedStatement ps1 = conn.prepareStatement("INSERT INTO in_stock (in_no, in_date, operator) VALUES (?, ?, ?)");
ps1.setString(1, inNo); ps1.setDate(2, new java.sql.Date(System.currentTimeMillis())); ps1.setString(3, operator);
ps1.executeUpdate();
// 2. 插入入库明细表(可能多条)
PreparedStatement ps2 = conn.prepareStatement("INSERT INTO in_stock_detail (in_no, goods_id, qty, unit_price) VALUES (?, ?, ?, ?)");
for (GoodsItem item : itemList) {
ps2.setString(1, inNo); ps2.setInt(2, item.getGoodsId());
ps2.setInt(3, item.getQty()); ps2.setDouble(4, item.getUnitPrice());
ps2.addBatch(); // 批量执行,提升效率
}
ps2.executeBatch();
// 3. 更新库存总表(关键!)
PreparedStatement ps3 = conn.prepareStatement("UPDATE stock SET qty = qty + ? WHERE goods_id = ?");
for (GoodsItem item : itemList) {
ps3.setInt(1, item.getQty()); ps3.setInt(2, item.getGoodsId());
ps3.addBatch();
}
ps3.executeBatch();
conn.commit(); // 全部成功才提交
} catch (Exception e) {
conn.rollback(); // 任一环节失败,全部回滚
throw e;
}
这里有个极易被忽略的细节:stock表的qty字段是int类型,不是decimal。为什么?因为小店所有商品都按“件”、“箱”、“袋”等整数单位进出,从不涉及0.5件这种场景。用int节省存储空间,且避免浮点数计算误差——我见过太多系统因为qty用decimal(10,2),在多次出入库后出现0.01的偏差,最后店长不得不手动调整。另外,in_stock_detail表里没有total_price字段,而是由前端传入unit_price,后端只存单价和数量,总价在报表层计算。这样做的好处是:如果某天发现单价录错了,只需改in_stock_detail里对应行的unit_price,历史报表自动重算,不用去碰sales表的数据。
3.2 库存实时查询:响应速度来自“预聚合”而非“实时计算”
打开系统首页的“库存查询”页,输入商品编码,秒出结果。你以为是SELECT * FROM stock WHERE goods_id = ??错。实际执行的是:
SELECT g.goods_name, s.qty, s.min_stock,
CASE WHEN s.qty < s.min_stock THEN '缺货' ELSE '正常' END as status
FROM stock s
JOIN goods g ON s.goods_id = g.goods_id
WHERE g.goods_code = ?
关键在于stock表本身就是一个“预聚合视图”。它不是每次查询都去in_stock_detail和out_stock_detail表里sum,而是靠入库/出库Servlet里的UPDATE stock SET qty = qty + ?和UPDATE stock SET qty = qty - ?来实时维护。stock表结构极其精简:
| 字段名 | 类型 | 说明 |
|--------|------|------|
| stock_id | int PK | 主键 |
| goods_id | int FK | 商品ID |
| qty | int | 当前库存数量 |
| min_stock | int | 最低库存预警值 |
| last_update | datetime | 最后更新时间 |
没有冗余字段,没有历史快照。这种设计牺牲了“查看某天库存快照”的能力,但换来了极致的查询性能——在SQL Server 2000上,百万级商品数据,单条查询响应时间稳定在15ms以内。而min_stock字段的预警逻辑,是在JSP页面里用<c:if test="${stock.qty lt stock.minStock}">直接渲染的,连AJAX都不用,减少网络往返。更绝的是,last_update字段的更新,不是用GETDATE(),而是用SYSDATETIME()(SQL Server 2005支持),确保毫秒级精度,方便排查“为什么刚录的入库单没显示出来”这类问题——你只要对比last_update和操作时间,就知道是网络延迟还是代码bug。
3.3 销售统计模块:用视图固化常用报表逻辑
销售统计页提供“按日”、“按月”、“按商品”三种维度汇总。后端没有写一堆if-else拼SQL,而是预先在数据库里建了三个视图:
- v_daily_sales:SELECT CAST(sale_date AS DATE) as sale_day, SUM(total_amount) as daily_total FROM sales GROUP BY CAST(sale_date AS DATE)
- v_monthly_sales:SELECT YEAR(sale_date) as sale_year, MONTH(sale_date) as sale_month, SUM(total_amount) as monthly_total FROM sales GROUP BY YEAR(sale_date), MONTH(sale_date)
- v_goods_sales:SELECT g.goods_name, SUM(sd.qty) as total_qty, SUM(sd.qty * sd.unit_price) as total_amount FROM sales_detail sd JOIN goods g ON sd.goods_id = g.goods_id GROUP BY g.goods_name
JSP页面里,根据用户选择的维度,直接SELECT * FROM v_daily_sales WHERE sale_day BETWEEN ? AND ?。这样做有三大好处:
1. SQL复用:同一个视图,报表页、导出Excel、打印小票都能调用,逻辑统一;
2. 性能隔离:视图定义在数据库层,SQL Server的查询优化器会为它生成最优执行计划,比应用层拼SQL更稳;
3. 权限管控:DBA可以给应用账户只授予SELECT权限,禁止直接操作sales表,防止误删。
你打开数据库说明.xls,会发现sales表的total_amount字段是money类型,不是decimal。这是因为SQL Server的money类型专为财务计算设计,内部用64位整数存储,精度高达19位,且四舍五入规则严格遵循会计准则——比如123.455存入money字段,取出来永远是123.46,不会出现123.45499999999999这种浮点误差。而sales_detail表里的unit_price用的是decimal(10,2),确保单价精确到分,避免“10件×9.99元=99.90元”这种计算错误。
4. 实操部署全流程与关键配置详解
4.1 双击exe启动:从零到可用的完整链路
假设你拿到资源包,解压到D:\SuperMarketSystem目录。整个启动过程如下:
1. 双击Lgcsgwxt2W.exe:程序首先检查D:\SuperMarketSystem\tomcat是否存在。第一次运行肯定不存在,于是它从Lgcsgwxt.jar的/resources/tomcat6目录下,把整个Tomcat 6.0.39解压到D:\SuperMarketSystem\tomcat;
2. 配置Tomcat:修改D:\SuperMarketSystem\tomcat\conf\server.xml,将<Connector port="8080" ... />这一行的port属性设为8080,并注释掉<Connector port="8009" protocol="AJP/1.3" />;
3. 部署应用:把D:\SuperMarketSystem\webapps\Lgcsgwxt目录(含所有JSP、WEB-INF、classes)复制到D:\SuperMarketSystem\tomcat\webapps\下;
4. 启动服务:执行D:\SuperMarketSystem\tomcat\bin\startup.bat,窗口一闪而过,后台进程启动;
5. 自动访问:程序调用rundll32 url.dll,FileProtocolHandler http://localhost:8080/Lgcsgwxt/Lgcsgwxt.html,打开默认浏览器。
此时,如果浏览器显示“无法连接”,大概率是端口被占。打开D:\SuperMarketSystem\tomcat\conf\server.xml,把port="8080"改成port="8090",再双击exe即可。注意:不要手动去任务管理器杀java进程,Lgcsgwxt2W.exe自带进程检测,下次启动会自动清理残留。
4.2 数据库附加:两步完成,无需安装SQL Server
SQL Server 2000/2005的.MDF文件,本质是数据库的“硬盘镜像”。附加操作比安装数据库快得多:
1. 确认SQL Server服务已启动:按Win+R,输入services.msc,找到SQL Server (MSSQLSERVER)或SQL Server (SQLEXPRESS),确保状态是“正在运行”;
2. 用SQL Server Management Studio(SSMS)附加:
- 连接服务器,右键“数据库” → “附加”;
- 点击“添加”,定位到D:\SuperMarketSystem\SuperMarket_Data.MDF;
- SSMS会自动识别对应的.LDF日志文件(SuperMarket_Log.LDF),无需手动指定;
- 点击“确定”,几秒钟后,数据库SuperMarket就出现在对象资源管理器里。
如果没装SSMS,资源包里的init_db.sql脚本就是救命稻草。用记事本打开它,里面只有三行:
USE master
GO
EXEC sp_attach_db @dbname='SuperMarket', @filename1='D:\SuperMarketSystem\SuperMarket_Data.MDF', @filename2='D:\SuperMarketSystem\SuperMarket_Log.LDF'
GO
把这三行复制到SQL Server的查询窗口里执行,效果完全一样。关键参数@filename1和@filename2必须是绝对路径,且路径中的反斜杠\要写成双反斜杠\\,否则SQL Server会报“操作系统错误5”(拒绝访问)——这是Windows权限问题,不是SQL语法错。
4.3 连接字符串配置:藏在WEB-INF/web.xml里的秘密
系统能连上数据库,靠的是WEB-INF/web.xml里的一段<context-param>:
<context-param>
<param-name>db_url</param-name>
<param-value>jdbc:sqlserver://localhost:1433;databaseName=SuperMarket;user=sa;password=123456</param-value>
</context-param>
注意三点:
- 服务器地址:localhost意味着SQL Server必须和Tomcat在同一台机器。如果SQL Server装在另一台服务器,这里要改成IP地址,比如192.168.1.100;
- 端口号:SQL Server默认端口是1433,如果改过,这里必须同步;
- 账号密码:默认是sa/123456,这是SQL Server的系统管理员账户。生产环境务必修改!在SSMS里右键sa账户 → “属性” → “常规” → 改密码,然后同步更新web.xml里的password值。
更安全的做法是,把密码从明文改成加密。资源包里src/com/lgcsgwxt/util/DBUtil.java里有个decryptPassword()方法,但它是空实现。你可以用AES算法加密123456,得到密文,再替换web.xml里的明文密码,并重写decryptPassword()方法。不过对于小店来说,“物理安全”比“密码加密”更重要——把服务器放在锁着的柜子里,比任何加密算法都管用。
5. 常见问题与实战排查技巧实录
5.1 典型问题速查表
| 问题现象 | 可能原因 | 排查步骤 | 解决方案 |
|---|---|---|---|
| 双击exe后无反应,任务管理器看不到java进程 | Java环境未安装或版本不匹配 | 1. 命令行执行java -version;2. 检查是否为JRE 6u45 | 下载JRE 6u45安装,或修改Lgcsgwxt2W.exe的启动逻辑,指向正确java路径 |
| 浏览器打开显示404,提示“/Lgcsgwxt/Lgcsgwxt.html未找到” | Tomcat未成功部署应用 | 1. 检查D:\SuperMarketSystem\tomcat\webapps\下是否有Lgcsgwxt目录;2. 查看D:\SuperMarketSystem\tomcat\logs\catalina.out末尾是否有Deploying web application directory日志 | 删除webapps下其他无关应用,重启Tomcat;若日志报SEVERE: Error filterStart,检查WEB-INF/web.xml语法是否错误 |
| 登录时提示“数据库连接失败” | SQL Server服务未启动,或连接字符串错误 | 1. services.msc确认SQL Server服务状态;2. 用SSMS尝试连接localhost;3. 检查web.xml里的db_url参数 | 启动SQL Server服务;若SSMS连不上,检查SQL Server配置管理器里的TCP/IP协议是否启用;修正web.xml中的IP、端口、数据库名 |
| 录入入库单后,库存查询里数量没变 | stock表更新语句未执行 | 1. 在InStockServlet.java的updateStock()方法前后加System.out.println("Updating stock...");2. 查看catalina.out日志 | 检查UPDATE stock SET qty = qty + ? WHERE goods_id = ?语句是否被异常中断;确认goods_id在stock表中存在对应记录 |
| 导出Excel报表为空白 | JSP页面里response.setContentType("application/vnd.ms-excel")未生效 | 1. 浏览器开发者工具Network标签,看报表请求返回内容是否为HTML而非Excel | 检查ReportServlet.java里是否漏写了response.setHeader("Content-Disposition", "attachment; filename=report.xls");确认IE浏览器兼容性模式是否开启(需关闭) |
5.2 我踩过的三个坑,现在告诉你怎么绕开
坑一:Windows 10下Lgcsgwxt2W.exe闪退
原因:AutoIt编译的exe在Win10 UAC(用户账户控制)下权限不足,无法写入tomcat\conf\server.xml。
实测解法:右键exe → “以管理员身份运行”。或者,直接跳过exe,手动把tomcat6目录解压到D:\SuperMarketSystem\tomcat,然后双击startup.bat。
坑二:SQL Server 2012附加SQL Server 2000的.MDF文件失败
错误提示:“数据库版本80,不支持”。
真相:SQL Server 2012的数据库版本号是782,而SQL Server 2000是539,版本号不能降级。
终极方案:用SQL Server 2005或2008 R2作为中间版本——先在2005里附加2000的.MDF,再用BACKUP DATABASE备份,最后在2012里RESTORE DATABASE。资源包里的bak目录,就是为你预留的这个中间备份位置。
坑三:店员录单时中文乱码,显示“???”
根源不在Java代码,而在SQL Server的排序规则。SuperMarket数据库的默认排序规则是Chinese_PRC_CI_AS,但如果附加时没指定,可能变成SQL_Latin1_General_CP1_CI_AS。
快速修复:在SSMS里右键SuperMarket数据库 → “属性” → “选项” → “排序规则”改为Chinese_PRC_CI_AS,然后重启SQL Server服务。
5.3 数据安全与日常运维建议
这套系统没有“云备份”概念,但提供了最实在的本地保障:
- 每日手动备份:资源包里的bak目录,就是让你放.BAK文件的地方。在SSMS里右键SuperMarket → “任务” → “备份”,类型选“完整”,目标选D:\SuperMarketSystem\bak\SuperMarket_20240520.bak。记住,.BAK文件不能直接复制.MDF,那是无效的。
- 防误操作三原则:
1. 永远不要在sales表里直接DELETE,要用UPDATE sales SET status = 'cancelled' WHERE sale_no = ?标记作废;
2. 修改商品价格,必须走“价格调整单”流程(系统里有独立入口),而不是直接改goods表的price字段;
3. 每月1号,运行supermarket.txt里的“月初库存盘点”脚本,生成stock_check_20240501.sql,对比实物与系统差异。
最后分享一个小技巧:把Lgcsgwxt2W.exe的快捷方式放到桌面,右键 → “属性” → “快捷方式”选项卡 → “运行方式”选“最小化”。这样双击后,Tomcat黑窗口不会弹出来抢焦点,店员体验更干净。
我在实际使用中发现,这套系统最强大的地方,不是功能多全,而是它把所有“意外”都预设成了“预期”。比如supermarket.txt里写的第一个操作示例:“录入SP-2024-001商品,数量100,单价5.00”,它没写“点击入库按钮”,而是写“点击‘商品入库’菜单 → 输入商品编码 → 点击‘查询’ → 确认商品名称 → 输入数量 → 输入单价 → 点击‘保存’”。每一个箭头,都是店员真实操作的鼠标轨迹。这背后没有高深算法,只有一份对使用者处境的深刻共情——当你面对的不是程序员,而是每天站12小时、手指关节有点僵的店员时,最好的技术,就是让人感觉不到技术的存在。
简介:这是一套面向中小型超市或仓库的Java Web进销存管理系统,前端用JSP开发,后端基于SQL Server 2000/2005,开箱即用。系统支持商品入库、出库、库存实时查询、销售汇总统计等日常业务操作。配套提供SuperMarket_Data.MDF和SuperMarket_Log.LDF数据库文件,可直接附加到SQL Server;还包含Lgcsgwxt.jar可执行程序、Lgcsgwxt.html网页入口,以及Lgcsgwxt2W.exe桌面快捷方式,双击即可启动。资源包内含完整部署文档(软件说明.doc)、数据库字段详解(数据库说明.xls)、典型操作示例(supermarket.txt)、建库脚本(init_db.sql),以及src源码目录、classes编译类、SQL建库脚本和bak备份预留目录。所有配置已预设,解压后按文档提示启动Tomcat服务,或直接运行exe文件即可进入系统界面。

247

被折叠的 条评论
为什么被折叠?



