Code Monkey home page Code Monkey logo

x-springboot's Introduction

X-SpringBoot

Image text Image text Image text

更新日志 | 项目地址 | SpringCloud版本 |前台项目地址

项目说明

  • X-SpringBoot 是一个轻量级的Java快速开发平台,基于各大开源项目组合而来,用于快速构建中小型API、RESTful API项目,该项目已经有过多个真实项目的实践,稳定、简单、快速,使我们摆脱那些重复劳动。
  • 本项目已大量重构,精简了大量代码减少第三方依赖,最干净的脚手架。
  • 引入了lombok 大量简化了代码
  • 引入了MyBatis Plus 大量简化了SQL
  • 引入hutool 工具包 规范工具类
  • 引入minio 分布式文件系统
  • 引入autoFull 自动填充绑定框架,多表关联不用写sql
  • 前后端完全脱离,前端代码可单独部署
  • 自定义Spring Security 支持获取token
  • 账号密码:admin/admin

版本信息

  • 核心框架:Spring Boot 2.7.7
  • 安全框架:Spring Security 5.7.x
  • 持久层框架:MyBatis Plus 3.5.2
  • 日志管理:SLF4J 1.7、Log4j
  • 页面交互:Vue2.x

环境

  • jdk 1.8
  • mysql 5.7+
  • redis
  • nginx

项目结构

X-SpringBoot
├─doc  
│  ├─db.sql 项目SQL语句
│  ├─nginx.confi nginx 配置文件
│  ├─updateLog 更新日志
│
├─authentication 权限认证
├─common 公共模块
│  ├─annotation 自定义注解
│  ├─aspect 系统日志
│  ├─base base包
│  ├─exception 异常处理
│  ├─utils 一些工具类
│  └─xss XSS过滤
│ 
├─config 配置信息
├─interceptor token拦截器
│ 
├─modules 功能模块
│  ├─oss 文件服务模块
│  ├─sys 权限模块
│  └─gen 代码生成
│ 
├─Application 项目启动类
│  
├──resources 
│  ├─mapper SQL对应的XML文件


系统截图 Image text Image text Image text

常见问题

1、启动报错

 是因为依赖没有引入  maven --> 先clear 再reimport 重新引入

2、数据库连接不上(mysql 5.7)

1) 看看application.yml 配置文件中 spring.profiles.active: dev  
   当前配置的是dev ,就修改application-dev.yml 中的数据库连接IP用户密码
2) 如果改完了还是不行,看看你mysql版本8.0以上 须要修改pom.xml中的 mysql-connector-java 的版本

最后

  • 交流QQ群:17470566
  • 本人QQ:913624256
  • 如果喜欢,记得star fork 谢谢您的关注 x-springboot会持续维护

x-springboot's People

Contributors

dependabot[bot] avatar jlleitschuh avatar yzcheng90 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

x-springboot's Issues

报禁止跨域错误

image
image
image
image
项目能正常启动,没有改代码,但是报跨域错误,用的项目自带的nginx配置,求解答

移除shiro安全框架后模板没有同步更新

v3.0

项目部分重构,精简部分代码
springboot 版本升级到 2.1.8
移除shiro 安全框架
新增spring security 安全框架


生成Controller代码的模板没有同步更新,仍然引入了shiro相关,导致新生成的代码编译不过

运行项目成功但登录出错

在成功部署前后端并运行,进行登录输入正确的用户名密码后,后台提示报错,新手不知道怎么解决求教
以下是报错信息:并没有改动项目
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:

Error updating database. Cause: java.lang.reflect.InaccessibleObjectException: Unable to make field protected java.lang.reflect.InvocationHandler java.lang.reflect.Proxy.h accessible: module java.base does not "opens java.lang.reflect" to unnamed module @f5958c9

The error may exist in com/suke/czx/modules/sys/mapper/SysLoginLogMapper.java (best guess)

The error may involve com.suke.czx.modules.sys.mapper.SysLoginLogMapper.insert

The error occurred while executing an update

