尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

还在服役的ASP网上报修系统:Access数据库与IIS部署实战拆解

还在服役的ASP网上报修系统:Access数据库与IIS部署实战拆解 简介这是一套基于ASP技术的网上报修系统源码面向Web开发初学者和有在线工单管理需求的技术人员可用于快速搭建用户注册、登录、报修提交、进度查询、后台处理等功能的维修平台。压缩包共880个文件大小约7.01MB其中包含195个asp核心逻辑文件大量gif/jpg/swf等图片动画界面素材css/js负责前端样式与交互htm文件提供静态页面另有mdb数据库便于数据存取整体配套较完整。已有334人学习下载。解压后可获得完整的系统运行雏形内容预览中的style.asp、index.asp、baoxiu_info.asp、wshbaoxiu_change.asp、mybaoxiu.asp等页面展示了报修录入、修改、查看、密码重置等典型流程覆盖用户前台与后台管理关键环节。通过阅读和调试这些代码可以系统练习ASP服务器端编程、SQL数据库查询、表单处理、会话管理以及SQL注入/XSS等基础安全防护是一份适合入门和提升的实战源码。1. 网上报修系统这套 ASP 老源码还在跑的老业务比新框架更值钱2024 年还在拿 ASP 写业务听起来像考古但你去老校区、老工厂、县城单位看一眼内部报修单子还在 Access 里躺着。这套网上报修系统是个典型的老技术栈ASP 页面 Access 数据库跑在 Windows 的 IIS 上功能就是最朴素的那条链——学生或员工提交报修单后勤管理员看单、派单、回访。正因为技术老它反而是一门值得拆的实操课你不需要理解微服务不需要 Node 环境一台 Windows 电脑开个 IIS 就能把整套流程跑通。适合三类人课程设计拿它改字段交作业的在校生、要给老环境做内部报修利旧的运维、想搞懂 ASP 与 Access 搭配边界的技术人员。它的价值不在代码多新而在于你能在半小时内复现一个真实可用的业务流程。2. 报修系统的物理结构五个目录与一张 Access 单据表下载下来解压后先别急着传服务器。这套系统的代码组织方式非常老派目录界限清楚我先带你把它当一张地图来看后面的配置和改功能都建立在对这张地图的理解上。2.1 conn.asp所有页面共用的那扇门ASP 项目里几乎都有一个 conn.asp 或者 db.asp它的作用全局只有一个创建数据库连接对象。这套系统打开 conn.asp常见写法是用 Server.CreateObject 创建 ADODB.Connection然后通过 Provider 指定 Microsoft.Jet.OLEDB.4.0 驱动去打开 Data 目录下的 Access 数据库文件。提示Microsoft.Jet.OLEDB.4.0 是 Access 2003 及更老版本 mdb 文件的默认驱动。这套系统如果数据库是 .mdb就不要换成 Ace 驱动除非你后续迁移到 .accdb 文件。在实际部署里我一般建议把 conn.asp 里的数据库路径改成 Server.MapPath 相对路径而不是写死C:\Inetpub\wwwroot...。前者在迁移服务器时不用改代码后者换一次机器改一次文件而且经常因为路径少了一级斜杠就报错。% 创建数据库连接对象 Dim conn Set conn Server.CreateObject(ADODB.Connection) Provider 指定 JET 4.0 驱动兼容 32 位 Access 2003 格式 mdb conn.ConnectionString ProviderMicrosoft.Jet.OLEDB.4.0;Data Source Server.MapPath(data/bx.mdb) conn.Open 放一个全局变量供页面里的 Recordset 复用 Dim rs Set rs Server.CreateObject(ADODB.Recordset) %逻辑说明这套网上报修系统的所有列表页、提交页、管理页都会在最顶部用!--#include fileconn.asp--把这段连接逻辑引进来。这样做的好处是数据库文件路径只有一个维护点坏处是 conn.asp 一旦写错整站所有页面同时报错排错时先 ping 这个文件的写法。参数说明ISAPI 筛选器在 IIS 7 以上默认启用JET 4.0 驱动只需要系统里有 MDAC 组件即可。Server.MapPath 是 ASP 内置方法它把虚拟路径data/bx.mdb映射到物理磁盘路径意思是不管网站被部署在哪个盘只要虚拟目录关系对连接串就不会断。2.2 admin 与 user 目录的职责边界这套系统的目录划分是理解权限模型的关键。一般解压后你能看到至少三个固定的物理目录admin 是管理员操作区user 或 guest 是普通报修人操作区data 放的是 Access 数据库文件。有的版本还会多一个 inc 或者 include 目录存放公共函数。admin 目录下通常有这几种典型页面login.asp 是管理员登录list.asp 是报修单列表deal.asp 是处理报修baoxiu_fankui.asp 之类的页面用来做回访记录。user 目录下主要是 add.asp 或 baoxiu.asp 这类提交页面以及查询自己报修进度的 chaxun.asp。注意老系统的权限验证多数写在页面头部比如在 list.asp 第一行判断 Session(admin) 是否为空。你不要以为进了 admin 目录就是安全的没有 Session 校验的页面直接输入 URL 就能访问。拿到这套源码后先检查 admin 下每个页面的头部有没有权限判断。2.3 报修单数据核心表与关键字段Access 里通常有一张名为 baoxiu、repair 或 WorkOrder 的主表。我拆过的几个版本字段大同小异核心逻辑是报修人信息 报修内容 处理人信息 状态位。常见的字段设计如下表所示字段名类型说明id自动编号主键报修单唯一标识baoxiu_ren文本报修人姓名或学号工号bumen文本报修人所属部门dianhua文本联系电话wenti_miaoshu备注报修问题描述长文本baoxiu_time日期/时间报修提交时间chuli_ren文本处理人姓名chuli_time日期/时间处理完成时间zhuangtai数字状态位0 未处理1 处理中2 已完成状态位是整个系统流转的命门。老代码里它就是一个数字字段页面上用 Select Case 或 If 判断显示成中文。你在改这套系统时不要试图把它改成字符串存已完成——老代码到处都是按数字判断的逻辑你改成字符串就得连带改查询 SQL。这一段理解透了接下来就是让它跑起来的事。3. 把源码跑起来IIS 部署与 ASP 运行环境的三个关键开关ASP 不是解压放 wwwroot 就能跑的。尤其现在很多人在 Windows 10/11 上做本地部署IIS 默认根本没安装 ASP 支持。这一章我给你一条能稳定复现的部署路径。3.1 开启 Windows 功能里的 ASP 三件套在新版本 Windows 上部署 ASP 站点第一件事是装 IIS 和 ASP。这一步踩坑率极高因为系统默认只装了静态文件处理ASP 的动态执行模块是关着的。打开启用或关闭 Windows 功能WinR 输入 optionalfeatures 回车在 Internet Information Services 下需要勾选这几项Web 管理工具下的 IIS 管理控制台万维网服务下的应用程序开发功能里的 ASP 和 ISAPI 扩展常见 HTTP 功能里的静态内容。提示如果你用的是 Windows 11 家庭版IIS 功能可能默认不可见这不是系统不支持是功能列表被裁了。用 dism 命令行一样能开下面会说。命令行启用是更适合复现的方式尤其适合写进部署文档里。用管理员身份打开 PowerShell 或 CMD执行以下命令dism /online /enable-feature /featurename:IIS-WebServer /all dism /online /enable-feature /featurename:IIS-ASP /all dism /online /enable-feature /featurename:IIS-ISAPIExtensions /all dism /online /enable-feature /featurename:IIS-ISAPIFilter /all逻辑说明IIS-WebServer 是基础服务IIS-ASP 是 ASP 脚本引擎ISAPI 扩展和筛选器是 ASP 模块快速处理请求的底层接口。四个功能缺哪个页面表现都不一样缺 ASP 引擎会直接下载 .asp 文件而不是执行缺 ISAPI 会报 500.21 内部错误。参数说明/online表示操作当前正在运行的系统/enable-feature后面跟的是 Windows 功能内部名不区分大小写。执行完建议重启一次 IIS运行iisreset命令。3.2 让 Access 数据库文件具备写入权限这是新手翻车最集中的地方。页面能打开列表能看到但只要一提交报修单就报错常见的错误是Microsoft JET Database Engine 错误 80004005 未找到文件或者操作必须使用一个可更新的查询。原因不是代码有问题是 IIS 的匿名用户IUSR 或 IIS_IUSRS 组对 data 目录没有写权限。Access 的 mdb 文件在写入时会自动创建一个同名的 .ldb 锁文件如果对这个目录没有修改权限JET 引擎认为数据库不可写直接抛错。icacls C:\inetpub\wwwroot\baoxiu\data /grant IIS_IUSRS:(OI)(CI)M /T icacls C:\inetpub\wwwroot\baoxiu\data /grant IUSR:(OI)(CI)M /T逻辑说明(OI)表示对象继承(CI)表示容器继承M是修改权限。这样设置的目的是让目录下新建的 mdb 和 ldb 文件也自动带上这个权限避免下一个文件生成时又没权限。参数说明/T是递归应用到所有子目录。如果你的 IIS 站点是应用程序池身份运行的你可能需要把IIS_IUSRS换成IIS APPPOOL\你的应用程序池名的写法现代 IIS 默认使用 ApplicationPoolIdentity 运行给 IIS_IUSRS 一般就能覆盖但池隔离时还是按池身份授权更稳。3.3 老版本 IIS 的父路径与 32 位模式兼容ASP 老代码里经常出现../这种相对路径写法比如在 admin 页面里引入上一级目录的 conn.asp。IIS 6 以下默认允许这种父路径访问IIS 7 以上出于安全考虑默认禁掉了。禁掉之后的表现是页面报ASP 0131 不允许的父路径。解决方案有两种。如果你只是本地调试直接在 IIS 的 ASP 设置里把启用父路径改为 True如果是命令行操作用 appcmd 修改配置appcmd set config Default Web Site/baoxiu /section:asp /enableParentPaths:true /commit:apphost逻辑说明enableParentPaths 是 ASP 脚本引擎的配置节参数值设置为 true 表示允许页面中的 Include 和 Server.Execute 使用相对父路径跳转。老源码里十有八九写的是!--#include file../conn.asp--不开启这个选项光靠改代码全部纠正路径工作量要翻好几倍。参数说明/commit:apphost表示把修改写入 applicationHost.config 全局配置不是只对当前请求生效。如果你把整套源码放在名为 baoxiu 的应用下路径就按上面写如果站点直接建在 Default Web Site 根目录则不需要带/baoxiu这段虚拟路径。4. 把报修单从浏览器送进 AccessADO 读取、写入与状态流转环境跑通之后接下来是这套系统最核心的代码逻辑。ASP 访问 Access 数据库统一走 ADOActiveX Data Objects它和你在 .NET 里用的 ADO.NET 是两代东西写法完全不同。这一章我拆三个场景读列表、提交新单、改状态。4.1 读列表Recordset 与 MoveNext 的经典循环报修列表页在 admin 目录下逻辑是先执行 SQL 查询得到记录集然后用循环把每一条记录渲染到 HTML 表格里。这种写法在 ASP 里快二十年没变过你拿到源码后看到的列表十有八九是这个结构% 打开记录集查询未处理报修单按提交时间倒序 rs.open SELECT id, baoxiu_ren, bumen, wenti_miaoshu, baoxiu_time, zhuangtai FROM baoxiu ORDER BY baoxiu_time DESC, conn, 1, 1 检查是否查询到记录 If rs.eof Then Response.Write trtd colspan6暂无报修记录/td/tr Else 循环遍历每一条记录 Do While Not rs.eof % tr td%rs(id)%/td td%rs(baoxiu_ren)%/td td%rs(wenti_miaoshu)%/td td%rs(baoxiu_time)%/td td % If rs(zhuangtai) 0 Then Response.Write 未处理 % % If rs(zhuangtai) 1 Then Response.Write 处理中 % /td tda hrefdeal.asp?id%rs(id)%处理/a/td /tr % rs.MoveNext Loop End If %逻辑说明rs.open后面的两个数字 1, 1 是 CursorType 和 LockType1 代表键集游标另一个 1 代表只读。列表页用只读游标最合适不会占用数据库连接资源。rs.eof是记录集结束标志在循环里每读取一行就必须调用rs.MoveNext否则会死循环——这是初学者最容易犯的错误。参数说明ORDER BY baoxiu_time DESC是按报修时间倒序排列最新的单子排最上面这符合管理员先处理新单的习惯。rs(字段名)这种写法是 ADO 记录集的默认字段访问方式比rs.Fields(字段名)少写几个字母老代码里几乎都这么写。4.2 提交工单INSERT 语句与参数校验的边界用户端提交报修单的页面在 user 目录下核心动作是接收表单字段然后插入 Access 表。老代码的经典写法是直接用Request(字段名)取值拼 SQL你得清楚这种写法的风险边界在哪里。% 接收表单提交的报修信息 Dim ren, bumen, tel, miaoshu ren Trim(Request(baoxiu_ren)) bumen Trim(Request(bumen)) tel Trim(Request(dianhua)) miaoshu Trim(Request(wenti_miaoshu)) 基础非空校验没填必填项就回跳 If ren Or miaoshu Then Response.Write scriptalert(请填写姓名和问题描述);history.back();/script Response.End End If 插入新报修单状态默认为 0未处理 Dim sql sql INSERT INTO baoxiu(baoxiu_ren, bumen, dianhua, wenti_miaoshu, baoxiu_time, zhuangtai) VALUES ( ren , bumen , tel , miaoshu , Now(), 0) conn.Execute sql Response.Redirect chaxun.asp?ren Server.URLEncode(ren) %逻辑说明Now()是 VBScript 内置函数返回当前系统时间Access 会把自动转成日期时间格式存进 baoxiu_time 字段。zhuangtai默认写死 0就免去在数据库里设置默认值的麻烦这条逻辑在所有提交页面都是通用的。参数说明这段代码的问题在于 SQL 是直接字符串拼接如果miaoshu里包含单引号SQL 语句会被截断报错严重时就是注入点。正确做法是使用 ADO 的 Command 对象进行参数化传值但老 Access 场景下 JET 驱动支持有限我一般习惯是涉及用户自由输入的长文本字段至少要把单引号替换成两个单引号这是 Access 引擎处理字符串转义的官方方式。注意Response.End是 ASP 里强制终止页面后续输出的方法。它和Response.Redirect配合使用时要小心Redirect 之后代码如果还继续执行可能出现无法输出任何数据的运行时错误。4.3 改状态UPDATE 语句与时间戳写入管理员在 deal.asp 页面处理报修核心逻辑是把 zhuangtai 从 0 改成 1 或 2同时记录处理人和处理时间。这段逻辑虽然短但状态流转是否正确直接决定报修单能不能进入回访环节。% 接收处理表单字段 Dim id, chuli_ren, zhuangtai, beizhu id Trim(Request(id)) chuli_ren Trim(Request(chuli_ren)) zhuangtai Trim(Request(zhuangtai)) 校验报修单号是否为数字防止非法参数 If Not IsNumeric(id) Then Response.Write scriptalert(非法的工单号);history.back();/script Response.End End If 更新报修单状态记录处理人和处理完成时间 Dim sql sql UPDATE baoxiu SET zhuangtai zhuangtai , chuli_ren chuli_ren , chuli_timeNow() WHERE id id conn.Execute sql Response.Redirect list.asp %逻辑说明IsNumeric(id)这一步极重要。老的 ASP 代码里通过 URL 或表单传入的 id 参数默认信任如果直接拼进 WHERE 条件?id1;DELETE FROM baoxiu这类参数就能把表清空。这个字段必须走数字校验不是可选项。参数说明chuli_timeNow()的效果是每次更新都把时间刷新为当前时刻。如果你的业务需要保留首次处理时间而非完成时间应该判断 chuli_time 是否为空再决定是否写入否则多次更新会把首次处理时间覆盖掉。这个细节经常被忽视但在回访统计时特别容易暴露问题。5. ASP 报修系统避坑指南五个高频故障与处理记录这一章是我拆这类老系统遇到最多的五个问题你可以把它当成自查清单用。每一个都是真实翻车现场按现象 → 原因 → 解决的顺序写方便你直接照着排。5.1 浏览器直接下载 .asp 文件而不是执行现象输入网址后没有出现页面浏览器直接弹出下载框要下载一个 .asp 文件。原因IIS 里安装了 ASP 扩展但未启用或者网站应用程序池的托管管道模式不对。更常见的情况是你用 IIS 7 新建了一个网站默认只有静态文件模块被启用ASP 的动态脚本模块未注册到这个站点。解决确认已开启 IIS-ASP 功能后在 IIS 管理器选中报修系统站点双击处理程序映射查看是否有 ASP 类型的映射。如果没有右键编辑功能权限勾选脚本。命令行排查方式是用 appcmd 查询站点启用的模块appcmd list modules /app.name:Default Web Site/baoxiu appcmd list config Default Web Site/baoxiu /section:handlers执行后看列表里有没有svc-asp这条处理器映射。没有就直接执行appcmd install module注册但更需要检查的是站点应用程序池是否启用了 32 位应用程序JET 驱动是 32 位的64 位进程调用会偶发找不到驱动。5.2 Access 数据库写入时报操作必须使用一个可更新的查询现象列表页一切正常但提交报修单或者修改状态时报 80004005 错误提示操作必须使用一个可更新的查询。原因最直接的原因是 IIS 匿名用户对 mdb 文件所在的 data 目录没有写权限。JET 引擎在写操作时会先创建 .ldb 锁文件目录不可写时它就认为整个查询不可更新。解决给 data 目录赋予 IIS_IUSRS 写权限前面第三章已经写过 icacls 命令。还有一层容易忽略的是报修系统管理的 Access 驱动是 Microsoft.Jet.OLEDB.4.0老驱动有时会要求 mdb 文件本身不是只读属性。右键 mdb 文件确认只读勾选状态在命令行里执行attrib -r C:\inetpub\wwwroot\baoxiu\data\bx.mdb去掉只读属性。5.3 页面中文乱码界面全是问号现象页面能打开但所有中文内容显示成问号或乱码英文和数字正常。原因这套网上报修系统的页面编码是 GB2312 或 GBK而新版 IIS 在响应头里默认带上了 UTF-8 的 charset 声明。浏览器收到 UTF-8 的响应头却读到 GBK 字节流解码就对不上。解决给每个 ASP 页面顶部的%代码块里加一行代码页声明% Response.CodePage 936 Response.Charset gb2312 %或者把整站设置为按文件自身的编码处理。在 IIS 里选中站点打开ASP功能在行为组里找到代码页改成 936。如果你把 conn.asp 页面的代码页声明写好了因为它被所有页面 include所以全站生效这是最省事的做法。注意Response.CodePage 的是服务器端脚本引擎处理字符串时用的代码页Response.Charset 是输出到浏览器响应头里的字符集声明。两者必须一致只改 Charset 会导致脚本引擎内部处理中文出错。5.4 ASP 0131 错误不允许的父路径现象页面打开时直接显示Active Server Pages error ASP 0131 不允许的父路径报错的文件是包含指令里的路径。原因页面里用了../这种返回上级目录的路径写法。IIS 7 以上默认禁止父路径访问属于安全策略调整不是代码坏了。解决两种方式任选其一。一是修改代码把../改成相对路径点非常多不推荐二是按第三章的做法开启父路径。生产环境如果对安全等级有强制要求可以把 Include 文件统一移动到站点根目录的公共目录这属于结构性改造。appcmd set config Default Web Site/baoxiu /section:asp /enableParentPaths:true /commit:apphost这句命令要在 [目录结构] 里对应的站点路径上执行如果你是在根目录站点部署的路径部分就写站点名不带子目录。5.5 Access 数据库被锁死ldb 文件长期存在现象报修单提交后data 目录里出现了一个同名的 .ldb 文件而且长时间不消失之后所有写操作都报数据库被锁定。原因某一次数据库操作非正常中断比如页面在执行 INSERT 时直接关掉浏览器连接对象没有被释放Access 的锁文件残留。另一种可能是 JET 驱动版本太老多个并发连接访问同一 mdb 文件时把锁升级成排他锁。解决先确认没有其他页面正在执行操作然后手动删除 .ldb 文件。反复出现锁残留时需要给 Access 数据库做压缩和修复数据库操作这个功能在 Access 2003 的工具菜单里有命令行也可以通过 ADOX 对象触发。建立一个定期自动备份和压缩任务用 Windows 任务计划程序运行一条简单的复制命令把 mdb 复制到带日期时间戳的备份目录。这条习惯可以避免数据库文件损坏时追悔莫及。6. 把报修单当成一条会走的记录状态机扩展与自动备份技巧6.1 状态字段的语义约定在上一章的基础上我建议你把这套系统的 zhuangtai 字段的取值从0/1/2扩成一套状态机。我的做法是把数字语义固定成以下约定0 未接单1 已派单2 处理中3 已完成待回访4 已回访。老页面里的 If 判断会因为新增数值而继续兼容不会出现字段冲突。6.2 自动备份 Access 的 VBS 脚本Access 单文件特性决定了它的备份可以非常简单直接把 mdb 文件复制走即可。配合 Windows 任务计划程序每天凌晨执行一次不依赖任何第三方组件。脚本如下 数据库备份脚本copy_db.vbs Dim fso, src, backupDir, fileName Set fso CreateObject(Scripting.FileSystemObject) src C:\inetpub\wwwroot\baoxiu\data\bx.mdb backupDir D:\baoxiu_backup\ 如果备份目录不存在自动创建 If Not fso.FolderExists(backupDir) Then fso.CreateFolder(backupDir) End If 文件名带上日期方便留存历史版本 fileName bx_ Year(Now) Month(Now) Day(Now) _ Hour(Now) Minute(Now) .mdb fso.CopyFile src, backupDir fileName, True Set fso Nothing逻辑说明Year(Now) Month(Now) Day(Now) 拼接出来的文件名如 bx_20251108_1530.mdb精确到分钟避免同一天多次备份时覆盖。True 参数表示目标文件已存在时强制覆盖。参数说明这里的备份目录要放在和站点不同的磁盘分区上避免磁盘故障时连备份一起丢。建议再加一条定时任务压缩旧备份保留最近 30 天即可这是 Access 单文件模式最经济的保存策略。6.3 我从这套系统里养成的一个强制习惯从那以后我每次改完这套 ASP 报修系统都会强制走一遍提交 → 处理 → 回访的完整流程然后去 data 目录看一眼 .ldb 锁文件是否自动释放。这个习惯帮我提前拦下过不少权限失效引发的写失败问题。改字段、加页面也是这样先在本地用完整流程把它过一遍再上生产环境。这套网上报修系统不算新但它在真实业务里验证过的报修流转模型比大多数花哨的新框架都扎实。希望这套拆解能帮你在自己的环境里少踩几个坑把它真正跑起来。本文还有配套的精品资源点击获取
返回列表