Merge remote-tracking branch 'origin/main'

property-only-app
zxf 3 months ago
commit 41416c4ca6

@ -71,3 +71,21 @@ export function listHouses(params) {
);
}
// 投诉与建议 - 删除
export function deleteComplaintSuggestion(ids) {
return request.post(
'autogencode/pmcomplaintsuggestion/delete',
ids,
{ useAdminUrl: true }
);
}
// 报修单 - 更新状态
export function updateMaintenanceOrderStatus(data) {
return request.post(
'autogencode/pmmaintenanceorder/updateStatusAndRemark',
data,
{ useAdminUrl: true }
);
}

@ -0,0 +1,42 @@
import request from '@/utils/request.js';
/**
* pubnotice 新增
* @param {Object} data
*/
export function pubnoticeCreateApi(data) {
return request.post('autogencode/pubnotice/save', data, { useAdminUrl: true });
}
/**
* pubnotice 更新
* @param {Object} data
*/
export function pubnoticeUpdateApi(data) {
return request.post('autogencode/pubnotice/update', data, { useAdminUrl: true });
}
/**
* pubnotice 详情
* @param {string} id noticeId
*/
export function pubnoticeDetailApi(id) {
return request.get(`autogencode/pubnotice/info/${id}`, {}, { useAdminUrl: true });
}
/**
* pubnotice 批量删除
* @param {string[]|string} ids
*/
export function pubnoticeDeleteApi(ids) {
return request.post('autogencode/pubnotice/delete', ids, { useAdminUrl: true });
}
/**
* pubnotice 列表
* @param {Object} params query params (page/limit + 各字段条件)
*/
export function pubnoticeListApi(params) {
return request.get('autogencode/pubnotice/list', params, { useAdminUrl: true });
}

@ -39,39 +39,45 @@ export function _toLogin(push, pathLogin) {
Cache.set('login_back_url',path);
}
// #ifdef H5
if (isWeixin()) {
let urlData = location.pathname + location.search
if (urlData.indexOf('?') !== -1) {
urlData += '&go_longin=1';
} else {
urlData += '?go_longin=1';
}
if (!Cache.has('snsapiKey')) {
auth.oAuth('snsapi_base', urlData);
} else {
if (['/pages/user/index'].indexOf(login_back_url) == -1) {
uni.navigateTo({
url: '/pages/users/wechat_login/index'
})
}
}
} else {
if (['/pages/user/index'].indexOf(login_back_url) == -1) {
uni.navigateTo({
url: '/pages/users/login/index'
})
}
}
// #endif
// // #ifdef H5
// if (isWeixin()) {
// let urlData = location.pathname + location.search
// if (urlData.indexOf('?') !== -1) {
// urlData += '&go_longin=1';
// } else {
// urlData += '?go_longin=1';
// }
// if (!Cache.has('snsapiKey')) {
// auth.oAuth('snsapi_base', urlData);
// } else {
// if (['/pages/user/index'].indexOf(login_back_url) == -1) {
// uni.navigateTo({
// url: '/pages/users/wechat_login/index'
// })
// }
// }
// } else {
// if (['/pages/user/index'].indexOf(login_back_url) == -1) {
// uni.navigateTo({
// url: '/pages/users/login/index'
// })
// }
// }
// // #endif
// if (['pages/user/index','/pages/user/index'].indexOf(login_back_url) == -1) {
// // #ifdef MP
// uni.navigateTo({
// url: '/pages/users/wechat_login/index'
// })
// // #endif
// }
if (['pages/user/index','/pages/user/index'].indexOf(login_back_url) == -1) {
// #ifdef MP
uni.navigateTo({
url: '/pages/users/wechat_login/index'
url: '/pages/users/login/index'
})
// #endif
}
}
}

