需求:获取红色领带品类的所有父节点
品类级别:
男装(根节点)–>领带&口袋巾–>领带–>尖角领带–>红色领带
思路:
- 接受两个参数,第一个参数为叶子节点category_id,第二个参数为父节点初始值ids
- 根据parent_id获取父节点,把父节点id放入ids中
- 判断父节点是否存在,若不存在返回 nil
- 若父节点存在,判断节点是否为根节点,若为根节点则把数据进行反转,然后返回数据
- 若父节点不为根节点,则根据parent_id继续向上查找
在service层增加一个方法,递归获取category_ids:
+ (defn get-category-ids
+ "根据catgoryid获取父级的categoryids"
+ [categroy-id ids]
+ (let [parent-catgory (catergory-db/get-parent-id {:category_id categroy-id})
+ ids (conj ids (:category_id parent-catgory))]
+ (if (seq parent-catgory)
+ (if (= "0" (:parent_id parent-catgory))
+ ;;把数据反转,根节点在前,叶子节点在后
+ (identity (reverse ids))
+ (get-category-ids (:category_id parent-catgory )ids))
+ (identity nil))))
controller层:
;;获取品类详情
(defn craftwork-admin-routes []
["/craftwork"
{:swagger {:tags ["后台-品类接口"]}
:middleware [craftwork-error-middleware]}
["/detail/:category_id"
{:get {:summary "品类详情"
:parameters {:path {:category_id string?}}
:handler (fn [{{{:keys [category_id]}:path}:parameters
{:keys [company_id]}:current-user}]
(-> (category-service/check-category-by-id category_id company_id)
(category-service/get-category-detail)
(success)))}}]
])
(defn get-category-detail
"获取品类详情"
[params]
(let [categroy (catergory-db/find-category-by-id params)
category_id (:category_id categroy)]
(assoc categroy :update_time (utils/get-timestamp (:update_time categroy))
:create_time (utils/get-timestamp (:create_time categroy))
+ ;;调用get-categroy-ids方法,第二个参数为[]
+ :category_ids (get-category-ids category_id []))))
返回结果
{
"code": 0,
"msg": "操作成功",
"data": {
"update_time": 1568022259,
"show_order": null,
"create_user_id": null,
"remark": null,
"category_ids": [
"1001",
"1008",
"1023",
],
"image_url": null,
"company_id": "1",
"category_name": "dsfw",
"parent_id": "221640856061386752",
"create_time": 1568022259,
"delete_flag": "0",
"update_user_id": null,
"category_code": null,
"category_intro": null,
"category_id": "1432543154"
}
}
若想把叶子节点的id也放入到catgory_ids中,怎么办?
service层:
在方法中增加catgory_ids返回值:category_ids,
(defn get-category-detail
"获取品类详情"
[params]
(let [categroy (catergory-db/find-category-by-id params)
category_id (:category_id categroy)]
(assoc categroy :update_time (utils/get-timestamp (:update_time categroy))
:create_time (utils/get-timestamp (:create_time categroy))
+ ;;调用get-categroy-ids方法,第二个参数为[ category_id]
+ :category_ids (get-category-ids category_id [category_id]))))
运行结果:
- category_ids 为所有父节点id+叶子节点id
{
"code": 0,
"msg": "操作成功",
"data": {
"update_time": 1568022259,
"show_order": null,
"create_user_id": null,
"remark": null,
"category_ids": [
"1001",
"1008",
"1023",
"221640856061386752" ;;把叶子节点也返回了
],
"image_url": null,
"company_id": "1",
"category_name": "dsfw",
"parent_id": "221640856061386752",
"create_time": 1568022259,
"delete_flag": "0",
"update_user_id": null,
"category_code": null,
"category_intro": null,
"category_id": "1432543154"
}
}