Giter VIP home page Giter VIP logo

jamebal / jmal-cloud-view Goto Github PK

View Code? Open in Web Editor NEW
525.0 7.0 117.0 21.66 MB

JmalCloud 是一款私有云存储网盘项目,能够简单安全管理您的云端文件

Home Page: https://jmal.cc/demo

License: MIT License

JavaScript 17.02% HTML 0.27% Vue 74.30% CSS 0.58% SCSS 7.78% Dockerfile 0.03% Shell 0.02%
vue javascript cloud netdisk webdav nginx mongodb self-hosted aliyun-oss oss tencent-cos

jmal-cloud-view's Issues

分享添加分享码和有效期限制

共享可以添加密码验证和有效期限制,也可以添加访问次数限制,
添加一个二维码功能,生成共享链接的时候自动生成链接二维码

后台添加用户逻辑判断

大佬,发现有两个小问题,想跟佬探讨一下,在添加用户的方法里,如果用户被删除了,似乎不能重新add回来;在更新用户的方法里,如果被删除了是否还能更新,这里会不会缺少判断用户是否被删除的逻辑

启动项目后登录报错

2022-09-01 11:26:50 |ERROR |http-nio-8088-exec-1 |CommonExceptionHandler.java:28 |com.jmal.clouddisk.exception.CommonExceptionHandler |null
java.lang.NullPointerException: null
at java.util.Objects.requireNonNull(Objects.java:203)
at com.github.benmanes.caffeine.cache.UnboundedLocalCache.put(UnboundedLocalCache.java:371)
at com.github.benmanes.caffeine.cache.UnboundedLocalCache.put(UnboundedLocalCache.java:366)

大佬您好,请问下docker镜像有更新到最新吗?

大佬您好,看你github的提交记录里面,您已修复用户最大配额只有100G的限制,但是更新您最新的容器镜像后发现还是存在配置只能最大设置到100GB,不知道是我配置文件未更新还是您还未更新阿里云上的镜像;如果您还未更新镜像请帮忙更新一下,谢谢;如果是需要调整本地配置文件,还请不吝指教;还有一个不情之请,不知是否方便将您的镜像在docker hub上也提交一份,[握手]。

請問如何新增語系?

你好,我找了很久網盤相關的程式,終於找到jmal 幾乎可以完全符合我的要求
我現在想要製作多國語系的翻譯,但是不曉得怎麼著手
請問可以提供一點提示嗎?

cmd窗口下运行clouddisk-2.6.3-exec.jar报错

环境: jdk-17.0.7