@ -122,7 +122,8 @@
"quickapp" : {},
/* */
"mp-weixin" : {
"appid" : "",
"appid" : "wxacb083448570908a",
"libVersion" : "latest",
"setting" : {
"urlCheck" : true,
"minified" : true,

464
app/package-lock.json generated

@ -1,446 +1,46 @@
{
"name": "app",
"version": "1.0.0",
"lockfileVersion": 2,
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
},
"ansi-styles": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
},
"babel-code-frame": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
"integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
"requires": {
"chalk": "^1.1.3",
"esutils": "^2.0.2",
"js-tokens": "^3.0.2"
}
},
"babel-core": {
"version": "6.26.3",
"resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
"integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
"requires": {
"babel-code-frame": "^6.26.0",
"babel-generator": "^6.26.0",
"babel-helpers": "^6.24.1",
"babel-messages": "^6.23.0",
"babel-register": "^6.26.0",
"babel-runtime": "^6.26.0",
"babel-template": "^6.26.0",
"babel-traverse": "^6.26.0",
"babel-types": "^6.26.0",
"babylon": "^6.18.0",
"convert-source-map": "^1.5.1",
"debug": "^2.6.9",
"json5": "^0.5.1",
"lodash": "^4.17.4",
"minimatch": "^3.0.4",
"path-is-absolute": "^1.0.1",
"private": "^0.1.8",
"slash": "^1.0.0",
"source-map": "^0.5.7"
}
},
"babel-generator": {
"version": "6.26.1",
"resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
"integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
"requires": {
"babel-messages": "^6.23.0",
"babel-runtime": "^6.26.0",
"babel-types": "^6.26.0",
"detect-indent": "^4.0.0",
"jsesc": "^1.3.0",
"lodash": "^4.17.4",
"source-map": "^0.5.7",
"trim-right": "^1.0.1"
}
},
"babel-helpers": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
"integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
"requires": {
"babel-runtime": "^6.22.0",
"babel-template": "^6.24.1"
}
},
"babel-messages": {
"version": "6.23.0",
"resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
"integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
"requires": {
"babel-runtime": "^6.22.0"
}
},
"babel-register": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
"integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
"requires": {
"babel-core": "^6.26.0",
"babel-runtime": "^6.26.0",
"core-js": "^2.5.0",
"home-or-tmp": "^2.0.0",
"lodash": "^4.17.4",
"mkdirp": "^0.5.1",
"source-map-support": "^0.4.15"
}
},
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"babel-template": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
"integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
"requires": {
"babel-runtime": "^6.26.0",
"babel-traverse": "^6.26.0",
"babel-types": "^6.26.0",
"babylon": "^6.18.0",
"lodash": "^4.17.4"
}
},
"babel-traverse": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
"integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
"requires": {
"babel-code-frame": "^6.26.0",
"babel-messages": "^6.23.0",
"babel-runtime": "^6.26.0",
"babel-types": "^6.26.0",
"babylon": "^6.18.0",
"debug": "^2.6.8",
"globals": "^9.18.0",
"invariant": "^2.2.2",
"lodash": "^4.17.4"
}
},
"babel-types": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
"integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
"requires": {
"babel-runtime": "^6.26.0",
"esutils": "^2.0.2",
"lodash": "^4.17.4",
"to-fast-properties": "^1.0.3"
}
},
"babylon": {
"version": "6.18.0",
"resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
"integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
},
"balanced-match": {
"packages": {
"": {
"name": "app",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
"license": "ISC",
"dependencies": {
"json-bigint": "^1.0.0"
}
},
"chalk": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"requires": {
"ansi-styles": "^2.2.1",
"escape-string-regexp": "^1.0.2",
"has-ansi": "^2.0.0",
"strip-ansi": "^3.0.0",
"supports-color": "^2.0.0"
"node_modules/bignumber.js": {
"version": "9.3.1",
"resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.3.1.tgz",
"integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==",
"engines": {
"node": "*"
}
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
},
"convert-source-map": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
"integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
"requires": {
"safe-buffer": "~5.1.1"
}
},
"core-image-xhr": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-image-xhr/-/core-image-xhr-1.0.3.tgz",
"integrity": "sha1-khHXtcQSGa9atpuThMoqR9VytHY="
},
"core-js": {
"version": "2.6.11",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
"integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
},
"daycaca": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/daycaca/-/daycaca-1.0.11.tgz",
"integrity": "sha512-2SJTpnpmxUGVWbFPTRhaZLvisCD7bYjvuFpLAhjfAAvtnBb26dAqIqaZ9Jq8yvSlugpEGY+v/YXHXGP3paVV9A=="
},
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"detect-indent": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
"integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
"requires": {
"repeating": "^2.0.0"
}
},
"dom7": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/dom7/-/dom7-2.1.3.tgz",
"integrity": "sha512-QTxHHDox+M6ZFz1zHPAHZKI3JOHY5iY4i9BK2uctlggxKQwRhO3q3HHFq1BKsT25Bm/ySSj70K6Wk/G4bs9rMQ==",
"requires": {
"ssr-window": "^1.0.1"
}
},
"emoji-awesome": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/emoji-awesome/-/emoji-awesome-0.0.2.tgz",
"integrity": "sha512-ggortYTr4+f4Jqp/R3vV9FAec+wRkIyRM458LUrv81mKQSKIJW9+xDlbqHsUpMeNKCLG45RsbbCyprrOoGZ6UQ=="
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
},
"esutils": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
},
"globals": {
"version": "9.18.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
"integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
},
"has-ansi": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
"integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
"requires": {
"ansi-regex": "^2.0.0"
}
},
"home-or-tmp": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
"integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
"requires": {
"os-homedir": "^1.0.0",
"os-tmpdir": "^1.0.1"
}
},
"invariant": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
"integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
"requires": {
"loose-envify": "^1.0.0"
}
},
"is-finite": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
"integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w=="
},
"js-tokens": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
"integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
},
"jsesc": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
"integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s="
},
"json5": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
"integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE="
},
"lodash": {
"version": "4.17.15",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
},
"loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"requires": {
"js-tokens": "^3.0.0 || ^4.0.0"
}
},
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"requires": {
"brace-expansion": "^1.1.7"
}
},
"minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
},
"mkdirp": {
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"requires": {
"minimist": "^1.2.5"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"os-homedir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
},
"os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
},
"private": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
"integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
},
"repeating": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
"integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
"requires": {
"is-finite": "^1.0.0"
}
},
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"slash": {
"node_modules/json-bigint": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
"integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
},
"source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
},
"source-map-support": {
"version": "0.4.18",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
"integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
"requires": {
"source-map": "^0.5.6"
"resolved": "https://registry.npmmirror.com/json-bigint/-/json-bigint-1.0.0.tgz",
"integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
"dependencies": {
"bignumber.js": "^9.0.0"
}
}
},
"dependencies": {
"bignumber.js": {
"version": "9.3.1",
"resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.3.1.tgz",
"integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="
},
"ssr-window": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-1.0.1.tgz",
"integrity": "sha512-dgFqB+f00LJTEgb6UXhx0h+SrG50LJvti2yMKMqAgzfUmUXZrLSv2fjULF7AWGwK25EXu8+smLR3jYsJQChPsg=="
},
"strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"requires": {
"ansi-regex": "^2.0.0"
}
},
"supports-color": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
},
"swiper": {
"version": "5.3.8",
"resolved": "https://registry.npmjs.org/swiper/-/swiper-5.3.8.tgz",
"integrity": "sha512-bCxrayTgzC2bZBRuFwAx7T4exWeHqMADBpcuTQ7PNCOIIzJRPqNh4ySIvW06LEEU3Q0KncaNre4hrn+jXcWivQ==",
"requires": {
"dom7": "^2.1.3",
"ssr-window": "^1.0.1"
}
},
"to-fast-properties": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
"integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
},
"trim-right": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
"integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM="
},
"vue": {
"version": "2.6.11",
"resolved": "https://registry.npmjs.org/vue/-/vue-2.6.11.tgz",
"integrity": "sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ=="
},
"vue-awesome-swiper": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/vue-awesome-swiper/-/vue-awesome-swiper-4.1.1.tgz",
"integrity": "sha512-50um10t6N+lJaORkpwSi1wWuMmBI1sgFc9Znsi5oUykw2cO5DzLaBHcO2JNX21R+Ue4TGoIJDhhxjBHtkFrTEQ=="
},
"vue-core-image-upload": {
"version": "2.4.11",
"resolved": "https://registry.npmjs.org/vue-core-image-upload/-/vue-core-image-upload-2.4.11.tgz",
"integrity": "sha512-He0OcNqUaL2yHQebFwk4IxLr1Q8m1S7u8zTUek7pMaOUHW76MXOOn6sHoJMruURNvsv3SyeqFEt4N7JQBnMviA==",
"json-bigint": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/json-bigint/-/json-bigint-1.0.0.tgz",
"integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
"requires": {
"babel-core": "^6.26.0",
"core-image-xhr": "^1.0.3",
"daycaca": "^1.0.6",
"vue": "^2.5.13"
"bignumber.js": "^9.0.0"
}
}
}

@ -0,0 +1,14 @@
{
"name": "app",
"version": "1.0.0",
"description": "",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "zombie",
"license": "ISC",
"dependencies": {
"json-bigint": "^1.0.0"
}
}

@ -184,6 +184,10 @@
"navigationBarTitleText": "溯源信息查看",
"navigationBarBackgroundColor": "#409EFF",
"navigationBarTextStyle": "white"
// #ifdef H5
,
"navigationStyle": "custom"
// #endif
}
},
{
@ -192,6 +196,10 @@
"navigationBarTitleText": "食材满意度评价",
"navigationBarBackgroundColor": "#409EFF",
"navigationBarTextStyle": "white"
// #ifdef H5
,
"navigationStyle": "custom"
// #endif
}
},
{
@ -200,6 +208,10 @@
"navigationBarTitleText": "物供相关查询",
"navigationBarBackgroundColor": "#409EFF",
"navigationBarTextStyle": "white"
// #ifdef H5
,
"navigationStyle": "custom"
// #endif
}
},
{
@ -208,6 +220,10 @@
"navigationBarTitleText": "采购相关操作",
"navigationBarBackgroundColor": "#409EFF",
"navigationBarTextStyle": "white"
// #ifdef H5
,
"navigationStyle": "custom"
// #endif
}
},
{
@ -216,6 +232,10 @@
"navigationBarTitleText": "库存查询",
"navigationBarBackgroundColor": "#409EFF",
"navigationBarTextStyle": "white"
// #ifdef H5
,
"navigationStyle": "custom"
// #endif
}
},
{
@ -224,6 +244,10 @@
"navigationBarTitleText": "审批处理",
"navigationBarBackgroundColor": "#409EFF",
"navigationBarTextStyle": "white"
// #ifdef H5
,
"navigationStyle": "custom"
// #endif
}
},
{
@ -232,6 +256,10 @@
"navigationBarTitleText": "物资领用",
"navigationBarBackgroundColor": "#409EFF",
"navigationBarTextStyle": "white"
// #ifdef H5
,
"navigationStyle": "custom"
// #endif
}
},
{
@ -240,6 +268,10 @@
"navigationBarTitleText": "投诉与建议",
"navigationBarBackgroundColor": "#409EFF",
"navigationBarTextStyle": "white"
// #ifdef H5
,
"navigationStyle": "custom"
// #endif
}
},
{
@ -248,6 +280,34 @@
"navigationBarTitleText": "报修服务",
"navigationBarBackgroundColor": "#409EFF",
"navigationBarTextStyle": "white"
// #ifdef H5
,
"navigationStyle": "custom"
// #endif
}
},
{
"path": "notice/index",
"style": {
"navigationBarTitleText": "通知公告列表",
"navigationBarBackgroundColor": "#409EFF",
"navigationBarTextStyle": "white"
// #ifdef H5
,
"navigationStyle": "custom"
// #endif
}
},
{
"path": "notice_detail/index",
"style": {
"navigationBarTitleText": "通知详情",
"navigationBarBackgroundColor": "#409EFF",
"navigationBarTextStyle": "white"
// #ifdef H5
,
"navigationStyle": "custom"
// #endif
}
}
]

