Giter Club home page Giter Club logo

play-community's People

Contributors

coolscalar avatar joymufeng avatar jxnu-liguobin avatar oldpanda avatar perkinszhu avatar readmagic 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

play-community's Issues

文章支持显示当前的所属分类,增加下一篇上一篇显示

大致如下:
文章支持显示当前的所属分类,增加下一篇上一篇显示,允许匿名评论,减小评论的时间成本,提供评论时可选留下邮箱等联系方式。点击发表说说无效。可考虑将手动选择页面调整为下拉自动分页并支持指出跳转至*页,增加答题浏览学习积分,并有头衔(滑稽),支持阶梯评论(滑稽)

play.api.UnexpectedException: Unexpected exception[CreationException: Unable to create injector

你好,我在按照说明配置后出现如下情况,能有人帮我解决下吗? 个人企鹅:2567782485.

play.api.UnexpectedException: Unexpected exception[CreationException: Unable to create injector, see the following errors:

  1. Error injecting constructor, java.util.concurrent.TimeoutException: Futures timed out after [60 seconds]
    at services.InitializeService.(InitializeService.scala:36)
    at Module.configure(Module.scala:9) (via modules: com.google.inject.util.Modules$OverrideModule -> Module)
    while locating services.InitializeService

1 error]
at play.core.server.DevServerStart$$anon$1.reload(DevServerStart.scala:186)
at play.core.server.DevServerStart$$anon$1.get(DevServerStart.scala:124)
at play.core.server.netty.PlayRequestHandler.modelConversion(PlayRequestHandler.scala:70)
at play.core.server.netty.PlayRequestHandler.handle(PlayRequestHandler.scala:81)
at play.core.server.netty.PlayRequestHandler.channelRead(PlayRequestHandler.scala:184)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
at com.typesafe.netty.http.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:129)
at com.typesafe.netty.http.HttpStreamsServerHandler.channelRead(HttpStreamsServerHandler.java:96)
Caused by: com.google.inject.CreationException: Unable to create injector, see the following errors:

  1. Error injecting constructor, java.util.concurrent.TimeoutException: Futures timed out after [60 seconds]
    at services.InitializeService.(InitializeService.scala:36)
    at Module.configure(Module.scala:9) (via modules: com.google.inject.util.Modules$OverrideModule -> Module)
    while locating services.InitializeService

1 error
at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:470)
at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:184)
at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110)
at com.google.inject.Guice.createInjector(Guice.java:99)
at com.google.inject.Guice.createInjector(Guice.java:84)
at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:185)
at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:137)
at play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21)
at play.core.server.DevServerStart$$anon$1.$anonfun$reload$3(DevServerStart.scala:174)
at play.utils.Threads$.withContextClassLoader(Threads.scala:21)
Caused by: java.util.concurrent.TimeoutException: Futures timed out after [60 seconds]
at scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:255)
at scala.concurrent.impl.Promise$DefaultPromise.result(Promise.scala:259)
at scala.concurrent.Await$.$anonfun$result$1(package.scala:215)
at scala.concurrent.BlockContext$DefaultBlockContext$.blockOn(BlockContext.scala:53)
at scala.concurrent.Await$.result(package.scala:142)
at services.InitializeService.(InitializeService.scala:84)
at services.InitializeService$$FastClassByGuice$$eb0b4755.newInstance()
at com.google.inject.internal.DefaultConstructionProxyFactory$FastClassProxy.newInstance(DefaultConstructionProxyFactory.java:89)
at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:111)
at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:90)

文章支持分享到第三方平台

社区中的文章支持一下分享到其他第三方平台,例如微信、微博等社交平台。
可考虑在文章下面添加分享按钮,点击之后选择分享的平台。

替换代码中的绝对路径为相对路径

目前源码中某些链接的 url 包含着 playscala.cn 的地址,这样如果在本地运行,且没有修改的话,就会直接跳转到该网站,比如说这一行 https://github.com/playcommunity/play-community/blob/master/app/views/main.scala.html#L64 ,用户点击登录或者注册就会跳到在线论坛,而不是本地,所以开这个 issue 建议能做些修改。

我注意到 playscala.cn 网站并没有全站 https ,所以似乎需要 https://secure.playscala.cn/ 这样一个地址来处理用户敏感信息,如密码。所以我觉得可以考虑全站 https ,然后把这些路径改成相对的。这样对新用户来说,不需要触及太多的代码,就可以在自己的机器上运行起整个网站。

【开发任务】将quill富文本编辑器升级至最新版本

预计开发时间

1-2小时

任务描述

目前编辑帖子和回复帖子用的是 quill 编辑器,当前使用的版本在输入中文时第一个字母会被quill拦截,导致第一个字符是英文状态,如下图:
quill

任务内容

尝试将 quill 编辑器升级至最新版本,看是否能解决该问题?

【开发任务】使用领域层重构TweetController类实现

预计开发时间:30-60分钟。

实现时可以参考已经完成重构的ResourceController。实现时请遵守以下几个原则:

  • TweetController的实现代码中不再依赖mongo对象读写数据库
  • 所有的数据库读写代码,按优先级重构至以下三个位置:
    • 优先重构为领域实体的业务方法,如models.User.collectResource(resource: Resource)
    • 其次考虑重构为repository/mongo/MongoXxxRepository的方法
    • 最后考虑在app/services实现一个领域服务类