Cause: java.lang.reflect.InaccessibleObjectException: Unable to make field protected java.lang.reflect.InvocationHandler java.lang.reflect.Proxy.h accessible: module java.base does not "opens java.lang.reflect" to unnamed module @f5958c9

at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:97)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)
at jdk.proxy2/jdk.proxy2.$Proxy126.insert(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272)
at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:59)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)
at jdk.proxy3/jdk.proxy3.$Proxy129.insert(Unknown Source)
at com.baomidou.mybatisplus.extension.service.IService.save(IService.java:60)
at com.baomidou.mybatisplus.extension.service.IService$$FastClassBySpringCGLIB$$f8525d18.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)
at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:704)
at com.suke.czx.modules.sys.service.impl.SysLoginLogServiceImpl$$EnhancerBySpringCGLIB$$83085ec9.save(<generated>)
at com.suke.czx.common.event.LoginLogListener.saveSysLog(LoginLogListener.java:25)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.springframework.context.event.ApplicationListenerMethodAdapter.doInvoke(ApplicationListenerMethodAdapter.java:344)
at org.springframework.context.event.ApplicationListenerMethodAdapter.processEvent(ApplicationListenerMethodAdapter.java:229)
at org.springframework.context.event.ApplicationListenerMethodAdapter.onApplicationEvent(ApplicationListenerMethodAdapter.java:166)
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:421)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378)
at com.suke.czx.common.utils.SpringContextUtils.publishEvent(SpringContextUtils.java:29)
at com.suke.czx.authentication.handler.CustomAuthenticationFailHandler.onAuthenticationFailure(CustomAuthenticationFailHandler.java:42)
at com.suke.czx.interceptor.ValidateCodeFilter.doFilterInternal(ValidateCodeFilter.java:53)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:112)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:82)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:221)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:186)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:1583)

Caused by: org.apache.ibatis.exceptions.PersistenceException:

Error updating database. Cause: java.lang.reflect.InaccessibleObjectException: Unable to make field protected java.lang.reflect.InvocationHandler java.lang.reflect.Proxy.h accessible: module java.base does not "opens java.lang.reflect" to unnamed module @f5958c9

The error may exist in com/suke/czx/modules/sys/mapper/SysLoginLogMapper.java (best guess)

The error may involve com.suke.czx.modules.sys.mapper.SysLoginLogMapper.insert

The error occurred while executing an update

Cause: java.lang.reflect.InaccessibleObjectException: Unable to make field protected java.lang.reflect.InvocationHandler java.lang.reflect.Proxy.h accessible: module java.base does not "opens java.lang.reflect" to unnamed module @f5958c9

at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:199)
at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)
... 82 common frames omitted

Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field protected java.lang.reflect.InvocationHandler java.lang.reflect.Proxy.h accessible: module java.base does not "opens java.lang.reflect" to unnamed module @f5958c9
at java.base/java.lang.reflect.AccessibleObject.throwInaccessibleObjectException(AccessibleObject.java:391)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:367)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:315)
at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:183)
at java.base/java.lang.reflect.Field.setAccessible(Field.java:177)
at org.apache.ibatis.reflection.invoker.GetFieldInvoker.invoke(GetFieldInvoker.java:38)
at org.apache.ibatis.reflection.wrapper.BeanWrapper.getBeanProperty(BeanWrapper.java:161)
at org.apache.ibatis.reflection.wrapper.BeanWrapper.get(BeanWrapper.java:49)
at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:116)
at org.apache.ibatis.reflection.MetaObject.metaObjectForProperty(MetaObject.java:144)
at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:118)
at com.suke.zhjg.common.autofull.interceptor.SqlInterceptor.realTarget(SqlInterceptor.java:103)
at com.suke.zhjg.common.autofull.interceptor.SqlInterceptor.intercept(SqlInterceptor.java:54)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)
at jdk.proxy2/jdk.proxy2.$Proxy193.prepare(Unknown Source)
at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:90)
at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:49)
at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49)
at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)
at jdk.proxy2/jdk.proxy2.$Proxy192.update(Unknown Source)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197)
... 86 common frames omitted

