又一个 webdav 服务器

背景

前几天记录了一篇关于 webdav 的文章,但那个 webdav 我始终无法解决写数据的问题。于是又找到了这个 webdav,虽然也有瑕疵, 不过总算满足了目前写文件的需求。

搭建 WebDAV

编辑 docker-compose.yml 文件:

version: '3.2'

  webdav-zotero:
    image: morrisjobke/webdav
    container_name: webdav-zotero
    environment:
      USERNAME: kelu
      PASSWORD: kelu
    volumes:
      - zotero:/var/webdav/zotero
    restart: always
    ports:
      - "8080:80"

用户名密码均为 kelu, 运行即可。

docker-compose up -d

使用 http://ip:8080/webdav 即可访问到服务。


一个电商需求分析demo - LaravelChina

一篇清晰简约的需求分析的文章。原文:https://laravel-china.org/courses/laravel-shop/5.7/module-division/2738

用例分析

Laravel Shop 是我们整套课程将要构建的项目名称,是一个单商户的电商系统。本章节将简单地从产品用例的角度上来分析 Laravel Shop 的需求,好让大家对我们即将开发的项目有个基础的概念。我们主要从以下三种元素入手:

  1. 角色
  2. 信息
  3. 动作

接下来做单独分解。

1. 角色

在我们的 Laravel Shop 里,将会出现以下角色:

  • 游客 —— 没有登录的用户;
  • 用户 —— 注册用户, 可以购买商品;
  • 运营 —— 可以上架、下架商品,处理订单;
  • 管理员 —— 权限最高的用户角色,可以管理运营。

2. 信息结构

主要信息有:

  • 用户 —— 模型名称 User;
  • 收货地址 —— 模型名称 UserAddress,包含地址和收货人姓名、电话;
  • 商品 —— 模型名称 Product,比如 iPhone X 就是一个商品;
  • 商品 SKU —— 模型名称 ProductSKU,同一商品下有个别属性可能有不同的值,比如 iPhone X 256G 和 iPhone X 64G 就是同一个商品的不同 SKU,每个 SKU 都有各自独立的库存;
  • 订单 —— 模型名称 Order;
  • 订单项 —— 模型名称 OrderItem,一个订单会包含一个或多个订单项,每个订单项都会与一个商品 SKU 关联;
  • 优惠券 —— 模型名称 CouponCode,订单可以使用优惠券来扣减最终需要支付的金额;
  • 运营人员 —— 模型名称 Operator,管理员也属于运营人员。

3. 动作

角色和信息之间的互动称之为『动作』,动作主要有以下几个:

  • 创建 Create
  • 查看 Read
  • 编辑 Update
  • 删除 Delete

用例

1.游客

  • 游客可以查看商品列表;
  • 游客可以查看单个商品内容。

2. 用户

  • 用户可以查看自己的收货地址列表;
  • 用户可以新增收货地址;
  • 用户可以修改自己的收货地址;
  • 用户可以删除自己的收货地址;
  • 用户可以收藏商品;
  • 用户可以将商品加入购物车;
  • 用户可以将购物车中的商品打包下单;
  • 用户可以在下单时使用优惠券;
  • 用户可以通过微信、支付宝支付订单;
  • 用户可以查看自己的订单信息;
  • 用户可以对已支付的订单申请退款;
  • 用户可以将已发货的订单标记为确认收货;
  • 用户可以对已购买的商品发布评价。

3. 运营

  • 运营可以看到所有的用户列表;
  • 运营可以发布商品;
  • 运营可以编辑商品内容;
  • 运营可以编辑商品 SKU 及其库存;
  • 运营可以下架商品;
  • 运营可以将用户已支付的订单标记为已发货;
  • 运营可以对申请退款的订单执行退款;
  • 运营可以创建、编辑、删除优惠券。

4. 管理员

  • 管理员可以查看运营人员列表;
  • 管理员可以新增运营人员;
  • 管理员可以编辑运营人员;
  • 管理员可以删除运营人员。

file

很多时候,当开发团队开始启动一个项目时,区分功能模块的优先顺序尤其重要,否则你都不知道从哪里下手。这里我们使用一个简单的分析框架,来决策功能模块的开发优先级。你也可以使用其对大部分的 Web 项目进行模块开发的优先级分析。

模块清单

首先,基于我们的需求分析,我们将系统拆分成如下几大模块:

  • 用户模块
  • 商品模块
  • 订单模块
  • 支付模块
  • 优惠券模块
  • 管理模块

依赖关系

有了模块清单,接下来我们需要思考,他们之间的依赖关系是怎样的。在上面的功能清单中,『订单模块』依赖于『用户模块』和『商品模块』,『支付模块』和『优惠券模块』又依赖于『订单模块』。各个模块之间的依赖关系可以用下图来表示:

file

上层的模块依赖于下层的模块,因此在开发过程中我们会优先构建下层的模块。

开发顺序

所以我们各个模块开发的顺序如下:

  1. 用户模块
  2. 商品模块
  3. 订单模块
  4. 支付模块
  5. 优惠券模块

『管理模块』是一个特殊的模块,既包含本身的逻辑(管理后台的权限控制等),又与其他业务模块都有关联,因此在开发过程中会与其他模块穿插开发。

