uniapp-商城-43-shop 后台管理 页面
后台管理较为简单,主要用于后台数据的管理,包含商品类别和商品信息,其实还可以扩展到管理用户等等
1、后台首页
包含 分类管理 商品管理 关于商家等几个栏目
主要代码:
<template><view class="manage"><!-- 商品管理后台 --><!-- uni-section标题栏 组件来完成 https://zh.uniapp.dcloud.io/component/uniui/uni-section.html--><uni-section title="分类管理" type="line"></uni-section><!-- 使用列表组件 uni-list uni-list-item 完成 https://zh.uniapp.dcloud.io/component/uniui/uni-list.html --><uni-list><uni-list-item title="管理分类" show-arrow to="/pages_manage/category/category"></uni-list-item></uni-list><uni-section title="商品管理" type="line"></uni-section><uni-list><uni-list-item title="商品列表" show-arrow to="/pages_manage/goods/list"></uni-list-item><uni-list-item title="新增商品" show-arrow to="/pages_manage/goods/add"></uni-list-item></uni-list><uni-section title="关于商家" type="line"></uni-section><uni-list><uni-list-item title="商家信息" show-arrow to="/pages_manage/brand/brand"></uni-list-item></uni-list></view>
</template><script>export default {data() {return {};}}
</script><style lang="scss" scoped>
.manage{padding:30rpx;
}
</style>
2、分类管理
由于对商品的类别进行划分,可以添加、修改和删除
新增分类;对已有分类进行修改和删除
代码:
页面展示以及操作方法
<template><view class="category"><!-- 分类管理 --><!-- 第二步 --><!-- 这里的row add 中间有一个空格,下面样式就可以写成 .row.add --><view class="row add" @click="clickAdd"><view class="left"><!-- https://uviewui.com/components/icon.html 使用的是uview的icon --><u-icon name="plus" color="#576b95" size="22"></u-icon><text class="text">新增分类</text></view></view><!-- 第一步 --><view class="row" v-for="(item,index) in categoryList" :key="item._id"><view class="left"><!-- 分类名称 --><view class="name">{{item.name}}</view></view><view class="right"><!-- 编辑和删除图标 --><!-- 使用的u-icon组件,自动生成一个class名字为 u-icon --><u-icon name="edit-pen" size="26" color="#576b95" @click="updateData(item._id,item.name)"></u-icon><u-icon name="trash" size="26" color="#EC544F" @click="deleteData(item._id)"></u-icon></view></view><!-- 第三步 --><!-- https://uniapp.dcloud.net.cn/component/uniui/uni-popup.html 使用这里弹出层 官方 使用的是输入框示例 --><!-- 下载安装相应的组件 ref来获取方法进行相应的动作,uview 是通过show 来完成相应的动作 --><!-- @confirm 这是一个回调函数,我们通过这就知道输入的到底是什么 --><uni-popup ref="inputDialog"><uni-popup-dialog mode="input" :value="iptValue"placeholder="请输入分类名称"title="分类名称" @confirm="dialogConfirm"></uni-popup-dialog></uni-popup></view>
</template><script>const db = uniCloud.database()export default {data() {return {// categoryList:[{_id:1,name:"水果"},{_id:2,name:"肉类"}],// 上面是模拟数据 实际写的是空 下面这样的 真实数据来之云存储,并给该变量赋值categoryList:[],iptValue:"",updateID:null};},onLoad() {this.getCateGory()},methods:{//获取数据库中的分类getCateGory(){db.collection("kt-mall-category").get().then(res=>{console.log(res);this.categoryList = res.result.data})},//添加分类clickAdd(){this.iptValue=""this.updateID=null;//https://uniapp.dcloud.net.cn/component/uniui/uni-popup.html 使用的是Popup Methods中open // 这里的inputDialog 的属性是ref在uni-popup中// 所以这里使用的是 this.$refs.inputDialog.open();this.$refs.inputDialog.open();},//点击确认按钮async dialogConfirm(e){this.iptValue = e;if(this.updateID){await db.collection("kt-mall-category").doc(this.updateID).update({name:this.iptValue}) }else{await db.collection("kt-mall-category").add({name:this.iptValue})} this.iptValue = "";//把输入或修改的值改为空,以免下一次在调用就还有上一次的值this.getCateGory(); },//修改一条分类updateData(id,name){this.iptValue=name;this.updateID=id;this.$refs.inputDialog.open();},//删除一条分类deleteData(id){uni.showModal({content:"是否删除该分类?",success:res=>{if(res.confirm){db.collection("kt-mall-category").doc(id).remove().then(res=>{this.getCateGory();}) }},fail:err=>{console.log(err);}})}}}
</script><style lang="scss">
.category{padding:30rpx;.row{@include flex-box();border-bottom: 1px solid $border-color-light;padding:26rpx 0;.left{font-size: 34rpx;}.right{@include flex-box();//使用的u-icon组件,自动生成一个class名字为 u-icon .u-icon{margin-left:30rpx;}}}// 对应的class 就是 row add.row.add{.left{color:$brand-theme-color-aux;@include flex-box();.text{font-size: 36rpx;padding-left:10rpx;}}}
}
</style>
3、商品管理
包含商品列表和新增商品
添加商品代码:
<template><view class="goodsView"><!-- 添加商品 --><uni-forms ref="goodsForm" :model="goodsFormData" :rules="goodsRules" :label-width="100" label-align="right"><uni-forms-item label="商品图片"><uni-file-pickerv-model="goodsFormData.thumb"fileMediatype="image"mode="grid"></uni-file-picker></uni-forms-item><uni-forms-item label="商品名称" required name="name"><uni-easyinput v-model="goodsFormData.name" placeholder="请输入商品名称" trim="both"></uni-easyinput></uni-forms-item><uni-forms-item label="产品分类" required name="category_id"><uni-data-selectcollection="kt-mall-category"field="_id as value, name as text"v-model="goodsFormData.category_id"></uni-data-select></uni-forms-item><uni-forms-item label="商品价格" required name="price"><uni-easyinput type="number" v-model="goodsFormData.price" placeholder="请输入商品价格" trim="both"></uni-easyinput></uni-forms-item><uni-forms-item label="商品原价"><uni-easyinput type="number" v-model="goodsFormData.before_price" placeholder="请输入原价" trim="both"></uni-easyinput></uni-forms-item><uni-forms-item label="商品属性"><u-cell :title="skuTitle" isLink :border="false" @click="clickSelect"></u-cell><view class="skuList"><view class="item" v-for="item in goodsFormData.sku_select" @click="clickSelect"><view class="left">{{item.skuName}}:</view><view class="right">{{skuChildName(item.children)}}</view></view></view></uni-forms-item><uni-forms-item label="商品描述"><uni-easyinput type="textarea" placeholder="请输入详细的描述信息" v-model="goodsFormData.description"></uni-easyinput></uni-forms-item><view class="btnView"><button type="primary" @click="onSubmit">确认提交</button></view></uni-forms><uni-popup ref="attrWrapPop" type="bottom"><view class="attrWrapper"><view class="head"><view class="title">商品属性</view><view class="addAttr" @click="clickAddAttr()">+ 添加属性</view></view> <view class="body"><view class="item" v-for="(item,index) in skuArr"><view class="top"> <checkbox :checked="item.checked" @click="changeCheckbox(index)"></checkbox><view class="font">{{item.skuName}}</view></view><view class="btnGroup" v-if="item.checked"><view class="btn" :class="child.checked?'active':''"v-for="(child,cIdx) in item.children" @click="clickChlidBtn(index,cIdx)">{{child.name}}</view><view class="btn" @click="clickAddAttr(index)"><u-icon name="plus"></u-icon></view></view></view></view><view class="foot"><button type="primary" @click="clickConfirmSelect">确认选择</button></view></view><view class="safe-area-bottom"></view></uni-popup><uni-popup ref="addAttrPop"><uni-popup-dialog mode="input" title="新增" placeholder="请输入新增的内容"@confirm="dialogConfirm"></uni-popup-dialog></uni-popup></view>
</template><script>const skuCloudObj = uniCloud.importObject("kt-mall-sku",{"customUI":true});const goodsCloudObj = uniCloud.importObject("kt-mall-goods",{"customUI":true})export default {data() {return {goodsFormData:{thumb:[],name:"",category_id:null,price:null,before_price:null,description:"",sku_select:[]},addAttrType:"parent", //parent代表父,child代表子goodsRules:{name:{rules:[{required:true,errorMessage:"请输入产品名称"}]},price:{rules:[{required:true,errorMessage:"请输入产品价格"}]},category_id:{rules:[{required:true,errorMessage:"请输入产品分类"}]}},skuArr:[]};},onLoad(){},computed:{skuTitle(){if(this.goodsFormData.sku_select.length){let arr = this.goodsFormData.sku_select.map(item=>{return item.skuName})return arr.join("/")}else{return "点击添加属性"}}},methods:{//属性返回子元素的名称skuChildName(arr){let nsArr = arr.map(item=>{return item.name})return nsArr.join("/")}, //点击确认选择clickConfirmSelect(){let arr = this.skuArr.filter(item=>{let state = item.children.some(child=>child.checked)return item.checked && state}).map(item=>{let children = item.children.filter(child=>{return child.checked})return {...item,children}})this.goodsFormData.sku_select = arrthis.$refs.attrWrapPop.close(); },//获取sku列表async getSkuData(){let res = await skuCloudObj.get();this.skuArr = res.dataconsole.log(res);},//点击添加属性clickAddAttr(index=null){if(index==null){this.addAttrType="parent"this.attrIndex=null}else{this.addAttrType="child"this.attrIndex=index}this.$refs.addAttrPop.open();}, //添加属性弹窗的确认按钮async dialogConfirm(e){if(!e) return; if(this.addAttrType=="parent"){let obj={skuName:e,checked:true,children:[]}let res = await skuCloudObj.add(obj)obj._id = res.id; this.skuArr.push(obj) }else if(this.addAttrType=="child"){ let obj={name:e,checked:true}let id = this.skuArr[this.attrIndex]._id;let res = await skuCloudObj.updateChild(id,obj) this.skuArr[this.attrIndex].children.push(obj)}},//点击属性的复选框changeCheckbox(index){this.skuArr[index].checked = !this.skuArr[index].checked },//点击属性值的子元素clickChlidBtn(index,cIdx){this.skuArr[index].children[cIdx].checked = !this.skuArr[index].children[cIdx].checked},//点击选择属性clickSelect(){this.$refs.attrWrapPop.open();if(this.skuArr.length) return;this.getSkuData();},//点击提交表单onSubmit(){this.$refs.goodsForm.validate().then(res=>{this.toDataBase();}).catch(err=>{console.log(err);})},//上传到云数据库async toDataBase(){this.goodsFormData.thumb = this.goodsFormData.thumb.map(item=>{return {url:item.url,name:item.name,extname:item.extname}})let res = await goodsCloudObj.add(this.goodsFormData)uni.showToast({title:"新增商品成功"})setTimeout(()=>{uni.navigateBack()},1500) }}}
</script><style lang="scss" scoped>
.goodsView{padding:30rpx;.skuList{.item{padding:30rpx;background: $page-bg-color;margin:15rpx 0;@include flex-box-set(start);}}
}.attrWrapper{padding:30rpx;background: #fff;border-radius: 20rpx 20rpx 0 0;.head{@include flex-box();font-size: 34rpx;margin-bottom:30rpx;.title{font-weight: bold;}.addAttr{color:$brand-theme-color-aux;}}.body{.item{border-top:1px solid $border-color-light;&:last-child{border-bottom:1px solid $border-color-light;}.top{padding:30rpx 0;@include flex-box-set(start);.font{padding-left: 10rpx;font-weight: bold;}}.btnGroup{padding:10rpx 0 30rpx;@include flex-box-set(start);flex-wrap: wrap;.btn{padding:0rpx 25rpx;height: 60rpx;border:1rpx solid $border-color-light;margin-right: 20rpx;border-radius: 10rpx; color:$text-font-color-2;margin-bottom:20rpx;@include flex-box-set();&.active{border-color: $brand-theme-color;color:$brand-theme-color;background: rgba(236,87,79,0.1);}}}}}.foot{padding:50rpx 200rpx;}
}
</style>
4、关于商家
商家信息展示和修改
代码:
<template><view class="brand"><!-- 商户信息 --><uni-forms ref="brandRef" :model="brandFormData" :rules="brandRules" :label-width="100" label-align="right"><uni-forms-item label="品牌招牌"><uni-file-picker v-model="brandFormData.thumb" fileMediatype="image" mode="grid":limit="1"/></uni-forms-item><uni-forms-item label="品牌名称" name="name" required><uni-easyinput type="text" v-model="brandFormData.name" placeholder="请输入品牌名称" /></uni-forms-item><uni-forms-item label="商户电话" name="mobile" required><uni-easyinput type="text" v-model="brandFormData.mobile" placeholder="请输入商户电话" /></uni-forms-item><uni-forms-item label="商户地址" name="address"><uni-easyinput v-model="brandFormData.address" placeholder="请输入商户地址" /></uni-forms-item><uni-forms-item label="商家介绍" name="about"><uni-easyinput v-model="brandFormData.about" placeholder="请输入商家介绍" type="textarea" /></uni-forms-item><button type="primary" @click="onSubmit">提交信息</button></uni-forms></view>
</template><script>const brandCloudObj = uniCloud.importObject("kt-mall-brand")export default {data() {return {brandFormData: {thumb:[],name: "", //品牌名称mobile: "",address:"",about:""},brandRules: {name: {rules: [{required: true,errorMessage: "请输入正确的品牌名称"}, {minLength: 3,maxLength: 20,errorMessage: '长度在{minLength}到{maxLength}的字符'}]},mobile: {rules: [{required: true,errorMessage: "请输入正确的品牌电话"}, {validateFunction: function(rule, value, data, callback) {let res = /^1[3-9]\d{9}$/.test(value);if (!res) {callback("手机格式不正确")}return;}}]}}};},onLoad(){this.getBrand();},methods: {//获取数据库中的品牌信息getBrand(){brandCloudObj.get().then(res=>{console.log(res);this.brandFormData = res.data[0]})},//点击提交按钮onSubmit() { this.$refs.brandRef.validate().then(res => {let arr = this.brandFormData.thumb.map(item=>{return {extname:item.extname,url:item.url,name:item.name,size:item.size}})this.brandFormData.thumb = arr;this.addAndUpdate();}).catch(err => {console.log(err);})},//新增或者修改品牌啊信息addAndUpdate(){if(this.brandFormData._id){brandCloudObj.update(this.brandFormData).then(res=>{uni.showToast({title:"修改成功",mask:true})setTimeout(()=>{uni.navigateBack();},1500)})}else{//新增brandCloudObj.add(this.brandFormData).then(res=>{uni.showToast({title:"新增成功"})setTimeout(()=>{uni.navigateBack();},1500)})}}}}
</script><style lang="scss" scoped>.brand {padding: 30rpx;}
</style>
相关文章:

uniapp-商城-43-shop 后台管理 页面
后台管理较为简单,主要用于后台数据的管理,包含商品类别和商品信息,其实还可以扩展到管理用户等等 1、后台首页 包含 分类管理 商品管理 关于商家等几个栏目 主要代码: <template><view class"manage">…...
kotlin JvmName注解的作用和用途
1. JvmName 注解的作用 JvmName 是 Kotlin 提供的一个注解,用于在编译为 Java 字节码时自定义生成的类名或方法名。 作用对象: 文件级别(整个 .kt 文件)函数、属性、类等成员 主要用途: 控制 Kotlin 编译后生成的 JV…...
Mac 平台 字体Unicode范围分析器
字体Unicode范围分析器 #include <CoreText/CoreText.h> // CoreText框架头文件,用于字体处理 #include <CoreFoundation/CoreFoundation.h> // CoreFoundation框架头文件 #include <stdio.h> // 标准输入输出 #include…...
【C++游戏引擎开发】第30篇:物理引擎(Bullet)—软体动力学系统
一、软体动力学理论体系 1.1 连续体力学基础 1.1.1 变形梯度张量 物体运动可描述为映射函数: x = ϕ ( X , t ) \mathbf{x} = \phi(\mathbf{X},t) x...

vue2 结合后端预览pdf 跨域的话就得需要后端来返回 然后前端呈现
<el-button :loading"pdfIslock" v-if"isPDFFile(form.pic)" type"primary" style"margin: 15px 0" click"previewPDF(form.pic)"> 预览pdf </el-button>//npm install pdfjs-dist //如果没有就得先安装import …...

什么是 HSQLDB?
大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构! Java开发人员学习Java数据库连接(JDBC)的最简单方法是试验HyperSQL数据库(又名HSQLDB)。 …...
AI时代企业应用系统架构的新思路与CIO变革指南
作为制造企业CIO,我们看问题需要有前瞻性,AI时代企业应用系统架构需要进行全面转型。 一、新思想与新技术 1. 核心新思想 可视化开发AI的融合模式:不再只依赖纯代码开发或传统低代码,而是两者结合,通过AI理解自然语…...

多语言爬虫实现网站价格监控
最近突发奇想想用多种代码来爬取数据做价格监控。常见的比如Python、JavaScript(Node.js)、或者Go?不过通常来说,Python应该是首选,因为它的库比较丰富,比如requests和BeautifulSoup,或者Scrapy。不过客户要求多种代码…...
如何修改 JAR 包中的源码
如何修改 JAR 包中的源码 前言一、准备工作二、将 JAR 当作 ZIP 打开并提取三、重写 Java 类方法 A:直接替换已编译的 .class方法 B:运行时类路径优先加载 四、修改 MyBatis(或其他)XML 资源五、重新打包 JAR(命令行&a…...

16.Three.js 中的 RectAreaLight 全面详解 + Vue 3 实战案例
😎 本文将带你从零了解 THREE.RectAreaLight 的工作原理、使用方式、注意事项,并在最后用 Vue 3 的 Composition API 封装一个完整的光源演示组件,一站式搞懂矩形区域光的魅力 💡! 🖼️ 一、展示图效果示意…...

excel 批量导出图片并指定命名
一、开发环境 打开excel文件中的宏编辑器和JS代码调试 工具-》开发工具-》WPS宏编辑器 左边是工程区,当打开多个excel时会有多个,要注意不要把代码写到其他工作簿去了 右边是代码区 二、编写代码 宏是js语言,因此变量或者方法可以网上搜…...
PyTorch_创建01张量
torch.ones 和 torch.ones_like 创建全1张量torch.zeros 和 torch.zeros_like 创建全0张量torch.full 和 torch.full_like 创建全为指定值张量 上面的函数里有 like 表示根据另外一个张量的形状创建全0或者全1的或者全为指定值的张量。 代码 import torch …...
神经网络之互动练习详解:从基础到拟合非线性数据
神经网络之互动练习详解:从基础到拟合非线性数据 在机器学习的世界里,神经网络是一种强大而神奇的工具,它可以帮助我们解决各种复杂的问题。今天,我们就通过一个有趣的互动练习,来深入了解神经网络的工作原理以及如何…...

Mem0.ai研究团队开发的全新记忆架构系统“Mem0”正式发布
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
海外社交软件技术深潜:实时互动系统与边缘计算的极限优化
一、毫秒级延迟之战:下一代实时通信架构 1.1 全球实时消息投递体系设计 图表 代码 性能基准测试(跨大西洋传输): 协议/算法组合 平均延迟 99分位延迟 丢包恢复率 WebSocketTLSBBRv2 142ms 298ms 78% QUIC自定义CC 112ms 201ms 92%…...

通过DeepSeek大语言模型控制panda机械臂,听懂人话,拟人性回答。智能机械臂助手又进一步啦
文章目录 前言环境配置运行测试报错 前言 通过使用智能化的工作流控制系统来精确操控机械臂,不仅能够基于预设算法可靠地规划每个动作步骤的执行顺序和力度,确保作业流程的标准化和可重复性,还能通过模块化的程序设计思路灵活地在原有工作流中…...

如何添加或删除极狐GitLab 项目成员?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 项目成员 (BASIC ALL) 成员是有权访问您的项目的用户和群组。 每个成员都有一个角色,这决定了他们在项目中可以…...

计算机网络-LDP标签发布与管理
前面学习了LDP建立邻居,建立会话,今天来学习在MPLS中的标签发布与管理。 在MPLS网络中,下游LSR决定标签和FEC的绑定关系,并将这种绑定关系发布给上游LSR。LDP通过发送标签请求和标签映射消息,在LDP对等体之间通告FEC和…...

云境天合水陆安全漏电监测仪—迅速确定是否存在漏电现象
云境天合水陆安全漏电监测仪是一种专为水下及潮湿环境设计的电气安全检测设备,通过高灵敏度电磁传感器探测漏电电流产生的交变磁场,基于法拉第电磁感应定律,自动区分高灵敏度信号和低灵敏度信号,精准定位泄漏电源的具体位置。一旦…...

软考 系统架构设计师系列知识点之杂项集萃(54)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(53) 第87题 某银行系统采用Factory Method方法描述其不同账户之间的关系,设计出的类图如下所示。其中与Factory Method的“Creator”角色对应的类是(ÿ…...

Nginx +Nginx-http-flv-module 推流拉流
这两天为了利用云服务器实现 Nginx 进行OBS Rtmp推流,Flv拉流时发生了诸多情况,记录实现过程。 环境 OS:阿里云CentOS 7.9 64位Nginx:nginx-1.28.0Nginx-http-flv-module:nginx-http-flv-module-1.2.12 安装Nginx编…...

KeyPresser 一款自动化按键工具
1. 简介 KeyPresser 是一款自动化按键工具,它可以与窗口交互,并支持后台运行, 无需保持被控窗口在前台运行。用户可以选择要操作的目标窗口,并通过勾选复选框来控制要发送哪些按键消息。可以从组合框中选择所需的按键,并在编辑框中输入时间间隔以控制按键发送之间的延迟。程…...

DVWA靶场保姆级通关教程--03CSRF跨站请求伪造
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 一、low级别的源码分析 二、medium级别源码分析 安全性分析 增加了一层 Referer 验证: 关键点是:在真实的网络环境中&a…...
从 Python 基础到 Django 实战 —— 数据类型驱动的 Web 开发之旅
主题简介: 本主题以 Python 基础数据类型为核心,结合 Django 框架的开发流程,系统讲解如何通过掌握数字、字符串、列表、元组、字典等基础类型,快速构建功能完善的 Web 应用。通过理论与实践结合,帮助学员从零基础 Py…...

架构思维:构建高并发读服务_基于流量回放实现读服务的自动化测试回归方案
文章目录 引言一、升级读服务架构,为什么需要自动化测试?二、自动化回归测试系统:整体架构概览三、日志收集1. 拦截方式2. 存储与优化策略3. 架构进化 四、数据回放技术实现关键能力 五、差异对比对比方式灵活配置 六、三种回放模式详解1. 离…...

Qt实现车载多媒体项目,包含天气、音乐、视频、地图、五子棋功能模块,免费下载源文件!
本文主要介绍项目,项目的结构,项目如何配置,项目如何打包。这篇文章如果对你有帮助请点赞和收藏,谢谢!源代码仅供学习使用,如果转载文章请标明出处!(免费下载源代码)&…...
Ubuntu 安装 Nginx
Nginx 是一个高性能的 Web 服务器和反向代理服务器,同时也可以用作负载均衡器和 HTTP 缓存。 Nginx 的主要用途 用途说明Web服务器提供网页服务,处理用户的 HTTP 请求,返回 HTML、CSS、JS、图片等静态资源。反向代理服务器将用户请求转发到…...
Android数据库全栈开发实战:Room+SQLCipher+Hilt企业级应用构建
简介 在移动应用开发中,数据库作为数据存储的核心组件,其安全性和性能对企业级应用至关重要。本文将从零开始,全面讲解Android数据库开发的最新技术,包括Room框架的深度使用、SQLCipher加密数据库的实现、Hilt依赖注入的集成以及前后端数据同步的完整方案。通过一个加密任…...

【PostgreSQL】超简单的主从节点部署
1. 启动数据库 启动主节点 docker run --name postgres-master -e POSTGRES_PASSWORDmysecretpassword -p 5432:5432 -d postgres启动从节点 docker run --name postgres-slave -e POSTGRES_PASSWORDmysecretpassword -p 5432:5432 -d postgres需要配置挂载的存储卷 2. 数据…...

zotero pdf中英翻译插件使用
最近发现一个pdf中英翻译的神器zotero-pdf2zh,按照官方安装教程走一遍的时候,发现一些流程不清楚的问题, 此文就是整理一些安装需要的文件以及遇到的问题: 相关文件下载地址 Zotero 是一款免费的、开源的文献管理工具࿰…...