当前位置:   article > 正文

ChatUI 快速构建聊天 机器人为例:_chatui markdown

chatui markdown

ChatUI 主要分为 ChatUI 和 ChatPro 两部分(两套ui框架) 。

ChatUI 更适合手机应用

ChatPro 更适合浏览器页面对话(客服 虽然ChatUI对项目框架做了自适应尺寸 多端应用考虑较多 现实操作起来麻烦)

ChatUI 只支持React

不支持vue和小程序 (我在uni-app里尝试过使用 但不建议)因为ChatUI 框架本身使用的React 框架所以这就解释了为啥只按照要求使用React来引入ChatUI。

引入项目

  1. import React, { useEffect, useRef } from 'react';
  2. export default () => {
  3. const wrapper = useRef();
  4. useEffect(() => {
  5. const bot = new window.ChatSDK({
  6. root: wrapper.current,
  7. // 注册组件 仅在组件内使用
  8. components: {},
  9. config: {
  10. // 机器人头像
  11. robot: {
  12. avatar: '//gw.alicdn.com/tfs/TB1U7FBiAT2gK0jSZPcXXcKkpXa-108-108.jpg',
  13. },
  14. // 用户头像
  15. user: {
  16. avatar: '//gw.alicdn.com/tfs/TB1DYHLwMHqK1RjSZFEXXcGMXXa-56-62.svg',
  17. },
  18. //(可选)配置按钮文案
  19. loadMoreText: '查看历史对话',
  20. // 反馈点赞
  21. feedback: {
  22. // 点赞后出的文本
  23. textOfGood: '谢谢您给我的赞,我会继续努力。',
  24. // 点踩后出的文本
  25. textOfBad: '',
  26. // 点踩后是否显示反馈表单
  27. needFeedback: true,
  28. // 不满意原因列表
  29. options: [
  30. {
  31. // 选项值
  32. value: '1',
  33. },
  34. {
  35. value: '2',
  36. },
  37. {
  38. value: '3',
  39. },
  40. ],
  41. },
  42. //快捷短语
  43. quickReplies: [
  44. { name: '张三', type: 'text', },
  45. { name: '李四' },
  46. { name: '王五',isNew: true, }
  47. ],
  48. }
  49. //输入框占位符
  50. placeholder: '请输入你的问题....',
  51. },
  52. //通讯请求(问答 反馈 历史 上传文件等)
  53. requests: {
  54. //问答
  55. send: function (msg) {},
  56. //历史配置接口
  57. history: function () {},
  58. //点赞 踩赞
  59. evaluate(data) {},
  60. //反馈
  61. feedback(data) {},
  62. }
  63. //上传图片 文件等
  64. handlers: {}
  65. });
  66. bot.run();
  67. }, []);
  68. // 注意 wrapper 的高度
  69. return <div style={{ height: '100%' }} ref={wrapper} />;
  70. }

requests 通讯请求(问答 反馈 历史 上传文件)

对话

项目中给我们封装的请求我不太喜欢 我使用的是Axios中文文档 | Axios中文网(axios)

  1. requests: {
  2. /*
  3. *
  4. * 问答接口
  5. * @param {object} msg - 消息
  6. * @param {string} msg.type - 消息类型
  7. * @param {string} msg.content - 消息内容
  8. * @return {object}
  9. */
  10. send: function (msg) {
  11. // 发送文本消息时
  12. if (msg.type === 'text') {
  13. const payload = {
  14. query: XXXX,
  15. }
  16. //post请求
  17. return axios.post('/XXX', payload, {
  18. headers: {
  19. 'Content-Type': 'application/json',
  20. },
  21. })
  22. .then(response => {
  23. return (
  24. {
  25. //消息类型:text普通消息 默认文本
  26. type: 'text',
  27. //消息内容
  28. content: {
  29. text: response.data.output
  30. }
  31. }
  32. );
  33. })
  34. .catch(error => {
  35. // 请求出错,处理错误
  36. console.error(error);
  37. // 返回错误信息或执行其他操作
  38. throw error;
  39. });
  40. }
  41. // ... 其它消息类型的处理
  42. },
  43. },

反馈(点赞功能)

不管点赞还是踩赞都是这一个接口 可以根据变量来区别传递内容(好/坏)

  1. evaluate(data) {
  2. return axios.post('/xxx',{messageId:xxx,}).then(res => {
  3. // 反馈文本(可以不管或antd轻提示)
  4. })
  5. },

历史

