首先要了解下 discuzX3.4 和 nodebb 的数据库结构,discuzX 用的是 mysql ,nodebb 用的是 mongodb 。

最重要的当然是用户相关的数据表和帖子数据表。discuzX 能查到数据表字典,nodebb 只能自己用 mongodb 的 admin 工具看了。

一、用户数据

1 、nodebb 和 discuz 数据表的对照

 Nodebb 用户表须用的数据(字段):
db.objects.findOne({username:"admin"})  -->
{
    "_id" : ObjectId("65cb8801e09f69ff71141520"),
    "_key" : "user:1",
    "joindate" : 1707837441083,
    "lastonline" : 1708000177292,
//"status" : "online",
    "uid" : 1,
    "username" : "admin",
//"userslug" : "admin",
    "password" : "$2a$12$VIKLGFC3AS1B4sDuVNivIOQO1HVpxjdOJXyUDBnDZqbu5nK",
//"password:shaWrapped" : 1,
    "email" : "32342@yeah.net",
//"email:confirmed" : 1,
//"groupTitle" : "[\"\"]",
//"gdpr_consent" : 1,
  "profileviews" : 0,      // 空间点击数 views
  "reputation" : 0,       // 声誉,积分 credits
    "topiccount" : 1,       // 主题 threads
    "lastposttime" : 1707837441933,
    "postcount" : 1,        // 帖子 posts (包含了主题)
//"rss_token" : "17305070-9558-4f2a-bef1-aba7902e0990",
    "picture" : "/assets/uploads/profile/1-profileavatar-1707989852545.jpeg",
    "uploadedpicture" : "/assets/uploads/profile/1-profileavatar-1707989852545.jpeg",
    "fullname" : "全名 guojin",
    "aboutme" : "关于我是一个管理员",
    "birthday" : "2024-02-15",
    "location" : "广州",
    "signature" : "签名:我是一个管理员",
    "website" : "https://weibo.com/我的网"
}

discuzX 的表分得比较散,有好几个表:

pre_common_member 用户主表

字段名数据类型默认值允许非空备注
uidmediumint(8) unsigned NO会员 id
emailchar(40) NO邮箱
usernamechar(15) NO用户名
passwordchar(32) NO密码
statustinyint(1)0NO判断用户是否已经删除 需要 discuz 程序加判断,并增加整体清理的功能。原 home 字段为 flag
emailstatustinyint(1)0NOemail 是否经过验证 home 字段为 emailcheck
avatarstatustinyint(1)0NO是否有头像 home 字段为 avatar
videophotostatustinyint(1)0NO视频认证状态 home
adminidtinyint(1)0NO管理员 id
groupidsmallint(6) unsigned0NO会员组 id
groupexpiryint(10) unsigned0NO用户组有效期
extgroupidschar(20) NO扩展用户组
regdateint(10) unsigned0NO注册时间
creditsint(10)0NO总积分
notifysoundtinyint(1)0NO短信声音
timeoffsetchar(4) NO时区校正
newpmsmallint(6) unsigned0NO新短消息数量
newpromptsmallint(6) unsigned0NO新提醒数目
accessmaskstinyint(1)0NO标志
allowadmincptinyint(1)0NO标志
onlyacceptfriendpmtinyint(1)0NO是否只接收好友短消息
conisbindtinyint(1) unsigned0NO用户是否绑定 QC

uc_members 用户表

字段名数据类型默认值允许非空备注
uidmediumint(8) unsigned NO用户 ID
usernamechar(15) NO用户名
passwordchar(32) NO密码
emailchar(32) NO用户 Email
myidchar(30) NO漫游 id
myidkeychar(16) NO漫游 id
regipchar(15) NO注册 IP
regdateint(10) unsigned0NO注册时间
lastloginipint(10)0NO上次登陆的 IP(程序转换成数值类型)
lastlogintimeint(10) unsigned0NO上次登录的时间
saltchar(6) NO密码干扰串,用来和密码进行配合验证,防止被暴力破解
secqueschar(8) NO用户的安全提问

pre_common_member_field_forum 用户论坛字段表

字段名数据类型默认值允许非空备注
uidmediumint(8) unsigned NO会员 id
publishfeedtinyint(3)0NO用户自定义发送哪些类型的 feed(原字段为 customaddfeed)
customshowtinyint(1) unsigned26NO自定义帖子显示模式
customstatusvarchar(30) NO自定义头衔
medalstext NO勋章信息
sightmltext NO签名
grouptermstext NO公共用户组
authstrvarchar(20) NO找回密码验证串
groupsmediumtext NO用户所有群组
attentiongroupvarchar(255) NO用户偏好

pre_common_member_profile 用户栏目表

字段名数据类型默认值允许非空备注
uidmediumint(8) unsigned NO会员 id
realnamevarchar(255) NO实名
gendertinyint(1)0NO性别 (0:保密 1:男 2:女)
birthyearsmallint(6) unsigned0NO
birthmonthtinyint(3) unsigned0NO
birthdaytinyint(3) unsigned0NO
constellationvarchar(255) NO星座(根据生日自动计算)
zodiacvarchar(255) NO生肖(根据生日自动计算)
telephonevarchar(255) NO固定电话
mobilevarchar(255) NO手机
idcardtypevarchar(255) NO证件类型:身份证 护照 军官证等
idcardvarchar(255) NO证件号码
addressvarchar(255) NO邮寄地址
zipcodevarchar(255) NO邮编
nationalityvarchar(255) NO国籍
birthprovincevarchar(255) NO出生省份
birthcityvarchar(255) NO出生城市
birthdistvarchar(20) NO出生行政区/县
birthcommunityvarchar(255) NO出生小区
resideprovincevarchar(255) NO居住省份
residecityvarchar(255) NO居住城市
residedistvarchar(20) NO居住行政区/县
residecommunityvarchar(255) NO居住小区
residesuitevarchar(255) NO小区、写字楼门牌号
graduateschoolvarchar(255) NO毕业学校
companyvarchar(255) NO公司
educationvarchar(255) NO学历
occupationvarchar(255) NO职业
positionvarchar(255) NO职位
revenuevarchar(255) NO年收入
affectivestatusvarchar(255) NO情感状态
lookingforvarchar(255) NO交友目的(交友类型)
bloodtypevarchar(255) NO血型
heightvarchar(255) NO身高
weightvarchar(255) NO体重
alipayvarchar(255) NO支付宝帐号
icqvarchar(255) NOICQ
qqvarchar(255) NOQQ
yahoovarchar(255) NOYAHOO
msnvarchar(255) NOMSN
taobaovarchar(255) NO阿里旺旺
sitevarchar(255) NO主页
biotext NO自我介绍 来自论坛 bio 字段
interesttext NO兴趣爱好
field1text NO自定义字段 1
field2text NO自定义字段 2
field3text NO自定义字段 3
field4text NO自定义字段 4
field5text NO自定义字段 5
field6text NO自定义字段 6
field7text NO自定义字段 7
field8text NO自定义字段 8

pre_common_member_count 用户统计表

字段名数据类型默认值允许非空备注
uidmediumint(8) unsigned NO会员 id
extcredits1int(10)0NO声望
extcredits2int(10)0NO金钱
extcredits3int(10)0NO扩展
extcredits4int(10)0NO扩展
extcredits5int(10)0NO扩展
extcredits6int(10)0NO扩展
extcredits7int(10)0NO扩展
extcredits8int(10)0NO扩展
friendssmallint(6) unsigned0NO好友个数 home
postsmediumint(8) unsigned0NO帖子数
threadsmediumint(8) unsigned0NO主题数
digestpostssmallint(6) unsigned0NO精华数
doingssmallint(6) unsigned0NO记录数
blogssmallint(6) unsigned0NO日志数
albumssmallint(6) unsigned0NO相册数
sharingssmallint(6) unsigned0NO分享数
attachsizeint(10) unsigned0NO上传附件占用的空间 home
viewsmediumint(8) unsigned0NO空间查看数
oltimesmallint(6) unsigned0NO在线时间
todayattachssmallint(6) unsigned0NO当天上传附件数
todayattachsizeint(10) unsigned0NO当天上传附件容量
feedsmediumint(8) unsigned0NO广播数
followermediumint(8) unsigned0NO听众数量
followingmediumint(8) unsigned0NO收听数量
newfollowermediumint(8) unsigned0NO新增听众数量
blacklistmediumint(8) unsigned0NO拉黑用户数

pre_common_member_status 用户状态表

字段名数据类型默认值允许非空备注
uidmediumint(8) unsigned NO会员 id
regipchar(15) NO注册 IP
lastipchar(15) NO最后登录 IP
lastvisitint(10) unsigned0NO最后访问
lastactivityint(10) unsigned0NO最后活动
lastpostint(10) unsigned0NO最后发表
lastsendmailint(10) unsigned0NO上次发送 email 时间 home 原字段为 lastsend
invisibletinyint(1)0NO是否隐身登录
buyercreditsmallint(6)0NO买家信用等级及积分
sellercreditsmallint(6)0NO卖家信用等级及积分
favtimesmediumint(8) unsigned0NO个人空间收藏次数
sharetimesmediumint(8) unsigned0NO个人空间分享次数
profileprogresstinyint(2) unsigned0NO个人资料完成度

2 、处理头像

discuz 默认自定义头像目录:data/attachment/forum/pw/upload/33370.jpg

discuzX 的默认自定议头像目录:

/uc_server/data/avatar/xx/xx/xx_avatar_big.jpg

其中 xx/xx/xx_ 正好是 uid ,位数不够的系统会自动补零

因此写了个程序,把 xx_avatar_middle.jpg 文件拷贝到一个目录里(一会儿复制到服务端去),并把文字名改为 xxxxxx_avatar_big.jpg ,最后还把{uid: “xxxxxx”, path: "/assets/uploads/profile/000/dz_avatar/62011_avatar_big.jpg”} 存成 json 文件,以备后面使用。

服务端我复制到目录:~/nodebb/public/uploads/profile/dz_avatar

import os,shutil,json


# file_list 为文件名称列表
def find_files_path(str_list, path=r"./"):
    # 组合绝对路径,当前路径+目录
    whole_path = os.getcwd() + path
    # 遍历目录下的文件
    files_path = os.walk(whole_path)
    # 路径空列表,用来存储查找文件路径
    path_data = []
    try:
        # 遍历要寻找的文件
        for str in str_list:
            # 查找目录下对应的文件

            for root, dirs, files in files_path:
                # 遍历所有文件名称,添加符合文件名称的文件路径进列表
                for f in files:

                    if str in f:
                        real_path = (root  + "\\" + f).replace("./", "\\")
                        #print(real_path)
                        uid_file = real_path[-26:].replace("\\", "").lstrip("0") #去0,得到文件名:uid + _avatar_middle.jpg
                        
                        path_data.append({"uid": real_path[-26:-18].replace("\\", "").lstrip("0"),
                                          "path": '/assets/uploads/profile/dz_avatar/'+uid_file})

                        shutil.copyfile(real_path, "./" + uid_file)  # 拷贝文件
    except Exception as e:
        print("遍历出现错误:" + e)
    finally:
        return path_data

uid_file_list = find_files_path(["big"], "./")

print(uid_file_list)

#data = {'name': 'John', 'age': 30, 'city': 'New York'}
 
with open('avatar_data.json', 'w') as f:
    json.dump(uid_file_list, f)

初烧20年
1 声望0 粉丝