支持关注他人

个人页面展示我关注的人,和关注我的人。订阅关注人的活跃通知

【开发任务】调整选择分类弹窗的布局,使其更加美观

在新增或编辑帖子时,可以通过弹窗选择分类,分类树展示基于jstree实现,弹窗内的布局使用Layui实现。目前功能均已实现,但是弹窗界面稍显简陋,需要进行一番美化。
查看弹窗方式为:进入首页,然后单击右上角我要分享按钮,然后单击选择分类,弹窗界面如下:
tan
弹窗对应View路基为:views.html.board.categoryTree

美化建议:

  • 更换一个漂亮的节点图标
  • 整体布局调整下
  • 分类树测试数据
    common-category.txt

【开发任务】实现密码加盐哈希存储

1. 任务目的

加强用户密码保护措施,防止密码泄露。

2. 任务内容

使用Argon2算法重构现有的MD5摘要算法。Argon2是目前公认的最安全的密码哈希算法。

3. 任务实现

3.1 为models.User新增两个属性:

@Entity("common-user")
case class User(
...
salt: Option[String],
argon2Hash: Option[String]
)
  • salt存放16字节盐值,每个用户盐值单独生成,生成方法如下:
byte[] salt = new byte[16];
SecureRandom r = new SecureRandom();
r.nextBytes(salt);
  • argon2Hash存放Argon2密码摘要。

3.2 在security包下新增PasswordEncoder接口和Argon2PasswordEncoder实现

3.3 重构登录模块

1) MD5 转 Argon2 时序图
如果用户尚未完成Argon2升级,则执行如下升级流程:
argon2

2) 重构后登陆流程
在登录逻辑中增加MD5和Argon2的判断,分别执行不同的密码校验策略:
argon2流程图

3.4 重构关联模块

以下几个模块的重构逻辑与登录模块相同:

  • 用户注册
  • 用户密码更改
  • 用户密码重置

【开发任务】使用领域层重构UserController类实现

预计开发时间:1-2小时。

实现时可以参考已经完成重构的ResourceController。实现时请遵守以下几个原则:

  • UserController的实现代码中不再依赖mongo对象读写数据库
  • 所有的数据库读写代码,按优先级重构至以下三个位置:
    • 优先重构为领域实体的业务方法,如models.User.collectResource(resource: Resource)
    • 其次考虑重构为repository/mongo/MongoXxxRepository的方法
    • 最后考虑在app/services实现一个领域服务类

【开发任务】使用领域层重构DictController类实现

预计开发时间:1-2小时。

实现时可以参考已经完成重构的ResourceController。实现时请遵守以下几个原则:

  • DictController的实现代码中不再依赖mongo对象读写数据库
  • 所有的数据库读写代码,按优先级重构至以下三个位置:
    • 优先重构为领域实体的业务方法,如models.User.collectResource(resource: Resource)
    • 其次考虑重构为repository/mongo/MongoXxxRepository的方法
    • 最后考虑在app/services实现一个领域服务类

【开发任务】使用领域层重构CorporationController类实现

预计开发时间:15-30分钟。

实现时可以参考已经完成重构的ResourceController。实现时请遵守以下几个原则:

  • CorporationController的实现代码中不再依赖mongo对象读写数据库
  • 所有的数据库读写代码,按优先级重构至以下三个位置:
    • 优先重构为领域实体的业务方法,如models.User.collectResource(resource: Resource)
    • 其次考虑重构为repository/mongo/MongoXxxRepository的方法
    • 最后考虑在app/services实现一个领域服务类

【开发任务】社区版块页面二级导航菜单实现

1. 社区版块简介

目前社区新增版块功能,页面效果如下:
board
正如贡献指南-3.3 社区版块(Board)设计所述,社区所有资源均挂在某个分类节点上,分类树的第1层为版块节点。

2. 开发任务说明

上图中蓝框中的path参数表示当前的分类路径为/scala/scala1/scala2,所在版块为/scala,红框部分为本次开发任务,即根据path参数,自动渲染分类导航菜单。渲染规则如下:

  • 导航菜单的列数与分类路径path的层数保持一致,如蓝框中是三层路径,则导航菜单应该渲染三列
  • 导航菜单的每一列分别对应分类树的每一层,鼠标移动到导航菜单上时,自动展开该层其他分类节点,单击该节点后,获取其path属性,跳转到/boards?path=path属性
  • 红导航菜单上显示的分类名称(分类名称路径)应与蓝框的path参数(分类ID路径)一致

3. 实现提示

  • 红框部分已被抽离成单独的view,路径为:views/board/nav.scala.html
  • 根据nav.scala.html的两个模板参数即可完成渲染任务
@(path: String, categoryList: List[Category])
  • 关于分类的工具方法参见:services.CategoryService,该类包含分类名称路径和分类ID路径转换的相关方法。
  • 测试分类数据(导入common-category表)
    common-category.txt

统一加解密服务

目前用户激活和密码重置使用不同的加解密组件,应该进行统一。并且为了简化用户部署,秘钥在系统第一次启动时自动生成。

消息提醒显示问题

Describe the bug
查看消息后,无论刷新还是继续查看,还是会有消息提示的计数,而点击清空是正常的

接入QQ第三方登录

QQ登录快,使用分享组件
需要先申请开发者认证,获取密钥,才能开发。

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.