无忧启动论坛

标题: 居然没人讨论一下deepseek? [打印本页]

作者: pda8888    时间: 2025-1-26 19:03
标题: 居然没人讨论一下deepseek?
www.deepseek.com
神器啊,可以帮助写好多代码,并帮助你学习以前可能根本不掌握的编程知识。
我一直在用chatgpt,感觉deepseek的确不输给chatgpt,不过网传的强过4o,就不清楚了,因为我没有购买gpt4o使用权

作者: dreamingcoffee    时间: 2025-1-26 19:07
商家卷款跑路了,用不了chatgpt了。
作者: 518hl    时间: 2025-1-26 19:11
在用  感觉挺好的  很智能啊
作者: hkl7366    时间: 2025-1-26 19:26
这两天刚接触,觉得挺好的。
作者: fjun67    时间: 2025-1-26 19:48
还没有用上。先了解下。
作者: dysunb    时间: 2025-1-26 20:00
可能知道的人还是少啊
作者: wintoflash    时间: 2025-1-26 20:41
http://bbs.wuyou.net/forum.php?m ... &extra=page%3D1
对于生成式人工智能,最好不要在论坛上讨论。
作者: pda8888    时间: 2025-1-26 20:59
wintoflash 发表于 2025-1-26 20:41
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=436442&extra=page%3D1
对于生成式人工智能,最好不 ...

不好意思,没看到这规定,请版主封帖吧。
作者: tt911    时间: 2025-1-26 21:00
已经用了一周多了。。
开始delphi里表现很好
后来没三天就连接不上了
只能vs code或网页里用了。
作者: http88    时间: 2025-1-26 21:21
豆包算力第一  chatgpt第二  deepseek第三
作者: martin313    时间: 2025-1-26 21:23
tt911 发表于 2025-1-26 21:00
已经用了一周多了。。
开始delphi里表现很好
后来没三天就连接不上了


