Диплом: Автоматизация процесса взаимодействия с клиентами (CRM) на примере агенства недвижимости

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
106
private $uri;
private $controller;
private $action;
private $params;
public function __construct($uri)
{
if ($uri) {
$uri = str_replace("/api", "", $uri);
$this->uri = $uri;
$this->getRoute();
}
}
private function getRoute()
{
$this->parseRoute();
$class = "\\controllers\\" . $this->controller . 'Controller';
$action = $this->action;
if (class_exists($class)) {
$controller = new $class();
if (method_exists($controller, $action)) {
$controller->$action();
} else {
echo "Метод не найден";
}
} else {
echo "Класс не найден";
}
}
private function parseRoute()
{
$uri = explode("/", $this->uri);
$this->controller = $uri[1] != null ? ucfirst($uri[1]) : "Index";
$this->action = $uri[2] != null ? ucfirst($uri[2]) : "Index";
$this->params = $uri[3];
}
}
objectRepository.php
<?php
namespace BL;
107
use classes\DBquery;
use classes\UploadFiles;
use core\BaseRepository;
class ObjectRepository extends BaseRepository
{
public static function Get()
{
$filepath = __DIR__ . "/sql/objects/getObjects.sql";
$db = new DBquery();
return $db->queryRowsFile($filepath);
}
public function GetId()
{
$request = $this->Request();
$filepath = __DIR__."/sql/objects/getObjectId.sql";
$db = new DBquery();
$params = [
"id" => $request->id
];
return $db->queryRowFile($filepath, $params);
}
public function AddObject()
{
$request = $_POST;
$addr = json_decode($request["address"], true);
$paramsAddr = [
"street" => $addr["data"]["street"],
"house" => $addr["data"]["house"],
"flat" => $addr["data"]["flat"],
"full_address" => $addr["unrestricted_value"]
];
$paramsOwner = [
"surname" => $request["surname"],
"first_name" => $request["firstName"],
"patronymic" => $request["patronymic"],
"phone" => $request["phone"],
"email" => $request["email"]
];
$addr = $this->db->insert('ro_addr', $paramsAddr);
$owner = $this->db->insert('ro_owner', $paramsOwner);
$paramsObject = [
108
"address_id" => $addr,
"square" => $request["square"],
"number_room" => $request["number_room"],
"floor" => $request["floor"],
"rental_time" => $request["rental_time"],
"photo" => UploadFiles::UploadToPath($_FILES["photo"]),
"owner_id" => $owner,
"price" => $request["price"],
"description" => $request["description"]
];
return $this->db->insert('ro_object', $paramsObject);
}
}
getObjects.sql
select
o.object_id,
o.square,
o.number_room,
o.floor,
LEFT(o.photo, INSTR(o.photo, '$#%#') - 1) AS photo,
o.photo as images,
o.description,
o.rental_time,
o.price,
concat('ул ',ra.street,' д.',ra.house,' кв.',ra.flat) as address,
ra.latitude, longitude, flex,
ro.surname, first_name, patronymic, phone, email
from
ro_object o
join ro_addr ra on o.address_id = ra.addr_id
join ro_owner ro on o.owner_id = ro.owner_id
join ro_rental_time rrt on o.rental_time = rrt.id
objects.vue
<template>
<div>
fluid
class="py-0"
>
v-model="select"
:loading="loading"
:items="search"
109
cache-items
flat
hide-no-data
hide-details
clearable
label="Введите адрес квартиры"
></v-autocomplete>
</v-flex>
<dialog-fullscreen-for-objects text-btn="Добавить обьект"></dialog-fullscreen-for-objects>
</v-layout>
</v-container>
fluid
grid-list-md
>
v-for="object in objectsComp"
:key="object.object_id"
v-bind="{ [`md${object.flex}`]: true }"
>
:src="pathImage + object.photo"
height="300px"
>
fill-height
fluid
pa-2
class="resp"
>
md-center>
<p class="headline white--text">{{object.number_room |
numberRoomString}}</p>
<p class="headline white--text" v-text="object.address"></p>
<p class="headline white--text" v-text="'Площадь '+object.square"></p>
<p class="headline white--text">Стоимость: {{ object.price }}р. {{ object.rental_time |
rentalTimePriceString }}</p>
</v-flex>
</v-layout>
</v-container>
110
</v-img>
открыть
</v-btn>
</v-card-actions>
</v-card>
</v-flex>
</v-layout>
</v-container>
</v-flex>
</v-layout>
</div>
</template>
<script>
import DialogFullscreenForObjects from "../components/DialogFullScreenForObjects";
export default {
name: "Objects",
components: {DialogFullscreenForObjects},
data() {
return {
loading: false,
items: [],
select: null,
objects: [],
pathImage: process.env.VUE_APP_ROOT_IMAGES,
/*[
{
id: 1,
number_rooms: 1,
address: "ул. Курчатова 1 д 12",
image: "https://www.nastol.com.ua/pic/201303/1920x1080/nastol.com.ua-44866.jpg",
description: "Описание квартиры.",
flex: 4
},
{
id: 2,
number_rooms: 1,
address: "ул. Курчатова 2 д 12",
image: "https://www.nastol.com.ua/pic/201303/1920x1080/nastol.com.ua-44866.jpg",
description: "Описание квартиры.",
flex: 4
},
111
{
id: 3,
number_rooms: 1,
address: "ул. Курчатова 3 д 12",
image: "https://www.nastol.com.ua/pic/201303/1920x1080/nastol.com.ua-44866.jpg",
description: "Описание квартиры.",
flex: 4
},
{
id: 4,
number_rooms: 1,
address: "ул. Курчатова 4 д 11",
image: "https://www.nastol.com.ua/pic/201303/1920x1080/nastol.com.ua-44866.jpg",
description: "Описание квартиры.",
flex: 4
},
{
id: 5,
number_rooms: 1,
address: "ул. Курчатова 5 д 12",
image: "https://www.nastol.com.ua/pic/201303/1920x1080/nastol.com.ua-44866.jpg",
description: "Описание квартиры.",
flex: 4
},
{
id: 6,
number_rooms: 1,
address: "ул. Курчатова 8 д 12",
image: "https://www.nastol.com.ua/pic/201303/1920x1080/nastol.com.ua-44866.jpg",
description: "Описание квартиры.",
flex: 4
},
{
id: 7,
number_rooms: 1,
address: "ул. Курчатова 6 д 12",
image: "https://www.nastol.com.ua/pic/201303/1920x1080/nastol.com.ua-44866.jpg",
description: "Описание квартиры.",
flex: 4
}
]*/
}
},
computed: {
search() {
return this.objects.map(obj => obj.address);
112
},
objectsComp() {
return this.select ? this.objects.filter(obj => obj.address.indexOf(this.select) !== -1) : this.objects;
}
},
methods: {
addObject() {
}
},
filters: {
numberRoomString: function (value) {
if (!value) return '';
let room = "";
value = parseInt(value);
switch (value) {
case 1:
room = "Однокомнатная";
break;
case 2:
room = "Двухкомнатная";
break;
case 3:
room = "Трехкомнатная";
break;
case 4:
room = "Четырехкомнатная";
break;
case 5:
room = "Пятикомнаятная";
break;
}
return room;
}
},
beforeMount() {
let self = this;
this.$store.dispatch('apartament')
.then(() => {
self.objects = self.$store.getters.getObjects;
})
.catch(error => {
console.log(error)
})
}
}
113
</script>
<style>
.resp {
background: rgba(27, 27, 27, .8);
}
</style>
Leads.vue
<template>
<v-container fluid>
<todo v-for="(state,index) in states"
:button-add="index === 0"
:add="add1"
:check-list="checkList"
:key="state.id"
:pkey="state.id"
:title="state.step_name"
:list="leadsToState(state.id)"></todo>
</v-layout>
<modal :dialog.sync="dialog">
</modal>
</v-container>
</template>
<script>
import todo from '../components/Todo';
import Modal from '../components/DialogAddLeads'
export default {
name: "Leads",
components: {
todo,
Modal
},
data() {
return {
dialog: false,
};
},
computed: {
leads() {
return this.$store.getters.getLeads;
},
states() {
return this.$store.getters.getStates;
114
}
},
methods: {
add1: function() {
this.dialog = !this.dialog;
},
leadsToState(step) {
return this.leads.filter(i => i.step_id == step);
},
getLeads() {
this.$store.dispatch('getLeads')
.then(() => {
this.list1 = this.$store.getters.getLeads;
})
.catch(error => {console.log(error)})
},
getStates() {
this.$store.dispatch('getStates');
},
checkList(evt) {
console.log(evt);
let payload = {
"leadId": evt.item.getAttribute("data-elem"),
"newStep": evt.to.getAttribute("data-id")
};
this.$store.dispatch('updLead', payload);
},
},
created() {
this.getStates();
this.getLeads();
}
};
</script>
Todo.vue
<template>
<v-flex md3 mx-2>
<v-card color="grey lighten-4 pb-3">
<draggable @add="checkList" :data-id="pkey" group="{name: 'people'}">
v-for="(el, index) in list"
hover
:key="index" :data-elem="el.leadId"
115
:to="{ name: 'lead', params: { id: el.leadId } }">
ФИО: {{ el.surname }} {{ el.first_name }} {{ el.patronymic }}
</v-flex>
Дата создания: {{ el.creation_date }}
</v-flex>
Комментариев: {{ el.countComment }}
</v-flex>
Просмотрено обьектов: {{ el.countObject }}
</v-flex>
</v-card-title>
</v-card>
</draggable>
color="green"
dark
small
absolute
bottom
right
fab
@click="add"
>
</v-btn>
</v-card>
</v-flex>
</template>
<script>
import draggable from "vuedraggable";
export default {
name: "Todo",
components: {
draggable
},
props: {
title: { String },
buttonAdd: {
type: Boolean,
default: false
},

Смотрите также:

"Автоматизация обработки заявок ООО "Проектно-Строительная Компания"
"Автоматизация процесса аттестации персонала для ООО "Нэт Бай Нэт Холдинг"
"Анализ интернет-активности конкурентов ( на примере конкурентов "Газпром нефть")
"Бухгалтерский учёт и аудит расчётов с подотчётними лицами в организации на примере ООО "ЛОЦ 10""
«Психологическое сопровождение персонала в организации на примере ООО «Крокус»
Cовершенствование деловой оценки персонала в организации (на примере ООО "Даймонд кейтеринг развитие")
IPO - инструмент финансирования деятельности организации. На примере ПАО «Нефтяная компания «Лукойл»
PR как средство продвижения организации (на примере ПАО "Тамбовский завод "Комсомолец им. Н.С. Артемова")
PR-коммуникации в сфере общественного питания (на примере кафе-кондитерской «Cream Cheese»)
SMM как средство повышения эффективности работы учреждений социокультурной сферы (на примере Малого театра)