cmd窗口下执行 java --enable-preview D:\Temp\clouddisk-2.6.3-exec.jar
启动失败,报错如下:
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'webdavConfig' defined in URL [jar:file:/D:/Temp/clouddisk-2.6.3-exec.jar!/BOOT-INF/classes!/com/jmal/clouddisk/webdav/WebdavConfig.class]: Unsatisfied dependency expressed through constructor parameter 1: Error creating bean with name 'myRealm' defined in URL [jar:file:/D:/Temp/clouddisk-2.6.3-exec.jar!/BOOT-INF/classes!/com/jmal/clouddisk/webdav/MyRealm.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'userServiceImpl': Unsatisfied dependency expressed through field 'fileService': Error creating bean with name 'fileServiceImpl' defined in URL [jar:file:/D:/Temp/clouddisk-2.6.3-exec.jar!/BOOT-INF/classes!/com/jmal/clouddisk/service/impl/FileServiceImpl.class]: null
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:245)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1352)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1189)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:560)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:417)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1332)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1162)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:560)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:663)
at org.springframework.boot.web.server.WebServerFactoryCustomizerBeanPostProcessor.getWebServerFactoryCustomizerBeans(WebServerFactoryCustomizerBeanPostProcessor.java:87)
at org.springframework.boot.web.server.WebServerFactoryCustomizerBeanPostProcessor.getCustomizers(WebServerFactoryCustomizerBeanPostProcessor.java:78)
at org.springframework.boot.web.server.WebServerFactoryCustomizerBeanPostProcessor.postProcessBeforeInitialization(WebServerFactoryCustomizerBeanPostProcessor.java:70)
at org.springframework.boot.web.server.WebServerFactoryCustomizerBeanPostProcessor.postProcessBeforeInitialization(WebServerFactoryCustomizerBeanPostProcessor.java:58)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:419)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1762)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:598)
... 22 common frames omitted
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'myRealm' defined in URL [jar:file:/D:/Temp/clouddisk-2.6.3-exec.jar!/BOOT-INF/classes!/com/jmal/clouddisk/webdav/MyRealm.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'userServiceImpl': Unsatisfied dependency expressed through field 'fileService': Error creating bean with name 'fileServiceImpl' defined in URL [jar:file:/D:/Temp/clouddisk-2.6.3-exec.jar!/BOOT-INF/classes!/com/jmal/clouddisk/service/impl/FileServiceImpl.class]: null
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:245)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1352)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1189)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:560)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1417)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1337)
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887)
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791)
... 48 common frames omitted
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userServiceImpl': Unsatisfied dependency expressed through field 'fileService': Error creating bean with name 'fileServiceImpl' defined in URL [jar:file:/D:/Temp/clouddisk-2.6.3-exec.jar!/BOOT-INF/classes!/com/jmal/clouddisk/service/impl/FileServiceImpl.class]: null
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:713)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:693)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:133)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:482)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1416)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:597)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1417)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1337)
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887)
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791)
... 62 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'fileServiceImpl' defined in URL [jar:file:/D:/Temp/clouddisk-2.6.3-exec.jar!/BOOT-INF/classes!/com/jmal/clouddisk/service/impl/FileServiceImpl.class]: null
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1314)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1199)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:560)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1417)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1337)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:710)
... 77 common frames omitted
Caused by: java.lang.ExceptionInInitializerError: null
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:198)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:87)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1308)
... 88 common frames omitted
Caused by: java.lang.SecurityException: JCE cannot authenticate the provider BC
at java.base/javax.crypto.JceSecurity.getInstance(JceSecurity.java:144)
at java.base/javax.crypto.KeyGenerator.getInstance(KeyGenerator.java:325)
at cn.hutool.crypto.KeyUtil.getKeyGenerator(KeyUtil.java:613)
at cn.hutool.crypto.KeyUtil.generateKey(KeyUtil.java:137)
at cn.hutool.crypto.KeyUtil.generateKey(KeyUtil.java:121)
at cn.hutool.crypto.KeyUtil.generateKey(KeyUtil.java:108)
at cn.hutool.crypto.KeyUtil.generateKey(KeyUtil.java:171)
at cn.hutool.crypto.symmetric.SymmetricCrypto.(SymmetricCrypto.java:104)
at cn.hutool.crypto.symmetric.SymmetricCrypto.(SymmetricCrypto.java:73)
at cn.hutool.crypto.symmetric.SM4.(SM4.java:36)
at com.jmal.clouddisk.service.impl.FileServiceImpl.(FileServiceImpl.java:105)
... 96 common frames omitted
Caused by: java.lang.IllegalStateException: zip file closed
at java.base/java.util.zip.ZipFile.ensureOpen(ZipFile.java:831)
at java.base/java.util.zip.ZipFile.getManifestName(ZipFile.java:1057)
at java.base/java.util.zip.ZipFile$1.getManifestName(ZipFile.java:1100)
at java.base/javax.crypto.JarVerifier.verifySingleJar(JarVerifier.java:461)
at java.base/javax.crypto.JarVerifier.verifyJars(JarVerifier.java:317)
at java.base/javax.crypto.JarVerifier.verify(JarVerifier.java:260)
at java.base/javax.crypto.ProviderVerifier.verify(ProviderVerifier.java:130)
at java.base/javax.crypto.JceSecurity.verifyProvider(JceSecurity.java:190)
at java.base/javax.crypto.JceSecurity.getVerificationResult(JceSecurity.java:218)
at java.base/javax.crypto.JceSecurity.getInstance(JceSecurity.java:140)
... 106 common frames omitted

No suitable ImageReader found for /jmalcloud/files/seafile/xxx.dwg