牛逼达人
作者: bgcen    时间: 2025-1-26 21:30
多谢分享
作者: sunyboy    时间: 2025-1-26 22:33
好像DeepSeek很牛!
作者: 15126222223    时间: 2025-1-26 23:48
我一直在学习AI,感觉现在非常牛公司很多,特别是国内在不停追赶,甚至有超过的可能。
作者: wang1126    时间: 2025-1-27 06:28
谢谢楼主分享
作者: tanglf    时间: 2025-1-27 07:46
牛逼达人一个,说说具体的
作者: ukyomax    时间: 2025-1-27 08:12
DeepSeek很牛
作者: 华昕    时间: 2025-1-27 08:34
用过几回,确实不错,但如果生成文章的话,敏感词一出现,直接就不生成了
作者: szwp    时间: 2025-1-27 08:38
居然想讨论了
作者: dkzzlf    时间: 2025-1-27 08:45
围观学习
作者: tt911    时间: 2025-1-27 09:33
标题: 都是AI给我写的
  1. unit Unit1;

  2. interface

  3. uses
  4.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  5.   System.Classes, Vcl.Graphics,
  6.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls,
  7.   Vcl.ExtCtrls, Vcl.WinXCtrls, Vcl.Menus;

  8. type
  9.   TForm1 = class(TForm)
  10.     SplitView1: TSplitView;
  11.     展开或折叠: TButton;
  12.     添加选中节点同级父目录: TButton;
  13.     添加文件路径: TButton;
  14.     删除节点: TButton;
  15.     双击打开文件: TButton;
  16.     简单写入TreeView1内容测试: TButton;
  17.     TreeView1: TTreeView;
  18.     OpenDialog1: TOpenDialog;
  19.     SaveDialog1: TSaveDialog;
  20.     简单载入TreeView1内容测试: TButton;
  21.     Edit1: TEdit;
  22.     PopupMenu1: TPopupMenu;
  23.     将TreeView1各节点转换为PopupMenu1子菜单项: TButton;
  24.     添加与选中节点同级子目录: TButton;
  25.     procedure 展开或折叠Click(Sender: TObject);
  26.     procedure 添加选中节点同级父目录Click(Sender: TObject);
  27.     procedure 添加文件路径Click(Sender: TObject);
  28.     procedure 删除节点Click(Sender: TObject);
  29.     procedure 双击打开文件Click(Sender: TObject);
  30.     procedure 简单写入TreeView1内容测试Click(Sender: TObject);
  31.     procedure 简单载入TreeView1内容测试Click(Sender: TObject);
  32.     procedure FormCreate(Sender: TObject);
  33.     procedure TreeView1StartDrag(Sender: TObject; var DragObject: TDragObject);
  34.     procedure TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
  35.       State: TDragState; var Accept: Boolean);
  36.     procedure TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
  37.     procedure MenuItemClick(Sender: TObject);
  38.     procedure 将TreeView1各节点转换为PopupMenu1子菜单项Click(Sender: TObject);
  39.     procedure 添加与选中节点同级子目录Click(Sender: TObject);
  40.   private
  41.     FDragNode: TTreeNode; // 用于存储当前拖动的节点
  42.     { Private declarations }
  43.     procedure ConvertTreeViewToMenu(TreeView: TTreeView; PopupMenu: TPopupMenu);
  44.     procedure AddMenuItem(ParentMenu: TMenuItem; Node: TTreeNode);
  45.   public
  46.     { Public declarations }
  47.   end;

  48. var
  49.   Form1: TForm1;

  50. implementation

  51. {$R *.dfm}

  52. procedure TForm1.删除节点Click(Sender: TObject);
  53. begin
  54.   // 删除选中的节点
  55.   if TreeView1.Selected <> nil then
  56.     TreeView1.Items.Delete(TreeView1.Selected);
  57. end;

  58. procedure TForm1.双击打开文件Click(Sender: TObject);
  59. var
  60.   Node: TTreeNode;
  61. begin
  62.   // 双击打开文件
  63.   Node := TreeView1.Selected;
  64.   if (Node <> nil) and (Node.Parent <> nil) then // 如果是文件节点
  65.   begin
  66.     if FileExists(Node.Text) then
  67.       // ShellExecute(0, 'open', PChar(Node.Text), nil, nil, SW_SHOWNORMAL)
  68.     else
  69.       ShowMessage('File not found: ' + Node.Text);
  70.   end;
  71. end;

  72. procedure TForm1.将TreeView1各节点转换为PopupMenu1子菜单项Click(Sender: TObject);
  73. begin
  74.   // 清空 PopupMenu
  75.   PopupMenu1.Items.Clear;

  76.   // 将 TreeView 转换为 PopupMenu
  77.   ConvertTreeViewToMenu(TreeView1, PopupMenu1);

  78.   // 显示 PopupMenu
  79.   PopupMenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
  80. end;

  81. procedure TForm1.展开或折叠Click(Sender: TObject);
  82. begin
  83.   SplitView1.Opened := not SplitView1.Opened; // 切换 SplitView 的展开/折叠状态
  84. end;

  85. procedure TForm1.添加与选中节点同级子目录Click(Sender: TObject);
  86. var
  87.   Node: TTreeNode;
  88. begin
  89.   // 添加子目录(作为选中节点的子节点)
  90.   if TreeView1.Selected <> nil then
  91.   begin
  92.     Node := TreeView1.Items.AddChild(TreeView1.Selected, Edit1.Text);
  93.     Node.ImageIndex := 1; // 设置图标(可选)
  94.     Node.SelectedIndex := 1;
  95.     TreeView1.Selected.Expand(True); // 展开父节点
  96.   end
  97.   else
  98.   begin
  99.     ShowMessage('请先选择一个节点!');
  100.   end;
  101. end;

  102. procedure TForm1.添加文件路径Click(Sender: TObject);
  103. var
  104.   Node: TTreeNode;
  105. begin
  106.   // 添加文件路径
  107.   if OpenDialog1.Execute then
  108.   begin
  109.     Node := TreeView1.Items.AddChild(TreeView1.Selected, OpenDialog1.FileName);
  110.     Node.ImageIndex := 1; // 设置图标(可选)
  111.     Node.SelectedIndex := 1;
  112.   end;
  113. end;

  114. procedure TForm1.添加选中节点同级父目录Click(Sender: TObject);
  115. var
  116.   Node: TTreeNode;
  117. begin
  118.   // 添加目录(与选中节点同级)
  119.   if TreeView1.Selected <> nil then
  120.   begin
  121.     Node := TreeView1.Items.Add(TreeView1.Selected.Parent, Edit1.Text);
  122.     Node.ImageIndex := 0; // 设置图标(可选)
  123.     Node.SelectedIndex := 0;
  124.   end
  125.   else
  126.   begin
  127.     ShowMessage('请先选择一个节点!');
  128.   end;
  129. end;

  130. procedure TForm1.简单写入TreeView1内容测试Click(Sender: TObject);
  131. begin
  132.   TreeView1.SaveToFile('abc.txt');
  133. end;

  134. procedure TForm1.简单载入TreeView1内容测试Click(Sender: TObject);
  135. begin
  136.   TreeView1.LoadFromFile('abc.txt');
  137. end;

  138. procedure TForm1.FormCreate(Sender: TObject);
  139. var
  140.   RootNode, ChildNode: TTreeNode;
  141. begin
  142.   // 添加示例数据到 TreeView
  143.   RootNode := TreeView1.Items.Add(nil, 'Root Node 1');
  144.   ChildNode := TreeView1.Items.AddChild(RootNode, 'Child Node 1.1');
  145.   TreeView1.Items.AddChild(ChildNode, 'Grandchild Node 1.1.1');
  146.   TreeView1.Items.AddChild(RootNode, 'Child Node 1.2');

  147.   RootNode := TreeView1.Items.Add(nil, 'Root Node 2');
  148.   TreeView1.Items.AddChild(RootNode, 'Child Node 2.1');

  149.   // 展开所有节点
  150.   TreeView1.FullExpand;
  151. end;

  152. procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
  153. var
  154.   TargetNode: TTreeNode;
  155. begin
  156.   // 获取鼠标位置下的目标节点
  157.   TargetNode := TreeView1.GetNodeAt(X, Y);

  158.   if (TargetNode <> nil) and (FDragNode <> nil) then
  159.   begin
  160.     // 将拖动节点移动到目标节点下
  161.     FDragNode.MoveTo(TargetNode, naAddChild); // naAddChild 表示作为子节点
  162.     TargetNode.Expand(True); // 展开目标节点
  163.   end;
  164. end;

  165. procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
  166.   State: TDragState; var Accept: Boolean);
  167. var
  168.   TargetNode: TTreeNode;
  169. begin
  170.   // 获取鼠标位置下的目标节点
  171.   TargetNode := TreeView1.GetNodeAt(X, Y);

  172.   // 允许拖动的条件:
  173.   // 1. 拖动源是 TreeView 自身
  174.   // 2. 目标节点存在
  175.   // 3. 目标节点不是拖动节点的子节点(避免循环嵌套)
  176.   Accept := (Source = TreeView1) and (TargetNode <> nil) and
  177.     (not FDragNode.HasAsParent(TargetNode));
  178. end;

  179. procedure TForm1.TreeView1StartDrag(Sender: TObject;
  180.   var DragObject: TDragObject);
  181. begin
  182.   // 开始拖动时,记录当前拖动的节点
  183.   FDragNode := TreeView1.Selected;
  184. end;

  185. procedure TForm1.ConvertTreeViewToMenu(TreeView: TTreeView;
  186.   PopupMenu: TPopupMenu);
  187. var
  188.   i: Integer;
  189. begin
  190.   // 遍历所有根节点
  191.   for i := 0 to TreeView.Items.Count - 1 do
  192.   begin
  193.     if TreeView.Items[i].Parent = nil then // 根节点
  194.       AddMenuItem(PopupMenu.Items, TreeView.Items[i]);
  195.   end;
  196. end;

  197. procedure TForm1.AddMenuItem(ParentMenu: TMenuItem; Node: TTreeNode);
  198. var
  199.   MenuItem: TMenuItem;
  200.   i: Integer;
  201. begin
  202.   // 创建菜单项
  203.   MenuItem := TMenuItem.Create(Self);
  204.   MenuItem.Caption := Node.Text;

  205.   // 如果是叶子节点(没有子节点),绑定点击事件
  206.   if Node.Count = 0 then
  207.     MenuItem.OnClick := MenuItemClick;

  208.   // 将菜单项添加到父菜单
  209.   ParentMenu.Add(MenuItem);

  210.   // 递归处理子节点
  211.   for i := 0 to Node.Count - 1 do
  212.   begin
  213.     AddMenuItem(MenuItem, Node.Item[i]);
  214.   end;
  215. end;

  216. procedure TForm1.MenuItemClick(Sender: TObject);
  217. begin
  218.   // // 处理菜单项点击事件
  219.   ShowMessageFmt('你点击了: %s', [TMenuItem(Sender).Caption]);
  220. end;

  221. end.
