Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >服务器环境(插件)搭建

服务器环境(插件)搭建

作者头像
OwenZhang
发布于 2021-12-07 07:13:41
发布于 2021-12-07 07:13:41
1.6K00
代码可运行
举报
文章被收录于专栏:Owen's WorldOwen's World
运行总次数:0
代码可运行

PHP开发工具:neteasecloudmusic,phpstorm,postman,rdm,navicat for mysql,iterm,google chrome,dingtalk,wechat,youdao

正式和测试区别开有:域名,数据库,代码仓库分支(正式master,测试dev,开发app).

app-->合并->owen(自己)-->合并->app-->合并->dev

app-->合并->master

主流环境(插件):最笨就用宝塔面板,安全考虑使用以下:

  1. Grafana接口监控 www.jianshu.com/p/3527f4816…
  2. Jenkins代码部署
  3. Sentry,kibana日志查看
  4. GitLab代码仓库
  5. Jumpserver堡垒机:在线文件管理,命令执行
  6. sql审计平台
  7. 接口文档:yapi,swagger,小幺鸡,mindoc(github.com/lifei6671/m…
  8. 石墨在线办公文档
  9. 项目分工流程:tapd,禅道,钉钉蚂蚁分工,worktile
  10. 产品原型图,UI:蓝湖

PHP常用插件包:composter

packagist.org/

www.phpcomposer.com/

  1. topthink/framework ThinkPHP 核心框架库
  2. rmccue/requests 用PHP编写的HTTP库
  3. predis/predis **[Redis- Predis 扩展](www.baidu.com/link?url=dD…)**
  4. lcobucci/jwt JWT 创建 Token
  5. phpmailer/phpmailer 实现PHP发邮件功能
  6. endroid/qr-code PHP-生成二维码
  7. codeitnowin/barcode PHP-生成条形码
  8. aliyuncs/oss-sdk-php 阿里云对象存储OSS(文件图片上传)
  9. topthink/think-queue 队列
  10. yansongda/pay 最优雅的微信和支付宝支付包
  11. symfony/event-dispatcher 通过分派事件并侦听事件来相互通信
  12. sentry/sdk sentry 日志查看,快速的发现故障问题

composer.json

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "name": "topthink/think",
    "description": "the new thinkphp framework",
    "type": "project",
    "keywords": [
        "lottery",
        "owenzhang"
    ],
    "homepage": "https://phper.owenzhang.com/",
    "license": "Apache-2.0",
    "authors": [
        {
            "name": "Owen Zhang",
            "email": "owen@owenzhang.com"
        }
    ],
    "require": {
        "php": ">=5.6.0",
        "topthink/framework": "5.1.*",
        "rmccue/requests": "^1.7",
        "predis/predis": "^1.1",
        "lcobucci/jwt": "^3.2",
        "phpmailer/phpmailer": "^6.0",
        "endroid/qr-code": "2.5.1",
        "aliyuncs/oss-sdk-php": "^2.3",
        "topthink/think-queue": "^2.0",
        "yansongda/pay": "2.6.0",
        "symfony/event-dispatcher": "3.4.32",
        "sentry/sdk": "2.0.3"
    },
    "autoload": {
        "psr-4": {
            "app\\": "application"
        }
    },
    "extra": {
        "think-path": "thinkphp"
    },
    "config": {
        "preferred-install": "dist"
    }
}
复制代码

PHP代码规范模块:

参数:DisablesendmsgListContext.php 用于列表参数格式化,避免参数过多不好维护
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
/**
 * 禁言列表参数格式化
 */
namespace app\sports\disablesendmsg\context;

use app\lucky\common\Context;

class DisablesendmsgListContext extends Context
{
    //页码
    public $page_no;
    //页数
    public $page_count;
    //操作者ID
    public $operatorId;
    //用户昵称
    public $user_nickname;
    //来源app1后台2
    public $sourceId;
    //是否删除1是0否
    public $isDel;
}
复制代码

数据验证层DisablesendmsgValidate.php
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
/**
 * 禁言
 */

namespace app\sports\disablesendmsg\validate;

use app\lucky\common\InstanceTrait;
use think\Validate;

class DisablesendmsgValidate
{
    use InstanceTrait;

