From d91bc5beba0ac6186bd11c0d3be11dce21d37c30 Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Fri, 23 Aug 2024 23:30:45 +0330 Subject: [PATCH] Fix ws and device page --- .gitignore | 2 +- components/admin/TheSidebar.vue | 4 +- mixins/WS_Admin.js | 6 + package-lock.json | 26 +++++ package.json | 2 + pages/admin/gps/device/index.vue | 177 +++++++++++++++++++++++++++++ pages/admin/gps/users/index.vue | 47 +++++++- pages/admin/serials-exel/index.vue | 2 +- server/controllers/GPS.Device.js | 79 +++++++++---- server/routes/admin.js | 1 + static/example.xlsx | Bin 0 -> 51066 bytes store/admin.js | 6 +- 12 files changed, 322 insertions(+), 30 deletions(-) create mode 100644 pages/admin/gps/device/index.vue create mode 100644 static/example.xlsx diff --git a/.gitignore b/.gitignore index c8c19c7..5a9e784 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -*.xlsx + # Created by .ignore support plugin (hsz.mobi) ### Node template # Logs diff --git a/components/admin/TheSidebar.vue b/components/admin/TheSidebar.vue index 34399f1..df1309e 100644 --- a/components/admin/TheSidebar.vue +++ b/components/admin/TheSidebar.vue @@ -339,10 +339,12 @@ :exact="false" :badge="pendingUsers ? { text: pendingUsers, color: 'danger' } : null" /> + + diff --git a/mixins/WS_Admin.js b/mixins/WS_Admin.js index 7978551..3e3a71a 100644 --- a/mixins/WS_Admin.js +++ b/mixins/WS_Admin.js @@ -58,6 +58,12 @@ export default { this.$store.commit('admin/set', ['newOldPieceRequests', data.newOldPieceRequests]) this.$store.commit('admin/set', ['newBufferRequests', data.newBufferRequests]) this.$store.commit('admin/set', ['newGuaranteeReports', data.newGuaranteeReports]) + + this.$store.commit('admin/set', ['newComplaintReports', data.newComplaintReports]) + this.$store.commit('admin/set', ['newWithdrawRequest', data.newWithdrawRequest]) + this.$store.commit('admin/set', ['pendingUsers', data.pendingUsers]) + this.$store.commit('admin/set', ['newAwardRequest', data.newAwardRequest]) + this.$store.commit('admin/set', ['newInstallDeviceRequest', data.newInstallDeviceRequest]) }) socket.on(`admin:notify`, data => { diff --git a/package-lock.json b/package-lock.json index 4ead9fc..c4278e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,6 +28,8 @@ "gsap": "^3.5.1", "jimp": "^0.16.1", "jquery": "^3.5.1", + "js-file-download": "^0.4.12", + "json-as-xlsx": "^2.5.6", "jsonwebtoken": "^8.5.1", "moment-jalaali": "^0.9.2", "mongoose": "^5.11.8", @@ -2842,6 +2844,17 @@ "node": ">=10.0.0" } }, + "node_modules/@e965/xlsx": { + "version": "0.20.3", + "resolved": "https://registry.npmjs.org/@e965/xlsx/-/xlsx-0.20.3.tgz", + "integrity": "sha512-703RN/3OdsRD5mtse2HBX7Um7xwaP9tlswEG6svOtjqokXoX7rJdQj7DyabD2I+xk22RgaIIU+R6BHgkpZGB/w==", + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -12476,6 +12489,11 @@ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" }, + "node_modules/js-file-download": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/js-file-download/-/js-file-download-0.4.12.tgz", + "integrity": "sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg==" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -12509,6 +12527,14 @@ "node": ">=4" } }, + "node_modules/json-as-xlsx": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/json-as-xlsx/-/json-as-xlsx-2.5.6.tgz", + "integrity": "sha512-z7phlB+VgS9wZv2N4SBKlguC3C7uauSj2PYSZICCrPaiu1lu8zkCpzZ4sOHWi0/3Je0CJl87q+J+3mpZbxpOew==", + "dependencies": { + "@e965/xlsx": "^0.20.0" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", diff --git a/package.json b/package.json index bdb5bf0..eceb62b 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,8 @@ "gsap": "^3.5.1", "jimp": "^0.16.1", "jquery": "^3.5.1", + "js-file-download": "^0.4.12", + "json-as-xlsx": "^2.5.6", "jsonwebtoken": "^8.5.1", "moment-jalaali": "^0.9.2", "mongoose": "^5.11.8", diff --git a/pages/admin/gps/device/index.vue b/pages/admin/gps/device/index.vue new file mode 100644 index 0000000..280d29d --- /dev/null +++ b/pages/admin/gps/device/index.vue @@ -0,0 +1,177 @@ + + + diff --git a/pages/admin/gps/users/index.vue b/pages/admin/gps/users/index.vue index 8a606ea..0bd6a89 100644 --- a/pages/admin/gps/users/index.vue +++ b/pages/admin/gps/users/index.vue @@ -33,6 +33,30 @@ کاربران جی پی اس + + + + + + فیلتر ها + + + + + + +

جستجو در لیست:

+ +
+
+
+
+ @@ -42,7 +66,7 @@ - + @@ -96,7 +120,9 @@ export default { return { users: [], centerDialogVisible: false, - user: {} + user: {}, + filterText :'' + } }, @@ -106,6 +132,23 @@ export default { }, usersTypeList() { return this.$route.query?.type + }, + filteredItems() { + const filterText = this.filterText + if (!this.filterText.length) return this.users + else { + return this.users.filter(item => { + return ( + item.first_name.includes(filterText) || + item.last_name.includes(filterText) || + item.mobile_number.includes(filterText) || + item.national_code.includes(filterText) || + item.province_name?.includes(filterText) || + item.city_name?.includes(filterText) || + (item.first_name + ' ' + item.last_name).includes(filterText) + ) + }) + } } }, watch: { diff --git a/pages/admin/serials-exel/index.vue b/pages/admin/serials-exel/index.vue index 7ebad2b..c6c02f2 100644 --- a/pages/admin/serials-exel/index.vue +++ b/pages/admin/serials-exel/index.vue @@ -30,7 +30,7 @@ download target="_blank" title="برای دانلود کلیک کنید" - :href="scope?.row.url + scope?.row.name" + :href="scope?.row.url +'/'+ scope?.row.name" style="color: blue; display: block; direction: ltr !important; text-align: right" > {{ scope?.row.name }} diff --git a/server/controllers/GPS.Device.js b/server/controllers/GPS.Device.js index 0da37d8..2e977b3 100644 --- a/server/controllers/GPS.Device.js +++ b/server/controllers/GPS.Device.js @@ -1,10 +1,9 @@ const readXlsxFile = require('read-excel-file/node') -const validator = require('validator') const { body, param, validationResult } = require('express-validator'); +const xlsx = require("json-as-xlsx") const { _sr } = require('../plugins/serverResponses'); const { checkValidations, res500 } = require('../plugins/controllersHelperFunctions'); const Device = require('../models/GPS.Device'); - module.exports.addCode = [ [ body('model').notEmpty().isString().withMessage(_sr.fa.required.name), @@ -55,25 +54,48 @@ module.exports.importExel = async (req, res) => { module.exports.getAll = [ async (req, res) => { - let page; - let rows; - if (!req.query?.rows) { - rows = 10 - } else { - rows = req.query.rows + + const data = await Device.find().sort({ created_at: -1 }) + res.status(200).json(data) + } +] + +module.exports.downloadAll = [ + async (req, res) => { + + const device = await Device.find().sort({ created_at: -1 }) + const data = [ + { + sheet: "device", + columns: [ + { label: "IMEI", value: "IMEI" }, + { label: "مدل", value: "model" }, + { label: "قیمت به تومان", value: "tomanPrice" }, + { label: "سود به دلار", value: "dollarProfit" }, + { label: "سود به تومان", value: "profit" }, + { label: "امتیاز", value: "score" }, + { label: "سود از تمدید", value: "renewalProfit" }, + { label: "وضعیت نصب", value: "status" }, + ], + content: device, + } + ] + + const settings = { + writeOptions: { + type: "buffer", + bookType: "csv", + }, + RTL: true } - if (!req.query?.page) { - page = 0 - // eslint-disable-next-line eqeqeq - } else if (!req.query.page == 1) { - page = 0 - } else { - page = req.query.page - page = page * rows - rows - } - const data = await Device.find().sort({ created_at: -1 }).skip(page).limit(rows); - const total = Math.ceil((await Device.estimatedDocumentCount())) - res.status(200).json({ data, total }) + setTimeout(() => { + const buffer = xlsx(data, settings) + res.writeHead(200, { + "Content-Type": "application/octet-stream", + "Content-disposition": "attachment; filename=device.csv", + }) + res.end(buffer) + }, 2000); } ] @@ -99,7 +121,7 @@ module.exports.getOneByIMEI = [ ], checkValidations(validationResult), async (req, res) => { - const data = await Device.findOne({IMEI:req.params.imei}).sort({ created_at: -1 }) + const data = await Device.findOne({ IMEI: req.params.imei }).sort({ created_at: -1 }) if (!data) { res.status(404).json(_sr.fa.not_found.item_id) } else { @@ -151,10 +173,18 @@ const creator = (exel) => { return new Promise(async (resolve, reject) => { for (const row of exel) { // eslint-disable-next-line no-constant-condition - if (validator.isIMEI(row[0].toString().trim()) || true) { + if (/^[0-9]{15}$/gm.test(row[0].toString().trim())) { const device = await Device.findOne({ IMEI: row[0] }) if (device) { - console.warn("Repeated IMEI ", row[0]) + console.info("Repeated IMEI ", row[0]) + + device.model = row[1] + device.tomanPrice = row[2] + device.dollarProfit = row[3] || 1 + device.profit = row[4] || 1 + device.score = row[5] || 1 + device.renewalProfit = row[6] || 1 + device.save() } else { await Device.create( { @@ -174,4 +204,5 @@ const creator = (exel) => { } resolve("end") }) -} \ No newline at end of file +} + diff --git a/server/routes/admin.js b/server/routes/admin.js index fe5bbbb..a84c011 100644 --- a/server/routes/admin.js +++ b/server/routes/admin.js @@ -71,6 +71,7 @@ router.get('/gps/register-device', installedDevice.getAllForAdmin) /// ////////////// Device router.post('/gps/device',hasPermission('gps'), device.addCode) router.post('/gps/device/exel',hasPermission('gps'), device.importExel) +router.get('/gps/device/exel',hasPermission('gps'), device.downloadAll) router.get('/gps/device',hasPermission('gps'), device.getAll) router.get('/gps/device/imei/:imei',hasPermission('gps'), device.getOneByIMEI) router.get('/gps/device/id/:id',hasPermission('gps'), device.getOne) diff --git a/static/example.xlsx b/static/example.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e135af3bdc950c44c05ff64b20f6f7793ccfbc2a GIT binary patch literal 51066 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 ({ verityProducts: [], panatechProducts: [], iranProvinces: [], - iranCities: [] + iranCities: [], + newWithdrawRequest: 0, + pendingUsers: 0, + newAwardRequest: 0, + newInstallDeviceRequest: 0 }) export const mutations = {