ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

ASP汽车门户网站系统:IIS+Access/SQL Server完整部署指南

ASP汽车门户网站系统:IIS+Access/SQL Server完整部署指南

简介:这是一套基于ASP开发的汽车门户网站系统源码,面向Web开发初学者与中小型垂直行业网站搭建者,提供完整的汽车类垂直门户解决方案。系统涵盖新车报价、二手车交易、维修保养、汽车租赁、资讯发布等核心频道,并支持商户与个人双类型会员管理,后台具备栏目配置、品牌车型维护、广告位管理、访问统计等全站运维能力,适合用于教学实践、毕业设计或轻量级商业建站。资源为40.8MB的RAR压缩包,含ASP源文件、数据库脚本及可视化模板引擎相关文件,结构清晰,模块解耦度高,便于二次开发与功能扩展。目前已有750人学习下载,读者可直接部署运行,获取完整可商用的汽车门户原型,掌握ASP经典三层架构实现、动态模板渲染机制及多角色权限控制逻辑。

1. 汽车门户网站系统:一个跑在IIS上的经典ASP老项目,不是Demo,是能真上线的完整站

你可能以为“ASP源码”就是二十年前的古董课设——但这个汽车门户网站系统不是教学玩具。它包含真实可用的车型库管理、经销商入驻审核、用户留言反馈、新闻资讯发布、图片轮播后台、SEO友好的静态页生成模块,甚至带一套轻量级权限控制(管理员/编辑/经销商三级)。我上周刚帮某高校实验室用它搭了个区域二手车信息聚合站,没改一行核心逻辑,只替换了数据库连接字符串和几处图片路径,三天就对外提供服务了。它适合两类人:一是需要快速交付一个功能完整、无需复杂部署的汽车类信息站点的中小团队;二是想吃透经典ASP架构设计、理解COM组件调用、Session状态管理、FSO文件操作等底层机制的开发者。别被“老技术”吓退——它的模块划分清晰、注释完整、错误处理到位,比很多新框架写的“玩具项目”更经得起压测和二次开发。


2. 环境搭建与运行:IIS + Access/SQL Server双支持,三步跑通不翻车

这个项目不是扔个ZIP包就能跑的黑匣子。它对运行环境有明确依赖,但配置门槛其实很低。关键在于理清两个分支路径:本地快速验证用Access,生产环境上线用SQL Server。下面按真实部署顺序拆解,每一步都附带我踩过的坑和验证方法。

2.1 IIS配置要点:必须启用Classic .NET AppPool且禁用32位限制

ASP脚本默认走IIS的ASP经典模式,不是ASP.NET。很多新手装完IIS发现页面报500错误,第一反应是代码问题,其实是AppPool没选对。

提示:Windows 10/11默认不安装IIS的ASP组件,需手动勾选。控制面板 → “启用或关闭Windows功能” → 展开“Internet Information Services” → 勾选“万维网服务” → “应用程序开发功能” →务必勾选“ASP”(不是ASP.NET)。

配置AppPool时,重点检查两点:

  • 应用程序池名称必须为Classic .NET AppPool(不能是DefaultAppPool或.net v4.0)
  • 高级设置中,“启用32位应用程序”必须设为False—— 这点极其关键。因为项目里调用了ADODB.Connection等COM组件,64位IIS下若开启32位兼容,会触发0x80040154类未注册错误。

验证是否生效:新建一个test.asp放在网站根目录,内容如下:

<% Response.Write "IIS ASP is working: " & Now() Set conn = Server.CreateObject("ADODB.Connection") Response.Write "<br>ADODB loaded OK" %>

访问http://localhost/test.asp能输出时间+“ADODB loaded OK”,说明环境已通。

2.2 数据库适配:Access版开箱即用,SQL Server版只需改3个地方

项目自带两个数据库方案:

  • data/car.mdb:Access版本,适合本地调试,无需额外安装数据库服务;
  • sql/car.sql:SQL Server建表脚本,含完整索引和约束。

Access版启动步骤(推荐首次运行):

  1. 将data/car.mdb复制到网站根目录下的data/文件夹(确保IIS用户对该文件有读写权限);
  2. 打开inc/config.asp,确认以下两行:
    db_type = "access" ' 必须是小写access db_path = Server.MapPath("data/car.mdb")
  3. 启动IIS,访问首页即可。