    public function checkAdd($data)
    {
        foreach ($data as $key => $value) {
            if (!is_array($value)) {
                $data[$key] = htmlentities($value);
            }
        }

        $rule = [
            "user_id" => "require|number",
            "disablesendmsg_reason" => "require|max:20",
            "disablesendmsg_duration" => "require|number|between:0,365"
        ];
        $msg = [
            "user_id.require" => "用户id必填",
            "name.number" => "用户id得是数字",
            "disablesendmsg_reason.require" => "禁言原因必填",
            "disablesendmsg_reason.max" => "禁言原因不得超过10字符",
            "disablesendmsg_duration.require" => "禁言时长必填",
            "disablesendmsg_duration.number" => "禁言时长得是数字",
            "disablesendmsg_duration.between" => "禁言时长必须在(0-365)之间"
        ];

        $validate = Validate::make($rule, $msg);
        $result = $validate->check($data);

        if (!$result) {
            return ["code" => _MSG_INVALID_CLIENT_PARAM, "msg" => $validate->getError()];
        }
        return ["code" => _MSG_SYSTEM_SUCCESS, "msg" => "校验成功", "data" => $data];
    }

    public function checkUpdate($data)
    {
        foreach ($data as $key => $value) {
            if (!is_array($value)) {
                $data[$key] = htmlentities($value);
            }
        }

        $rule = [
            "id" => "require|number",
            "is_jiechu" => "require|number|between:0,1"
        ];
        $msg = [
            "id.require" => "禁言ID必须提供",
            "id.number" => "禁言ID必须是数字",
            "is_jiechu.require" => "禁言解除标识必须提供",
            "is_jiechu.number" => "禁言解除标识必须是数字",
            "is_jiechu.between" => "禁言解除标识必须在(0-1)之间"
        ];

        $validate = Validate::make($rule, $msg);
        $result = $validate->check($data);

        if (!$result) {
            return ["code" => _MSG_INVALID_CLIENT_PARAM, "msg" => $validate->getError()];
        }
        return ["code" => _MSG_SYSTEM_SUCCESS, "msg" => "校验成功", "data" => $data];
    }

   
}
复制代码

控制层:Disablesendmsg.php
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
/**
 * 禁言
 */

namespace app\sports\disablesendmsg\controller;

use app\common\BaseController;
use app\common\DataValidate;
use app\lucky\user\validate\UserValidate;
use app\sports\disablesendmsg\context\DisablesendmsgListContext;
use app\sports\disablesendmsg\service\DisablesendmsgService;
use app\sports\disablesendmsg\validate\DisablesendmsgValidate;
use think\App;
use think\Request;

class Disablesendmsg extends BaseController
{
    public $service = null;
    public $sys = '';

    public function __construct(App $app = null, Request $request = null)
    {
        parent::__construct($app, $request);
        $this->service = new DisablesendmsgService();
        $this->sys = \session('sys') ? \session('sys') : 343;
    }

    /**
     * 获取禁言列表
     */
    public function getDisablesendmsgList()
    {
        $postData = $this->request->post();
        $valiData = DataValidate::getInstance()->checkPager($postData);
        if ($valiData["code"] != _MSG_SYSTEM_SUCCESS) {
            $this->_jsonReturnV2($valiData["code"], '', $valiData["msg"]);
        }

        $context = new DisablesendmsgListContext($valiData['data']);
        $context->operatorId = $this->loginInfo['user_id'];

        $data = $this->service->getList($context,  $this->sys);

        $this->_jsonReturnV2(_MSG_SUCCESS, $data, '查询成功');
    }

   
    /**
     * 禁言添加
     */
    public function addDisablesendmsg()
    {
        $postData = $this->request->post();
        $valiData = DisablesendmsgValidate::getInstance()->checkAdd($postData);
        if ($valiData["code"] != _MSG_SYSTEM_SUCCESS) {
            $this->_jsonReturnV2($valiData["code"], '', $valiData["msg"]);
        }

        //operator_id操作员id
        $valiData['data']['operator_id'] = $this->loginInfo['user_id'];
        $data = $this->service->addDisablesendmsg($valiData['data'], $this->sys);

        if ($data) {
            $this->_jsonReturnV2(_MSG_SUCCESS, '', '添加成功');
        } else {
            $this->_jsonReturnV2(_MSG_AlREADY_EXIST, '', '添加失败');
        }
    }

   
}
复制代码