复制代码

作者: 9zhmke    时间: 2025-1-27 10:38
pda8888 发表于 2025-1-26 20:59
不好意思,没看到这规定,请版主封帖吧。

主题是Deepseek,没有讨论到需要封贴的内容
作者: wzq123    时间: 2025-1-27 10:53
听过,没用过,看qq群里有说过。
作者: cena    时间: 2025-1-27 11:35
谢谢分享
作者: 呆萌鼠    时间: 2025-1-27 13:11
国内个人使用感受是豆包稍微详细些,deepseek稍微简洁,不过这两天deepseek进步挺快的,我是喜欢用豆包多一些,deepseek期待提高。
作者: hycsl888    时间: 2025-1-27 13:25
试了一下,不能AI画图。
作者: win98se    时间: 2025-1-27 15:36
http88 发表于 2025-1-26 21:21
豆包算力第一  chatgpt第二  deepseek第三

尊嘟假嘟
作者: win98se    时间: 2025-1-27 15:36
hycsl888 发表于 2025-1-27 13:25
试了一下,不能AI画图。

AI P图哪家好
作者: guong    时间: 2025-1-27 15:37
来了解下
作者: win98se    时间: 2025-1-27 15:37
tt911 发表于 2025-1-27 09:33

太牛了
作者: jj精益求钱    时间: 2025-1-27 16:40
真有怎么好用
作者: 2011bigstern    时间: 2025-1-27 17:12
刚才用了下,不能生成图片吧。
作者: 前面听说风很大    时间: 2025-1-27 17:14
别的不说,就软件的名字和图标比豆包之类的领先了几条街
作者: ajinf12378    时间: 2025-1-27 17:19
确实非常强大
作者: proof    时间: 2025-1-27 17:40
今天看到相关热搜
作者: cxydeity    时间: 2025-1-27 18:10
来了解下