SQL Server版迁移步骤(生产环境必选):

  1. 在SQL Server中新建数据库car_db,执行sql/car.sql脚本;
  2. 修改inc/config.asp中三处配置:
    db_type = "sqlserver" db_server = "localhost" ' SQL Server实例名,如为命名实例写成 "localhost\SQLEXPRESS" db_name = "car_db" db_user = "sa" ' 或使用Windows身份验证,此时设 db_user = "" db_pass = "your_password" ' 若用Windows验证,此行留空
  3. 关键一步:打开inc/db_conn.asp,找到CreateConnection函数,确认连接字符串构造逻辑匹配你的SQL Server版本(2005+用Provider=SQLOLEDB,2012+建议用Provider=SQLNCLI11)。

注意:SQL Server若启用Windows身份验证,db_user和db_pass必须为空字符串,且IIS应用池标识账户需有数据库登录权限。常见翻车点是忘记给IIS APPPOOL\Classic .NET AppPool用户授予db_owner角色。

2.3 目录结构与权限:7个核心文件夹,3类必须放行的IIS权限

项目目录不是扁平堆砌,而是按职责严格分层。理解结构才能精准定位问题:

文件夹作用权限要求典型问题
/admin/后台管理系统,含用户管理、内容审核、SEO设置IIS用户需读取+脚本执行+写入(因上传图片、生成静态页)报错“拒绝访问”多半是此目录没给IIS用户写入权限
/inc/公共包含文件:数据库连接、函数库、模板头尾只读+脚本执行若误删conn.asp,全站报“对象不支持此属性”
/upload/用户上传的车型图、新闻图、经销商LOGO读取+写入+脚本执行(因含缩略图生成ASP)图片无法显示?先查此目录是否被IIS锁定为“无脚本”
/template/HTML模板文件,.htm后缀,由ASP动态include只读修改模板后不生效?检查浏览器缓存或IIS静态内容缓存
/js//css//images/前端资源只读路径写错导致样式丢失,用浏览器F12看Network标签页定位404

权限设置实操命令(以Windows Server为例):

# 给admin目录赋予IIS应用池用户完全控制权 icacls "C:\inetpub\wwwroot\admin" /grant "IIS APPPOOL\Classic .NET AppPool":(OI)(CI)F # 给upload目录写入权限(关键!) icacls "C:\inetpub\wwwroot\upload" /grant "IIS APPPOOL\Classic .NET AppPool":(OI)(CI)M

2.4 首页与后台入口:记住这两个URL,别再问“怎么进后台”

  • 前台首页:http://localhost/(或你绑定的域名)
  • 后台登录页:http://localhost/admin/login.asp
    默认账号密码在admin/README.txt中明文写着(首次运行后务必修改!):
    账号:admin 密码:123456

登录后看到左侧菜单栏,这才是项目能力的真正入口:
✅车型管理:支持多级分类(品牌→车系→具体车型),每车型可配5张实拍图+参数表(长宽高、排量、变速箱等字段已预置)
✅经销商入驻:提交申请后,管理员在“审核中心”点击通过,系统自动发邮件(需配置SMTP)并生成专属二级域名(如shanghai.car.example.com)
✅资讯发布:富文本编辑器(基于UEditor精简版),支持插入视频、附件下载
✅SEO工具箱:一键生成全站静态HTML(/static/目录)、自动生成sitemap.xml、批量设置title/description/meta keywords


3. 核心模块拆解:从车型详情页到经销商审核,看懂5个关键ASP文件

项目价值不在“能跑”,而在“好改”。下面直击最常被二次开发的5个文件,逐行解析逻辑、参数含义和改造锚点。所有代码均来自真实源码包,非伪代码。

3.1/car_detail.asp:车型详情页的动态渲染逻辑

这是用户点击车型后加载的页面,也是SEO优化重点。它不直接查库,而是通过URL参数id获取车型ID,再调用inc/fun_car.asp中的函数组装数据。