服务层:DisablesendmsgService.php,服务接口,处理业务逻辑

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
/**
 * 禁言
 */

namespace app\sports\disablesendmsg\service;

use app\common\DataService;
use app\common\Redis;
use app\lucky\user\model\UserV2Model;
use app\lucky\user\service\UserService;
use app\sports\disablesendmsg\context\DisablesendmsgListContext;
use app\sports\disablesendmsg\model\DisablesendmsgModel;

class DisablesendmsgService
{
    public $model = '';

    public function __construct()
    {
        $this->model = new DisablesendmsgModel();
    }

    /**
     * 查询列表
     *
     * @access public
     * @param array $data 数据数组
     * @param string $sys 系统
     * @return array 返回类型
     */
    public function getList(DisablesendmsgListContext $context, $sys = 343)
    {
        $context->page_no = isset($context->page_no) ? $context->page_no : 1;
        $context->page_count = isset($context->page_count) ? $context->page_count : 10;
        //来源app1后台2
        $context->sourceId = isset($context->sourceId) ? $context->sourceId : 1;
        $context->operatorId = isset($context->operatorId) ? $context->operatorId : 0;
        $context->user_nickname = isset($context->user_nickname) ? $context->user_nickname : '';
        $context->isDel = isset($context->isDel) ? $context->isDel : 0;
        if ($context->user_nickname) {
            $userIdArr = UserService::getInstance()->getUserInfoByLikeUserNickname($context->user_nickname, $sys);
            $context->userIdArr = $userIdArr;
        }

        $result = $this->model->selectStatusListByPager($context, $sys);

        $data = $result['data'];

        //处理前端数据格式
        if ($data) {
            foreach ($data as $k => $v) {
                $userInfo = UserService::getInstance()->getUserInfo($v['user_id'], $sys);
                $data[$k]['nickname'] = isset($userInfo['nickname']) ? $userInfo['nickname'] : '';
                $data[$k]['headimgurl'] = isset($userInfo['headimgurl']) ? $userInfo['headimgurl'] : '';

                if ($context->sourceId == 1) {
                    //来源app1后台2 app时间格式
                    $data[$k]['disablesendmsg_date'] = DataService::getInstance()->_handleCreateTimeTwo(date('Y-m-d H:i:s', $v['disablesendmsg_time']));
                } else {
                    //后台时间格式
                    $data[$k]['disablesendmsg_date'] = date('Y-m-d H:i', $v['disablesendmsg_time']);
                }
            }
        }

        $pageTotal = (int)ceil($result['total'] / $context->page_count);
        $page_info = [
            'total' => $result['total'],//总记录
            'page_no' => $context->page_no,//页数
            'page_count' => $context->page_count,//每页显示数量
            'page_total' => $pageTotal,//总页数
        ];

        return [
            'page_info' => $page_info,
            'list' => $data,
        ];
    }

    /**
     * 添加禁言
     *
     * @access public
     * @param array $data 数据数组
     * @param string $sys 系统
     * @return array 返回类型
     */
    public function addDisablesendmsg($data, $sys = 343)
    {
        //防止重复添加
        $repetitionData = $this->model->getOneByUserId($data['user_id'], $sys);
        if ($repetitionData) {
            $updateData = [
                "operator_id" => isset($data['operator_id']) ? $data['operator_id'] : 0,
                "source_id" => isset($data['source_id']) ? $data['source_id'] : 1,
                "is_jiechu" => isset($data['is_jiechu']) ? $data['is_jiechu'] : 0,
                "disablesendmsg_reason" => isset($data['disablesendmsg_reason']) ? $data['disablesendmsg_reason'] : "",
                "disablesendmsg_duration" => isset($data['disablesendmsg_duration']) ? $data['disablesendmsg_duration'] : "",
                'disablesendmsg_time' => time(),
                'update_time' => time(),
                "sys" => $sys
            ];

            $result = $this->model->updateByUserId($updateData, $data['user_id'], $sys);
            if ($result) {
                $key = $this->_getDisablesendmsgUserListKey($sys);
                Redis::getInstance()->redisZadd($key, time(), $data['user_id']);
            }

            return $result;
        } else {
            $data = [
                "operator_id" => isset($data['operator_id']) ? $data['operator_id'] : 0,
                "user_id" => isset($data['user_id']) ? $data['user_id'] : 0,
                "source_id" => isset($data['source_id']) ? $data['source_id'] : 1,
                "disablesendmsg_reason" => isset($data['disablesendmsg_reason']) ? $data['disablesendmsg_reason'] : "",
                "disablesendmsg_duration" => isset($data['disablesendmsg_duration']) ? $data['disablesendmsg_duration'] : "",
                'disablesendmsg_time' => time(),
                "sys" => $sys
            ];

            $result = $this->model->insert($data, $sys);

            if ($result) {
                //用户的禁言列表
                //将被禁言的用户id 添加到redis/ key=Disablesendmsg:343:user
                $key = $this->_getDisablesendmsgUserListKey($sys);
                Redis::getInstance()->redisZadd($key, time(), $data['user_id']);
                return true;
            } else {
                return false;
            }
        }
    }

