[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-public-ObvLqJdX":3,"public-project-articles-ObvLqJdX":17},{"id":4,"uuid":5,"project_id":6,"title":7,"content":8,"type":9,"status":10,"public_enabled":10,"views":11,"sort":12,"created_at":13,"updated_at":14,"project_title":15,"project_slug":16},55,"ObvLqJdX",39,"22. SpringBoot+Vue实现Echarts数据报表（柱状图、饼图、折线图）","\nEcharts 官网：[https:\u002F\u002Fecharts.apache.org\u002Fexamples\u002Fzh\u002Findex.html#chart-type-line](https:\u002F\u002Fecharts.apache.org\u002Fexamples\u002Fzh\u002Findex.html#chart-type-line)\n\nVue 安装 Echarts\n\n```vue\nnpm i echarts -S\n```\n\n完整示例代码：\n![image.png](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2023\u002Fpng\u002F751015\u002F1696770670783-3ee309f5-9a40-42fd-8272-c3d5ae534dea.png#averageHue=%23fefdfd&clientId=u37f1eb57-b430-4&from=paste&height=583&id=ud449b590&originHeight=729&originWidth=1477&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=73862&status=done&style=none&taskId=u81ca858e-46e3-4807-b40d-2f3b1768ded&title=&width=1181.6)\n\n静态图表的 Vue 代码示例\n\n```vue\n\u003Ctemplate>\n  \u003Cdiv>\n    \u003Cel-row :gutter=\"10\">\n      \u003Cel-col :span=\"12\">\n        \u003Cel-card>\n          \u003Cdiv style=\"width: 100%; height: 400px\" id=\"line\">\u003C\u002Fdiv>\n        \u003C\u002Fel-card>\n      \u003C\u002Fel-col>\n      \u003Cel-col :span=\"12\">\n        \u003Cel-card>\n          \u003Cdiv style=\"width: 100%; height: 400px\" id=\"bar\">\u003C\u002Fdiv>\n        \u003C\u002Fel-card>\n      \u003C\u002Fel-col>\n    \u003C\u002Fel-row>\n\n    \u003Cel-row :gutter=\"10\" style=\"margin: 10px 0\">\n      \u003Cel-col :span=\"12\">\n        \u003Cel-card>\n          \u003Cdiv style=\"width: 100%; height: 400px\" id=\"pie\">\u003C\u002Fdiv>\n        \u003C\u002Fel-card>\n      \u003C\u002Fel-col>\n    \u003C\u002Fel-row>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript>\nimport * as echarts from 'echarts'\n\nconst option = {\n  title: {\n    text: '订单销售的趋势图',\n    left: 'center'\n  },\n  tooltip: {\n    trigger: 'axis'\n  },\n  legend: {\n    left: 'left'\n  },\n  xAxis: {\n    type: 'category',\n    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']\n  },\n  yAxis: {\n    type: 'value'\n  },\n  series: [\n    {\n      name: '金额',\n      data: [820, 932, 901, 934, 1290, 1330, 1320],\n      type: 'line',\n      smooth: true\n    },\n    {\n      name: '库存',\n      data: [356, 987, 457, 768, 390, 680, 1920],\n      type: 'line',\n      smooth: true\n    }\n  ]\n}\n\nconst option1 = {\n  title: {\n    text: '订单销售的柱状图',\n    left: 'center'\n  },\n  tooltip: {\n    trigger: 'axis'\n  },\n  legend: {\n    left: 'left'\n  },\n  xAxis: {\n    type: 'category',\n    data: ['水果', '零食', '饮料', '奶制品', '生活用品']\n  },\n  yAxis: {\n    type: 'value'\n  },\n  series: [\n    {\n      name: '金额',\n      data: [820, 932, 901, 934, 1290, 1330, 1320],\n      type: 'bar',\n      smooth: true\n    },\n    {\n      name: '销量',\n      data: [100, 200, 204, 209, 590, 698, 700],\n      type: 'bar',\n      smooth: true\n    }\n  ]\n}\n\nconst option2 = {\n  title: {\n    text: '订单销售统计',\n    subtext: '比例图',\n    left: 'center'\n  },\n  tooltip: {\n    trigger: 'item'\n  },\n  legend: {\n    orient: 'vertical',\n    left: 'left'\n  },\n  series: [\n    {\n      name: 'Access From',\n      type: 'pie',\n      center: ['50%', '60%'],\n      radius: '50%',\n      data: [\n        { value: 1048, name: 'Search Engine' },\n        { value: 735, name: 'Direct' },\n        { value: 580, name: 'Email' },\n        { value: 484, name: 'Union Ads' },\n        { value: 300, name: 'Video Ads' }\n      ],\n      emphasis: {\n        itemStyle: {\n          shadowBlur: 10,\n          shadowOffsetX: 0,\n          shadowColor: 'rgba(0, 0, 0, 0.5)'\n        }\n      }\n    }\n  ]\n}\n\nexport default {\n  name: \"Charts\",\n  data() {\n    return {}\n  },\n  mounted() {  \u002F\u002F 等待页面的元素全部加载完成之后再初始化\n\n    \u002F\u002F 折线图\n    let linetDom = document.getElementById('line');\n    let lineChart = echarts.init(linetDom);\n    lineChart.setOption(option)\n\n    \u002F\u002F 柱状图\n    let barDom = document.getElementById('bar');\n    let barChart = echarts.init(barDom);\n    barChart.setOption(option1)\n\n    \u002F\u002F 饼图\n    let pieDom = document.getElementById('pie');\n    let pieChart = echarts.init(pieDom);\n    pieChart.setOption(option2)\n  },\n  methods: {}\n}\n\u003C\u002Fscript>\n\n\u003Cstyle scoped>\n\n\u003C\u002Fstyle>\n```\n\norders 表结构\n\n```sql\nCREATE TABLE `orders` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `no` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '订单编号',\n  `name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '订单名称',\n  `money` decimal(10,2) DEFAULT NULL COMMENT '订单金额',\n  `userid` int(11) DEFAULT NULL COMMENT '用户ID',\n  `category` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '订单分类',\n  `date` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '订单日期',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单表';\n```\n\nOrder.java\n\n```java\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.math.BigDecimal;\n\n@Data\n@AllArgsConstructor\n@NoArgsConstructor\n@Builder\npublic class Orders {\n    @TableId(type = IdType.AUTO)\n    private Integer id;\n    private String no;\n    private String name;\n    private BigDecimal money;\n    private Integer userid;\n    private String category;\n    private String date;\n\n    @TableField(exist = false)\n    private String user;\n}\n```\n\nOrdersController.java\n\n```java\nimport cn.hutool.core.date.DateUtil;\nimport cn.hutool.core.util.IdUtil;\nimport cn.hutool.core.util.StrUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.example.springboot.common.HoneyLogs;\nimport com.example.springboot.common.LogType;\nimport com.example.springboot.common.Result;\nimport com.example.springboot.entity.Orders;\nimport com.example.springboot.entity.User;\nimport com.example.springboot.service.OrdersService;\nimport com.example.springboot.service.UserService;\nimport com.example.springboot.utils.TokenUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\n\n@RestController\n@RequestMapping(\"\u002Forders\")\npublic class OrdersController {\n\n    @Autowired\n    OrdersService ordersService;\n\n    @Autowired\n    UserService userService;\n\n    \u002F**\n     * 新增信息\n     *\u002F\n    @HoneyLogs(operation = \"订单\", type = LogType.ADD)\n    @PostMapping(\"\u002Fadd\")\n    public Result add(@RequestBody Orders orders) {\n        User currentUser = TokenUtils.getCurrentUser();  \u002F\u002F 获取到当前登录的用户信息\n        orders.setUserid(currentUser.getId());\n        orders.setDate(DateUtil.today());  \u002F\u002F   2023-10-08\n        orders.setNo(IdUtil.fastSimpleUUID());\n        ordersService.save(orders);\n        return Result.success();\n    }\n\n    \u002F**\n     * 修改信息\n     *\u002F\n    @HoneyLogs(operation = \"订单\", type = LogType.UPDATE)\n    @PutMapping(\"\u002Fupdate\")\n    public Result update(@RequestBody Orders orders) {\n        ordersService.updateById(orders);\n        return Result.success();\n    }\n\n    \u002F**\n     * 删除信息\n     *\u002F\n    @HoneyLogs(operation = \"订单\", type = LogType.DELETE)\n    @DeleteMapping(\"\u002Fdelete\u002F{id}\")\n    public Result delete(@PathVariable Integer id) {\n        ordersService.removeById(id);\n        return Result.success();\n    }\n\n\n    \u002F**\n     * 批量删除信息\n     *\u002F\n    @HoneyLogs(operation = \"订单\", type = LogType.BATCH_DELETE)\n    @DeleteMapping(\"\u002Fdelete\u002Fbatch\")\n    public Result batchDelete(@RequestBody List\u003CInteger> ids) {\n        ordersService.removeBatchByIds(ids);\n        return Result.success();\n    }\n\n    \u002F**\n     * 查询全部信息\n     *\u002F\n    @GetMapping(\"\u002FselectAll\")\n    public Result selectAll() {\n        List\u003COrders> ordersList = ordersService.list(new QueryWrapper\u003COrders>().orderByDesc(\"id\"));\n        return Result.success(ordersList);\n    }\n\n    \u002F**\n     * 根据ID查询信息\n     *\u002F\n    @GetMapping(\"\u002FselectById\u002F{id}\")\n    public Result selectById(@PathVariable Integer id) {\n        Orders orders = ordersService.getById(id);\n        User user = userService.getById(orders.getUserid());\n        if (user != null) {\n            orders.setUser(user.getName());\n        }\n        return Result.success(orders);\n    }\n\n\n    \u002F**\n     * 多条件模糊查询信息\n     * pageNum 当前的页码\n     * pageSize 每页查询的个数\n     *\u002F\n    @GetMapping(\"\u002FselectByPage\")\n    public Result selectByPage(@RequestParam Integer pageNum,\n                               @RequestParam Integer pageSize,\n                               @RequestParam String name) {\n        QueryWrapper\u003COrders> queryWrapper = new QueryWrapper\u003COrders>().orderByDesc(\"id\");  \u002F\u002F 默认倒序，让最新的数据在最上面\n        queryWrapper.like(StrUtil.isNotBlank(name), \"name\", name);\n        Page\u003COrders> page = ordersService.page(new Page\u003C>(pageNum, pageSize), queryWrapper);\n        List\u003COrders> records = page.getRecords();\n        for (Orders record : records) {\n            Integer authorid = record.getUserid();\n            User user = userService.getById(authorid);\n            if (user != null) {\n                record.setUser(user.getName());\n            }\n        }\n        return Result.success(page);\n    }\n\n\n}\n```\n\nWebController 统计数据方法\n\n```java\n \u002F**\n     * 获取统计图数据\n     * @return 动态数据\n     *\u002F\n    @GetMapping(\"\u002Fcharts\")\n    public Result charts() {\n        \u002F\u002F 包装折线图的数据\n        List\u003COrders> list = ordersService.list();\n        Set\u003CString> dates = list.stream().map(Orders::getDate).collect(Collectors.toSet());\n        List\u003CString> dateList = CollUtil.newArrayList(dates);\n        dateList.sort(Comparator.naturalOrder());\n        List\u003CDict> lineList = new ArrayList\u003C>();\n        for (String date : dateList) {\n            \u002F\u002F 统计当前日期的所有金额总数和\n            BigDecimal sum = list.stream().filter(orders -> orders.getDate().equals(date)).map(Orders::getMoney)\n                    .reduce(BigDecimal::add).orElse(BigDecimal.ZERO);\n            Dict dict = Dict.create();\n            Dict line = dict.set(\"date\", date).set(\"value\", sum);\n            lineList.add(line);\n        }\n\n        \u002F\u002F 柱状图数据\n        List\u003CDict> barList = new ArrayList\u003C>();\n        Set\u003CString> categories = list.stream().map(Orders::getCategory).collect(Collectors.toSet());\n        for (String cate : categories) {\n            \u002F\u002F 统计当前日期的所有金额总数和\n            BigDecimal sum = list.stream().filter(orders -> orders.getCategory().equals(cate)).map(Orders::getMoney)\n                    .reduce(BigDecimal::add).orElse(BigDecimal.ZERO);\n            Dict dict = Dict.create();\n            Dict bar = dict.set(\"name\", cate).set(\"value\", sum);\n            barList.add(bar);\n        }\n\n\n        \u002F\u002F 包装所有数据\n        Dict res = Dict.create().set(\"line\", lineList).set(\"bar\", barList);\n        return Result.success(res);\n    }\n```\n\n动态图表 Vue\n\n```vue\n\u003Ctemplate>\n  \u003Cdiv>\n    \u003Cel-row :gutter=\"10\">\n      \u003Cel-col :span=\"12\">\n        \u003Cel-card>\n          \u003Cdiv style=\"width: 100%; height: 400px\" id=\"line\">\u003C\u002Fdiv>\n        \u003C\u002Fel-card>\n      \u003C\u002Fel-col>\n      \u003Cel-col :span=\"12\">\n        \u003Cel-card>\n          \u003Cdiv style=\"width: 100%; height: 400px\" id=\"bar\">\u003C\u002Fdiv>\n        \u003C\u002Fel-card>\n      \u003C\u002Fel-col>\n    \u003C\u002Fel-row>\n\n    \u003Cel-row :gutter=\"10\" style=\"margin: 10px 0\">\n      \u003Cel-col :span=\"12\">\n        \u003Cel-card>\n          \u003Cdiv style=\"width: 100%; height: 400px\" id=\"pie\">\u003C\u002Fdiv>\n        \u003C\u002Fel-card>\n      \u003C\u002Fel-col>\n    \u003C\u002Fel-row>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript>\nimport * as echarts from 'echarts'\n\nconst option = {\n  title: {\n    text: '订单销售的趋势图',\n    left: 'center'\n  },\n  tooltip: {\n    trigger: 'axis'\n  },\n  legend: {\n    left: 'left'\n  },\n  xAxis: {\n    type: 'category',\n    data: []\n  },\n  yAxis: {\n    type: 'value'\n  },\n  series: [\n    {\n      name: '金额',\n      data: [],\n      type: 'line',\n      smooth: true\n    },\n  ]\n}\n\nconst option1 = {\n  title: {\n    text: '订单销售的柱状图',\n    left: 'center'\n  },\n  tooltip: {\n    trigger: 'axis'\n  },\n  legend: {\n    left: 'left'\n  },\n  xAxis: {\n    type: 'category',\n    data: []\n  },\n  yAxis: {\n    type: 'value'\n  },\n  series: [\n    {\n      name: '金额',\n      data: [],\n      type: 'bar',\n      smooth: true\n    }\n  ]\n}\n\nconst option2 = {\n  title: {\n    text: '订单销售统计',\n    subtext: '比例图',\n    left: 'center'\n  },\n  tooltip: {\n    trigger: 'item'\n  },\n  legend: {\n    orient: 'vertical',\n    left: 'left'\n  },\n  series: [\n    {\n      name: '金额',\n      type: 'pie',\n      center: ['50%', '60%'],\n      radius: '50%',\n      data: [],\n      label: {\n        show: true,\n        formatter(param) {\n          return param.name + ' (' + param.percent + '%)';\n        }\n      },\n      emphasis: {\n        itemStyle: {\n          shadowBlur: 10,\n          shadowOffsetX: 0,\n          shadowColor: 'rgba(0, 0, 0, 0.5)'\n        }\n      }\n    }\n  ]\n}\n\nexport default {\n  name: \"Charts\",\n  data() {\n    return {}\n  },\n  mounted() {  \u002F\u002F 等待页面的元素全部加载完成之后再初始化\n\n    \u002F\u002F 折线图\n    let linetDom = document.getElementById('line');\n    let lineChart = echarts.init(linetDom);\n\n\n    \u002F\u002F 柱状图\n    let barDom = document.getElementById('bar');\n    let barChart = echarts.init(barDom);\n    barChart.setOption(option1)\n\n    \u002F\u002F 饼图\n    let pieDom = document.getElementById('pie');\n    let pieChart = echarts.init(pieDom);\n    pieChart.setOption(option2)\n\n    this.$request.get('\u002Fcharts').then(res => {\n      \u002F\u002F 折线\n      option.xAxis.data = res.data?.line?.map(v => v.date) || []\n      option.series[0].data = res.data?.line?.map(v => v.value) || []\n      lineChart.setOption(option)\n\n      \u002F\u002F 柱状图\n      option1.xAxis.data = res.data?.bar?.map(v => v.name) || []\n      option1.series[0].data = res.data?.bar?.map(v => v.value) || []\n      barChart.setOption(option1)\n\n      \u002F\u002F 饼图\n      option2.series[0].data = res.data?.bar || []\n      pieChart.setOption(option2)\n    })\n  },\n  methods: {}\n}\n\u003C\u002Fscript>\n\n\u003Cstyle scoped>\n\n\u003C\u002Fstyle>\n```\n","coding",1,1688,99,"2024-04-16 02:30:25","2026-05-03 22:49:02","【青哥带小白做毕设2024】完整教程资料汇总","qingge-graduation-project-2024",{"project":18,"items":19},{"id":6,"title":15,"slug":16},[20,27,34,41,48,55,62,68,75,82,89,96,103,110,117,124,131,138,145,152,159,166,173],{"id":21,"uuid":22,"project_id":6,"title":23,"type":9,"status":10,"public_enabled":10,"views":24,"sort":4,"created_at":25,"updated_at":26,"project_title":15,"project_slug":16},33,"R1oMCsCX","00. 从0开始带小白做SpringBoot+Vue+uniapp微信小程序实战项目",12130,"2025-04-08 11:28:17","2026-05-07 15:33:28.189425+00",{"id":28,"uuid":29,"project_id":6,"title":30,"type":9,"status":10,"public_enabled":10,"views":31,"sort":32,"created_at":33,"updated_at":14,"project_title":15,"project_slug":16},34,"s3u3u8W7","01. 网页布局技巧",3326,56,"2025-04-08 11:28:13",{"id":35,"uuid":36,"project_id":6,"title":37,"type":9,"status":10,"public_enabled":10,"views":38,"sort":39,"created_at":40,"updated_at":14,"project_title":15,"project_slug":16},35,"21zUHQYS","02. JavaScript入门",2017,57,"2025-04-08 11:27:55",{"id":42,"uuid":43,"project_id":6,"title":44,"type":9,"status":10,"public_enabled":10,"views":45,"sort":46,"created_at":47,"updated_at":14,"project_title":15,"project_slug":16},36,"4XVgY9Ti","03. Vue脚手架搭建",3719,58,"2025-04-08 11:27:46",{"id":49,"uuid":50,"project_id":6,"title":51,"type":9,"status":10,"public_enabled":10,"views":52,"sort":53,"created_at":54,"updated_at":14,"project_title":15,"project_slug":16},37,"S8vLLLvk","04. Git速成，推送代码到云端",1585,59,"2025-04-08 11:27:41",{"id":56,"uuid":57,"project_id":6,"title":58,"type":9,"status":10,"public_enabled":10,"views":59,"sort":60,"created_at":61,"updated_at":14,"project_title":15,"project_slug":16},38,"9EbwnGDp","05. 网页布局神器ElementUI速成",2670,60,"2025-04-08 11:27:37",{"id":6,"uuid":63,"project_id":6,"title":64,"type":9,"status":10,"public_enabled":10,"views":65,"sort":66,"created_at":67,"updated_at":14,"project_title":15,"project_slug":16},"tmzahWer","06. Vue管理系统速成",3744,61,"2025-04-08 11:27:32",{"id":69,"uuid":70,"project_id":6,"title":71,"type":9,"status":10,"public_enabled":10,"views":72,"sort":73,"created_at":74,"updated_at":14,"project_title":15,"project_slug":16},40,"2agqAUQK","07. SpringBoot速成",3654,62,"2025-04-08 11:27:27",{"id":76,"uuid":77,"project_id":6,"title":78,"type":9,"status":10,"public_enabled":10,"views":79,"sort":80,"created_at":81,"updated_at":14,"project_title":15,"project_slug":16},41,"SXPAzgy7","08. Http扫盲，让小白也能听懂",2337,63,"2025-04-08 11:27:20",{"id":83,"uuid":84,"project_id":6,"title":85,"type":9,"status":10,"public_enabled":10,"views":86,"sort":87,"created_at":88,"updated_at":14,"project_title":15,"project_slug":16},42,"ostBIxAV","09. SpringBoot集成Mybatis实现增删改查",4190,64,"2025-04-08 11:27:13",{"id":90,"uuid":91,"project_id":6,"title":92,"type":9,"status":10,"public_enabled":10,"views":93,"sort":94,"created_at":95,"updated_at":14,"project_title":15,"project_slug":16},43,"6Sv7afpa","10. Vue封装前后端数据交互工具",3716,65,"2024-04-16 02:33:13",{"id":97,"uuid":98,"project_id":6,"title":99,"type":9,"status":10,"public_enabled":10,"views":100,"sort":101,"created_at":102,"updated_at":14,"project_title":15,"project_slug":16},44,"d53BPIQs","11. Vue登录（含验证码）、注册页面开发",4867,66,"2024-04-16 02:33:08",{"id":104,"uuid":105,"project_id":6,"title":106,"type":9,"status":10,"public_enabled":10,"views":107,"sort":108,"created_at":109,"updated_at":14,"project_title":15,"project_slug":16},45,"m033ng06","12. SpringBoot集成JWT token实现权限验证",3243,67,"2024-04-16 02:33:00",{"id":111,"uuid":112,"project_id":6,"title":113,"type":9,"status":10,"public_enabled":10,"views":114,"sort":115,"created_at":116,"updated_at":14,"project_title":15,"project_slug":16},46,"7xzyVD06","13. SpringBoot+Vue实现单文件、多文件上传和下载",2784,68,"2024-04-16 02:32:52",{"id":118,"uuid":119,"project_id":6,"title":120,"type":9,"status":10,"public_enabled":10,"views":121,"sort":122,"created_at":123,"updated_at":14,"project_title":15,"project_slug":16},47,"BdOLUenp","14. 多角色登录（Vue-Router路由守卫）",2318,69,"2024-04-16 02:32:39",{"id":125,"uuid":126,"project_id":6,"title":127,"type":9,"status":10,"public_enabled":10,"views":128,"sort":129,"created_at":130,"updated_at":14,"project_title":15,"project_slug":16},48,"2Wkx3igg","15. Vue个人信息修改、修改密码、重置密码",2092,70,"2024-04-16 02:32:33",{"id":132,"uuid":133,"project_id":6,"title":134,"type":9,"status":10,"public_enabled":10,"views":135,"sort":136,"created_at":137,"updated_at":14,"project_title":15,"project_slug":16},49,"BDvVa4By","16. SpringBoot+Vue管理系统实现增删改查",2598,71,"2024-04-16 02:32:29",{"id":139,"uuid":140,"project_id":6,"title":141,"type":9,"status":10,"public_enabled":10,"views":142,"sort":143,"created_at":144,"updated_at":14,"project_title":15,"project_slug":16},50,"FJVl0rCu","17. SpringBoot+Vue实现数据的批量导入和导出",1684,72,"2024-04-16 02:32:26",{"id":146,"uuid":147,"project_id":6,"title":148,"type":9,"status":10,"public_enabled":10,"views":149,"sort":150,"created_at":151,"updated_at":14,"project_title":15,"project_slug":16},51,"FvW9oHgj","18. SpringBoot+Vue项目部署上线",2845,73,"2024-04-16 02:32:22",{"id":153,"uuid":154,"project_id":6,"title":155,"type":9,"status":10,"public_enabled":10,"views":156,"sort":157,"created_at":158,"updated_at":14,"project_title":15,"project_slug":16},52,"xyqrxxiR","19. SpringBoot+Vue集成富文本编辑器",1499,74,"2024-04-16 02:32:18",{"id":160,"uuid":161,"project_id":6,"title":162,"type":9,"status":10,"public_enabled":10,"views":163,"sort":164,"created_at":165,"updated_at":14,"project_title":15,"project_slug":16},53,"XAaCXz8W","20. SpringBoot+Vue集成系统公告",1043,75,"2024-04-16 02:32:14",{"id":167,"uuid":168,"project_id":6,"title":169,"type":9,"status":10,"public_enabled":10,"views":170,"sort":171,"created_at":172,"updated_at":14,"project_title":15,"project_slug":16},54,"2havlmaC","21. SpringBoot+Vue集成AOP系统日志",1159,76,"2024-04-16 02:32:11",{"id":4,"uuid":5,"project_id":6,"title":7,"type":9,"status":10,"public_enabled":10,"views":11,"sort":12,"created_at":13,"updated_at":14,"project_title":15,"project_slug":16}]