一个小疑惑

可能是我Spring还没有学明白,不太理解为什么com/suke/czx/authentication/SecurityConfigurer.java 中的authenticationSuccessHandler() 等方法要手动 new 实例,而不是使用依赖注入的方式呢?谢谢!

打包部署跨域问题

打包成jar丢在服务器(端口8090)用jar运行的,x-springboot-ui 拷贝到服务器
nginx 按照demo配置的(监听8089端口),x-springboot-ui中common.js baseURL 直接写的服务器的ip加端口
跑起来提示跨域
Access to XMLHttpRequest at 'http://服务器IP:8090/token/login' from origin 'http://服务器IP:8089' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
请教一下大佬应该怎么配置呢?谢谢

request.getParameter("captcha"); doFilterInternal

rotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) {

    String url = request.getRequestURI();
    if (pathMatcher.match(Constant.TOKEN_ENTRY_POINT_URL,url)){
        String captcha = request.getParameter("captcha");
        String randomStr = request.getParameter("randomStr");
        String username=request.getParameter("username");

     }

}

大神 无法获取到值是怎么 回事,新手请多指教

文档

请问一下有详细的文档吗?

前段Module目录下HTML修改无法生效,始终有缓存,重启NGINX也没作用

前段页面例如.../sys/user.htmlL,在其中简单修改了一些描述后重启NGINX也不起作用。

在VUE中跳转页面的修改都不起作用,即使所有页面都添加了清除缓存标识也不起作用,如下:

<meta http-equiv="Expires" content="0">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-control" content="no-cache">
<meta http-equiv="Cache" content="no-cache">

在INDEX.HTML中修改时起效的,但是只要在MODULES下的页面不管如何重启,请缓存都不起作用。

请问这种情况是什么原因造成的?

token缓存bug

你好,感觉这似乎是一个Bug。
前端common.js 24行将token从localStorage取出。只要token存在则放入header中。
所以哪怕是登录接口,都将会带有token参数。
若长时间不登录,后端redis中此token将消失。
当前端调用登录接口后,AuthenticationTokenFilter的51行取不到userid.则将返回“无效token”
这时前端将刷新login页面,导致无法登录。

我的解决方案是在login.html的153行加入 localStorage.removeItem("token");
当登录错误时就删除旧token。

不知道我的提问是否正确,期待回复,谢谢。

运行localhost:8080

您好,我只是安装了mysql,然后编译运行此工程 输入localhost:8080 {"msg":"hello welcome to use x-springboot","code":0}
如果我要显示项目中的截图内容 我还需要什么操作? 多谢

关于框架中的一些小问题反馈

首先非常感谢作者原创的此框架, 让我开发更加高效,在使用中发现了框架中的一部分小问题,在此想提出来和作者交流一下, 可能有些并非bug,而是框架设计本身就是这样的,具体发现的问题如下:

1.退出登录时权限没有废除,后续无论什么角色登录都是同样的权限,这里检查了一下,可能是在SysUserTokenServiceImpl的logout()方法中退出登录只是删除了数据库中的token(同时这里有个小疑问,token存数据库的目的是什么?),而没有使用SecurityUtils.getSubject().logout();废除用户权限
2.角色菜单更新失效,这里检查了一下应该是缺少了SysRoleController的修改角色方法中缺少了sysRoleMenuService.saveOrUpdate(role.getRoleId(),role.getMenuIdList());更新权限的语句
3.生成模板中大小写mapper(应当大写,但是这里模板中是小写)问题:这个之前有在框架讨论群中咨询过,生成模板需要统一才能自定义Mapper内容,否则映射不上,还要抛异常
4.SysRoleMenuServiceImpl中保存角色菜单时,原本是直接根据角色和菜单所关联的这个ID删除,其实逻辑上应按照roleId删除,我理解这个保存函数的步骤是先删除当前角色的所有权限,再将新权限赋给当前角色。

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.