@ -50,60 +50,67 @@
<view class="iconfont icon-xiangyou"></view>
</view>
<!-- 供应链管理功能入口 -->
<view class='nav acea-row'>
<navigator class='item' url='/pages/supply_chain/traceability/index' hover-class='none'>
<view class='pictrue'>
<image src="/static/images/wg/wg_source.png"></image>
<view class='nav acea-row' v-if="menus.length">
<view class="property-service-title">物业服务</view>
<!-- <navigator class='item' url='/pages/supply_chain/traceability/index' hover-class='none'>
<view class='pictrue picsmall'>
<image class="image" src="/static/images/wg/wg_source.png"></image>
</view>
<view class="menu-txt">溯源信息</view>
</navigator>
<navigator class='item' url='/pages/supply_chain/evaluation/index' hover-class='none'>
<view class='pictrue'>
<image src="/static/images/stars1.png"></image>
<view class='pictrue picsmall'>
<image class="image" src="/static/images/stars1.png"></image>
</view>
<view class="menu-txt">满意度评价</view>
</navigator>
<navigator class='item' url='/pages/supply_chain/supply_query/index' hover-class='none'>
<view class='pictrue'>
<image src="/static/images/wg/wg_search.png"></image>
<view class='pictrue picsmall'>
<image class="image" src="/static/images/wg/wg_search.png"></image>
</view>
<view class="menu-txt">物供查询</view>
</navigator>
<navigator class='item' url='/pages/supply_chain/purchase/index' hover-class='none'>
<view class='pictrue'>
<image src="/static/images/wg/wg_buy.png"></image>
<view class='pictrue picsmall'>
<image class="image" src="/static/images/wg/wg_buy.png"></image>
</view>
<view class="menu-txt">采购操作</view>
</navigator>
<navigator class='item' url='/pages/supply_chain/stock/index' hover-class='none'>
<view class='pictrue'>
<image src="/static/images/wg/wg_stock.png"></image>
<view class='pictrue picsmall'>
<image class="image" src="/static/images/wg/wg_stock.png"></image>
</view>
<view class="menu-txt">库存查询</view>
</navigator>
<navigator class='item' url='/pages/supply_chain/approval/index' hover-class='none'>
<view class='pictrue'>
<image src="/static/images/wg/wg_audit.png"></image>
<view class='pictrue picsmall'>
<image class="image" src="/static/images/wg/wg_audit.png"></image>
</view>
<view class="menu-txt">审批处理</view>
</navigator>
<navigator class='item' url='/pages/supply_chain/material_receipt/index' hover-class='none'>
<view class='pictrue'>
<image src="/static/images/wg/wg_get.png"></image>
<view class='pictrue picsmall'>
<image class="image" src="/static/images/wg/wg_get.png"></image>
</view>
<view class="menu-txt">物资领用</view>
</navigator>
</navigator> -->
<navigator class='item' url='/pages/supply_chain/complaint/index' hover-class='none'>
<view class='pictrue'>
<image src="/static/images/wg/wg_jy.png"></image>
<view class='pictrue picsmall'>
<image class="image" src="/static/images/wg/wg_jy.png"></image>
</view>
<view class="menu-txt">投诉与建议</view>
</navigator>
<navigator class='item' url='/pages/supply_chain/repair/index' hover-class='none'>
<view class='pictrue'>
<image src="/static/images/wg/wg_wx.png"></image>
<view class='pictrue picsmall'>
<image class="image" src="/static/images/wg/wg_wx.png"></image>
</view>
<view class="menu-txt">报修服务</view>
</navigator>
<navigator class='item' url='/pages/supply_chain/notice/index' hover-class='none'>
<view class='pictrue picsmall'>
<image class="image" src="/static/images/wg/wg_notice.png"></image>
</view>
<view class="menu-txt">通知公告</view>
</navigator>
</view>
<!-- menu -->
@ -1345,6 +1352,20 @@
.productList .list .item .pictrue image.on {
border-radius: 6rpx;
}
.picsmall {
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 12rpx;
// width: 50%;
// height: 50%;
}
.image {
width: 60rpx !important;
height: 60rpx !important;
}
.productList .list .item .text {
@ -1426,6 +1447,16 @@
color: #454545;
}
.property-service-title {
width: 100%;
box-sizing: border-box;
padding: 20rpx 24rpx 8rpx;
font-size: 28rpx;
font-weight: 600;
color: #2f3a4a;
letter-spacing: 1rpx;
}
.mp-bg {
position: absolute;
left: 0;

@ -1,13 +1,5 @@
<template>
<view class="approval-page">
<view class="header">
<view class="back" @click="goBack">
<text class="iconfont icon-xiangzuo"></text>
</view>
<view class="title">审批处理</view>
<view class="right"></view>
</view>
<view class="content">
<!-- 审批状态筛选 -->
<view class="filter-section">
@ -22,7 +14,7 @@
<view class="item-header">
<view class="header-left">
<text class="approval-type">{{ item.type }}</text>
<text class="approval-status" :class="getStatusClass(item.status)">{{ item.status }}</text>
<text class="approval-status" :class="statusClassMap[item.status]">{{ item.status }}</text>
</view>
<text class="approval-time">{{ item.time }}</text>
</view>
@ -64,6 +56,10 @@ export default {
data() {
return {
activeStatus: 'all',
statusClassMap: {
'待处理': 'status-pending',
'已处理': 'status-processed'
},
approvals: [
{ id: 1, type: '采购申请', status: '待处理', time: '2026-03-07 10:00', applicant: '张三', content: '采购有机蔬菜100斤', amount: 100 },
{ id: 2, type: '领用申请', status: '待处理', time: '2026-03-07 09:30', applicant: '李四', content: '领用维修耗材', amount: 50 },
@ -84,17 +80,6 @@ export default {
}
},
methods: {
goBack() {
uni.navigateBack();
},
getStatusClass(status) {
if (status === '待处理') {
return 'status-pending';
} else if (status === '已处理') {
return 'status-processed';
}
return '';
},
approveApproval(id) {
//
uni.showToast({
@ -129,37 +114,6 @@ export default {
<style lang="scss">
.approval-page {
.header {
display: flex;
align-items: center;
justify-content: space-between;
height: 88rpx;
padding: 0 30rpx;
background-color: #409EFF;
color: #fff;
.back {
width: 60rpx;
height: 100%;
display: flex;
align-items: center;
.iconfont {
font-size: 32rpx;
color: #fff;
}
}
.title {
font-size: 32rpx;
font-weight: 600;
}
.right {
width: 60rpx;
}
}
.content {
padding: 30rpx;

@ -1,13 +1,5 @@
<template>
<view class="complaint-page">
<view class="header">
<view class="back" @click="goBack">
<text class="iconfont icon-xiangzuo"></text>
</view>
<view class="title">投诉与建议</view>
<view class="right"></view>
</view>
<view class="content">
<!-- 顶部标签我要反馈 / 我的记录 -->
<view class="tabs">
@ -123,14 +115,17 @@
<text class="type">{{ item.submitChannel === '0' ? '投诉' : '建议' }}</text>
<text
class="status"
:class="statusClass(item.status)"
:class="statusClassMap[item.status] || statusClassMap['__default__']"
>
{{ statusText(item.status) }}
</text>
</view>
<text class="time">
{{ item.submitTime || item.createTime || '' }}
</text>
<view class="header-right">
<text class="time">
{{ item.submitTime || item.createTime || '' }}
</text>
<text class="delete-btn" @click="handleDelete(item.id)"></text>
</view>
</view>
<view class="card-body">
@ -184,7 +179,8 @@
<script>
import {
createComplaintSuggestion,
listComplaintSuggestion
listComplaintSuggestion,
deleteComplaintSuggestion
} from '@/api/property.js';
export default {
@ -204,7 +200,14 @@ export default {
page: 1,
limit: 10,
loading: false,
finished: false
finished: false,
statusClassMap: {
0: 'status-pending',
1: 'status-pending',
2: 'status-processing',
3: 'status-done',
'__default__': 'status-pending'
}
};
},
computed: {
@ -216,15 +219,12 @@ export default {
return '';
}
},
onShow() {
onLoad() {
if (this.activeTab === 'list') {
this.refreshList();
}
},
methods: {
goBack() {
uni.navigateBack();
},
switchToList() {
this.activeTab = 'list';
if (!this.records.length) {
@ -327,51 +327,38 @@ export default {
if (status === '3') return '已处理';
return status;
},
statusClass(status) {
const text = this.statusText(status);
if (text === '已处理') return 'status-done';
if (text === '待处理') return 'status-pending';
if (text === '未处理') return 'status-pending';
if (text === '处理中') return 'status-processing';
return '';
}
async handleDelete(id) {
uni.showModal({
title: '确认删除',
content: '确定要删除这条反馈记录吗?',
success: async (res) => {
if (res.confirm) {
try {
uni.showLoading({ title: '删除中...', mask: true });
await deleteComplaintSuggestion([id]);
uni.hideLoading();
uni.showToast({
title: '删除成功',
icon: 'success'
});
this.refreshList();
} catch (e) {
uni.hideLoading();
uni.showToast({
title: typeof e === 'string' ? e : '删除失败,请稍后重试',
icon: 'none'
});
}
}
}
});
},
}
};
</script>
<style lang="scss">
.complaint-page {
.header {
display: flex;
align-items: center;
justify-content: space-between;
height: 88rpx;
padding: 0 30rpx;
background-color: #409EFF;
color: #fff;
.back {
width: 60rpx;
height: 100%;
display: flex;
align-items: center;
.iconfont {
font-size: 32rpx;
color: #fff;
}
}
.title {
font-size: 32rpx;
font-weight: 600;
}
.right {
width: 60rpx;
}
}
.content {
padding: 30rpx;
@ -564,9 +551,25 @@ export default {
}
}
.time {
font-size: 22rpx;
color: #999;
.header-right {
display: flex;
align-items: center;
flex-direction: column;
align-items: flex-end;
.time {
font-size: 22rpx;
color: #999;
margin-bottom: 8rpx;
}
.delete-btn {
font-size: 22rpx;
color: #FF4D4F;
padding: 4rpx 12rpx;
border-radius: 16rpx;
background-color: #FFF1F0;
}
}
}

@ -1,13 +1,5 @@
<template>
<view class="evaluation-page">
<view class="header">
<view class="back" @click="goBack">
<text class="iconfont icon-xiangzuo"></text>
</view>
<view class="title">食材满意度评价</view>
<view class="right"></view>
</view>
<view class="content">
<!-- 食材选择 -->
<view class="food-section">
@ -72,9 +64,6 @@ export default {
};
},
methods: {
goBack() {
uni.navigateBack();
},
selectFood(food) {
this.selectedFood = food;
this.qualityRating = 0;
@ -110,37 +99,6 @@ export default {
<style lang="scss">
.evaluation-page {
.header {
display: flex;
align-items: center;
justify-content: space-between;
height: 88rpx;
padding: 0 30rpx;
background-color: #409EFF;
color: #fff;
.back {
width: 60rpx;
height: 100%;
display: flex;
align-items: center;
.iconfont {
font-size: 32rpx;
color: #fff;
}
}
.title {
font-size: 32rpx;
font-weight: 600;
}
.right {
width: 60rpx;
}
}
.content {
padding: 30rpx;

@ -1,13 +1,5 @@
<template>
<view class="material-receipt-page">
<view class="header">
<view class="back" @click="goBack">
<text class="iconfont icon-xiangzuo"></text>
</view>
<view class="title">物资领用</view>
<view class="right"></view>
</view>
<view class="content">
<!-- 发起领用申请 -->
<view class="form-section">
@ -42,7 +34,7 @@
<view class="record-item" v-for="(item, index) in receiptRecords" :key="index">
<view class="item-header">
<text class="material-name">{{ item.materialName }}</text>
<text class="receipt-status" :class="getStatusClass(item.status)">{{ item.status }}</text>
<text class="receipt-status" :class="statusClassMap[item.status]">{{ item.status }}</text>
</view>
<view class="item-body">
<view class="info-item">
@ -82,6 +74,11 @@ export default {
purpose: '',
applicant: ''
},
statusClassMap: {
'待审批': 'status-pending',
'已审批': 'status-approved',
'已拒绝': 'status-rejected'
},
materials: [
{ id: 1, name: '维修耗材' },
{ id: 2, name: '办公用品' },
@ -96,9 +93,6 @@ export default {
};
},
methods: {
goBack() {
uni.navigateBack();
},
submitReceipt() {
if (!this.receiptForm.materialName || !this.receiptForm.quantity || !this.receiptForm.purpose || !this.receiptForm.applicant) {
uni.showToast({
@ -133,53 +127,12 @@ export default {
showCancel: false
});
},
getStatusClass(status) {
if (status === '待审批') {
return 'status-pending';
} else if (status === '已审批') {
return 'status-approved';
} else if (status === '已拒绝') {
return 'status-rejected';
}
return '';
}
}
};
</script>
<style lang="scss">
.material-receipt-page {
.header {
display: flex;
align-items: center;
justify-content: space-between;
height: 88rpx;
padding: 0 30rpx;
background-color: #409EFF;
color: #fff;
.back {
width: 60rpx;
height: 100%;
display: flex;
align-items: center;
.iconfont {
font-size: 32rpx;
color: #fff;
}
}
.title {
font-size: 32rpx;
font-weight: 600;
}
.right {
width: 60rpx;
}
}
.content {
padding: 30rpx;

@ -0,0 +1,475 @@
<template>
<view class="notice-list-page">
<view class="content">
<!-- 搜索与筛选 -->
<view class="search-section">
<view class="search-box">
<input v-model="query.noticeTitle" type="text" placeholder="请输入通知标题" />
<view class="search-btn" @click="refreshList">
搜索
</view>
</view>
<view class="tab-row">
<view class="tab" :class="typeTab === 'all' ? 'active' : ''" @click="switchType('all')"></view>
<view class="tab" :class="typeTab === '1' ? 'active' : ''" @click="switchType('1')"></view>
<view class="tab" :class="typeTab === '2' ? 'active' : ''" @click="switchType('2')"></view>
</view>
<!-- <view class="tab-row" style="margin-top: 20rpx;">
<view class="tab" :class="statusTab === 'all' ? 'active' : ''" @click="switchStatus('all')"></view>
<view class="tab" :class="statusTab === '0' ? 'active' : ''" @click="switchStatus('0')">稿</view>
<view class="tab" :class="statusTab === '1' ? 'active' : ''" @click="switchStatus('1')"></view>
</view> -->
</view>
<!-- 列表 -->
<scroll-view scroll-y class="list-scroll" @scrolltolower="loadMore">
<view class="empty" v-if="!loading && records.length === 0">
<text class="iconfont icon-wushuju"></text>
<text class="text">暂无通知公告</text>
</view>
<view
v-for="item in records"
:key="item.noticeId"
class="record-card"
@click="openDetail(item.noticeId)"
>
<view class="card-header">
<view class="left">
<view class="title-row">
<text class="type line1">{{ item.noticeTitle || '未命名通知' }}</text>
</view>
<view class="tag-row">
<text class="tag kind" :class="typeClassMap[item.type] || ''">
{{ typeText(item.type) }}
</text>
<text class="tag status" :class="statusClassMap[item.status] || statusClassMap['__default__']">
{{ statusText(item.status) }}
</text>
<text class="tag sms" :class="smsClassMap[item.smsStatus] || ''">
{{ smsText(item.smsStatus) }}
</text>
</view>
</view>
<text class="time">{{ formatDate(item.noticeTime) }}</text>
</view>
<view class="card-body">
<view class="row">
<text class="label">通知类型</text>
<text class="value">{{ item.noticeType || '—' }}</text>
</view>
<view class="row">
<text class="label">通知范围</text>
<text class="value">{{ item.noticeScope || '—' }}</text>
</view>
<view class="row">
<text class="label">拟稿单位</text>
<text class="value">{{ item.draftDept || '—' }}</text>
</view>
<view class="row" v-if="item.noticeSource">
<text class="label">通知来源</text>
<text class="value">{{ item.noticeSource }}</text>
</view>
<view class="preview" v-if="item.noticeContent">
{{ contentPreview(item.noticeContent) }}
</view>
</view>
<view class="card-footer">
<view class="detail-btn" @click.stop="openDetail(item.noticeId)">查看详情</view>
</view>
</view>
<view class="load-more" v-if="loading">...</view>
<view class="load-more" v-else-if="finished && records.length > 0">已加载全部</view>
</scroll-view>
</view>
</view>
</template>
<script>
import { pubnoticeListApi } from '@/api/pubnotice.js';
export default {
data() {
return {
query: {
noticeTitle: '',
},
typeTab: 'all', // all | 1 | 2
statusTab: '1', // all | 0 | 1
records: [],
page: 1,
limit: 10,
loading: false,
finished: false,
typeClassMap: {
1: 'tag-internal',
2: 'tag-external',
'__default__': ''
},
statusClassMap: {
0: 'status-draft',
1: 'status-submit',
'__default__': ''
},
smsClassMap: {
0: 'sms-unsent',
1: 'sms-sent',
'__default__': ''
}
};
},
onLoad() {
this.refreshList();
},
onPullDownRefresh() {
this.refreshList();
},
methods: {
switchType(type) {
this.typeTab = type;
this.refreshList();
},
switchStatus(status) {
this.statusTab = status;
this.refreshList();
},
async refreshList() {
this.page = 1;
this.records = [];
this.finished = false;
await this.fetchList();
uni.stopPullDownRefresh && uni.stopPullDownRefresh();
},
async loadMore() {
if (this.loading || this.finished) return;
this.page += 1;
await this.fetchList();
},
buildParams() {
const params = {
page: this.page,
limit: this.limit,
delFlag: '1',
};
const noticeTitle = (this.query.noticeTitle || '').trim();
if (noticeTitle) params.noticeTitle = noticeTitle;
if (this.typeTab !== 'all') params.type = this.typeTab;
if (this.statusTab !== 'all') params.status = this.statusTab;
return params;
},
async fetchList() {
this.loading = true;
try {
const params = this.buildParams();
const res = await pubnoticeListApi(params);
const data = res?.data || {};
const list = data?.list || [];
if (this.page === 1) {
this.records = list;
} else {
this.records = this.records.concat(list);
}
const total = data?.total ?? data?.count ?? res?.total ?? res?.count;
if (!list.length) {
this.finished = true;
} else if (typeof total === 'number' && total <= this.records.length) {
this.finished = true;
}
} catch (e) {
uni.showToast({
title: typeof e === 'string' ? e : '获取通知公告失败',
icon: 'none',
});
} finally {
this.loading = false;
}
},
openDetail(noticeId) {
if (!noticeId) return;
uni.navigateTo({
url: `/pages/supply_chain/notice_detail/index?noticeId=${noticeId}`,
});
},
contentPreview(content) {
if (content === undefined || content === null) return '';
const s = String(content).replace(/\s+/g, ' ').trim();
if (!s) return '';
return s.length > 80 ? s.slice(0, 80) + '...' : s;
},
formatDate(val) {
if (!val) return '';
if (typeof val === 'string') {
return val.replace('T', ' ').slice(0, 19);
}
if (val instanceof Date) {
const pad = (n) => (n < 10 ? '0' + n : '' + n);
return `${val.getFullYear()}-${pad(val.getMonth() + 1)}-${pad(val.getDate())} ${pad(
val.getHours()
)}:${pad(val.getMinutes())}`;
}
return String(val);
},
typeText(type) {
if (type === 1 || type === '1') return '内部';
if (type === 2 || type === '2') return '外部';
return type || '—';
},
statusText(status) {
if (status === 0 || status === '0') return '草稿';
if (status === 1 || status === '1') return '提交';
return status ?? '—';
},
smsText(smsStatus) {
if (smsStatus === 0 || smsStatus === '0') return '未发';
if (smsStatus === 1 || smsStatus === '1') return '已发';
return smsStatus ?? '—';
},
},
};
</script>
<style lang="scss">
.notice-list-page {
.content {
padding: 30rpx;
}
.search-section {
margin-bottom: 20rpx;
.search-box {
display: flex;
align-items: center;
background-color: #fff;
border-radius: 12rpx;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.06);
padding: 14rpx 16rpx;
margin-bottom: 20rpx;
input {
flex: 1;
height: 64rpx;
font-size: 26rpx;
color: #333;
}
.search-btn {
height: 64rpx;
padding: 0 18rpx;
background-color: #409eff;
color: #fff;
border-radius: 32rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 24rpx;
font-weight: 600;
}
}
.tab-row {
display: flex;
background-color: #fff;
border-radius: 12rpx;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.06);
.tab {
flex: 1;
height: 72rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 26rpx;
color: #666;
position: relative;
&.active {
color: #409eff;
font-weight: 600;
&::after {
content: '';
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: 60rpx;
height: 4rpx;
background-color: #409eff;
border-radius: 2rpx;
}
}
}
}
}
.list-scroll {
max-height: calc(100vh - 310rpx);
}
.record-card {
background-color: #fff;
border-radius: 10rpx;
padding: 24rpx 26rpx;
margin-bottom: 20rpx;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.06);
.card-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
margin-bottom: 16rpx;
.left {
flex: 1;
min-width: 0;
}
.title-row {
margin-bottom: 10rpx;
}
.type {
font-size: 28rpx;
font-weight: 700;
color: #333;
max-width: 520rpx;
}
.time {
font-size: 22rpx;
color: #999;
white-space: nowrap;
}
}
.tag-row {
display: flex;
flex-wrap: wrap;
gap: 10rpx;
}
.tag {
padding: 6rpx 16rpx;
border-radius: 20rpx;
font-size: 20rpx;
line-height: 1;
}
.tag-internal {
background-color: #e6f7ff;
color: #409eff;
}
.tag-external {
background-color: #fff7e6;
color: #fa8c16;
}
.status-draft {
background-color: #f5f5f5;
color: #666;
}
.status-submit {
background-color: #f6ffed;
color: #52c41a;
}
.sms-unsent {
background-color: #f5f5f5;
color: #999;
}
.sms-sent {
background-color: #e6fffb;
color: #13c2c2;
}
.card-body {
.row {
display: flex;
margin-bottom: 10rpx;
.label {
width: 170rpx;
font-size: 24rpx;
color: #666;
}
.value {
flex: 1;
font-size: 24rpx;
color: #333;
min-width: 0;
}
}
.preview {
margin-top: 16rpx;
font-size: 24rpx;
color: #999;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
}
.card-footer {
margin-top: 20rpx;
display: flex;
justify-content: flex-end;
.detail-btn {
padding: 8rpx 16rpx;
background-color: #409eff;
color: #fff;
border-radius: 16rpx;
font-size: 20rpx;
}
}
}
.empty {
margin-top: 80rpx;
display: flex;
flex-direction: column;
align-items: center;
color: #999;
.iconfont {
font-size: 80rpx;
margin-bottom: 16rpx;
}
.text {
font-size: 24rpx;
}
}
.load-more {
text-align: center;
padding: 20rpx 0 10rpx;
font-size: 22rpx;
color: #999;
}
.line1 {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
</style>

@ -0,0 +1,298 @@
<template>
<view class="notice-detail-page">
<view class="content" v-if="!loading">
<view class="detail-card" v-if="notice && (notice.noticeTitle || notice.noticeId)">
<view class="title-section">
<text class="detail-title">{{ notice.noticeTitle || '未命名通知' }}</text>
<view class="tag-row">
<text class="tag kind" :class="typeClassMap[notice.type] || ''">{{ typeText(notice.type) }}</text>
<text class="tag status" :class="statusClassMap[notice.status] || statusClassMap['__default__']">{{ statusText(notice.status) }}</text>
<text class="tag sms" :class="smsClassMap[notice.smsStatus] || ''">{{ smsText(notice.smsStatus) }}</text>
</view>
</view>
<view class="info-list">
<view class="row" v-if="notice.noticeType">
<text class="label">通知类型</text>
<text class="value">{{ notice.noticeType }}</text>
</view>
<view class="row" v-if="notice.noticeSource">
<text class="label">通知来源</text>
<text class="value">{{ notice.noticeSource }}</text>
</view>
<view class="row" v-if="notice.draftDept">
<text class="label">拟稿单位</text>
<text class="value">{{ notice.draftDept }}</text>
</view>
<view class="row" v-if="notice.noticeScope">
<text class="label">通知范围</text>
<text class="value">{{ notice.noticeScope }}</text>
</view>
<view class="row" v-if="notice.bizType || notice.bizId">
<text class="label">业务信息</text>
<text class="value">{{ bizText(notice.bizType, notice.bizId) }}</text>
</view>
<view class="row" v-if="notice.noticeTime">
<text class="label">通知时间</text>
<text class="value">{{ formatDate(notice.noticeTime) }}</text>
</view>
<view class="row" v-if="notice.remark">
<text class="label">备注</text>
<text class="value remark-value">{{ notice.remark }}</text>
</view>
</view>
<view class="content-box">
<jyf-parser
v-if="notice.noticeContent"
:html="notice.noticeContent"
ref="article"
:tag-style="tagStyle"
></jyf-parser>
<view class="empty" v-else></view>
</view>
</view>
<view class="empty-page" v-else>
<text class="iconfont icon-wushuju"></text>
<text class="text">暂无详情数据</text>
</view>
</view>
<view class="loading" v-else>
<text>加载中...</text>
</view>
</view>
</template>
<script>
import jyfParser from '@/components/jyf-parser/jyf-parser';
import { pubnoticeDetailApi } from '@/api/pubnotice.js';
export default {
components: {
'jyf-parser': jyfParser,
},
data() {
return {
loading: false,
noticeId: '',
notice: {},
tagStyle: {
img: 'max-width:100%;height:auto;display:block;',
table: 'width:100%;border-collapse:collapse;',
video: 'max-width:100%;',
},
typeClassMap: {
1: 'tag-internal',
2: 'tag-external',
'__default__': ''
},
statusClassMap: {
0: 'status-draft',
1: 'status-submit',
'__default__': ''
},
smsClassMap: {
0: 'sms-unsent',
1: 'sms-sent',
'__default__': ''
}
};
},
onLoad(options) {
this.noticeId = options.noticeId || options.id || '';
if (this.noticeId) this.fetchDetail();
},
methods: {
async fetchDetail() {
this.loading = true;
try {
const res = await pubnoticeDetailApi(this.noticeId);
this.notice = res?.data || {};
} catch (e) {
uni.showToast({
title: typeof e === 'string' ? e : '获取通知详情失败',
icon: 'none',
});
} finally {
this.loading = false;
}
},
bizText(bizType, bizId) {
const t = bizType ? String(bizType) : '';
const id = bizId ? String(bizId) : '';
if (!t && !id) return '—';
if (t && id) return `${t} #${id}`;
return t || id;
},
formatDate(val) {
if (!val) return '';
if (typeof val === 'string') {
return val.replace('T', ' ').slice(0, 19);
}
if (val instanceof Date) {
const pad = (n) => (n < 10 ? '0' + n : '' + n);
return `${val.getFullYear()}-${pad(val.getMonth() + 1)}-${pad(val.getDate())} ${pad(
val.getHours()
)}:${pad(val.getMinutes())}`;
}
return String(val);
},
typeText(type) {
if (type === 1 || type === '1') return '内部';
if (type === 2 || type === '2') return '外部';
return type || '—';
},
statusText(status) {
if (status === 0 || status === '0') return '草稿';
if (status === 1 || status === '1') return '提交';
return status ?? '—';
},
smsText(smsStatus) {
if (smsStatus === 0 || smsStatus === '0') return '未发';
if (smsStatus === 1 || smsStatus === '1') return '已发';
return smsStatus ?? '—';
},
},
};
</script>
<style lang="scss">
.notice-detail-page {
.content {
padding: 30rpx;
}
.detail-card {
background-color: #fff;
border-radius: 12rpx;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.06);
padding: 24rpx 26rpx;
}
.title-section {
margin-bottom: 20rpx;
.detail-title {
font-size: 30rpx;
font-weight: 800;
color: #333;
display: block;
line-height: 1.4;
word-break: break-all;
}
.tag-row {
display: flex;
flex-wrap: wrap;
gap: 10rpx;
margin-top: 14rpx;
}
}
.tag {
padding: 6rpx 16rpx;
border-radius: 20rpx;
font-size: 20rpx;
line-height: 1;
}
.tag-internal {
background-color: #e6f7ff;
color: #409eff;
}
.tag-external {
background-color: #fff7e6;
color: #fa8c16;
}
.status-draft {
background-color: #f5f5f5;
color: #666;
}
.status-submit {
background-color: #f6ffed;
color: #52c41a;
}
.sms-unsent {
background-color: #f5f5f5;
color: #999;
}
.sms-sent {
background-color: #e6fffb;
color: #13c2c2;
}
.info-list {
.row {
display: flex;
margin-bottom: 14rpx;
.label {
width: 170rpx;
font-size: 24rpx;
color: #666;
flex-shrink: 0;
}
.value {
flex: 1;
font-size: 24rpx;
color: #333;
min-width: 0;
word-break: break-word;
}
}
.remark-value {
line-height: 1.5;
}
}
.content-box {
margin-top: 10rpx;
padding-top: 20rpx;
border-top: 1rpx solid #f5f5f5;
}
.empty-page {
margin-top: 120rpx;
display: flex;
flex-direction: column;
align-items: center;
color: #999;
.iconfont {
font-size: 80rpx;
margin-bottom: 16rpx;
}
.text {
font-size: 24rpx;
}
}
.empty {
font-size: 26rpx;
color: #999;
line-height: 2;
padding: 30rpx 0;
}
.loading {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
color: #999;
font-size: 26rpx;
}
}
</style>

@ -1,13 +1,5 @@
<template>
<view class="purchase-page">
<view class="header">
<view class="back" @click="goBack">
<text class="iconfont icon-xiangzuo"></text>
</view>
<view class="title">采购相关操作</view>
<view class="right"></view>
</view>
<view class="content">
<!-- 操作菜单 -->
<view class="menu-grid">
@ -72,7 +64,7 @@
<view class="order-item" v-for="(item, index) in orders" :key="index">
<view class="item-header">
<text class="order-no">订单号{{ item.orderNo }}</text>
<text class="order-status" :class="getStatusClass(item.status)">{{ item.status }}</text>
<text class="order-status" :class="statusClassMap[item.status]">{{ item.status }}</text>
</view>
<view class="item-body">
<view class="info-item">
@ -150,6 +142,11 @@ export default {
description: '',
images: []
},
statusClassMap: {
'已下单': 'status-ordered',
'配送中': 'status-delivering',
'已完成': 'status-completed'
},
orders: [
{ id: 1, orderNo: 'CG20260307001', name: '有机蔬菜', quantity: 100, status: '已下单', orderTime: '2026-03-07', expectedTime: '2026-03-09' },
{ id: 2, orderNo: 'CG20260307002', name: '新鲜水果', quantity: 50, status: '配送中', orderTime: '2026-03-06', expectedTime: '2026-03-08' },
@ -158,9 +155,6 @@ export default {
};
},
methods: {
goBack() {
uni.navigateBack();
},
openPurchaseRequest() {
this.activeForm = 'request';
this.purchaseRequest = {
@ -262,55 +256,12 @@ export default {
};
}, 1500);
},
getStatusClass(status) {
switch (status) {
case '已下单':
return 'status-ordered';
case '配送中':
return 'status-delivering';
case '已完成':
return 'status-completed';
default:
return '';
}
}
}
};
</script>
<style lang="scss">
.purchase-page {
.header {
display: flex;
align-items: center;
justify-content: space-between;
height: 88rpx;
padding: 0 30rpx;
background-color: #409EFF;
color: #fff;
.back {
width: 60rpx;
height: 100%;
display: flex;
align-items: center;
.iconfont {
font-size: 32rpx;
color: #fff;
}
}
.title {
font-size: 32rpx;
font-weight: 600;
}
.right {
width: 60rpx;
}
}
.content {
padding: 30rpx;
@ -395,7 +346,7 @@ export default {
}
.upload-box {
.display: flex;
display: flex;
flex-wrap: wrap;
.upload-btn {
@ -562,7 +513,7 @@ export default {
}
.item-footer {
.display: flex;
display: flex;
justify-content: flex-end;
.detail-btn {

@ -1,13 +1,5 @@
<template>
<view class="repair-page">
<view class="header">
<view class="back" @click="goBack">
<text class="iconfont icon-xiangzuo"></text>
</view>
<view class="title">报修服务</view>
<view class="right"></view>
</view>
<view class="content">
<!-- 顶部标签我要报修 / 报修记录 -->
<view class="tabs">
@ -59,7 +51,7 @@
</picker>
</view>
<view class="form-item">
<!-- <view class="form-item">
<text class="label">联系方式</text>
<input
class="input"
@ -68,18 +60,18 @@
placeholder="请输入手机号"
maxlength="20"
/>
</view>
</view> -->
<view class="form-item">
<text class="label">报修内容</text>
<textarea
class="textarea"
v-model="form.handleContent"
v-model="form.faultDesc"
placeholder="请描述故障位置、现象等,便于快速处理"
maxlength="300"
:auto-height="true"
/>
<text class="count">{{ form.handleContent.length }}/300</text>
<text class="count">{{ form.faultDesc.length }}/300</text>
</view>
<view class="form-item">
@ -130,14 +122,17 @@
</text>
<text
class="status"
:class="statusClass(item.status)"
:class="statusClassMap[item.status] || statusClassMap['__default__']"
>
{{ statusText(item.status) }}
</text>
</view>
<text class="time">
{{ item.assignTime || item.createTime || '' }}
</text>
<view class="header-right">
<text class="time">
{{ item.reportTime || item.createTime || '' }}
</text>
<text class="cancel-btn" @click="handleCancel(item.id)" v-if="!item.status || item.status === '0'"></text>
</view>
</view>
<view class="card-body">
@ -147,41 +142,28 @@
{{ getFaultTypeLabel(item.faultType) }}
</text>
</view>
<view class="row" v-if="item.assigneContext">
<view class="row" v-if="item.faultDesc">
<text class="label">报修内容</text>
<text class="value">
{{ item.assigneContext }}
</text>
</view>
<view class="row" v-if="item.executorName">
<text class="label">执行人</text>
<text class="value">
{{ item.executorName }}
</text>
</view>
<view class="row" v-if="item.expectedCompleteTime">
<text class="label">预计完成</text>
<text class="value">
{{ item.expectedCompleteTime }}
</text>
</view>
<view class="row" v-if="item.completeTime">
<text class="label">实际完成</text>
<text class="value">
{{ item.completeTime }}
{{ item.faultDesc }}
</text>
</view>
<view class="row" v-if="item.handleContent">
<text class="label">处理情况</text>
<text class="value">
{{ item.handleContent }}
</text>
</view>
<view class="row" v-if="item.costAmount">
<text class="label">维修费用</text>
<text class="value">
{{ item.costAmount }}
</text>
<view
class="image-grid"
v-if="item.files && item.files.length"
>
<view
class="image-item"
v-for="(file, imgIndex) in item.files"
:key="imgIndex"
@click="previewRecordImages(item.files, imgIndex)"
>
<image
:src="HTTP_ADMIN_URL + '/' + (file.url || file.attDir)"
mode="aspectFill"
></image>
</view>
</view>
</view>
</view>
@ -221,9 +203,9 @@
<text class="name">
{{ (item.unitNo ? item.unitNo + '单元' : '') + (item.floorNo ? ' ' + item.floorNo + '层' : '') + (item.houseNo ? ' ' + item.houseNo + '室' : '') || item.houseName || '房屋' }}
</text>
<text class="desc">
<!-- <text class="desc">
{{ item.buildingId ? '楼栋 ' + item.buildingId : '' }}
</text>
</text> -->
</view>
<view
class="empty"
@ -245,7 +227,7 @@
</template>
<script>
import { createMaintenanceOrder, listMaintenanceOrder, listMaintenanceOrderDetail, listHouses } from '@/api/property.js';
import { createMaintenanceOrder, listMaintenanceOrder, listMaintenanceOrderDetail, listHouses, updateMaintenanceOrderStatus } from '@/api/property.js';
import request from '@/utils/request.js';
import { HTTP_ADMIN_URL } from '@/config/app';
@ -257,11 +239,10 @@ export default {
activeTab: 'form',
form: {
phone: '',
handleContent: '',
expectedTime: '',
faultDesc: '',
faultType: ''
},
faultTypeIndex: 0,
faultTypeIndex: -1,
images: [],
selectedHouseId: null,
selectedHouseName: '',
@ -272,11 +253,21 @@ export default {
finished: false,
housePopupVisible: false,
houseList: [],
houseLoading: false
houseLoading: false,
statusClassMap: {
0: 'status-pending',
1: 'status-doing',
2: 'status-done',
99: 'status-done',
'__default__': 'status-pending'
}
};
},
computed: {
selectedFaultType() {
if (this.faultTypeIndex == -1) {
return '';
}
const types = this.dict.get('fault_type');
if (types && types.length > this.faultTypeIndex) {
return types[this.faultTypeIndex].dictLabel;
@ -284,15 +275,12 @@ export default {
return '';
}
},
onShow() {
onLoad() {
if (this.activeTab === 'list') {
this.refreshList();
}
},
methods: {
goBack() {
uni.navigateBack();
},
handleFaultTypeChange(e) {
const index = e.detail.value;
this.faultTypeIndex = index;
@ -333,7 +321,7 @@ export default {
const unitPart = item.unitNo ? item.unitNo + '单元' : '';
const floorPart = item.floorNo ? item.floorNo + '层' : '';
const housePart = item.houseNo ? item.houseNo + '室' : '';
this.selectedHouseName = [unitPart, floorPart, housePart].filter(Boolean).join(' ');
this.selectedHouseName = [unitPart, floorPart, housePart].filter(Boolean).join('');
this.housePopupVisible = false;
},
chooseImage() {
@ -410,7 +398,7 @@ export default {
});
return;
}
if (!this.form.handleContent.trim()) {
if (!this.form.faultDesc.trim()) {
uni.showToast({
title: '请填写报修内容',
icon: 'none'
@ -421,12 +409,7 @@ export default {
//
const imagefiles = this.images.map(file => {
let attDir = file.url;
// /file/public/
if (attDir.startsWith('file/public/')) {
attDir = attDir.replace('file/public/', '')
} else if (attDir.startsWith('file/')) {
attDir = attDir.replace('file/', '')
}
return {
attId: file.id + '',
name: file.fileName,
@ -441,10 +424,10 @@ export default {
});
const payload = {
phone: this.form.phone.trim(),
assigneContext: this.form.handleContent.trim(),
remark: this.form.expectedTime.trim(),
// phone: this.form.phone.trim(),
faultDesc: this.form.faultDesc.trim(),
status: this.form.status || '0',
houseId: this.selectedHouseId,
houseName: this.selectedHouseName,
files: imagefiles,
faultType: this.form.faultType
@ -460,10 +443,9 @@ export default {
});
this.form.phone = '';
this.form.handleContent = '';
this.form.expectedTime = '';
this.form.faultDesc = '';
this.form.faultType = '';
this.faultTypeIndex = 0;
this.faultTypeIndex = -1;
this.images = [];
this.page = 1;
@ -517,19 +499,23 @@ export default {
this.loading = false;
}
},
previewRecordImages(files, index) {
if (!files || !files.length) return;
const urls = files.map(file => {
const path = file.url || file.attDir || file.filePath;
return this.HTTP_ADMIN_URL + '/' + path;
});
uni.previewImage({
current: index,
urls
});
},
statusText(status) {
if (status === 0 || status === '0') return '待处理';
if (status === 1 || status === '1') return '处理中';
if (status === 2 || status === '2') return '已处理';
if (status === 99 || status === '99') return '已办结';
return status;
},
statusClass(status) {
const text = this.statusText(status);
if (text === '已处理' || text === '已办结') return 'status-done';
if (text === '处理中') return 'status-doing';
if (text === '待处理') return 'status-pending';
return '';
return '待处理';
},
getFaultTypeLabel(value) {
const types = this.dict.get('fault_type');
@ -538,6 +524,37 @@ export default {
return type ? type.dictLabel : value;
}
return value;
},
async handleCancel(id) {
uni.showModal({
title: '确认撤销',
content: '确定要撤销这条报修记录吗?',
success: async (res) => {
if (res.confirm) {
try {
uni.showLoading({ title: '撤销中...', mask: true });
await updateMaintenanceOrderStatus({
id: id,
status: '99',
remark: '已撤销'
});
uni.hideLoading();
uni.showToast({
title: '撤销成功',
icon: 'success'
});
this.refreshList();
} catch (e) {
console.error('撤销失败:', e);
uni.hideLoading();
uni.showToast({
title: typeof e === 'string' ? e : '撤销失败,请稍后重试',
icon: 'none'
});
}
}
}
});
}
}
};
@ -545,37 +562,6 @@ export default {
<style lang="scss">
.repair-page {
.header {
display: flex;
align-items: center;
justify-content: space-between;
height: 88rpx;
padding: 0 30rpx;
background-color: #409EFF;
color: #fff;
.back {
width: 60rpx;
height: 100%;
display: flex;
align-items: center;
.iconfont {
font-size: 32rpx;
color: #fff;
}
}
.title {
font-size: 32rpx;
font-weight: 600;
}
.right {
width: 60rpx;
}
}
.content {
padding: 30rpx;
@ -799,6 +785,7 @@ export default {
font-weight: 600;
color: #333;
margin-right: 16rpx;
max-width: 300rpx;
}
.status {
@ -823,9 +810,25 @@ export default {
}
}
.time {
font-size: 22rpx;
color: #999;
.header-right {
display: flex;
align-items: center;
flex-direction: column;
align-items: flex-end;
.time {
font-size: 22rpx;
color: #999;
margin-bottom: 8rpx;
}
.cancel-btn {
font-size: 22rpx;
color: #FF4D4F;
padding: 4rpx 12rpx;
border-radius: 16rpx;
background-color: #FFF1F0;
}
}
}
@ -846,6 +849,28 @@ export default {
color: #333;
}
}
.image-grid {
margin-top: 12rpx;
margin-left: 0;
display: flex;
flex-wrap: wrap;
gap: 12rpx;
.image-item {
width: calc((100% - 24rpx) / 3);
aspect-ratio: 1 / 1;
border-radius: 8rpx;
overflow: hidden;
background-color: #f5f5f5;
image {
width: 100%;
height: 100%;
display: block;
}
}
}
}
}

@ -1,13 +1,5 @@
<template>
<view class="stock-page">
<view class="header">
<view class="back" @click="goBack">
<text class="iconfont icon-xiangzuo"></text>
</view>
<view class="title">库存查询</view>
<view class="right"></view>
</view>
<view class="content">
<!-- 搜索和筛选 -->
<view class="search-section">
@ -107,9 +99,6 @@ export default {
};
},
methods: {
goBack() {
uni.navigateBack();
},
searchStock() {
uni.showToast({
title: '搜索功能开发中',
@ -134,37 +123,6 @@ export default {
<style lang="scss">
.stock-page {
.header {
display: flex;
align-items: center;
justify-content: space-between;
height: 88rpx;
padding: 0 30rpx;
background-color: #409EFF;
color: #fff;
.back {
width: 60rpx;
height: 100%;
display: flex;
align-items: center;
.iconfont {
font-size: 32rpx;
color: #fff;
}
}
.title {
font-size: 32rpx;
font-weight: 600;
}
.right {
width: 60rpx;
}
}
.content {
padding: 30rpx;
@ -346,7 +304,7 @@ export default {
}
.item-footer {
.display: flex;
display: flex;
justify-content: flex-end;
.detail-btn {

@ -1,13 +1,5 @@
<template>
<view class="supply-query-page">
<view class="header">
<view class="back" @click="goBack">
<text class="iconfont icon-xiangzuo"></text>
</view>
<view class="title">物供相关查询</view>
<view class="right"></view>
</view>
<view class="content">
<!-- 标签页 -->
<view class="tabs">
@ -157,9 +149,6 @@ export default {
};
},
methods: {
goBack() {
uni.navigateBack();
},
searchPurchase() {
uni.showToast({
title: '搜索功能开发中',
@ -218,37 +207,6 @@ export default {
<style lang="scss">
.supply-query-page {
.header {
display: flex;
align-items: center;
justify-content: space-between;
height: 88rpx;
padding: 0 30rpx;
background-color: #409EFF;
color: #fff;
.back {
width: 60rpx;
height: 100%;
display: flex;
align-items: center;
.iconfont {
font-size: 32rpx;
color: #fff;
}
}
.title {
font-size: 32rpx;
font-weight: 600;
}
.right {
width: 60rpx;
}
}
.content {
padding: 30rpx;
@ -388,7 +346,7 @@ export default {
}
.item-footer {
.display: flex;
display: flex;
justify-content: flex-end;
.detail-btn {
@ -438,7 +396,7 @@ export default {
}
.upload-box {
.display: flex;
display: flex;
flex-wrap: wrap;
.upload-btn {

@ -1,13 +1,5 @@
<template>
<view class="traceability-page">
<view class="header">
<view class="back" @click="goBack">
<text class="iconfont icon-xiangzuo"></text>
</view>
<view class="title">溯源信息查看</view>
<view class="right"></view>
</view>
<view class="content">
<!-- 扫码按钮 -->
<view class="scan-section">
@ -81,9 +73,6 @@ export default {
};
},
methods: {
goBack() {
uni.navigateBack();
},
scanCode() {
//
uni.showToast({
@ -128,37 +117,6 @@ export default {
<style lang="scss">
.traceability-page {
.header {
display: flex;
align-items: center;
justify-content: space-between;
height: 88rpx;
padding: 0 30rpx;
background-color: #409EFF;
color: #fff;
.back {
width: 60rpx;
height: 100%;
display: flex;
align-items: center;
.iconfont {
font-size: 32rpx;
color: #fff;
}
}
.title {
font-size: 32rpx;
font-weight: 600;
}
.right {
width: 60rpx;
}
}
.content {
padding: 30rpx;

@ -49,7 +49,7 @@
<div class="logon" @click="loginMobile" v-if="current !== 0"></div>
<div class="logon" @click="submit" v-if="current === 0"></div>
<div class="tips">
<div v-if="current==0" @click="current = 1"></div>
<!-- <div v-if="current==0" @click="current = 1"></div> -->
<div v-if="current==1" @click="current = 0"></div>
</div>
</div>
@ -90,7 +90,7 @@
data: function() {
return {
navList: ["快速登录", "账号登录"],
current: 1,
current: 0,
account: "",
password: "",
captcha: "",
@ -418,6 +418,9 @@
console.log(69999);
console.log(backUrl);
if (!backUrl.startsWith('/')) {
backUrl = '/' + backUrl;
}
uni.reLaunch({
url: backUrl
});

@ -1,7 +1,7 @@
{
"appid": "wxd29e5ba4ccbcca2f",
"compileType": "miniprogram",
"libVersion": "3.1.4",
"libVersion": "latest",
"packOptions": {
"ignore": [],
"include": []

@ -4,5 +4,5 @@
"setting": {
"compileHotReLoad": true
},
"libVersion": "3.1.4"
}
"libVersion": "latest"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

@ -10,6 +10,7 @@ import {
checkLogin
} from '../libs/login';
import store from '../store';
import JSONBig from 'json-bigint';
/**
@ -46,16 +47,25 @@ function baseRequest(url, method, data, {
method: method || 'GET',
header: header,
data: requestData,
dataType: 'json',
responseType: 'text',
success: (res) => {
let data = res.data;
try {
// 使用 JSONBig 解析响应数据,处理大数值
data = JSONBig.parse(res.data);
} catch (e) {
// JSONBig 解析失败时,使用原数据
}
if (noVerify)
reslove(res.data, res);
else if (res.data.code == 200)
reslove(res.data, res);
else if ([410000, 410001, 410002, 401].indexOf(res.data.code) !== -1) {
reslove(data, res);
else if (data.code == 200)
reslove(data, res);
else if ([410000, 410001, 410002, 401].indexOf(data.code) !== -1) {
toLogin();
reject(res.data);
reject(data);
} else
reject(res.data.message || '系统错误');
reject(data.message || '系统错误');
},
fail: (msg) => {
reject('请求失败');

Loading…
Cancel
Save