月度归档: 2025 年 2 月

  • Vue3+VueUse 极简实现可拖拽侧边栏

    <script setup lang="ts">
    import { computed, onMounted, ref } from 'vue'
    import { useMousePressed, useMouseInElement } from '@vueuse/core'
    
    const containerRef = shallowRef()
    const dividerRef = shallowRef()
    
    const { pressed } = useMousePressed({ target: dividerRef, touch: false })
    const { elementX } = useMouseInElement(containerRef)
    
    const asideWidth = ref('300px')
    
    watch(elementX, (newVal) => {
      console.log(newVal, pressed.value)
      if (!pressed.value) return
      if (newVal < 300) {
        asideWidth.value = '300px'
        return
      }
      asideWidth.value = `${Math.floor(newVal)}px`
    })
    
    </script>
    
    <template>
    <ElContainer v-show="panel === 'tree'" ref="containerRef" class="container">
          <ElAside class="aside"
            ></ElAside>
          <div ref="dividerRef" class="divider"></div>
          <ElMain class="main">
          </ElMain>
     </ElContainer>
    <ElContainer v-show="panel === 'card'"> <BookCard :book="currentBook" /></ElContainer>
    </template>
    <style scoped lang="less">
    .aside {
      width: v-bind('asideWidth');
    }
    .divider {
      flex: 0 0 4px;
      &:hover {
        background-color: var(--el-border-color);
        cursor: col-resize;
      }
      &:active {
        background-color: var(--el-border-color);
        cursor: col-resize;
      }
    }
    </style>

    在flex容器(container)中横向排布侧边栏(aside)、分隔线(divider)和主要区域(main)通过useMousePressed获取分隔线上的鼠标按压状态,通过useMouseInElement获取容器内的鼠标移动状态,这些状态是响应式的侦听鼠标横向移动距离,仅当鼠标在分隔线按下(即拖拽)时,同步修改侧边栏宽度。

    参考:流烨(链接:https://juejin.cn/post/7384242126429405225),相比调整了一下动态设置宽度的方式,改为width: v-bind(‘asideWidth’),同时,优化.divider的样式,增加hover,让它平时隐藏,鼠标滑过时显示更容易寻找。

  • l5-swagger如何设置服务端路径

    正如tests/storage/annotations/OpenApi/L5SwaggerAnnotationsExampleServer.php所示:

    <?php
    
    namespace Tests\storage\annotations\OpenApi;
    
    /**
     *  @OA\Server(
     *      url=L5_SWAGGER_CONST_HOST,
     *      description="L5 Swagger OpenApi dynamic host server"
     *  )
     *
     *  @OA\Server(
     *      url="https://projects.dev/api/v1",
     *      description="L5 Swagger OpenApi Server"
     * )
     */
    class L5SwaggerAnnotationsExampleServer
    {
    }

    L5_SWAGGER_CONST_HOST是作为一个变量直接引用的,这个变量在.env中设置,在实际项目中,尤其是多实例部署的产品,优先考虑用这种方法,而其中第二个是直接写死的地址,这种更适合相对固定的内部测试或者官方接口站点作为对照。实际上,api/doc还会依据L5_SWAGGER_BASE_PATH自动加载一个相对的接口地址,这个更适合用在调试环境,启动端口有可能会变,而且多个开发者的配置也不一定一致。L5_SWAGGER_CONST_HOST和L5_SWAGGER_BASE_PATH之间是相对独立的,可以搜索一下l5-swagger源代码看看逻辑,可惜这一点在l5-swagger的文档中说的并不清楚。

  • 出版行业如何选择大模型

    过年期间deepseek吵得很热闹,不过就我看到的信息,更像是一次冲喜,毕竟要过除夕了。我不太相信惊喜,二十年前在武汉的某博士沙龙上我突发灵感得到的结论,一切惊喜都可视作异常。回京后,做了下简单的测试,拿一个简单地问题去问这几个模型,这个问题还不算很苛刻,只是想看看训练时的语料审查有多么严重。

    按结果的省略程度排序依次是:

    1. deepseek
    2. qwen
    3. mistral

    拿出版行业来说,尽管审查也是一个很重的任务,但这个任务是由编辑来承担的,大模型没有权力直接来操刀,否则很容易造成失真,编辑就没法干活了。即使有deepseek无审查版也不行,因为那个无审查只是推理时无审查,并不能解决训练阶段的语料审查。

    所以,这个可以当作出版行业大模型的一个选择条件,如果是2C我没有什么意见,安全第一,但是从编辑专业角度而言,必须选择一个中立的大模型来作为基础模型。这几个里面,没有哪个合适的,勉强选择的话只有mistral可以考虑,但这家伙中立的过分了,其实作为专业模型,我们不需要大模型给出态度和立场。

    所以,行业模型还要从更基础的模型来做。

  • 用Caddy部署wordpress

    年前把公司网站的服务器换到了caddy上,今天想写一篇博客,发现证书过期了,之前用了certbot但是配置自动任务还是比较麻烦的,尤其是用了docker。索性一起换掉。

    docker-compose.yml中的配置如下:

      caddy:
        image: registry.cn-beijing.aliyuncs.com/futuremeng/caddy:1.1
        container_name: caddy
        restart: unless-stopped
        environment:
          - TZ=Asia/Shanghai
        volumes:
          - ./services/caddy/config:/config
          - ${DATA_DIR}/caddy:/data
          - ${SOURCE_DIR}:/www/:rw
          - ${LOGS_DIR}/caddy:/var/log/caddy
        ports:
          - "80:80"
          - "443:443"
        networks:
          - default

    其中的env变量请自行脑补。

    caddyfile:

    https://WordPress.com {
            root * /www/WordPress
            php_fastcgi php80:9000 {
                    trusted_proxies private_ranges
            }
            file_server
            encode gzip
            @disallowed {
                    path /xmlrpc.php
                    path *.sql
                    path /wp-content/uploads/*.php
            }
            rewrite @disallowed '/index.php'
    }

    详情可见:

    https://github.com/futuremeng/dnmp