通过问 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 等再反过来向上写。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于