用AI写了一套discuz X3.4转换到wellcms2.0的数据转换程序。这套程序前后端分离,前端由index.html页面显示转换界面,包括指定数据库的连接地址、端口、数据库名称、用户名、密码。在转换之前可以先测试数据库连接状态,转换的过程分成10个步骤实时显示。后端专门处理数据,数据的处理规则我专门列了一个表格。这个表格我上传到了附件中,可以下载了查看。数据转换表里面有需要转换的数据表和字段,以及有些字段需要进行特殊处理的规则。
第一次写出来的程序就两个文件,一个是前端的index.html,另一个是后端转换数据的主程序convert.php。效果如下图所示。界面视觉效果不惊艳,但也还算看得过去。

怎样与AI沟通,以及转换需要哪些数据表和字段都是受到冰哥的指点。在不知道怎么和AI沟通之前,修改代码的时候AI总是会重写代码,导致旧的问题解决了,又出现新的问题,而且还增加其他的文件。效率非常低。
需要转换哪些数据表和字段,直接看我做的数据转换表即可。除了有些字段需要做特殊处理之外,我还加了一些数据过滤。因为我想把原本的一些版块数据合并,在wellcms里面不需要那么多版块。我总共就添加了三个版块。子版块之类的我就用tag标签代替了。所以,在转换规则里面有把原数据转换成标签的规则。
接下来我把转换规则简单说一下。
1.转换用户数据
| discuz X3.4源数据表 | 源字段 | wellcms目标数据表 | 目标字段 |
| pre_ucenter_members | uid | well_user | uid |
| username | username | ||
| password | password | ||
| salt | salt | ||
| regdate | create_date | ||
| regip | create_ip |
这是转换用户数据所需要的数据表和字段。因为discuz的regip存储的是字符串。而wellcms的create_ip存储的是整数,所以,除了regip这个字段需要转换成整数类型之后再插入目标数据表的create_ip字段之外,其他的字段值都是直接转换就行。
2.转换标签数据
| discuz X3.4源数据表 | 源字段 | wellcms目标数据表 | 目标字段 |
| pre_forum_forum | fid | well_website_tag | tagid |
| name | name |
这里就属于我自己的需求,把版块转换成标签。如果是把版块转换成版块的话目标数据表就要改成well_forum,需要的字段就是fid,fup,name这三个字段。这里其实建议自己先在新安装的程序中建立好版块。
3.转换主题数据
| discuz X3.4源数据表 | 源字段 | wellcms目标数据表 | 目标字段 |
| pre_forum_thread | tid | well_website_thread | tid |
| fid | fid | ||
| authorid | uid | ||
| subject | subject | ||
| dateline | create_date | ||
| views | views |
这里根据冰哥的提示是主题索引主要保存的是和主题相关的数据。字段分别是tid(主题ID),fid(版块ID),authorid(作者ID)在wellcms中是uid,subject是标题,dateline是发布时间,在wellcms中对应的是create_date,views是浏览次数。这里没什么需要特殊处理的数据,直接转换即可。
4.转换主题标签关系数据
| discuz X3.4源数据表 | 源字段 | wellcms目标数据表 | 目标字段 |
| pre_forum_thread | fid | well_website_thread | tag |
| pre_forum_forum | name | tag |
因为前面的操作我把版块转换成了标签,所以在这里我要把标签数据写入到主题索引中,否则文章就没有标签,如果不是把版块转换成标签的话,这步可以省略。这里需要做的特殊处理比较复杂。要先从pre_forum_thread源数据表中获得fid字段的值,再从pre_forum_forum源数据表中获得对应fid的name字段值,将从pre_forum_thread源数据表中获得fid字段的值和从pre_forum_forum源数据表中获得对应fid的name字段值以{"fid":"name"}的格式组合成字符串之后存入目标数据表的tag字段中,而不是单独将源数据表的fid和name字段的值写入目标数据表的tag字段中。这种特殊处理让AI写代码的时候第一次转换的值变成了类似{"fid","17":"name","版块名字"}这样的格式,后来让AI修复了格式。
5.转换评论在主题索引中的统计数据
| discuz X3.4源数据表 | 源字段 | wellcms目标数据表 | 目标字段 |
| pre_forum_post | useip | well_website_thread | userip |
| pre_forum_thread | replies | posts |
这一步是把discuz的回帖数转换成wellcms中的评论数,useip和userip分别代表了discuz和wellcms的用户发布ip地址数据,replies就是discuz的回帖数量,posts就是wellcms的评论数量。没什么需要特殊处理的,直接转换就可以。
6.转换帖子数据
| discuz X3.4源数据表 | 源字段 | wellcms目标数据表 | 目标字段 |
| pre_forum_post | tid | well_website_data | tid |
| message | message |
这一步就是把discuz中的帖子转换成wellcms中的文章。索引数据转换过了,这里转换的是正文数据。这里也一样没什么需要特殊处理的,直接转换。
7.转换评论数据
| discuz X3.4源数据表 | 源字段 | wellcms目标数据表 | 目标字段 |
| pre_forum_post | pid | well_website_comment | pid |
| fid | fid | ||
| tid | tid | ||
| authorid | uid | ||
| dateline | create_date | ||
| useip | userip | ||
| message | message |
这一步把discuz中的回帖转换成wellcms中的评论,这不是索引,而是回帖或评论的正文内容。(本文写到这里发现useip转换成userip的时候没有做特殊处理,还得修复一下。其实在之前这里也做过处理,后面数据表格改了很多次,改来改去就弄错了。),除了要把useip转换成整数之后再插入userip字段中之外,其他的都直接转换。
8.转换Thread id数据,也就是索引ID
| discuz X3.4源数据表 | 源字段 | wellcms目标数据表 | 目标字段 |
| pre_forum_thread | tid | well_website_thread_tid | tid |
| fid | fid | ||
| authorid | uid |
这些数据discuz是存放在forum_thread表中的,就是主题索引表,而wellcms是分开存储的,有单独的一个tid索引表。同样不需要做特殊处理,直接转换。
9.转换评论ID数据
| discuz X3.4源数据表 | 源字段 | wellcms目标数据表 | 目标字段 |
| pre_forum_post | pid | well_website_comment_pid | pid |
| fid | fid | ||
| tid | tid | ||
| authorid | uid |
这一步的评论ID在wellcms中其实就相当于是主题的索引ID,吧?和评论的正文是分开存储的。而discuz是和正文一起存储在forum_post表中。也是直接转换即可。
10.转换附件数据
| discuz X3.4源数据表 | 源字段 | wellcms目标数据表 | 目标字段 |
| pre_forum_attachment_0 | aid | well_website_attach | aid |
| tid | tid | ||
| pid | pid | ||
| uid | uid | ||
| dateline | create_date | ||
| filename | orgfilename | ||
| filesize | filesize | ||
| attachment | filename | ||
| pre_forum_attachment_1 | aid | well_website_attach | aid |
| tid | tid | ||
| pid | pid | ||
| uid | uid | ||
| dateline | create_date | ||
| filename | orgfilename | ||
| filesize | filesize | ||
| attachment | filename | ||
| pre_forum_attachment_2 | aid | well_website_attach | aid |
| tid | tid | ||
| pid | pid | ||
| uid | uid | ||
| dateline | create_date | ||
| filename | orgfilename | ||
| filesize | filesize | ||
| attachment | filename | ||
| pre_forum_attachment_3 | aid | well_website_attach | aid |
| tid | tid | ||
| pid | pid | ||
| uid | uid | ||
| dateline | create_date | ||
| filename | orgfilename | ||
| filesize | filesize | ||
| attachment | filename | ||
| pre_forum_attachment_4 | aid | well_website_attach | aid |
| tid | tid | ||
| pid | pid | ||
| uid | uid | ||
| dateline | create_date | ||
| filename | orgfilename | ||
| filesize | filesize | ||
| attachment | filename | ||
| pre_forum_attachment_5 | aid | well_website_attach | aid |
| tid | tid | ||
| pid | pid | ||
| uid | uid | ||
| dateline | create_date | ||
| filename | orgfilename | ||
| filesize | filesize | ||
| attachment | filename | ||
| pre_forum_attachment_6 | aid | well_website_attach | aid |
| tid | tid | ||
| pid | pid | ||
| uid | uid | ||
| dateline | create_date | ||
| filename | orgfilename | ||
| filesize | filesize | ||
| attachment | filename | ||
| pre_forum_attachment_7 | aid | well_website_attach | aid |
| tid | tid | ||
| pid | pid | ||
| uid | uid | ||
| dateline | create_date | ||
| filename | orgfilename | ||
| filesize | filesize | ||
| attachment | filename | ||
| pre_forum_attachment_8 | aid | well_website_attach | aid |
| tid | tid | ||
| pid | pid | ||
| uid | uid | ||
| dateline | create_date | ||
| filename | orgfilename | ||
| filesize | filesize | ||
| attachment | filename | ||
| pre_forum_attachment_9 | aid | well_website_attach | aid |
| tid | tid | ||
| pid | pid | ||
| uid | uid | ||
| dateline | create_date | ||
| filename | orgfilename | ||
| filesize | filesize | ||
| attachment | filename |
discuz的附件信息有10个分表,而wellcms只有一个。所以,10个表对应的的转换数据表和字段都是一样。也不需要做特殊处理。直接转换。这个附件我主要是还没有验证,只是把数据转过去了而已,在文章中其实是没有显示的,因为文章中的内容也需要修改,discuz帖里面的一些短代码和wellcms的代码不一样。这两点是还没有做完的,后面要继续完善。
以上这些全部转换完之后,就会发现标签列表里面没有数据。其实还差一步,转换标签索引数据。
这一步我没有写到转换表里面,因为没有直接的数据可以转换,而是需要从已经转换完成的数据中调用数据之后,经过特殊处理再存入索引表中。wellcms的索引表是well_website_tag_thread,需要数据的字段是tagid和tid,这两项数据我是给AI这样说的:“你是一位有10年经验的PHP程序员、数据库工程师、网页设计师,请修改上文中的convert.php文件的代码,增加一项转换规则:从well_website_thread目标数据表中获取tag字段的值,如果值不为空,就将对应的tid字段写入well_website_tag_thread目标数据表的tid字段中,同时将tag字段值中的纯数字部分写入well_website_tag_thread目标数据表的tagid字段中。这项规则放在所有转换规则的最后,也就是最后一条转换规则。不要对数据库的表或字段进行删除或创建的操作,只需要对相应字段中的数据进行复制和插入的处理。只需要增加相应的代码,不要重写代码,不要简化代码,只需要修改和增加对应的代码,修改完之后输出完整代码。”
11.转换标签索引数据
从提示词来看,转换方式就是:从well_website_thread目标数据表中获取tag字段的值,如果值不为空,就将对应的tid字段写入well_website_tag_thread目标数据表的tid字段中,同时将tag字段值中的纯数字部分写入well_website_tag_thread目标数据表的tagid字段中。
well_website_thread数据表的tag字段存储的就是标签信息,是{"fid":"name"}这样的格式。fid是数字,name是标签名称,也就是之前我转换的版块名称。如果你的版块有纯数字的话......我想应该没有人会做纯数字的版块吧。
做完这些之后,会发现标签列表里面有文章数据了,但是tag-list.html页面中,标签没有统计数据。这里还需要做最后一步。这一步和前面那一步一样,都没有写入转换规则的表格里,而是直接让AI做了。提示词是这样的:“你是一位有10年经验的PHP程序员、数据库工程师、网页设计师,请修改上文中的convert.php文件代码,在第10条转换规则中增加一项功能,将well_website_tag_thread目标数据表中的tagid字段中值相同的记录分别统计,然后将统计好的数量写入well_website_tag目标数据表中对应tagid的count字段中。不要对数据库的表或字段进行删除或创建的操作,只需要对相应字段中的数据进行复制和插入的处理。不要重写代码,不要简化代码,只需要修改和增加对应的代码,修改完之后输出完整代码。”
从提示词来看,这是需要更新well_website_tag数据表的count字段,也就是标签的统计数据。这个数据是直接从标签索引表里面统计出来之后再存储的。
12.更新标签统计数据
将well_website_tag_thread目标数据表中的tagid字段中值相同的记录分别统计,然后将统计好的数量写入well_website_tag目标数据表中对应tagid的count字段中。
所有这些做完之后,整个discuz的数据转换过来就完成了90%了。剩下的文章正文内容里面的代码替换和附件的问题我还需要继续让AI帮我写。
附上一张数据转换开始和结束的截图