历史的注意点在于 返回的结果 分清楚左右 时间处理问题等

  1. //请求
  2. requests: {
  3. /**
  4. *
  5. * 问答接口
  6. * @param {object} msg - 消息
  7. * @param {string} msg.type - 消息类型
  8. * @param {string} msg.content - 消息内容
  9. * @return {object}
  10. */
  11. // 历史配置接口
  12. history: function () {
  13. return axios.post('/XXX').then(res => {
  14. const historylist = res.data.historylist
  15. // *map需要返回值 记得暴露
  16. let list = historylist.map(item => {
  17. if (item.position == "left") {
  18. return {
  19. //回复类型(文本样式)自己制作的组件
  20. "type": 'TestQuestion',
  21. //卡片
  22. "code": 'knowledge',
  23. "_id": "msg_1",
  24. "position": item.position,
  25. //文本内容
  26. "content": {
  27. //文本
  28. "text": item.text
  29. },
  30. //时间处理
  31. "createdAt": item.datetime
  32. }
  33. } else {
  34. return {
  35. "_id": "msg_1",
  36. "type": "text",
  37. "position": item.position,
  38. "content": {
  39. "text": item.text
  40. },
  41. //时间处理 拿到的是时间戳(具体的数值)
  42. "createdAt": item.datetime
  43. }
  44. }
  45. })
  46. return {
  47. list: list,
  48. "noMore": true
  49. }
  50. }
  51. ).catch(
  52. // message.success("正在加载....")
  53. )
  54. },
  55. },

上传(图片 文件)

  1. //上传图片 文件等
  2. handlers: {
  3. onToolbarClick(item, ctx) {
  4. //如果点的是"相册"
  5. if (item.type === 'image') {
  6. ctx.util.chooseImage({
  7. multiple: true, // 是否可多选
  8. success(e) {
  9. if (e.files) { // 如果有 h5 上传的图
  10. const file = e.files[0];
  11. //文件流上传
  12. const formData = new FormData();
  13. formData.append("file", file)
  14. //先展示图片
  15. ctx.appendMessage({
  16. type: 'image',
  17. content: {
  18. picUrl: URL.createObjectURL(file)
  19. },
  20. position: 'right'
  21. });
  22. return axios.post('/XXX', formData, {
  23. headers: {
  24. 'Content-Type': 'multipart/form-data'
  25. }
  26. }).then(res => {
  27. ctx.postMessage({
  28. type: 'text',
  29. content: {
  30. text: res.data
  31. },
  32. quiet: true // 不展示
  33. });
  34. })
  35. } else if (e.files) { // 如果有 app 上传的图
  36. // ..与上面类似
  37. }
  38. },
  39. });
  40. }
  41. }
  42. }

图标

框架中有些ui图标缺失仔细查看使用的是 iconfont-阿里巴巴矢量图标库  其中的一种引用方式(ChatUI框架是阿里达摩院创作)可根据F12找到相关图标代码路径 然后在indext文件引入

  1. <!-- chatui pro 组件icon资源丢失,底层代码是引入内部阿里的阿里适量需使用Symbol引入链接 -->
  2. 例如:
  3. <script src="https://at.alicdn.com/t/c/font_4148071_nlz31z9a4y.js"></script>

封装组件(根据自己需求制作卡片)

参考Markdown 对话展示方式 那个就是自己写的组件(卡片)因为此组件只是将传递数据比较简单没做别的操作(使用的是函数组件)

注册卡片(组件)

使用以前要注册(引入组件)

一定要注意 ChatUI是用React开发的就意味着 只要将此UI框架引入我们的React项目就会有两个React版本(我们项目一个,ChatUI框架内核一个)ChatUI框架是用17^版本 我们要么保持一至 要么使用 class组件 否则项目会出现报错。

class组件官方正在弃用 只是在大力推广函数式组件

  1. components: {
  2. "TestQuestion": Testquestion,
  3. },

使用卡片

  1. return {
  2. //使用卡片(组件)
  3. type: 'Testquestion',
  4. content: {
  5. //给卡片传递的数据(文本)
  6. text: res.data,
  7. }
  8. }

Markdown 对话展示方式

使用React自带markdown组件需要自己安装(下面代码没有使用css说明使用了安装库只需要把文本传入组件即可)由于react自带的markdown功能没有那么全 需要自己去找合适库不一定要用React自带的。

文章属于回忆录 

ChatUI用户群”群的钉钉群号: 32174470

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/676856
推荐阅读
相关标签
  

闽ICP备14008679号