头像

后来_4




离线:1天前


最近来访(98)
用户头像
acwing_7845
用户头像
烟火成城
用户头像
菜狗一枚
用户头像
Acwer
用户头像
寒暄a
用户头像
陌丨落
用户头像
RKLV
用户头像
Lukii学习版
用户头像
Fatin
用户头像
Lpy-Issac
用户头像
才疏学浅的阿企
用户头像
R虎虎生威R
用户头像
alixjm
用户头像
-咕咕咕-
用户头像
一个莫得感情的独行侠
用户头像
一口一个
用户头像
2850g
用户头像
梦忆晴天
用户头像
大雪球hh
用户头像
yxc


项目介绍

想法来源: https://www.bilibili.com/video/BV19B4y1Y7m8/

正式上线地址:https://www.x-terminal.cn/

一个很特别的浏览器主页,支持使用输入命令的方式来操作,目标是帮你在一个 web 终端或多个web终端中高效完成搜索,周赛入口,听音乐,刷视频等事情!

如果你是一名程序员,相信你会爱上它~

前端技术

主要技术:

  • pnpm + vite3 打包工具(快,开发体验极好)
  • Vue3 使用setup语法配合组合式api,很容易将项目功能抽离
  • Pinia 状态管理工具 (比vuex更轻便,且兼容vuex语法)
  • Ant design vue 组件库
  • Typescript 类型约束

依赖库:

  • axios 网络请求
  • dayjs 时间处理
  • lodash 工具库(像防抖,节流这种常用函数都有)
  • getopts 命令参数解析 ==> 依赖于minimist 解析库(下载量几千万次/周)

后端技术

主要技术:

  • Node.js
  • Express,jsonwebtoken
  • MySQL
  • Sequelize

依赖库:

  • Axios 网络请求库
  • NeteaseCloudMusicApi 网易云服务
  • cherrio 有关dom解析的库,配合axios爬取某些信息

依赖服务:

  • 高德地图 天气api
  • 哔哩哔哩 视频api
  • 搏天api (获取随机壁纸,翻译结果)

部署

后端服务: 微信云托管

前端页面: 测试站点使用的unicloud,静态网页托管服务

亮点

在原视频up主鱼皮的项目基础上进行了部分简化,并添加了一些自己想到的功能:

  • 页面内部,实现tab页多开终端
  • article命令,利用无限滚动虚拟列表进行长列表优化
  • video 优化展示效果,并使用循环列表动态扩容算法,添加了上一条,下一条视频,视频分区的功能
  • 增加acwing 网课活动入口(爬虫获取), 最新周赛入口(爬虫获取),题目搜索功能
  • 增加leetcode 题目搜索功能,最新单周赛和双周赛入口功能 (计算预测
  • 删除了部分不常用的搜索引擎,添加了csdn菜鸟教程等常用网站的搜索跳转功能
  • 添加weather 天气命令 (调用高德地图 天气api,一天免费调用30w次)
  • 添加 calculator 计算器的功能 (原理详情见leetcode 772 基本计算器Ⅲ
  • 添加bookmark 书签功能的 增删查,addremoveshow功能,用户登陆后,可以通过已添加的书签key,实现快速跳转的功能
  • 授权方式 由session 换成了 jwt

演示视频地址:

视频演示地址



活动打卡代码 AcWing 4405. 统计子矩阵

后来_4
1个月前
#include<iostream>
using namespace std;

typedef long long ll;
const int N = 5e2+3;
int n, m, k;
int a[N][N];


int main(){
    ios::sync_with_stdio(false);
    cin >> n >> m >> k;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            cin >> a[i][j];
            a[i][j] += a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];
        }
    }

    ll ans = 0;
    for(int i=1; i<=m; i++){
        for(int j=i; j<=m; j++){
            for(int s = 1, t = 1; t <= n; t ++ ){
                while(s <= t && a[t][j] - a[s - 1][j] - a[t][i - 1] + a[s - 1][i - 1] > k) s ++ ;
                if(s <= t) ans += t - s + 1;
            }
        }
    }

    cout << ans << '\n';
}




活动打卡代码 LeetCode 1282. 用户分组

后来_4
1个月前
class Solution:
    def groupThePeople(self, groupSizes: List[int]) -> List[List[int]]:
        groups = defaultdict(list)
        for i, size in enumerate(groupSizes):
            groups[size].append(i)
        ans = []
        for size, people in groups.items():
            ans.extend(people[i: i + size] for i in range(0, len(people), size))
        return ans



活动打卡代码 AcWing 3589. 平方因子

后来_4
1个月前
nums = []
for i in range(2,101):
    nums.append(i * i)
try:
    while True:
        n = int(input())
        flag = False
        for i in range(len(nums)):
            if nums[i] > n:
                break
            if n % nums[i] == 0:
                flag = True
                break
        if flag:
            print("Yes")
        else:
            print("No")
except:
    pass




后来_4
4个月前
class Solution:
    def numEquivDominoPairs(self, dominoes: List[List[int]]) -> int:
        dic = {}
        cnt = 0
        for i in range(len(dominoes)):
            x,y = dominoes[i]
            if y > x:
                x,y = y,x
            s = str(x) + '/' + str(y)
            if dic.get(s):
                dic[s] += 1
            else:
                dic[s] = 1
        for k in dic:
            cnt += (dic[k]) * (dic[k] - 1) // 2
        return cnt



后来_4
4个月前
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def lcaDeepestLeaves(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        def dfs(tree):
            if not tree:
                return [None,0]
            lr,rr = dfs(tree.left),dfs(tree.right)
            if lr[1] == rr[1]:
                return [tree,lr[1] + 1]
            elif lr[1] > rr[1]:
                return [lr[0],lr[1] + 1]
            return [rr[0],rr[1] + 1]
        return dfs(root)[0]



后来_4
4个月前
class Solution:
    def maxDepthAfterSplit(self, seq: str) -> List[int]:
        cnt = 0
        res = []
        for i in range(len(seq)):
            if seq[i] == '(':
                cnt += 1
                res.append(cnt % 2)
            else:
                res.append(cnt % 2)
                cnt -= 1

        return res


活动打卡代码 LeetCode 1110. 删点成林

后来_4
4个月前
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def delNodes(self, root: TreeNode, to_delete: List[int]) -> List[TreeNode]:
        deletes = set(to_delete)
        res = []
        def dfs(node, isRoot):
            if not node:
                return None
            is_delete = node.val in deletes
            if isRoot and not is_delete:
                res.append(node)
            node.left = dfs(node.left,is_delete)
            node.right = dfs(node.right,is_delete)
            return None if is_delete else node
        dfs(root,True)
        return res



后来_4
4个月前
class Solution:
    def tribonacci(self, n: int) -> int:
        nums = [0,1,1]
        for i in range(0,38):
            nums.append(nums[i]+nums[i+1]+nums[i+2])
        return nums[n]



后来_4
4个月前
class Solution:
    def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
        arr3 = []
        for i in range(len(arr2)):
            if arr1.count(arr2[i])>0:
                while(arr1.count(arr2[i])>0):
                    arr3.append(arr2[i])
                    arr1.remove(arr2[i])
        arr1.sort()
        for j in range(len(arr1)):
            arr3.append(arr1[j])
        return arr3