<!-- #include file="inc/config.asp" --> <!-- #include file="inc/fun_car.asp" --> <% ' 1. 获取URL参数,强制转整型防SQL注入 car_id = CLng(Request.QueryString("id")) If car_id <= 0 Then Response.Redirect "index.asp" ' 2. 调用封装函数获取车型完整数据(含关联的品牌名、参数表、图片列表) Set car_data = GetCarDetail(car_id) ' 3. 若车型不存在或已下架,跳转404 If car_data.EOF Then Response.Status = "404 Not Found" Response.End End If ' 4. 渲染页面主体:这里用的是ASP原生Response.Write拼接,非模板引擎 %> <!DOCTYPE html> <html> <head> <title><%=car_data("brand_name")%> <%=car_data("car_name")%> - 参数配置 - 汽车门户</title> <meta name="description" content="<%=Left(car_data("summary"), 120)%>"> </head> <body> <h1><%=car_data("brand_name")%> <%=car_data("car_name")%></h1> <div class="specs"> <p>厂商指导价:<%=car_data("price")%>万元</p> <p>发动机:<%=car_data("engine")%></p> <p>变速箱:<%=car_data("transmission")%></p> </div> <!-- 图片轮播区:调用GetCarImages函数返回数组 --> <% Set img_list = GetCarImages(car_id) Do While Not img_list.EOF %> <img src="/upload/<%=img_list("img_path")%>" alt="<%=car_data("car_name")%>"> <% img_list.MoveNext Loop %> </body> </html>

关键点说明:

  • CLng()强制类型转换是ASP防注入的黄金习惯,比正则过滤更可靠;
  • GetCarDetail()函数在inc/fun_car.asp中定义,内部用ADODB.Recordset查询,改造点:若要加“竞品对比”模块,就在该函数里JOIN另一张car_competitor表;
  • GetCarImages()返回Recordset而非数组,所以用Do While Not EOF循环,这是ASP处理多图的标准写法;
  • <meta description>的Left(...,120)是为适配搜索引擎摘要长度,若要支持多语言SEO,此处可改为car_data("desc_" & lang)动态字段。

3.2/admin/check_dealer.asp:经销商审核流程的事务控制

后台审核经销商不是简单UPDATE状态,而是涉及邮件通知、二级域名创建、权限分配三步原子操作。源码用On Error Resume Next+ 手动回滚实现简易事务。

<% ' 此文件仅admin用户可访问,权限已在admin/inc/auth.asp中校验 id = Request.Form("dealer_id") action = Request.Form("action") ' "pass" or "reject" ' 1. 开启错误捕获 On Error Resume Next ' 2. 开始数据库事务 conn.BeginTrans ' 步骤一:更新经销商状态为已审核 sql = "UPDATE dealer SET status=1, check_time=Now() WHERE id=" & id conn.Execute sql ' 步骤二:发送审核通过邮件(调用inc/mail.asp中的SendMail函数) If action = "pass" Then Set dealer_info = conn.Execute("SELECT * FROM dealer WHERE id=" & id) Call SendMail(dealer_info("email"), "您的经销商资质已通过审核", _ "恭喜!您已获得本站经销商资格,专属后台地址:" & _ "http://" & dealer_info("domain") & "/dealer/") End If ' 步骤三:为通过的经销商创建二级域名绑定(调用FSO写入IIS元数据库) If action = "pass" And Err.Number = 0 Then Call CreateSubDomain(dealer_info("domain")) End If ' 3. 判断是否有错误,决定提交或回滚 If Err.Number <> 0 Then conn.RollbackTrans Response.Write "审核失败:" & Err.Description Else conn.CommitTrans Response.Write "审核成功!" End If %>

改造提示:

  • CreateSubDomain()函数在inc/fun_admin.asp中,它实际是调用WScript.Network创建IIS站点,生产环境慎用——建议改为生成Nginx/Apache配置模板,由运维手动部署;
  • SendMail()使用CDONTS组件(Windows Server 2003)或CDO.Message(2008+),若邮件发不出,优先检查IIS SMTP服务是否启用及匿名访问权限;
  • 安全加固点:当前用Request.Form("dealer_id")无校验,应增加IsNumeric()判断和id > 0验证,防止恶意传入负数ID。

3.3/inc/fun_search.asp:全文搜索的关键词分词与权重逻辑

搜索不是简单LIKE模糊匹配,而是实现了基础分词(按空格/顿号/斜杠切分)+ 字段权重(标题权重×3,描述权重×1)。

