简介:这是一套面向ASP初学者与有一定经验开发者的医生预约系统源码,重点演示Ajax与JSON在实际项目中的配合使用,适合用来理解前后端异步交互、数据格式转换以及预约业务逻辑的落地方式。压缩包共37个文件,约321KB,包含9个asp页面文件、5个js脚本、3个css样式表,以及mdb与db数据库文件,另有png、gif等界面素材,覆盖预约查询、科室获取、时间选择等核心模块,目录结构清晰,便于按功能定位代码。目前已有272人学习下载,可作为课程设计或练手项目的参考。读者可从中获得一套可直接运行的预约系统实例,观察Ajax请求如何与后台asp交互、JSON数据如何组织与解析,并借鉴日期选择、科室联动等常见交互的实现思路,对理解传统Web开发中的异步通信与数据库操作有实际帮助。
1. 从一份老 ASP 预约系统源码说起:ajax 与 json 到底怎么落地
翻到这份asp+ajax+json医生预约系统源码和数据库.zip的时候,我第一反应是有点意外——现在满屏都是前后端分离、Spring Boot 加 Vue,居然还有人把 ASP 时代的 ajax 局部刷新和 json 数据交换整理成一套能跑的医生预约 demo。它解决的不是什么高深问题,而是让一个不懂框架的人,用最原始的方式看清「前端点一下、后端查一次、页面不整页刷新」这条链路到底怎么走通。适合谁?刚接触 Web 开发、想搞明白 ajax 请求参数怎么赋值、json 格式长什么样、asp 能否搭配 mysql 这类疑问的新手,以及需要一套轻量预约逻辑做课程设计或二次改造的开发者。整包里有yuyue.asp、findappoint.asp、getDepartments.asp这些页面,配合jquery-1.4.2.min.js和doubleDate2.0.js,把科室选择、日期联动、预约提交串成了一条完整流程,数据库是#Database_1107.mdb,Access 格式,开箱即用。
2. 拆包看结构:asp 页面、ajax 接口与 json 返回怎么分工
2.1 目录里每个文件在预约流程里干什么
拿到压缩包先别急着双击.asp,把文件按职责分三堆看会清楚很多。根目录下的conn.asp和config.asp是数据库连接与全局配置,md5.asp负责密码摘要,include目录放公共引用。业务页面集中在yuyue.asp(预约主入口)、findappoint.asp(查询预约结果)、finddayappoint.asp和findtimeappoint.asp(按日期、时段筛选),getDepartments.asp是给前端 ajax 调用的科室列表接口。前端资源里jquery.js、jquery-1.4.2.min.js是基础库,doubleDate2.0.js和doubleDate.css管日期控件,common.js、css.css管通用交互和样式,jquery-ui-1.8.18.custom.*那一堆 png 是 UI 皮肤图。数据库#Database_1107.mdb放在jtDatabase目录下,表结构围绕医生、科室、排班、预约记录展开。
| 文件/目录 | 作用 | 是否需改动 |
|---|---|---|
| conn.asp / config.asp | 数据库连接串与全局常量 | 部署前必改 |
| getDepartments.asp | 返回科室 json 的 ajax 接口 | 按需扩展 |
| yuyue.asp | 预约表单与提交入口 | 核心业务页 |
| findappoint.asp | 预约记录查询 | 按需调整 |
| doubleDate2.0.js | 日期选择与联动 | 一般不动 |
| #Database_1107.mdb | Access 数据库 | 需迁移或备份 |
这张表的意义在于:你一眼能看出哪些是「配置层」、哪些是「接口层」、哪些是「展示层」。很多新手翻车就翻在把conn.asp里的路径当成相对路径直接跑,结果 IIS 一换目录就报数据库连接失败。
2.2 ajax 请求参数怎么赋值、json 怎么回传
这套 demo 最值得看的就是getDepartments.asp和yuyue.asp之间的配合。前端用 jQuery 的$.ajax发请求,后端拼 json 字符串返回,浏览器拿到后动态填充下拉框。常见做法是后端不引任何 json 库,直接字符串拼接,因为 ASP 原生没有json_encode。下面这段是这类项目的典型写法,我按原包逻辑还原:
// common.js 中科室联动片段 function loadDepartments() { $.ajax({ url: 'getDepartments.asp', type: 'GET', dataType: 'json', // 告诉 jQuery 按 json 解析 cache: false, // 避免 IE 缓存旧科室列表 success: function(data) { var sel = $('#departSelect'); sel.empty(); $.each(data, function(i, item) { // item.id / item.name 对应后端返回字段 sel.append('<option value="' + item.id + '">' + item.name + '</option>'); }); }, error: function(xhr, status, err) { alert('科室加载失败:' + status); } }); }逻辑说明:dataType: 'json'是关键,它让 jQuery 自动调用JSON.parse,省去手动转换。cache: false在 IE 下尤其重要,否则第二次打开页面科室列表可能还是旧的。参数说明:url指向接口页,type用 GET 是因为只读查询;如果要做提交预约,改成 POST 并把表单字段放进data。后端getDepartments.asp对应要输出合法 json,形如[{"id":"1","name":"内科"},{"id":"2","name":"外科"}],注意中文编码要和页面一致,否则会出现乱码。
2.3 数据库连接与 Access 迁移到 SQL Server 的取舍
conn.asp里通常是这样的连接串:
<% Dim conn, dbPath dbPath = Server.MapPath("jtDatabase/#Database_1107.mdb") Set conn = Server.CreateObject("ADODB.Connection") conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbPath %>逻辑说明:Server.MapPath把虚拟路径转成物理路径,避免相对路径歧义。参数说明:Provider在 64 位系统上要换成Microsoft.ACE.OLEDB.12.0,否则 Jet 引擎不可用,这是 win11 配置 iis asp 时最常见的报错来源。至于 asp 能否搭配 mysql,答案是能,但要把ADODB.Connection换成 MySQL ODBC 驱动,SQL 里的#日期分隔符和top语法都得改,工作量不小。我的建议是:学习 ajax 与 json 交互就保留 Access,真要上线再迁 SQL Server,别一上来就折腾驱动。
3. 本地跑起来:IIS 配置、编码与接口联调
3.1 win11 配置 iis asp 的完整步骤
这套源码是经典 ASP,必须靠 IIS 的 ASP 模块解析,不能直接双击运行。win11 下按下面走:
- 打开「启用或关闭 Windows 功能」,勾选 Internet Information Services,展开后把「万维网服务 → 应用程序开发功能」里的 ASP 勾上,同时勾选 ISAPI 扩展和 ISAPI 筛选器。
- 把解压后的站点目录放到非系统盘,例如
D:\web\doctorappoint,避免权限和路径空格问题。 - 打开 IIS 管理器,右键「网站 → 添加网站」,物理路径指向该目录,端口给 8080 之类避免和默认站冲突。
- 选中站点,双击「ASP」图标,把「启用父路径」设为 True,因为
include引用常用相对父级路径。 - 回到「应用程序池」,把该站点的池改为「无托管代码」,经典 ASP 不需要 .NET 运行时。
- 给站点目录加上
IIS_IUSRS的读取和执行权限,数据库文件所在jtDatabase目录额外给写权限,否则预约提交会失败。
# 用管理员 PowerShell 快速验证 ASP 是否启用 dism /online /get-featureinfo /featurename:IIS-ASP # 若 State 为 Disabled,执行: dism /online /enable-feature /featurename:IIS-ASP /all逻辑说明:dism命令直接查 ASP 功能状态,比在图形界面里翻更可靠。参数说明:/featurename:IIS-ASP是 ASP 模块的功能名,/all会连带启用依赖项。执行完重启 IIS 或iisreset生效。
3.2 编码格式与 ajax 请求设置编码格式
中文乱码是这套源码最容易翻车的地方。ASP 页面顶部一般有<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>,对应 GB2312/GBK。如果前端 ajax 返回的 json 里中文变成问号,先查三处:页面CODEPAGE、Response.CharSet、以及 ajax 的contentType。常见做法是在接口页开头加:
<% Response.CodePage = 936 Response.CharSet = "gb2312" Response.ContentType = "application/json" %>逻辑说明:CodePage决定脚本内部字符串编码,CharSet决定输出给浏览器的字符集,两者要一致。参数说明:如果前端页面是 UTF-8,这里就都改成 65001 和 utf-8,但数据库里的中文可能已经是 GBK,混用会乱码,所以整套统一最稳。ajax 请求设置编码格式时,POST 提交可在$.ajax里加contentType: 'application/x-www-form-urlencoded; charset=gb2312',让参数按同编码发送。
3.3 接口联调:从科室下拉到预约提交
联调顺序建议按数据流走,别一上来就点提交。先访问getDepartments.asp,浏览器直接打开应看到 json 数组;如果报 500,多半是conn.asp路径或驱动问题。再打开yuyue.asp,看科室下拉是否被 ajax 填充。接着选日期,doubleDate2.0.js会触发finddayappoint.asp或findtimeappoint.asp查询可约时段。最后填信息提交,走hisorder.asp写库。每一步都在浏览器 F12 的 Network 面板看请求状态和返回体,比盲猜快得多。若返回json parse error,说明后端输出的不是合法 json,常见是多了 BOM 头或末尾逗号,用记事本另存为「无 BOM 的 UTF-8」或 ANSI 可解。
4. 避坑与排查:这套老 ASP 源码最容易栽的五个地方
4.1 数据库连接失败,报「未找到提供程序」
现象:访问任意页面提示Provider cannot be found或ADODB.Connection 错误 '800a0e7a'。原因:64 位 Windows 默认没有 32 位 Jet 引擎,而Microsoft.Jet.OLEDB.4.0只有 32 位版本。解决:在 IIS 应用程序池里把「启用 32 位应用程序」设为 True,或把连接串换成Microsoft.ACE.OLEDB.12.0并安装对应 Access 数据库引擎。我一般优先开 32 位,改动最小。
4.2 中文乱码,json 里全是问号
现象:科室名称显示为??或锟斤拷。原因:页面CODEPAGE、Response.CharSet、数据库存储编码三者不一致。解决:统一成 936 或 65001,并确认#Database_1107.mdb里的中文本身没坏。若数据库已是乱码,得先用 Access 打开核对,别在代码层反复改。
4.3 ajax 请求成功但下拉框不填充
现象:Network 显示 200,返回体也有数据,页面却没反应。原因:dataType: 'json'解析失败被静默吞掉,或返回字段名和前端item.id对不上。解决:把dataType临时改成text,在success里alert(data)看原始返回,确认字段名后再改回。字段大小写敏感,ID和id不是一回事。
4.4 日期控件不弹出或样式错位
现象:点日期输入框没反应,或日历面板跑到页面角落。原因:jquery-ui-1.8.18.custom.css和那堆ui-bg_*.png路径不对,或 jQuery 版本冲突。解决:确认css与images目录相对位置没被移动,检查页面是否重复引入了两个 jQuery 版本。这套 demo 用的是 1.4.2,别再引高版本,否则$.browser之类老 API 会报错。
4.5 预约提交后数据库没记录
现象:提交返回成功提示,但#Database_1107.mdb里查不到新行。原因:jtDatabase目录没有写权限,或hisorder.asp里的 SQL 字段和表结构不匹配。解决:给目录加IIS_IUSRS写权限;用 Access 打开数据库核对表字段名,逐字比对INSERT语句。Access 对保留字敏感,字段名带空格或关键字要用方括号包起来。
5. 二次改造与验证:把 demo 变成能用的预约模块
跑通只是第一步,真正有价值的是知道怎么改。我一般先做一次「最小验证」:手动往数据库插一条医生排班,看前端能否查到;再删掉一条,看列表是否实时更新。这一步能确认 ajax 链路和数据库读写都是活的,而不是靠缓存假象。验证通过后再动业务逻辑。
改造方向上,getDepartments.asp可以扩展成带参数的接口,比如传入医院 ID 返回对应科室,前端 ajax 用data: {hospitalId: 1}传参,后端用Request.QueryString("hospitalId")接收。json 数组也可以升级成带状态码的对象,形如{"code":0,"data":[...]},前端判断code再渲染,比裸数组更健壮。如果要做跨平台音乐管理系统 v2.0 源码那种多端复用,接口层就得抽出来,别把 SQL 写死在页面里。
| 改造点 | 原实现 | 建议做法 |
|---|---|---|
| 接口返回 | 裸 json 数组 | 包一层 code/msg/data |
| 参数传递 | 无参或固定 | QueryString/Form 显式接收 |
| SQL 位置 | 页面内联 | 抽到独立 include |
| 编码 | 页面级设置 | 统一配置文件常量 |
| 错误处理 | 无 | 返回错误码而非 500 |
最后说个具体技巧:调试 ajax 时,在$.ajax的beforeSend里打印请求参数,在complete里打印耗时,比只看success有用得多。我早年调这套类似源码时,就因为没看complete,把一个超时当成了成功,白查半天。从那以后我每次改接口都强制走一遍「看请求、看返回、看数据库」三步,缺一步都不放心。希望帮到你。
本文还有配套的精品资源,点击获取