在同步时报错
|WARN |pool-2-thread-3 |FileServiceImpl.java:948 |com.jmal.clouddisk.service.impl.FileServiceImpl |No suitable ImageReader found for /jmalcloud/files/seafile/xxx.dwg./jmalcloud/files/seafile/xxx.dwg
net.coobird.thumbnailator.tasks.UnsupportedFormatException: No suitable ImageReader found for /jmalcloud/files/seafile/xxx.dwg.
at net.coobird.thumbnailator.tasks.io.FileImageSource.read(Unknown Source)
at net.coobird.thumbnailator.tasks.SourceSinkThumbnailTask.read(Unknown Source)
at net.coobird.thumbnailator.Thumbnailator.createThumbnail(Unknown Source)
at net.coobird.thumbnailator.Thumbnails$Builder.toOutputStream(Unknown Source)
at com.jmal.clouddisk.service.impl.FileServiceImpl.generateThumbnail(FileServiceImpl.java:942)
at com.jmal.clouddisk.service.impl.FileServiceImpl.createFile(FileServiceImpl.java:870)
at com.jmal.clouddisk.service.impl.FileServiceImpl.createFile(FileServiceImpl.java:894)
at com.jmal.clouddisk.service.impl.SettingService$SyncFileVisitor.visitFile(SettingService.java:141)
at com.jmal.clouddisk.service.impl.SettingService$SyncFileVisitor.visitFile(SettingService.java:114)
at java.nio.file.Files.walkFileTree(Files.java:2670)
at java.nio.file.Files.walkFileTree(Files.java:2742)
at com.jmal.clouddisk.service.impl.SettingService.lambda$sync$0(SettingService.java:91)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:750)

安装失败

./jc.sh install
[+] Running 0/0
⠋ drawio-webapp Pulling 0.1s
⠋ jmalcloud Pulling 0.1s
⠋ mongo Pulling 0.1s
⠋ nginx Pulling 0.1s
⠋ office Pulling 0.1s
error getting credentials - err: exit status 1, out: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.secrets was not provided by any .service files

https://blog.csdn.net/RABCDXB/article/details/124829168

方便联系吗

这个有办法做成公网的吗,目前只能在自己电脑上运行呢

文件数超过一定数量就无法点击选中,列表模式下选择会乱掉

大概跟踪了下,是fileListScrollTop这个变量计算的问题,但没看太懂是来做什么用的,mousedown里有个逻辑是判断fileListScrollTop是否>0直接return掉了,但其实如果滚动一定距离,这个值就是大于0,而重置的地方就只有数据加载完毕的回调,但此时其实并未发生数据加载,索性我直接就注释了这段检查,看起来也没什么问题

webdav 目前無法使用嗎?

我用底下的指令測試 webdav 但是會發生錯誤

chchang@hqdc039:~/git/jmal-cloud-zh_TW$ cadaver http://192.168.11.34:7171/api/webDAV/changch
Authentication required for userRealm on server `192.168.11.34':
Username: changch
Password: 
Could not access /api/webDAV/changch/ (not WebDAV-enabled?):
Did not find a collection resource.
Connection to `192.168.11.34' closed.
dav:!> 

在基本設置中沒有找到有跟webdav 相關的選項,請問目前 webdav 是否可以正常使用?
又或者是我該檢查什麼地方的設定?

请问能否应用在ARM64或者ARM32的设备上呢?

比如玩客云或者N1的armbian或者openwrt上(可跑docker),如果不行,请问以后有进一步适配这些低端设备的计划吗?
目前尝试在X86的群晖上跑,感觉运用起来比coludreve好太多了,而且直接映射文件夹出来就好了。不过主力当然用群晖啦。
这个项目的权限管理真的好,测试网址中打算用admin来修改上传权限,都提示不可行。作为使用者非常看好,要真能用在这些低端低功耗设备上,绝对可以取代filebrowser(包括灯大修改的),所以作者加油!!
BTW,如果可以通过RCLONE,打通onedrive,就更犀利了。

共享问题

发现这个可以自己登录账号自己使用但是把文件共享给不登录的游客下载就会无法下载只能看到共享文件是BUG么

新增角色bug

有两个bug如下:
1、在新加了用户之后,发现用户登录会出现404
Uploading 微信图片_20221103200645.png…

image
2、并且用户被删除后再次创建会出现用户已存在的bug
image

本地执行dev脚本失败

错误信息如下

PS E:\IdeaProjects\jmal-cloud-view> npm run dev

> [email protected] dev E:\IdeaProjects\jmal-cloud-view
> vue-cli-service serve

 INFO  Starting development server...
 10% building 2/2 modules 0 activei 「wds」: Project is running at http://localhost:9528/
i 「wds」: webpack output is served from /
i 「wds」: Content not from webpack is served from E:\IdeaProjects\jmal-cloud-view\public
i 「wds」: 404s will fallback to /index.html
 98% after emitting CopyPlugin

 ERROR  Failed to compile with 1 error                                                                                                                                                                                                                                                                      下午12:50:12

 error  in ./src/App.vue

Syntax Error: TypeError: Cannot read property 'parseComponent' of undefined


 @ ./src/main.js 25:34-50
 @ multi (webpack)-dev-server/client?http://192.168.56.1:9528/sockjs-node (webpack)/hot/dev-server.js ./src/main.js

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.