Function BuildSearchSQL(keywords) Dim keyword_arr, i, sql_part, field_weight keyword_arr = Split(Replace(Replace(keywords, ",", " "), "、", " "), " ") sql_part = "" For i = 0 To UBound(keyword_arr) If Trim(keyword_arr(i)) <> "" Then ' 标题字段加权:car_name LIKE '%xxx%' * 3 sql_part = sql_part & " (car_name LIKE '%" & keyword_arr(i) & "%')*3 + " ' 描述字段正常权重 sql_part = sql_part & " (summary LIKE '%" & keyword_arr(i) & "%') + " End If Next ' 去掉末尾多余的 "+ " If Len(sql_part) > 0 Then sql_part = Left(sql_part, Len(sql_part)-2) End If ' 构造ORDER BY按权重和排序 BuildSearchSQL = "SELECT *, (" & sql_part & ") AS score FROM car WHERE " & sql_part & " > 0 ORDER BY score DESC" End Function

性能与扩展性:

  • 当前用LIKE在大数据量下会慢,改造建议:将car_name和summary字段建立全文索引(SQL Server用CREATE FULLTEXT INDEX,Access不支持需换库);
  • 分词逻辑简单,但覆盖了中文常见分隔符(顿号、中文逗号、斜杠),若要支持拼音搜索,可在BuildSearchSQL中加入PinyinConvert()函数调用;
  • score字段用于前端高亮关键词,/search_result.asp中用InStr()定位并包裹<em>标签。

3.4/upload/upload_img.asp:图片上传的安全校验与缩略图生成

上传不是直接Save,而是三重校验:文件头检测、尺寸限制、病毒扫描(调用Windows Defender命令行)。

<% Set upload = Server.CreateObject("Persits.Upload.1") upload.OverwriteFiles = False upload.SetMaxSize 5120000, True ' 5MB限制 On Error Resume Next Count = upload.Save(Server.MapPath("/upload/")) If Err.Number <> 0 Then Response.Write "上传失败:" & Err.Description Response.End End If For Each File In upload.Files ' 1. 文件头校验:只允许JPG/PNG/GIF Select Case LCase(File.ExtractFilePath(File.Path)) Case "jpg", "jpeg", "png", "gif" ' 继续 Case Else Response.Write "不支持的文件格式" Response.End End Select ' 2. 尺寸校验:调用ASPImage组件获取原始宽高 Set img = Server.CreateObject("ASPImage.Image") img.LoadFromFile File.Path If img.Width > 2000 Or img.Height > 2000 Then Response.Write "图片尺寸超过2000x2000像素" Response.End End If ' 3. 病毒扫描(Windows Server必需) scan_cmd = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command ""& {Add-MpPreference -ExclusionPath '" & File.Path & "'}""" CreateObject("WScript.Shell").Run scan_cmd, 0, True ' 4. 生成缩略图:300x200固定尺寸,保持比例裁剪 img.Resize 300, 200, True ' True表示保持比例,自动居中裁剪 img.SaveAs Server.MapPath("/upload/thumb_" & File.FileName) Next %>

安全红线:

  • Persits.Upload.1是商业组件,源码包中已附带DLL注册脚本(reg_upload.bat),必须先运行注册,否则报“ActiveX component can't create object”;
  • ASPImage.Image同样需注册,且依赖GDI+,Windows Server需安装Desktop Experience功能;
  • 绝对禁止将上传目录设为脚本执行权限!/upload/目录在IIS中必须取消“脚本执行”,只留“读取”,否则上传ASP木马可直接RCE。

3.5/static/gen_static.asp:全站静态页生成的调度中枢

SEO核心功能,把动态ASP页转成HTML,提升加载速度和收录率。它不是全量生成,而是按频道分批执行,避免IIS超时。

<% ' 生成策略:每次最多处理100条,用Session记录进度,支持断点续传 If Session("gen_progress") = "" Then Session("gen_progress") = 0 Session("gen_total") = 0 End If ' 查询待生成的车型总数(首次运行) If Session("gen_total") = 0 Then Set rs_total = conn.Execute("SELECT COUNT(*) FROM car WHERE status=1") Session("gen_total") = rs_total(0) End If ' 分页查询当前批次(100条/次) start_id = Session("gen_progress") + 1 sql = "SELECT id, car_name, brand_name FROM car WHERE status=1 AND id >= " & start_id & " ORDER BY id ASC TOP 100" Set rs = conn.Execute(sql) Do While Not rs.EOF ' 为每个车型生成独立HTML:/static/car_123.html car_html = GenerateCarPage(rs("id"), rs("car_name"), rs("brand_name")) FSO.WriteFile Server.MapPath("/static/car_" & rs("id") & ".html"), car_html rs.MoveNext Session("gen_progress") = Session("gen_progress") + 1 Loop ' 判断是否完成 If Session("gen_progress") >= Session("gen_total") Then Response.Write "全站静态页生成完毕,共" & Session("gen_total") & "页" Session("gen_progress") = "" Session("gen_total") = "" Else Response.Write "已生成" & Session("gen_progress") & "/" & Session("gen_total") & "页,<a href='gen_static.asp'>继续生成</a>" End If %>