作者: lmyx2008    时间: 2025-1-28 02:23
这个讨论好
作者: 唐峰    时间: 2025-1-28 23:08
很火啊这两天
作者: 荃新焦点    时间: 2025-1-29 09:51
这个中国AI,引起美股科技股暴跌,被特朗普明确提起的公司,引发全球关注!
作者: woy8    时间: 2025-1-29 10:04
刚接触,先学习学习。
作者: kukuyu    时间: 2025-1-29 10:10
确实是神器
作者: pda8888    时间: 2025-1-29 11:30


作者: 445112826    时间: 2025-1-29 13:10
看到DeepSeek最近特火,很期待,希望中国AI发展越来越好。
作者: kklan    时间: 2025-1-29 14:50
这炸开应用和市场的手法缺乏翻新,淘宝、姚明、J20。。。总是老一套。

以AI攻击社会和文化,就是找死。
作者: lmyx2008    时间: 2025-1-30 06:14
阿里也来凑热闹,qwen2.5什么反超deepseek v3,正是都想沾光
作者: fsz2015    时间: 2025-1-30 09:35
今天看到相关热搜
作者: pda8888    时间: 2025-1-30 09:47
现在我在测试,好像已经不转圈了,可以立即响应提问了。
作者: wzq123    时间: 2025-1-30 09:55
有啥讨论的,全网到处都是介绍。
作者: snow0snow0    时间: 2025-1-30 10:18
因为这里大多数是行家,明白这是给啥东西,人工智能大模型的关键是数据何这些数据的训练,搜索引擎算法只是一个壳,都是开源的。你有这些数据也能开发出这样的系统。
作者: 2011monoso    时间: 2025-1-30 10:27
一般般, 没有什么特别
作者: hycsl888    时间: 2025-1-30 11:48
win98se 发表于 2025-1-27 15:36
AI P图哪家好

还是CT高铁票
作者: shoot6661    时间: 2025-1-30 11:57
snow0snow0 发表于 2025-1-30 10:18
因为这里大多数是行家,明白这是给啥东西,人工智能大模型的关键是数据何这些数据的训练,搜索引擎算法只是 ...

那你的意思是全世界除了美国全是废物呗,他们怎么没开发出来?再看表现美国股市反应也太大了啊,不是被deepseek吓得啊,莫不是被你蠢得..再说这里,大多数就是D版用户..
作者: Admin'    时间: 2025-1-30 14:36
被攻击了吧啊
作者: 前面听说风很大    时间: 2025-1-30 19:22
snow0snow0 发表于 2025-1-30 10:18
因为这里大多数是行家,明白这是给啥东西,人工智能大模型的关键是数据何这些数据的训练,搜索引擎算法只是 ...

高人出现了。你也开发一个现有的模型都不具备的新模型出来,然后开源给全世界看看??
作者: ddzyhhh    时间: 2025-1-30 23:04
https://cdn.deepseek.com/apk/deepseek.apk
https://download.deepseek.com/app

作者: jxcy    时间: 2025-2-3 17:10
普通的民众只能是看看热闹了,专业或者行业可以说是革命性的开始
作者: 一代宗师    时间: 2025-2-3 17:22
国产的牛,听说一百多个国家下载app 榜首
作者: lingyun28556    时间: 2025-2-3 18:40
写代码的不会啊
作者: martin313    时间: 2025-2-3 18:55
对比起来,deepseek 写相对稍微复杂点的批处理方面,比百度的文心一言强些,文心的经常是无法运行

昨天改了一下午,总算改成了我自己满意的批处理脚本出来
作者: ddonglliu    时间: 2025-2-3 18:56
主要是在国内
作者: fjun67    时间: 2025-2-3 19:09
看看再说。
作者: Zhengqiang5q    时间: 2025-2-3 19:10
不会又缴 智商税 吧!
作者: pda8888    时间: 2025-2-3 20:23
马老板的通义也很强,https://tongyi.aliyun.com/qianwen/ 可以一试。
作者: pda8888    时间: 2025-2-4 10:38
一个简单的问题让AI们分出了高下:
问:批处理中,把字符串中的=替换成a,只能用纯批处理语法,不借助第3方工具,如powershell,如何写?
通义千问2.5、豆包、deepseek 3个国产AI 多轮改进无果,其中通义千问2.5、豆包至少进行了10轮以上改进,要么结果不正确,要么被语法错误直接退出。deepseek只进行了3轮,就一直提示 “服务器繁忙,请稍后再试。”无法再继续。
最后,请出了chatGPT,结果恰老师一把搞定:
  1. @echo off
  2. setlocal enabledelayedexpansion

  3. set "str=hello=world"
  4. set "newstr="
  5. for /L %%i in (0,1,100) do (
  6.     set "char=!str:~%%i,1!"
  7.     if "!char!"=="" goto :done
  8.     if "!char!"=="=" (
  9.         set "char=a"
  10.     )
  11.     set "newstr=!newstr!!char!"
  12. )
  13. :done
  14. echo %newstr%
复制代码

不黑不吹,实测。
作者: pda8888    时间: 2025-2-4 10:45
本帖最后由 pda8888 于 2025-2-4 10:48 编辑

我说:
你怎么那么厉害,隔壁通义、豆包、ds都搞不定。虽然你的代码有些瑕疵,即:for /L %%i in (0,1,100),假定了原始字符串长度在100以内。

chatGPT说:
哈哈,多谢夸奖!你提的这个问题很关键,确实 for /L %%i in (0,1,100) 只适用于长度在 100 以内的字符串。要更通用,可以动态计算字符串长度,比如这样:
  1. @echo off
  2. setlocal enabledelayedexpansion

  3. set "str=hello=world=this=is=a=test"
  4. set "len=0"

  5. :: 计算字符串长度
  6. for /L %%i in (0,1,500) do (
  7.     if "!str:~%%i,1!"=="" goto :length_done
  8.     set /a len+=1
  9. )
  10. :length_done

  11. set "newstr="
  12. for /L %%i in (0,1,%len%) do (
  13.     set "char=!str:~%%i,1!"
  14.     if "!char!"=="=" (
  15.         set "char=a"
  16.     )
  17.     set "newstr=!newstr!!char!"
  18. )
  19. echo %newstr%
