[MySym] - 自定义 Sym 论坛编辑器中 emoji 列表提示

本贴最后更新于 2827 天前,其中的信息可能已经时过境迁

通过问 D 大,得知 ctrl+/的代码在 common.js 里,搜索 emoji 关键字找到 emojiString,此处存放了所有 emoji 名称的字符串(老长了 D 大怎么做到的……)
于是在此处添加 ajax 方法,以从后台获取该用户相关的 emoji 列表:

$.ajax({
   async: false,
   url: Label.servePath + "/users/emotions",
   type: "GET",
   success: function (result) {
       console.log('ajax:'+result.emotions);
       emojString=result.emotions;
   }
});

其实我不太清楚 async 的含义,也懒得管,能用就行 0.0~
这里其实用了一个 CodeMirror 的插件(似乎是做代码自动补全的,D 大将它用到了表情符号上👍)
鉴于这块代码内也有其他 ajax 并且调用了 UserProcessor(类似于 Controller),我也将 emotion 获取的 controller 写在了这里(因为是获取该用户的 emoji,所以也不算打乱,应该是吧)

@RequestProcessing(value = "/users/emotions", method = HTTPRequestMethod.GET)
public void getEmotions(final HTTPRequestContext context, final HttpServletRequestrequest,final HttpServletResponse response) throws Exception {
    String emotions;
    context.renderJSON();//context包含request和resposne对象,不知道是否一致
    final JSONObject currentUser = (JSONObject) request.getAttribute(User.USER); //获到的包含用户信息的JSON对象
    final String userId = currentUser.optString(Keys.OBJECT_ID); //取得用户ID1470108766562
    emotions=emotionQueryService.getEmotions(userId);//保存
    context.renderJSONValue("emotions",emotions);
}

这段代码是拷贝的其他方法里的再做修改,注释是我通过调试读取到的值,以明白这段代码是用来做什么的(这段时间工作的新技能,不必探查源码考究代码的功能,通过调试知道其能获取什么值就直接拿来用好了)
可以看到,这里建立了 emotionQueryService,需要如下引入:

@Inject
private EmotionQueryService emotionQueryService;

虽然这个 ajax 是 void 类型的,不过可以通过 context.renderJSONValue 方法将值带回去(这个是向 D 讨教类似功能的代码得出的结论)
于是,进入 getEmotions 方法。
在论坛上问过 D 大 Service,Repository,Cache,以及 Model 类的关系(查看帖子
如 D 所言,Repository 就是执行数据库查询操作的 DAO,不过我得说,Service 也有 Query 代码,这属于分层不够明确:P
Service 是服务类,按我的理解就是调用 Repository 以完成 Processing 需要的动作,Cache,D 大的解释是放入内存,有些操作就是先对内存数据进行操作,完后再写回数据库的,如此大概会提高速度(积分就是如此,以至于直接通过该数据库库字段的话,积分不会变化,需要重启服务才能生效)
于是,我照着原有规则,写了一个 EmotionQueryService 和 EmotionMgmtService,目前只用到了前者:
完整代码由于包含完整 emoji 列表比较长,就不贴了,关键代码如下:

try {
  String emojis=emotionRepository.getUserEmotions(userId);
  if(emojis!=null&&emojis.length()!=0)
        return emojis;
} catch (final RepositoryException e) {
LOGGER.log(Level.ERROR, e.getMessage());
  return allEmojis;
}

这块没什么可说的了,关键在于 Repository 里面:

@Repository
public class EmotionRepository extends AbstractRepository {
    public EmotionRepository() {
        super("emotions");//此处据我推测应该与repository.json里的name有关
    }
    public String getUserEmotions(final String userId) throws RepositoryException {
        final PropertyFilter pf=new PropertyFilter(Emotion.EmotionUser, FilterOperator.EQUAL, userId);//定义查询条件
        final Query query = new Query().setFilter(pf);//添加查询条件
        final JSONObject result = get(query);//执行查询
        final JSONArray array = result.optJSONArray(Keys.RESULTS);
        if (0 == array.length()) {
            return null;
        }
        String resultString="";
        try {
            
            for(int i=0;i<array.length();i++){
                resultString+=array.optJSONObject(i).get("emotionName").toString();
                if(i!=array.length()-1)
                    resultString+=",";
            }
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return resultString;
    }
}

Query 或者 Filter 的具体逻辑无需关心,直接可用(一般情况下应该很容易吧,再复杂我还没有考虑过,我这里只需要通过 userid 获取到所有结果就行)
这个项目 json 处处可见,此处亦然,只定义 Repository 还不行,还需要在 repository.json 里添加数据表的对应:

{
    "name": "emotions",
    "keys": [
        {
            "name": "oId",
            "type": "String",
            "length": 19
        },
        {
            "name": "user_oId",
            "type": "String",
            "length": 19
        },
        {
            "name": "emotionName",
            "type": "String",
            "length": 25
        },
        {
            "name": "emotionSort",
            "type": "int"
        },
        {
            "name": "emotionType",
            "type": "int"
        }
    ]
}

第一个 name 疑似 repository 的 super 里传入的参数,其他的则对应数据表的列名了。
如此,emoji 快捷键调出来的 emoji 列表就掌握在自己手中了,还有相应的管理等功能,尚未完成,装逼要趁早,所以先写了个这个流水账。实际开发的流程其实是逆推过来的,先模拟了 service,repository 等再反过来向上写。

  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    523 引用 • 4581 回帖 • 694 关注

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
ZephyrJung
一切有为法,如梦幻泡影,如露亦如电,应作如是观 北京

推荐标签 标签

  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 635 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 521 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    22 引用 • 31 回帖 • 3 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 13 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    3 引用 • 82 回帖 • 2 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    122 引用 • 73 回帖
  • CodeMirror
    1 引用 • 2 回帖 • 123 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    276 引用 • 685 回帖 • 1 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 544 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    76 引用 • 37 回帖 • 1 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 154 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 688 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 250 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    228 引用 • 1450 回帖 • 2 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    85 引用 • 1201 回帖 • 448 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 596 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 95 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    148 引用 • 257 回帖
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    492 引用 • 1383 回帖 • 367 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    6587 引用 • 29565 回帖 • 250 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 689 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 45 关注
  • 自由行
    2 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖 • 2 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 12 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    941 引用 • 1458 回帖 • 152 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    138 引用 • 268 回帖 • 192 关注