"ruoyi/vscode:/vscode.git/clone" did not exist on "5cdb4ecba56abd729f710bf468b5ab7d0f922e2d"
Unverified Commit 324c8da3 authored by linlinjava's avatar linlinjava Committed by GitHub
Browse files

Merge branch 'master' into dev

parents 693cf5cd 4c46da9b
### gradle ###
.gradle
/build/
!gradle/wrapper/gradle-wrapper.jar
### STS ###
.settings/
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
bin/
### IntelliJ IDEA ###
/.idea/
/private/
/storage/
/litemall.iml
.checkstyle
.idea
*.iws
*.iml
*.ipr
rebel.xml
### maven ###
target/
*.war
*.ear
*.zip
*.tar
*.tar.gz
### logs ####
/logs/
*.log
### temp ignore ###
*.cache
*.diff
*.patch
*.tmp
*.java~
*.properties~
*.xml~
### system ignore ###
.DS_Store
Thumbs.db
Servers
.metadata
upload
gen_code
# 更新日志
## V 1.5.0
*2019-11-15*, 持续优化轻商城模块,以及推荐项目Flutter_Mall
#### Bug 修复
* `小商城`优惠券绑定绑定优惠券ID(#157 by @beaver383)
* `小商城`评论列表不能正确显示
* `轻商城`修正取消订单接口 (#256 by @1037621594)
#### 优化
* `小商城`采用延迟队列实现支付超时取消订单功能(参考#275 by @alexzhu0592)
* `小商城`分享按钮可选配置 (#239 by @galenzhao)
#### 新特性
* `基础系统`支持阿里云短信
* `轻商城`接入微信支付H5支付 (#291 by @beaver383)
* `小商城`团购拼团超期取消 (#284 by @beaver383)
* `管理后台`订单详情新增打印 (#274 by @fanchenggang )
* README文档推荐项目Flutter_Mall
## V 1.4.0
*2019-05-16*,支持移动端轻商城
#### Bug 修复
* `小商场`购物车和订单的商品数量必须正整数
* `小商城`微信支付回调校验失败通知信息
* `小商城`收货地址采用userId和id联合查询
* `管理后台`管理员不能删除自己账号
#### 优化
* `文档`支持API文档
* `基础系统`更新第三方插件mybatis-generator-plugin到1.3.2
* `管理后台`不允许管理员通过编辑接口修改管理员密码
#### 新特性
* `小商城`帮助中心页面
* `小商城`后端登录验证方式采用JWT (#167 by @Bigger-Ma)
* `轻商场`基本结构完成 (#157 by @pkwenda)
* `管理后台`支持操作日志管理
## V 1.3.0
*2019-03-11*,支持配置管理
......
......@@ -7,30 +7,41 @@ litemall = Spring Boot后端 + Vue管理员前端 + 微信小程序用户前端
* [文档](https://linlinjava.gitbook.io/litemall)
* [贡献](https://linlinjava.gitbook.io/litemall/contribute)
* [FAQ](https://linlinjava.gitbook.io/litemall/faq)
* [API](https://linlinjava.gitbook.io/litemall/api)
## 项目实例
### 小商场实例
* renard-wx模块实例
![](./doc/pic/renard_wx_demo.png)
> 注意:此实例是真实小商场,开发者可以购买商品和付款,但请不要尝试退款操作。
* litemall-wx模块实例
![](./doc/pic/litemall_wx_demo.png)
> 注意:此实例是测试小商场,开发者请不要尝试购买商品、付款、退款操作。
### 轻商场实例
目前未部署
请手机扫描以下二维码访问:
![](./doc/pic/mobmall.png)
![](./doc/pic/5.gif)
或者浏览器采用手机模式访问以下网址: [http://122.51.199.160:8080/vue/index.html#/](http://122.51.199.160:8080/vue/index.html#/)
注意:
> 1. 由于第一次加载数据量较大,建议wifi网络访问,且耐心等待数秒。
> 2. 此实例是测试轻商场,不支持支付,而且处于开发中还不完善。
### 管理后台实例
![](./doc/pic/4.png)
1. 浏览器打开,输入以下网址: [http://118.24.0.153:8080/#/login](http://118.24.0.153:8080/#/login)
1. 浏览器打开,输入以下网址: [http://122.51.199.160:8080/#/login](http://122.51.199.160:8080/#/login)
2. 管理员用户名`admin123`,管理员密码`admin123`
> 注意:此实例只是测试管理后台,不是前两个小商城的管理后台。
......@@ -99,9 +110,8 @@ litemall = Spring Boot后端 + Vue管理员前端 + 微信小程序用户前端
```bash
cd litemall
mvn install
mvn package
cd ./litemall-all
mvn spring-boot:run
mvn clean package
java -Dfile.encoding=UTF-8 -jar litemall-all/target/litemall-all-0.1.0-exec.jar
```
4. 启动管理后台前端
......@@ -144,7 +154,7 @@ litemall = Spring Boot后端 + Vue管理员前端 + 微信小程序用户前端
## 开发计划
当前版本[v1.3.0](https://linlinjava.gitbook.io/litemall/changelog)
当前版本[v1.5.0](https://linlinjava.gitbook.io/litemall/changelog)
目前项目开发中,存在诸多不足,以下是目前规划的开发计划。
......@@ -210,9 +220,15 @@ V 3.0.0 完成以下目标:
项目参考:litemall项目的litemall-vue模块基于vant--mobile-mall项目开发。
## 推荐
1. [Flutter_Mall](https://github.com/youxinLu/mall)
项目介绍:Flutter_Mall是一款Flutter开源在线商城应用程序。
## 问题
![](doc/pic/qq.png)
![](doc/pic/qq2.png)
* 开发者有问题或者好的建议可以用Issues反馈交流,请给出详细信息
* 在开发交流群中应讨论开发、业务和合作问题
......
......@@ -2,7 +2,7 @@
### 项目打包
1.主机或者开发机打包项目到deploy;
1.服务器或者开发机打包项目到deploy;
```
cd litemall
cat ./litemall-db/sql/litemall_schema.sql > ./deploy/db/litemall.sql
......@@ -25,13 +25,13 @@
2. 修改litemall文件夹下面的*.yml外部配置文件,当litemall-all模块启动时会
加载外部配置文件,而覆盖默认jar包内部的配置文件。
例如,配置文件中一些地方需要设置成远程主机的IP地址
例如,配置文件中一些地方需要设置成远程服务器的IP地址
此时deploy部署包结构如下:
* bin
存放远程主机运行的脚本,包括deploy.sh脚本和reset.sh脚本
存放远程服务器运行的脚本,包括deploy.sh脚本和reset.sh脚本
* db
......@@ -39,15 +39,15 @@
* litemall
存放远程主机运行的代码,包括litemall-all二进制可执行包和litemall外部配置文件
存放远程服务器运行的代码,包括litemall-all二进制可执行包和litemall外部配置文件
* util
存放开发主机运行的脚本,包括package.sh脚本和lazy.sh脚本。
由于是本地开发主机运行,因此开发者可以不用上传到远程主机
存放开发服务器运行的脚本,包括package.sh脚本和lazy.sh脚本。
由于是本地开发服务器运行,因此开发者可以不用上传到远程服务器
### 项目部署
1. 远程主机环境(MySQL和JDK1.8)已经安装好,请确保云主机的安全组已经允许相应的端口。
1. 远程服务器环境(MySQL和JDK1.8)已经安装好,请确保云服务器的安全组已经允许相应的端口。
2. 导入db/litemall.sql
```bash
cd /home/ubuntu/deploy/db
......@@ -59,7 +59,7 @@
sudo ln -f -s /home/ubuntu/deploy/litemall/litemall.jar /etc/init.d/litemall
sudo service litemall start
```
4. 测试是否部署成功(xxx.xxx.xxx.xxx是云主机IP):
4. 测试是否部署成功(xxx.xxx.xxx.xxx是云服务器IP):
```
http://xxx.xxx.xxx.xxx:8080/wx/index/index
http://xxx.xxx.xxx.xxx:8080/admin/index/index
......@@ -73,26 +73,26 @@
* util/packet.sh
在开发主机运行可以自动项目打包
在开发服务器运行可以自动项目打包
* util/lazy.sh
在开发主机运行可以自动项目打包、项目上传远程主机、自动登录系统执行项目部署脚本。
在开发服务器运行可以自动项目打包、项目上传远程服务器、自动登录系统执行项目部署脚本。
注意:
> 1. 开发者需要在util/lazy.sh中设置相应的远程主机登录账号和密钥文件路径。
> 2. 开发者需要在bin/reset.sh设置远程主机的MySQL的root登录账户。
> 1. 开发者需要在util/lazy.sh中设置相应的远程服务器登录账号和密钥文件路径。
> 2. 开发者需要在bin/reset.sh设置远程服务器的MySQL的root登录账户。
* bin/deploy.sh
在远程主机运行可以自动部署服务
在远程服务器运行可以自动部署服务
* bin/reset.sh
在远程主机运行可以自动项目导入数据、删除本地上传图片、再执行bin/deploy.sh部署服务。
在远程服务器运行可以自动项目导入数据、删除本地上传图片、再执行bin/deploy.sh部署服务。
注意:
> 开发者需要在bin/reset.sh设置远程主机的MySQL的root登录账户。
> 开发者需要在bin/reset.sh设置远程服务器的MySQL的root登录账户。
总结,当开发者设置好配置信息以后,可以在本地运行lazy.sh脚本自动一键部署:
```bash
......
......@@ -14,18 +14,18 @@ PASSWORD=
if test -z "$PASSWORD"
then
echo "请设置云主机MySQL的root账号密码"
exit -1
echo "请设置云服务器MySQL的root账号密码"
exit 1
fi
# 导入数据
cd /home/ubuntu/deploy/db
cd /home/ubuntu/deploy/db || exit 2
mysql -h localhost -u $ROOT -p$PASSWORD < litemall.sql
# 删除storage文件夹内文件
cd /home/ubuntu/deploy/litemall/storage
cd /home/ubuntu/deploy/litemall/storage || exit 2
rm -f ./**
# 重新部署服务
cd /home/ubuntu/deploy/bin
cd /home/ubuntu/deploy/bin || exit 2
sudo ./deploy.sh
\ No newline at end of file
litemall:
# 开发者应该设置成自己的wx相关信息
wx:
app-id: wxa5b486c6b918ecfb
app-secret: e04004829d4c383b4db7769d88dfbca1
mch-id: 111111
mch-key: xxxxxx
notify-url: http://118.24.0.153:8080/wx/order/pay-notify
# 商户证书文件路径
# 请参考“商户证书”一节 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=4_3
key-path: xxxxx
#通知相关配置
notify:
mail:
# 邮件通知配置,邮箱一般用于接收业务通知例如收到新的订单,sendto 定义邮件接收者,通常为商城运营人员
enable: false
host: smtp.exmail.qq.com
username: ex@ex.com.cn
password: XXXXXXXXXXXXX
sendfrom: ex@ex.com.cn
sendto: ex@qq.com
# 短消息模版通知配置
# 短信息用于通知客户,例如发货短信通知,注意配置格式;template-name,template-templateId 请参考 NotifyType 枚举值
sms:
enable: false
appid: 111111111
appkey: xxxxxxxxxxxxxx
template:
- name: paySucceed
templateId: 156349
- name: captcha
templateId: 156433
- name: ship
templateId: 158002
- name: refund
templateId: 159447
# 微信模版通知配置
# 微信模版用于通知客户或者运营者,注意配置格式;template-name,template-templateId 请参考 NotifyType 枚举值
wx:
enable: false
template:
- name: paySucceed
templateId: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- name: captcha
templateId: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- name: ship
templateId: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- name: refund
templateId: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# 快鸟物流查询配置
express:
enable: false
appId: "XXXXXXXXX"
appKey: "XXXXXXXXXXXXXXXXXXXXXXXXX"
vendors:
- code: "ZTO"
name: "中通快递"
- code: "YTO"
name: "圆通速递"
- code: "YD"
name: "韵达速递"
- code: "YZPY"
name: "邮政快递包裹"
- code: "EMS"
name: "EMS"
- code: "DBL"
name: "德邦快递"
- code: "FAST"
name: "快捷快递"
- code: "ZJS"
name: "宅急送"
- code: "TNT"
name: "TNT快递"
- code: "UPS"
name: "UPS"
- code: "DHL"
name: "DHL"
- code: "FEDEX"
name: "FEDEX联邦(国内件)"
- code: "FEDEX_GJ"
name: "FEDEX联邦(国际件)"
# 对象存储配置
storage:
# 当前工作的对象存储模式,分别是local、aliyun、tencent
active: local
# 本地对象存储配置信息
local:
storagePath: storage
address: http://118.24.0.153:8080/wx/storage/fetch/
# 阿里云对象存储配置信息
aliyun:
endpoint: oss-cn-shenzhen.aliyuncs.com
accessKeyId: 111111
accessKeySecret: xxxxxx
bucketName: xxxxxx
# 腾讯对象存储配置信息
# 请参考 https://cloud.tencent.com/document/product/436/6249
tencent:
secretId: 111111
secretKey: xxxxxx
region: xxxxxx
bucketName: xxxxxx
\ No newline at end of file
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql
spring:
datasource:
druid:
url: jdbc:mysql://localhost:3306/litemall?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&allowPublicKeyRetrieval=true&verifyServerCertificate=false&useSSL=false
driver-class-name: com.mysql.jdbc.Driver
username: litemall
password: litemall123456
initial-size: 10
max-active: 50
min-idle: 10
max-wait: 60000
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
validation-query: SELECT 1 FROM DUAL
test-on-borrow: false
test-on-return: false
test-while-idle: true
time-between-eviction-runs-millis: 60000
filters: stat,wall
spring:
profiles:
active: db, core, admin, wx
active: none
message:
encoding: UTF-8
datasource:
druid:
url: jdbc:mysql://localhost:3306/litemall?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&allowPublicKeyRetrieval=true&verifyServerCertificate=false&useSSL=false
driver-class-name: com.mysql.jdbc.Driver
username: litemall
password: litemall123456
initial-size: 10
max-active: 50
min-idle: 10
max-wait: 60000
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
validation-query: SELECT 1 FROM DUAL
test-on-borrow: false
test-on-return: false
test-while-idle: true
time-between-eviction-runs-millis: 60000
filters: stat,wall
server:
port: 8080
logging:
level:
root: ERROR
org.springframework: ERROR
org.mybatis: ERROR
org.linlinjava.litemall.core: ERROR
org.linlinjava.litemall.db: ERROR
org.linlinjava.litemall.admin: ERROR
org.linlinjava.litemall.wx: ERROR
org.linlinjava.litemall: ERROR
\ No newline at end of file
config: classpath:logback-spring.xml
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql
litemall:
# 开发者应该设置成自己的wx相关信息
wx:
app-id: wxa5b486c6b918ecfb
app-secret: e04004829d4c383b4db7769d88dfbca1
mch-id: 111111
mch-key: xxxxxx
notify-url: http://122.51.199.160:8080/wx/order/pay-notify
# 商户证书文件路径
# 请参考“商户证书”一节 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=4_3
key-path: xxxxx
#通知相关配置
notify:
mail:
# 邮件通知配置,邮箱一般用于接收业务通知例如收到新的订单,sendto 定义邮件接收者,通常为商城运营人员
enable: false
host: smtp.exmail.qq.com
username: ex@ex.com.cn
password: XXXXXXXXXXXXX
sendfrom: ex@ex.com.cn
sendto: ex@qq.com
# 短消息模版通知配置
# 短信息用于通知客户,例如发货短信通知,注意配置格式;template-name,template-templateId 请参考 NotifyType 枚举值
sms:
enable: false
# 如果是腾讯云短信,则设置active的值tencent
# 如果是阿里云短信,则设置active的值aliyun
active: tencent
sign: litemall
template:
- name: paySucceed
templateId: 156349
- name: captcha
templateId: 156433
- name: ship
templateId: 158002
- name: refund
templateId: 159447
tencent:
appid: 111111111
appkey: xxxxxxxxxxxxxx
aliyun:
regionId: xxx
accessKeyId: xxx
accessKeySecret: xxx
# 微信模版通知配置
# 微信模版用于通知客户或者运营者,注意配置格式;template-name,template-templateId 请参考 NotifyType 枚举值
wx:
enable: false
template:
- name: paySucceed
templateId: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- name: captcha
templateId: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- name: ship
templateId: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- name: refund
templateId: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# 快鸟物流查询配置
express:
enable: false
appId: "XXXXXXXXX"
appKey: "XXXXXXXXXXXXXXXXXXXXXXXXX"
vendors:
- code: "ZTO"
name: "中通快递"
- code: "YTO"
name: "圆通速递"
- code: "YD"
name: "韵达速递"
- code: "YZPY"
name: "邮政快递包裹"
- code: "EMS"
name: "EMS"
- code: "DBL"
name: "德邦快递"
- code: "FAST"
name: "快捷快递"
- code: "ZJS"
name: "宅急送"
- code: "TNT"
name: "TNT快递"
- code: "UPS"
name: "UPS"
- code: "DHL"
name: "DHL"
- code: "FEDEX"
name: "FEDEX联邦(国内件)"
- code: "FEDEX_GJ"
name: "FEDEX联邦(国际件)"
# 对象存储配置
storage:
# 当前工作的对象存储模式,分别是local、aliyun、tencent
active: local
# 本地对象存储配置信息
local:
storagePath: storage
address: http://122.51.199.160:8080/wx/storage/fetch/
# 阿里云对象存储配置信息
aliyun:
endpoint: oss-cn-shenzhen.aliyuncs.com
accessKeyId: 111111
accessKeySecret: xxxxxx
bucketName: xxxxxx
# 腾讯对象存储配置信息
# 请参考 https://cloud.tencent.com/document/product/436/6249
tencent:
secretId: 111111
secretKey: xxxxxx
region: xxxxxx
bucketName: xxxxxx
# 七牛云对象存储配置信息
qiniu:
endpoint: http://pd5cb6ulu.bkt.clouddn.com
accessKey: 111111
secretKey: xxxxxx
bucketName: litemall
\ No newline at end of file
......@@ -2,11 +2,11 @@
# 本脚本的作用是
# 1. 项目打包
# 2. 上传云主机
# 3. 远程登录云主机并执行reset脚本
# 2. 上传云服务器
# 3. 远程登录云服务器并执行reset脚本
# 请设置云主机的IP地址和账户
# 例如 ubuntu@118.24.0.153
# 请设置云服务器的IP地址和账户
# 例如 ubuntu@122.51.199.160
REMOTE=
# 请设置本地SSH私钥文件id_rsa路径
# 例如 /home/litemall/id_rsa
......@@ -14,30 +14,30 @@ ID_RSA=
if test -z "$REMOTE"
then
echo "请设置云主机登录IP地址和账户"
exit -1
echo "请设置云服务器登录IP地址和账户"
exit 1
fi
if test -z "$ID_RSA"
then
echo "请设置云主机登录IP地址和账户"
exit -1
echo "请设置云服务器登录IP地址和账户"
exit 1
fi
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
cd $DIR/../..
cd $DIR/../.. || exit 2
LITEMALL_HOME=$PWD
echo "LITEMALL_HOME $LITEMALL_HOME"
# 项目打包
cd $LITEMALL_HOME
cd $LITEMALL_HOME || exit 2
./deploy/util/package.sh
# 上传云主机
cd $LITEMALL_HOME
# 上传云服务器
cd $LITEMALL_HOME || exit 2
scp -i $ID_RSA -r ./deploy $REMOTE:/home/ubuntu/
# 远程登录云主机并执行reset脚本
# 远程登录云服务器并执行reset脚本
ssh $REMOTE -i $ID_RSA << eeooff
cd /home/ubuntu
sudo ./deploy/bin/reset.sh
......
......@@ -133,6 +133,44 @@ litemall.wx.notify-url=
3. 最后,如果设置正确,用chrome的开发者工具查看登录页面向后端请求返回数据信息;
如果设置不正确,请启动相应的后端服务。
### 2.2 安装失败/启动不成功
现象:
执行`cnpm install`失败
原因:
可能下载依赖失败。
解决:
清空node_modules,重新执行`cnpm install`命令,或者自行百度、Google。
### 2.3 分页数据返回不正常
现象:
如果管理后台点击很大的分页页数(实际已超过当时数据最大页数),后端仍然能够返回数据。
原因:
这个不是BUG,而是开发者对于查询页面超过实际页面后应该产生何种效果的不同理解。
* 返回最后一页数据可能是合理的;
* 返回空数据可能也是合理的。
解决:
litemall-db模块的application-db.yaml资源文件中reasonable是true
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql
开发者可以尝试设置reasonable为false,然后检查是否能够解决问题。
## 3. 基础系统
这里主要是指litemall-db、litemall-core和litemall-all模块三个模块的相关问题。
......@@ -227,13 +265,15 @@ IDEA导入项目时,非常耗时间,或者卡断,或者一直疯狂运行
原因:
应该是litemall-admin模块的node_modules文件夹导致的。
node_modules是litemall-admin所依赖的项目库,可能有近200M的文件。
应该是litemall-admin模块和litemall-vue模块的node_modules文件夹导致的。
node_modules是litemall-admin和litemall-vue模块所依赖的项目库,可能有近200M的文件。
而IDEA如果没有设置,则可能尝试对该文件夹进行解析索引,从而导致卡断。
解决方案:
先关闭IDEA,然后删除node_modules文件夹,然后重新打开IDEA,设置node_modules文件夹Excluded状态。
1. 先关闭IDEA,然后删除litemall-admin和litemall-vue模块内的node_modules文件夹;
2. 然后分别创建空的node_modules文件夹;
3. 重新打开IDEA,分别设置litemall-admin模块和litemall-vue模块的node_modules文件夹Excluded状态。
![](./pic/excluded.png)
......
......@@ -4,6 +4,7 @@
* [更新日志](../CHANGELOG.md)
* [贡献指南](../CONTRIBUTE.md)
* [FAQ](./FAQ.md)
* [API](./api.md)
* [1. 系统架构](./project.md)
* [2. 基础系统](./platform.md)
* [3. 小商场](./wxmall.md)
......
......@@ -21,9 +21,7 @@
* `改善`管理员登录页面打开慢,优化速度
* `改善`地址优化,目前每一次点击都会请求后台,应该缓存已有的数据
* `改善`vue和vue-element-admin等及时更新
* `功能`系统日志功能
* `功能`系统数据字典功能
* `功能`系统栏目管理功能
* `功能`支持数据库备份
## 4.1 litemall-admin-api
......
This diff is collapsed.
......@@ -5,15 +5,14 @@ litemall轻商城,是商城移动版本。
技术:
* 轻商城前端,即litemall-vue模块
* power by vue-cli3
* vue-cli3
* Vue + Vue-router + Vant + Sass
* axios
* vee-validate
* fastclick
* babel-polyfill
* @xkeshi/vue-countdown
* Vant
* 轻商城端,即litemall-wx-api模块,也就是和小商城后端是一样的。
* 轻商城端,即litemall-wx-api模块,也就是和小商城后端是一样的。
* Spring Boot 2.x
* Spring MVC
* [weixin-java-tools](https://gitee.com/binary/weixin-java-tools)
......
doc/pic/1.png

121 KB | W: | H:

doc/pic/1.png

118 KB | W: | H:

doc/pic/1.png
doc/pic/1.png
doc/pic/1.png
doc/pic/1.png
  • 2-up
  • Swipe
  • Onion skin
doc/pic/2.png

72.5 KB | W: | H:

doc/pic/2.png

67.1 KB | W: | H:

doc/pic/2.png
doc/pic/2.png
doc/pic/2.png
doc/pic/2.png
  • 2-up
  • Swipe
  • Onion skin
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment