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