这是先做了数据库连接测试之后再开始转换数据,在最下面显示测试的记录,转换用户数据的时候因为数据量比较大,进度会在这里停一小会儿。

数据转换完成。截图留个纪念。
做的还可以,动手能力很强,赞一个。
AI提示词可以试试这样写:
##角色:你是一位经验丰富的PHP程序员
##目标:将discuz X3.4转换到wellcms2.x
##覆盖功能:
-1、将discuz X3.4 数据表转换到wellcms2.x数据表,优先分析官方说明或数据表备注;
- discuz X3.4 数据表如下:
// 双引号不要去掉,如果代码中有双引号必须使用占位符```
```贴安装包干净的数据表```
- wellcms2.x 数据表如下:
```数据表内容```
-2、列出需要转换的数据,并标注重要和非重要数据;
-3、给出完整的转换步骤和方案。
// 可追加其他转换要求
##约束铁律:
-1、100% 兼容wellcms2.x的环境要求;
-2、确保上下文100%一致;
##验收标准:
-1、重要数据必须100%转换到wellcms2.x
-2、转换步骤和逻辑必须清晰可验证
##执行要求:
-1、先输出需要转换的数据和转换方案
-2、根据待转换数据和方案进行提示词编写,需严格遵守“覆盖功能”、“约束铁律”、“验收标准”
-3、对转换代码进行验收
现在执行第一步:输出需要转换的数据和转换方案
根据执行要求跟AI对话,以上是markdown文档格式,AI专有的格式。不用这个格式也可以,但段落要分清。