MVP 产品

是的,作为工程师,我们不需要了解产品的方方面面,那是产品经理的工作。但是作为一位优秀的开发者,在开发项目时,对将要完成的产品 MVP 要了然于胸,MVP 是 Minimum Viable Prodcut (最小化可行性产品)的简称。如何得出产品的 MVP 产品呢?可以先问这样的问题:

对于这个产品来讲,哪些功能是必不可缺的?

电商产品是一个用户购买商品的地方,产品存在的核心价值是『用户购买商品』,那首先需要用户、然后需要商品、购买需要付款。所以在我们的电商项目里,用户、商品、订单和支付模块都是必不可少的。

优惠券功能并不是购物流程中必备的一环,属于附加的功能,锦上添花的东西。我们在设计和开发项目时,应优先完成基础的功能,让流程能尽快跑起来,尽早交付,快速迭代。

Web 开发是个速度至上的领域,最小产品功能先上,测试的工作量也不会太大。不能憋大招,一个上线就是一大堆功能,复杂度增加的是无限的开发和调错时间,项目上线期限无尽延长。另一方面,用户能在最短时间内接触到产品,产品经理也可以尽快听到用户的反馈,及时调整产品战略,产品离成功会更进一步,这是一个多赢的方案。

这个思路也与敏捷开发的思路不谋而合:

敏捷开发即是以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。

结语

功能模块的开发优先级,我们已经有了,接下来就是要动手开始写代码了。


批量调整word中插入的图片大小 - 到处玩的

使用宏,alt+F8进入宏查看界面,点击创建,输入以下代码,设置图片高、宽,单位:厘米。f5或保存后退出宏编辑界面。

然后alt+F8进入宏查看界面,点击运行即可。

Sub 批量设置图片大小()
'
' Macro 宏
'
'
Myheigth = 9
Mywidth = 12
On Error Resume Next '忽略错误
For Each iShape In ActiveDocument.InlineShapes
iShape.Height = 28.345 * Myheigth '设置图片高度为任意cm
iShape.Width = 28.345 * Mywidth '设置图片宽度
Next
For Each Shape In ActiveDocument.Shapes
Shape.Height = 28.345 * Myheigth '设置图片高度为任意cm
Shape.Width = 28.345 * Mywidth '设置图片宽度
Next
End Sub

参考资料


搭建个人 webdav 服务器

背景

对于技术飞速发展的今天来说, webdav 算是一个相对古老的协议,可能一些人也只是瞥过这个单词,并不知道是用来做什么的。由于我iPad上的一个软件 “Document” 的服务中有这样一个协议(还有Dropbox/google drive/SMB/ftp等),想起以前曾经用过 OmniFocuse 这类的应用,也支持自定义的 WebDAV协议,临时起意也起一个自己的 WebDAV 服务。接下来介绍如何使用容器搭建。

什么是 WebDAV

首先要了解HTTP协议。 HTTP协议定义了几种请求: GET, POST,PUT等用来下载文件上传数据。

WebDAV 则在标准的HTTP协议上扩展了特有的请求方式: PROPFIND, MOVE, COPY等。 然后用这些请求,操作web服务器上的磁盘,我们可以将其当作网盘来使用。

WebDAV 标准得到了广泛的成功,所有的现代操作系统拥有内置的对普通 WebDAV 的支持,许多流行的应用程序也可以使用 WebDAV,如 Microsoft Office,Dreamweaver 和 Photoshop。

搭建 WebDAV

这么成熟的协议docker社区肯定已经有很多相关的镜像了。我使用的是这个镜像: jgeusebroek/docker-webdav 。这个镜像基于 alpine并内置了一个轻量的 httpd 服务,已经相当的够用了。

按照作者的描述,简单使用如下命令就可以运行起来了。

docker run --restart=always -d
	-p 0.0.0.0:80:80 \
	--hostname=webdav \
	--name=webdav \
	-v /<host_directory_to_share>:/webdav \
	jgeusebroek/webdav

默认的账号密码是 webdav/vadbew。当然这样非常不安全。

以下是我的一些自定义配置,可以跟着我往下配置。

在这里我是重写了账号密码(debian系):

#!/bin/bash

apt-get install apache2-utils
htpasswd -c htpasswd kelu

我使用 htpasswd 命令创建了一个用户名为 kelu 的 htpasswd 文件,按照提示输入密码,便完成了认证文件的创建。创建一个config文件夹,并将它移入文件夹中:

mkdir config
mv htpasswd config
cd config
wget https://github.com/jgeusebroek/docker-webdav/raw/master/files/webdav.conf

最后我把默认的webdav的http配置也放到了配置文件夹中。

最后创建 docker-compose.yml 文件:

version: '3.2'

services:
  webdav:
    image: jgeusebroek/webdav
    container_name: webdav
    environment:
#      USER_UID: 0
      USER_GID: 50
      READWRITE: 'true'
    volumes:
      - /var/local/document:/webdav
      - ./config:/config
    ports:
      - '39989:80'
    restart: always

我将 /var/local/document 文件夹作为webdav的主目录,运行:

docker-compose up -d

便完成了服务的搭建,在 WebDAV 客户端中输入服务器/ip/端口/账号/密码即可访问。

参考资料