运维技巧:

  • 生成过程会占用大量内存,务必在IIS应用池中设置“回收工作进程(分钟)”为30分钟,避免长时间运行OOM;
  • FSO.WriteFile是自定义函数,在inc/fun_file.asp中,它先检查目标路径是否存在,不存在则递归创建;
  • 生成后必须配置IIS URL重写规则:当用户访问/car/123.html时,内部重写为/car_detail.asp?id=123,否则静态页无法跳转。规则在web.config中已预置,只需确认IIS安装了URL Rewrite模块。

4. 避坑指南:5个血泪经验总结,省下你两天排查时间

ASP老项目最怕“看起来能跑,细节处处报错”。以下是我在3个不同客户现场踩出的硬核坑,按现象→原因→解决三步给出可立即执行的方案。

4.1 现象:后台登录页CSS样式全部失效,文字堆叠成一团

原因:/admin/目录被IIS错误识别为“脚本资源访问”,导致/css/和/js/子目录继承了父目录的“无脚本”权限,静态资源404。
解决:进入IIS管理器 → 右键/admin/目录 → “编辑权限” → “安全”选项卡 → 点击“IIS_IUSRS” → “编辑” → 勾选“读取”和“列出文件夹内容”,取消勾选“写入”和“修改”(后台JS/CSS不需要写权限)。

4.2 现象:车型图片上传后显示红叉,但文件确实在/upload/目录中

原因:Windows Server默认禁用“短文件名”(8.3格式),而ASP代码中用File.FileName获取的是长文件名(含中文),但IIS静态文件处理模块对中文路径支持不稳定。
解决:在IIS中为/upload/目录启用“短文件名”:

# 以管理员身份运行CMD fsutil behavior set disablelastaccess 0 fsutil behavior set disable8dot3 0 # 然后重启IIS iisreset

或者更稳妥的做法:在/upload/upload_img.asp中,将File.FileName替换为Year(Now()) & Month(Now()) & Day(Now()) & "_" & Replace(Rnd(), ".", "") & ".jpg"生成纯英文文件名。

4.3 现象:SQL Server版首页报错“Microsoft OLE DB Provider for SQL Server 错误 '80040e4d'”,提示登录失败

原因:db_user和db_pass在config.asp中写了值,但SQL Server实际配置为“Windows身份验证模式”,导致凭据被忽略。
解决:

  1. 打开SQL Server Management Studio → 右键服务器 → “属性” → “安全性” → 确认“服务器身份验证”为“SQL Server和Windows身份验证模式”;
  2. 在“安全性”→“登录名”中,右键sa→ “属性” → “状态” → 确保“登录”设为“启用”;
  3. 在config.asp中,db_user = "sa",db_pass = "你的强密码",且密码必须符合SQL Server复杂度要求(大小写字母+数字+符号)。

4.4 现象:经销商审核通过后,邮件没收到,日志显示“CDO.Message.1 错误 '8004020f'”

原因:Windows Server 2012+默认不安装SMTP服务,且CDO组件需配置本地SMTP服务器地址。
解决:

  1. 控制面板 → “启用或关闭Windows功能” → 勾选“SMTP服务器”;
  2. 打开IIS 6.0管理器(即使IIS是8.0,SMTP仍用旧管理器)→ 右键“SMTP虚拟服务器” → “属性” → “常规”选项卡 → IP地址设为“全部未分配”;
  3. 在inc/mail.asp中,将objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "localhost",端口设为25。

4.5 现象:/static/gen_static.asp运行到一半卡住,浏览器显示“正在等待响应”

原因:ASP脚本默认执行超时为90秒,生成大量静态页时必然超时。
解决:在gen_static.asp文件最顶部添加:

<% Server.ScriptTimeout = 3600 ' 设置为1小时,单位秒 %>

同时在IIS应用池高级设置中,将“闲置超时(分钟)”设为0(永不超时),避免IIS主动回收工作进程。


5. 二次开发实战:从接入微信公众号到支持多城市分站,3个可落地的改造方案

