commit
379471c727
20
README.md
20
README.md
@ -1,8 +1,22 @@
|
|||||||
# open-renamer
|
# open-renamer
|
||||||
|
|
||||||
|
![](https://qiniupic.fleyx.com/blog/202204071632882.png)
|
||||||
|
|
||||||
renamer 的开源实现版本,BS 应用,支持全平台部署使用
|
renamer 的开源实现版本,BS 应用,支持全平台部署使用
|
||||||
已打包镜像到 dockerhub 中:[hub.docker.com](https://hub.docker.com/r/fleyx/open-renamer)
|
已打包镜像到 dockerhub 中:[hub.docker.com](https://hub.docker.com/r/fleyx/open-renamer)
|
||||||
|
|
||||||
|
已实现如下三种处理规则:
|
||||||
|
|
||||||
|
- 插入
|
||||||
|
- 删除
|
||||||
|
- 序列化
|
||||||
|
|
||||||
|
特点:
|
||||||
|
|
||||||
|
- 不限制规则数量
|
||||||
|
- 支持将规则保存为模板,方便下次使用
|
||||||
|
- 全平台支持,可直接部署在 nas 中,通过浏览器访问
|
||||||
|
|
||||||
## 运行方式:
|
## 运行方式:
|
||||||
|
|
||||||
推荐通过 docker 部署到 nas 中,即可管理 nas 媒体文件
|
推荐通过 docker 部署到 nas 中,即可管理 nas 媒体文件
|
||||||
@ -34,9 +48,3 @@ version: "3.6"
|
|||||||
# 使用宿主机网络.即可通过"宿主机ip:11004"访问程序
|
# 使用宿主机网络.即可通过"宿主机ip:11004"访问程序
|
||||||
network_mode: host
|
network_mode: host
|
||||||
```
|
```
|
||||||
|
|
||||||
已实现如下三种处理规则:
|
|
||||||
|
|
||||||
- 插入
|
|
||||||
- 删除
|
|
||||||
- 序列化
|
|
||||||
|
@ -5,6 +5,8 @@ import * as fs from 'fs-extra';
|
|||||||
import ProcessHelper from '../util/ProcesHelper';
|
import ProcessHelper from '../util/ProcesHelper';
|
||||||
import FileObj from '../vo/FileObj';
|
import FileObj from '../vo/FileObj';
|
||||||
|
|
||||||
|
let numberSet = new Set(["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]);
|
||||||
|
|
||||||
class FileService {
|
class FileService {
|
||||||
static async readPath(pathStr: string, showHidden: boolean): Promise<Array<FileObj>> {
|
static async readPath(pathStr: string, showHidden: boolean): Promise<Array<FileObj>> {
|
||||||
pathStr = decodeURIComponent(pathStr);
|
pathStr = decodeURIComponent(pathStr);
|
||||||
@ -46,13 +48,62 @@ class FileService {
|
|||||||
console.error(e);
|
console.error(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
folderList.sort((a, b) => a.name.localeCompare(b.name)).push(...files.sort((a, b) => a.name.localeCompare(b.name)));
|
folderList.sort((a, b) => FileService.compareStr(a.name, b.name)).push(...files.sort((a, b) => FileService.compareStr(a.name, b.name)));
|
||||||
return folderList;
|
return folderList;
|
||||||
}
|
}
|
||||||
|
|
||||||
static async checkExist(pathStr: string) {
|
static async checkExist(pathStr: string) {
|
||||||
return await fs.pathExists(pathStr);
|
return await fs.pathExists(pathStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数字字母混合排序
|
||||||
|
* @param a str
|
||||||
|
* @param b str
|
||||||
|
*/
|
||||||
|
static compareStr(a: string, b: string) {
|
||||||
|
let an = a.length;
|
||||||
|
let bn = b.length;
|
||||||
|
for (let i = 0; i < an;) {
|
||||||
|
let charA = FileService.readChar(a, i, an);
|
||||||
|
let charB = FileService.readChar(b, i, bn);
|
||||||
|
if (charB.length == 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (charA !== charB) {
|
||||||
|
//读取字符串不相等说明可以得到排序结果
|
||||||
|
//如果都为数字,按照数字的比较方法,否则按照字符串比较
|
||||||
|
return numberSet.has(charA.charAt(0)) && numberSet.has(charB.charAt(0)) ? Number(charA) - Number(charB) : charA.localeCompare(charB);
|
||||||
|
}
|
||||||
|
i += charA.length;
|
||||||
|
}
|
||||||
|
//排到最后都没分结果说明相等
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 读取字符,如果字符为数字就读取整个数字
|
||||||
|
* @param a a
|
||||||
|
* @param n 数字长度
|
||||||
|
*/
|
||||||
|
static readChar(a: string, i: number, n: number) {
|
||||||
|
let res = "";
|
||||||
|
for (; i < n; i++) {
|
||||||
|
let char = a.charAt(i);
|
||||||
|
if (numberSet.has(char)) {
|
||||||
|
//如果当前字符是数字,添加到结果中
|
||||||
|
res += char;
|
||||||
|
} else {
|
||||||
|
//如果不为数字,但是为第一个字符,直接返回,否则返回res
|
||||||
|
if (res.length == 0) {
|
||||||
|
return char;
|
||||||
|
} else {
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default FileService;
|
export default FileService;
|
||||||
|
@ -55,6 +55,9 @@ import { ArrowDownBold, ArrowUpBold } from "@element-plus/icons";
|
|||||||
import HttpUtil from "../../utils/HttpUtil";
|
import HttpUtil from "../../utils/HttpUtil";
|
||||||
import FileChose from "@/components/FileChose";
|
import FileChose from "@/components/FileChose";
|
||||||
import RuleBlock from "./components/RuleBlock.vue";
|
import RuleBlock from "./components/RuleBlock.vue";
|
||||||
|
|
||||||
|
let numberSet = new Set(["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]);
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "Home",
|
name: "Home",
|
||||||
components: {
|
components: {
|
||||||
@ -80,6 +83,7 @@ export default {
|
|||||||
async addData(data) {
|
async addData(data) {
|
||||||
data.forEach((item) => (item.checked = false));
|
data.forEach((item) => (item.checked = false));
|
||||||
this.fileList.push(...data);
|
this.fileList.push(...data);
|
||||||
|
this.fileList = [...this.fileList.sort((a, b) => compareStr(a.name, b.name))];
|
||||||
this.dialogVisible = false;
|
this.dialogVisible = false;
|
||||||
this.needPreview = true;
|
this.needPreview = true;
|
||||||
await this.showResult();
|
await this.showResult();
|
||||||
@ -158,6 +162,55 @@ export default {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数字字母混合排序
|
||||||
|
* @param a str
|
||||||
|
* @param b str
|
||||||
|
*/
|
||||||
|
function compareStr(a, b) {
|
||||||
|
let an = a.length;
|
||||||
|
let bn = b.length;
|
||||||
|
for (let i = 0; i < an; ) {
|
||||||
|
let charA = readChar(a, i, an);
|
||||||
|
let charB = readChar(b, i, bn);
|
||||||
|
if (charB.length == 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (charA !== charB) {
|
||||||
|
//读取字符串不相等说明可以得到排序结果
|
||||||
|
//如果都为数字,按照数字的比较方法,否则按照字符串比较
|
||||||
|
return numberSet.has(charA.charAt(0)) && numberSet.has(charB.charAt(0)) ? Number(charA) - Number(charB) : charA.localeCompare(charB);
|
||||||
|
}
|
||||||
|
i += charA.length;
|
||||||
|
}
|
||||||
|
//排到最后都没分结果说明相等
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 读取字符,如果字符为数字就读取整个数字
|
||||||
|
* @param a a
|
||||||
|
* @param n 数字长度
|
||||||
|
*/
|
||||||
|
function readChar(a, i, n) {
|
||||||
|
let res = "";
|
||||||
|
for (; i < n; i++) {
|
||||||
|
let char = a.charAt(i);
|
||||||
|
if (numberSet.has(char)) {
|
||||||
|
//如果当前字符是数字,添加到结果中
|
||||||
|
res += char;
|
||||||
|
} else {
|
||||||
|
//如果不为数字,但是为第一个字符,直接返回,否则返回res
|
||||||
|
if (res.length == 0) {
|
||||||
|
return char;
|
||||||
|
} else {
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user