背景调研
为中介带来诸多优势,能借助它打造专属小程序,方便及时更新核实租赁信息,确保信息准确无误,像房屋的大致地址、租金数额、租赁条件、房源优缺点等关键信息都能清晰呈现。还可上传房屋拍摄照片,这样用户能提前了解房屋状况,从而减少实地看房时间,中介也能借此降低人力成本,实现双赢。
功能规划
- 小区管理:后台录入小区的地图位置,地段,主要特点,户型,交通地铁,外观图片,在售在租房源等。
- 房源管理:后台录入房源的地图位置,地段,主要特点,水电气费用,户型,面积,楼层,上传室内图片等。
- 中介管理:后台录入金牌中介经纪人的信息,包括特点,联系方式等。
用户端:根据多种条件查看房源信息,地图导航位置等
数据字典
ProductModel.DB_STRUCTURE = {
_pid: 'string|true',
PRODUCT_ID: 'string|true',
PRODUCT_TITLE: 'string|true|comment=标题',
PRODUCT_STATUS: 'int|true|default=1|comment=状态 0=未启用,1=使用中',
PRODUCT_CATE_ID: 'string|true|default=0|comment=分类',
PRODUCT_CATE_NAME: 'string|false|comment=分类冗余',
PRODUCT_ORDER: 'int|true|default=9999',
PRODUCT_VOUCH: 'int|true|default=0',
PRODUCT_FORMS: 'array|true|default=[]',
PRODUCT_OBJ: 'object|true|default={}',
PRODUCT_QR: 'string|false',
PRODUCT_VIEW_CNT: 'int|true|default=0',
PRODUCT_ADD_TIME: 'int|true',
PRODUCT_EDIT_TIME: 'int|true',
PRODUCT_ADD_IP: 'string|false',
PRODUCT_EDIT_IP: 'string|false',
};
CateModel.DB_STRUCTURE = {
_pid: 'string|true',
CATE_ID: 'string|true',
CATE_TITLE: 'string|false|comment=标题',
CATE_STATUS: 'int|true|default=1|comment=状态 0/1',
CATE_CNT: 'int|true|default=0',
CATE_FORMS: 'array|true|default=[]',
CATE_OBJ: 'object|true|default={}',
CATE_ADDRESS_DETAIL: 'string|false|comment=详细地址',
CATE_ADDRESS: 'object|false|comment=详细地址坐标参数',
CATE_ORDER: 'int|true|default=9999',
CATE_VOUCH: 'int|true|default=0',
CATE_QR: 'string|false',
CATE_ADD_TIME: 'int|true',
CATE_EDIT_TIME: 'int|true',
CATE_ADD_IP: 'string|false',
CATE_EDIT_IP: 'string|false',
};
代码实现
在这里插入代码片
class CateService extends BaseProjectService {
async getAllCateOptions(status = 1) {
let cateList = await CateModel.getAll({ CATE_STATUS: status }, '*', { 'CATE_ORDER': 'asc', 'CATE_ADD_TIME': 'desc' });
let arr = [];
for (let k in cateList) {
let cateId = cateList[k]._id;
let cateNode = {
level: 1,
label: cateList[k].CATE_TITLE,
val: cateId,
order: cateList[k].CATE_ORDER,
obj: cateList[k].CATE_OBJ,
parentId: ''
}
arr.push(cateNode);
}
return arr;
}
async getCateList({
query,
search, // 搜索条件
sortType, // 搜索菜单
sortVal, // 搜索菜单
orderBy, // 排序
page,
size,
isTotal = true,
oldTotal
}) {
orderBy = orderBy || {
'CATE_ORDER': 'asc',
'CATE_ADD_TIME': 'desc'
};
let fields = '*';
let where = {};
where.and = {
_pid: this.getProjectId() //复杂的查询在此处标注PID
};
where.and.CATE_STATUS = 1; // 状态
if (query && query.line && query.line.length > 0) {
where.and['CATE_OBJ.line'] = ['in', query.line];
}
if (query && query.tag && query.tag.length > 0) {
where.and['CATE_OBJ.tag'] = ['in', query.tag];
}
if (query && query.type && query.type.length > 0) {
where.and['CATE_OBJ.type'] = ['in', query.type];
}
if (query && query.area && query.area.length > 0) {
where.and['CATE_OBJ.area'] = ['in', query.area];
}
if (query && query.cate && query.cate.length > 0) {
where.and['CATE_OBJ.cate'] = ['in', query.cate];
}
where.and['CATE_OBJ.rentmin'] = ['>=', Number(query.rentmin)];
where.and['CATE_OBJ.rentmax'] = ['<=', Number(query.rentmax)];
if (util.isDefined(search) && search) {
where.or = [
{ 'CATE_OBJ.station': ['like', search] },
{ CATE_TITLE: ['like', search] },
];
} else if (sortType && util.isDefined(sortVal)) {
// 搜索菜单
switch (sortType) {
case 'sort': {
// 排序
orderBy = this.fmtOrderBySort(sortVal, 'CATE_ADD_TIME');
break;
}
case 'trade': {
where.and['CATE_OBJ.trade'] = sortVal;
break;
}
case 'size': {
where.and['CATE_OBJ.size'] = sortVal;
break;
}
case 'type': {
where.and['CATE_OBJ.type'] = sortVal;
break;
}
case 'star': {
where.and['CATE_OBJ.star'] = sortVal;
break;
}
}
}
return await CateModel.getList(where, fields, orderBy, page, size, isTotal, oldTotal);
}
async viewCate(id) {
let fields = '*';
let where = {
_id: id,
CATE_STATUS: 1
}
let cate = await CateModel.getOne(where, fields);
if (!cate) return null;
let list = await ProductModel.getAll({ PRODUCT_CATE_ID: id, PRODUCT_STATUS: 1 });
cate.list = list;
return cate;
}
}
UI设计
管理系统