复制代码
优化点
动态计算字符串长度
先用 for /L 循环找出 str 长度,避免固定长度 100 的限制。
支持任意长度的字符串
现在可以处理更长的 str,只受 cmd.exe 变量最大长度(8191 字符)的限制。

我又说:
假定500也是瑕疵,应该用死循环,直到拆解的单一字符是空。

chatGPT说:
你说得对,500 也是个固定值,最稳妥的方法是用死循环,直到拆解出的单字符为空。这是改进版代码:
  1. @echo off
  2. setlocal enabledelayedexpansion

  3. set "str=hello=world=this=is=a=test"
  4. set "newstr="
  5. set "i=0"

  6. :loop
  7. set "char=!str:~%i%,1!"
  8. if "!char!"=="" goto :done
  9. if "!char!"=="=" set "char=a"
  10. set "newstr=!newstr!!char!"
  11. set /a i+=1
  12. goto :loop

  13. :done
  14. echo %newstr%
  15. exit /b
复制代码
改进点
使用死循环 (:loop + goto)
逐字符解析 str,直到 char 为空,保证适用于任何长度的字符串。
避免 for /L 限制
不再受固定长度 (100、500) 的影响,适应更长的 str。

姜还是老的辣,厉害!即使ds不提示繁忙,第4把搞定,跟恰老师一把搞定,区别太大。

作者: lmyx2008    时间: 2025-2-4 10:58
pda8888 发表于 2025-2-4 10:38
一个简单的问题让AI们分出了高下:
问:批处理中,把字符串中的=替换成a,只能用纯批处理语法,不借助第3 ...

deepseek回答在批处理中,可以使用变量替换功能将字符串中的等号 `=` 替换为 `a`。以下是具体实现方法:

### 方法 1:直接替换(无特殊字符时)
```batch
@echo off
set "str=Your=String=With=Equals"
set "str=%str:==a%"
echo 替换后的字符串: %str%
```

### 方法 2:使用延迟扩展(处理特殊字符时)
```batch
@echo off
setlocal enabledelayedexpansion
set "str=Your=String=With=Equals&More"
set "str=!str:==a!"
echo 替换后的字符串: !str!
```

### 代码解释:
1. **变量替换语法**:  
   使用 `%var:old=new%` 或 `!var:old=new!`(延迟扩展)将变量中的 `old` 替换为 `new`。  
   此处 `old` 是 `=`,因此写法为 `%str:==a%`,即:  
   - 第一个 `=` 表示原字符。  
   - 第二个 `=` 是分隔符(固定语法)。  
   - `a` 是替换后的新字符。

2. **处理特殊字符**:  
   如果字符串包含 `&`、`|` 等特殊符号,需启用延迟扩展(`setlocal enabledelayedexpansion`)并使用 `!` 代替 `%` 访问变量。

### 示例输出:
```
替换后的字符串: YourAStringAWithAEquals
```

### 注意事项:
- 如果字符串来自文件或外部输入,需先将其存入变量再操作。  
- 等号 `=` 在批处理中无特殊转义需求,直接替换即可。
作者: pda8888    时间: 2025-2-4 11:08
本帖最后由 pda8888 于 2025-2-4 11:24 编辑

楼上,要实测。
AI们都能很快作答,不过要以实测验证为准。你贴的ds的两个方案:
方案一的输出是:
  1. 此时不应有 ==a%"。
  2. 命令语法不正确。
复制代码

方案二的输出是:
  1. 替换后的字符串: str:==a
复制代码

顺便再贴一个图,恰老师太有趣了:


作者: lmyx2008    时间: 2025-2-4 11:10
各有特色,人工智能还要继续训练
作者: zjlcnn    时间: 2025-2-4 11:46
已经在本地部署了32B版本




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3