    /**
     * 获取用户的禁言列表的key
     */
    private function _getDisablesendmsgUserListKey($sys)
    {
        return "Disablesendmsg:{$sys}:users";
    }


}
复制代码

数据层 DisablesendmsgModel.php 尽量简洁

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
/**
 * 禁言
 */

namespace app\sports\disablesendmsg\model;

use app\sports\disablesendmsg\context\DisablesendmsgListContext;
use think\Db;

class DisablesendmsgModel
{

    /**
     * @param $data
     * @param $sys
     * @return mixed
     * @description 添加禁言
     */
    public function insertGetId($data)
    {
        return Db::table("user_disablesendmsg")->insertGetId($data);
    }


    /**
     * @param $data
     * @return mixed
     * @description 修改信息
     */
    public function updateByUserId($data, $userId, $sys = 343)
    {
        return DB::table("user_disablesendmsg")
            ->where("user_id", $userId)
            ->where("sys", $sys)
            ->update($data);
    }

    /**
     * @param $data
     * @param $status
     * @return array
     * @description 分页查询
     */
    public function selectStatusListByPager(DisablesendmsgListContext $context, $sys)
    {
        $where = [];

        if ($context->operatorId) {
            $where['operator_id'] = $context->operatorId;
        }

        $op = Db::table('user_disablesendmsg')
            ->where(array('is_del' => $context->isDel, 'sys' => $sys, 'is_jiechu' => 0))
            ->where($where)
            ->field(array('id', 'user_id', 'disablesendmsg_reason', 'disablesendmsg_duration', 'disablesendmsg_time', 'is_jiechu'))
            ->order('disablesendmsg_time desc');

        if ($context->user_nickname) {
            $op = $op->whereIn('user_id', $context->userIdArr);
        }

        //总共记录
        $count = count($op->select());
        $list = $op->page($context->page_no, $context->page_count)->select();

        return [
            'data' => $list,
            'total' => $count
        ];

    }

    /**
     * @param $id
     * @return mixed
     * @description id 根据id查询
     */
    public function getOneById($id, $sys)
    {
        return DB::table("user_disablesendmsg")
            ->where("id", $id)
            ->where("sys", $sys)
            ->find();
    }


}
复制代码

Buy me a cup of coffee :)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年10月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
力扣 (LeetCode)-104. 二叉树的最大深度,图
每天学习编程,让你离梦想更新一步,感谢不负每一份热爱编程的程序员,不论知识点多么奇葩,和我一起,让那一颗四处流荡的心定下来,一直走下去,加油,2021加油!欢迎关注加我vx:xiaoda0423,欢迎点赞、收藏和评论
达达前端
2021/03/22
6770
力扣 (LeetCode)-104. 二叉树的最大深度,图
用js来实现那些数据结构16(图02-图的遍历)
  上一篇文章我们简单介绍了一下什么是图,以及用JS来实现一个可以添加顶点和边的图。按照惯例,任何数据结构都不可或缺的一个point就是遍历。也就是获取到数据结构中的所有元素。那么图当然也不例外。这篇文章我们就来看看如何遍历以及用js来实现图的遍历。   首先,有两种算法可以对图进行遍历:广度优先搜索(BFS)和深度优先搜索(DFS)。图的遍历可以用来寻找特定的顶点,可以寻找两个顶点之间有哪些路径,检查图是否是联通的,也可以检查图是否含有环等等。   在开始代码之前,我们需要了解一下图遍历的思想,也就是说,