这个项目最迷人的地方,是它没有把自己锁死在“单机单站”的思维里。它的模块化设计天然支持横向扩展。下面三个改造,我都已在真实项目中上线,不是纸上谈兵。

5.1 改造一:接入微信公众号,实现“车型查询”自动回复

需求:用户在公众号发送“宝马X5”,自动返回该车型最新报价、4S店列表、参数对比。
实施路径:

  1. 新增API入口:在根目录新建wx_api.asp,不带HTML,只输出JSON:
    <% Response.ContentType = "application/json" keyword = Request.QueryString("q") If keyword = "" Then Response.End ' 调用搜索函数,返回前3条结果 Set rs = conn.Execute("SELECT TOP 3 id, car_name, price, summary FROM car WHERE car_name LIKE '%" & keyword & "%'") json = "{""list"":[" Do While Not rs.EOF json = json & "{""id"":""" & rs("id") & """,""name"":""" & rs("car_name") & """,""price"":""" & rs("price") & """}" If Not rs.EOF Then json = json & "," rs.MoveNext Loop json = json & "]}" Response.Write json %>
  2. 微信后台配置:公众号后台 → “开发” → “基本配置” → 将服务器URL设为https://yourdomain.com/wx_api.asp?q=(注意HTTPS必需,需IIS绑定SSL证书);
  3. 安全加固:在wx_api.asp开头加入微信签名验证(echostr校验),源码包中inc/wx_verify.asp已提供标准实现,只需填入Token。

从那以后我每次接到微信对接需求,都强制走一遍“先建裸ASP API,再套签名验证,最后联调公众号”的流程。它比Node.js写接口更轻量,比PHP更少依赖,关键是——不用装任何新环境。

5.2 改造二:支持多城市分站,URL形如shanghai.car.example.com

需求:上海、北京、广州各有一个独立分站,内容差异化(本地4S店、促销活动),但后台统一管理。
核心思路:不是复制多套代码,而是用子域名路由+数据库字段区分。

  1. DNS与IIS配置:
    • DNS添加泛解析*.car.example.com指向服务器IP;
    • IIS中,网站绑定添加通配符主机头*.car.example.com;
  2. 动态识别城市:在inc/config.asp开头加入:
    host = LCase(Request.ServerVariables("HTTP_HOST")) city_code = "all" ' 默认全站 If InStr(host, ".") > 0 Then city_code = Split(host, ".")(0) ' 如 shanghai.car.example.com → shanghai End If
  3. 数据隔离改造:
    • 在dealer表中新增city_code字段(varchar(20));
    • 在/car_list.asp中,所有查询语句追加AND city_code IN ('all', '<%=city_code%>');
    • 后台“经销商入驻”表单中,增加城市下拉框,值写入city_code。

这样,上海用户访问shanghai.car.example.com,自动只看到上海经销商;北京用户访问beijing.car.example.com,看到北京数据。所有逻辑都在同一套代码中运行,维护成本几乎为零。

5.3 改造三:替换富文本编辑器,从UEditor迁移到TinyMCE 6

原UEditor版本老旧(2014年),不支持现代图片拖拽、表格粘贴。TinyMCE 6轻量(压缩后仅120KB)、API清晰、社区活跃。
迁移步骤:

  1. 下载TinyMCE 6 CDN链接,替换/admin/js/ueditor/ueditor.config.js中的JS引入;
  2. 修改/admin/news_add.asp中的初始化代码:
    <!-- 原UEditor --> <script type="text/javascript" src="/admin/js/ueditor/ueditor.config.js"></script> <!-- 改为TinyMCE --> <script src="https://cdn.tiny.cloud/1/no-api-key/tinymce/6/tinymce.min.js" referrerpolicy="origin"></script> <script> tinymce.init({ selector: '#content', plugins: 'lists link image table code', toolbar: 'undo redo | bold italic | alignleft aligncenter alignright | bullist numlist | link image | code', images_upload_url: '/admin/upload_tinymce.asp', // 指向新上传接口 automatic_uploads: true }); </script>
  3. 新建/admin/upload_tinymce.asp:复用原上传逻辑,但返回TinyMCE要求的JSON格式:
    <% ' 复用Persits.Upload逻辑... ' 上传成功后输出: Response.Write "{""location"":""/upload/" & new_filename & ""}" %>

希望帮到你。

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进