zaking
2018/06/14
1.7K1
TypeScript实现图
图是一个非线性数据结构,本文将讲解图的基本运用,将图巧妙运用,并用TypeScript将其实现,欢迎各位感兴趣的开发者阅读本文。
神奇的程序员
2022/04/10
6300
TypeScript实现图
【你该懂一点Javascript算法系列】之【图类】的定义及深度优先与广度优先搜索算法
图 github直达地址 https://github.com/fanshyiis/...
super.x
2019/04/12
6450
【你该懂一点Javascript算法系列】之【图类】的定义及深度优先与广度优先搜索算法
文心一言 VS 讯飞星火 VS chatgpt (309)-- 算法导论22.2 7题
七、职业摔跤手可以分为两种类型:“娃娃脸”(“好人”)型和“高跟鞋”(“坏人”)型。在任意一对职业摔跤手之间都有可能存在竞争关系。假定有 n 个职业摔跤手,并且有一个给出竞争关系的 r 对摔跤手的链表。请给出一个时间为 O(n+r) 的算法来判断是否可以将某些摔跤手划分为“娃娃脸”型,而剩下的划分为“高跟鞋”型,使得所有的竞争关系均只存在于娃娃脸型和高跟鞋型选手之间。如果可以进行这种划分,则算法还应当生成一种这样的划分。如果要写代码,请用go语言。
福大大架构师每日一题
2024/08/16
1060
文心一言 VS 讯飞星火 VS chatgpt (309)-- 算法导论22.2 7题
文心一言 VS 讯飞星火 VS chatgpt (303)-- 算法导论22.2 1题
一、请计算出在有向图22-2(a)上运行广度优先搜索算法后的d值和π值。这里假定结点3为算法所用的源结点。如果要写代码,请用go语言。
福大大架构师每日一题
2024/08/16
1170
文心一言 VS 讯飞星火 VS chatgpt (303)-- 算法导论22.2 1题
从 0 开始学习 JavaScript 数据结构与算法(十二)图
在计算机程序设计中,图也是一种非常常见的数据结构,图论其实是一个非常大的话题,在数学上起源于哥尼斯堡七桥问题。
XPoet
2021/04/26
7710
用js来实现那些数据结构15(图01)
  其实在上一篇介绍树结构的时候,已经有了一些算法的相关内容介入。而在图这种数据结构下,会有更多有关图的算法,比如广度优先搜索,深度优先搜索最短路径算法等等。这是我们要介绍的最后一个数据结构。同时也是本系列最为复杂的一个。那么我们先来简单介绍一下,什么是图? 一、图的概念   简单说,图就是网络结构的抽象模型,图是一组由边连接的节点(或顶点)。任何二元关系都可以用图来表示。比如我们的地图,地铁线路图等。都是图的实际应用。   接着我们看看图的一些相关概念和术语。   一个图G = (V,E)由以下元素组成:
zaking
2018/06/14
7080
文心一言 VS 讯飞星火 VS chatgpt (331)-- 算法导论22.5 7题
为了判断一个有向图是否是半连通的,我们可以使用深度优先搜索(DFS)或广度优先搜索(BFS)。核心思路是检查从任意顶点出发是否能访问到所有其他顶点,并且对于任意顶点,都存在一条路径到达另一个顶点或另一个顶点存在一条路径到达它。
福大大架构师每日一题
2024/08/29
1260
文心一言 VS 讯飞星火 VS chatgpt (331)-- 算法导论22.5 7题
文心一言 VS 讯飞星火 VS chatgpt (307)-- 算法导论22.2 5题
五、证明:在广度优先搜索算法里,赋给结点 u 的 u.d 值与结点在邻接链表里出现的次序无关。使用图 22-3 作为例子,证明:BFS 所计算出的广度优先树可以因邻接链表中的次序不同而不同。如果要写代码,请用go语言。
福大大架构师每日一题
2024/08/16
1240
文心一言 VS 讯飞星火 VS chatgpt (307)-- 算法导论22.2 5题
数据结构——图
图是一组由边连接的顶点。任何二元关系都可以用图来表示。社交网络、道路等都可以用图来表示。
多云转晴
2020/05/21
9410
【数据结构与算法】详解什么是图结构,并用代码手动实现一个图结构
本系列文章【数据结构与算法】所有完整代码已上传 github,想要完整代码的小伙伴可以直接去那获取,可以的话欢迎点个Star哦~下面放上跳转链接
@零一
2021/01/29
5760
文心一言 VS 讯飞星火 VS chatgpt (315)-- 算法导论22.3 7题
七、请重写DFS算法的伪代码,以便使用栈来消除递归调用。如果要写代码,请用go语言。
福大大架构师每日一题
2024/08/16
1100
文心一言 VS 讯飞星火 VS chatgpt (315)-- 算法导论22.3 7题
数据结构基础温故-5.图(中):图的遍历算法
上一篇我们了解了图的基本概念、术语以及存储结构,还对邻接表结构进行了模拟实现。本篇我们来了解一下图的遍历,和树的遍历类似,从图的某一顶点出发访问图中其余顶点,并且使每一个顶点仅被访问一次,这一过程就叫做图的遍历(Traversing Graph)。如果只访问图的顶点而不关注边的信息,那么图的遍历十分简单,使用一个foreach语句遍历存放顶点信息的数组即可。但是,如果为了实现特定算法,就必须要根据边的信息按照一定的顺序进行遍历。图的遍历算法是求解图的连通性问题、拓扑排序和求解关键路径等算法的基础。
Edison Zhou
2018/08/20
1.2K0
数据结构基础温故-5.图(中):图的遍历算法
文心一言 VS 讯飞星火 VS chatgpt (311)-- 算法导论22.2 9题
九、设$G=(V,E)$为一个连通无向图。请给出一个$O(V+E)$时间的算法来计算图$G$中的一条这样的路径:该路径正反向通过$E$中每条边恰好一次(该路径通过每条边两次,但这两次的方向相反)。如果给你大量的分币作为奖励,请描述如何在迷宫中找出一条路。如果要写代码,请用go语言。
福大大架构师每日一题
2024/08/16
1030
文心一言 VS 讯飞星火 VS chatgpt (311)-- 算法导论22.2 9题
文心一言 VS 讯飞星火 VS chatgpt (322)-- 算法导论22.4 3题
三、给出一个算法来判断给定无向图$G=(V,E)$是否包含一个环路。算法运行时间应该在$O(V)$数量级,且与$|E|$无关。如果要写代码,请用go语言。
福大大架构师每日一题
2024/08/16
930
文心一言 VS 讯飞星火 VS chatgpt (322)-- 算法导论22.4 3题
文心一言 VS 讯飞星火 VS chatgpt (301)-- 算法导论22.1 5题
五、有向图$G=(V,E)$的平方图是图$G^{2}=(V,E^{2})$,这里,边$(u,v)∈E^{2}$当且仅当图$G$包含一条最多由两条边构成的从$u$到$v$的路径。请给出一个有效算法来计算图$G$的平方图$G^{2}$。这里图$G$既可以以邻接链表表示,也可以以邻接矩阵表示。请分析算法的运行时间。如果要写代码,请用go语言。
福大大架构师每日一题
2024/08/16
970
文心一言 VS 讯飞星火 VS chatgpt (301)-- 算法导论22.1 5题
【愚公系列】2023年11月 数据结构(十四)-图
数据结构是计算机科学中的一个重要概念,它描述了数据之间的组织方式和关系,以及对这些数据的访问和操作。常见的数据结构有:数组、链表、栈、队列、哈希表、树、堆和图。
愚公搬代码
2023/11/13
3360
《JavaScript数据结构与算法》读书笔记
这本书让我回顾了一遍大学时候学的数据结构。数据结构和算法是程序员最喜欢也是最痛苦的部分,这本书很轻松的描述了这部分东西,是一本很不错的书。这篇文章记录书中的重点部分,并不会对书中所有的内容都复述一遍,如果希望了解更多的内容可以去看看这本书。由于ES5和ES6思想基本上是相同的,这里只记录ES6的实现。
kai666666
2020/10/19
4060
《JavaScript数据结构与算法》读书笔记
揉捻Map-疯狂Java
学编程的小程
2023/10/11
2470
揉捻Map-疯狂Java
推荐阅读
相关推荐
力扣 (LeetCode)-104. 二叉树的最大深度,图
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验