project-specific.mdc 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. ---
  2. alwaysApply: false
  3. ---
  4. ### 项目特定配置
  5. #### 环境配置识别
  6. 基于您的项目结构,需要特别注意以下配置文件:
  7. **配置文件优先级**
  8. 1. `config.js` - 主要配置文件(API地址、版本号等)
  9. 2. `ext.json` - 开发环境扩展配置
  10. 3. `ext-production.json` - 生产环境配置
  11. 4. `change.bat` - 环境切换脚本
  12. **配置文件示例**
  13. ```javascript
  14. // src/config.js
  15. export default {
  16. // API 基础地址
  17. baseUrl: 'https://api.example.com',
  18. // 版本信息
  19. version: '1.0.0',
  20. // 环境标识
  21. env: 'development', // development | production
  22. // 调试开关
  23. debug: true,
  24. // 小程序配置
  25. miniProgram: {
  26. appId: 'wx1234567890',
  27. },
  28. // 其他配置
  29. pageSize: 20,
  30. timeout: 10000
  31. }
  32. ```
  33. #### 分包结构规范
  34. 根据您的项目结构,使用了模块化分包:
  35. **主要分包识别**
  36. - `pages/` - 主包页面(首页、登录等核心页面)
  37. - `pagesOrder/` - 订单相关页面
  38. - `pagesClient/` - 客户管理页面
  39. - `pagesPurchase/` - 采购相关页面
  40. - `pagesStore/` - 门店管理页面
  41. - `pagesStatistics/` - 统计分析页面
  42. - `pagesShare/` - 分享相关页面
  43. - `pagesFund/` - 资金管理页面
  44. - `pagesArrears/` - 欠款管理页面
  45. - `pagesInvite/` - 邀请相关页面
  46. - `pagesStorehouse/` - 仓库管理页面
  47. **分包配置建议**
  48. ```json
  49. // pages.json
  50. {
  51. "pages": [
  52. // 主包页面(保持最小)
  53. {
  54. "path": "pages/index/index",
  55. "style": { "navigationBarTitleText": "首页" }
  56. },
  57. {
  58. "path": "pages/login/login",
  59. "style": { "navigationBarTitleText": "登录" }
  60. }
  61. ],
  62. "subPackages": [
  63. {
  64. "root": "pagesOrder",
  65. "name": "order",
  66. "pages": [
  67. {
  68. "path": "list/index",
  69. "style": { "navigationBarTitleText": "订单列表" }
  70. }
  71. ]
  72. },
  73. {
  74. "root": "pagesClient",
  75. "name": "client",
  76. "pages": [
  77. {
  78. "path": "list/index",
  79. "style": { "navigationBarTitleText": "客户列表" }
  80. }
  81. ]
  82. }
  83. ],
  84. "preloadRule": {
  85. "pages/index/index": {
  86. "network": "all",
  87. "packages": ["order"]
  88. }
  89. }
  90. }
  91. ```
  92. #### 开发环境配置
  93. 针对您的 ReadMe.txt 中提到的开发配置:
  94. **HTTP 开发环境设置**
  95. ```javascript
  96. // 1. 本地 host 配置(需要开启)
  97. // 在 hosts 文件中添加:
  98. // 127.0.0.1 local.example.com
  99. // 2. 小程序开发设置
  100. // - 不校验合法域名、web-view、TLS版本以及HTTPS证书
  101. // - 预览及真机调试时主包、分包体积上限调整为4M
  102. // 3. 代理配置示例
  103. // vue.config.js
  104. module.exports = {
  105. devServer: {
  106. proxy: {
  107. '/api': {
  108. target: 'http://localhost:8080',
  109. changeOrigin: true,
  110. pathRewrite: {
  111. '^/api': '/api'
  112. }
  113. }
  114. }
  115. }
  116. }
  117. ```
  118. #### 通用工具方法约定
  119. 根据项目结构,建议以下通用方法规范:
  120. **API 请求封装**
  121. ```javascript
  122. // utils/request.js
  123. import config from '@/config.js'
  124. const request = {
  125. baseUrl: config.baseUrl,
  126. // 通用请求方法
  127. async request(options) {
  128. const defaultOptions = {
  129. url: this.baseUrl + options.url,
  130. method: options.method || 'GET',
  131. data: options.data || {},
  132. header: {
  133. 'Content-Type': 'application/json',
  134. 'Authorization': uni.getStorageSync('token') || '',
  135. ...options.header
  136. },
  137. timeout: config.timeout || 10000
  138. }
  139. return new Promise((resolve, reject) => {
  140. uni.request({
  141. ...defaultOptions,
  142. success: (res) => {
  143. if (res.statusCode === 200) {
  144. resolve(res.data)
  145. } else {
  146. this.handleError(res)
  147. reject(res)
  148. }
  149. },
  150. fail: (err) => {
  151. this.handleError(err)
  152. reject(err)
  153. }
  154. })
  155. })
  156. }
  157. }
  158. ```
  159. **路由跳转封装**
  160. ```javascript
  161. // utils/router.js
  162. export const router = {
  163. // 普通跳转
  164. push(url, params = {}) {
  165. const query = Object.keys(params).map(key =>
  166. `${key}=${encodeURIComponent(params[key])}`
  167. ).join('&')
  168. const fullUrl = query ? `${url}?${query}` : url
  169. uni.navigateTo({ url: fullUrl })
  170. },
  171. // 替换当前页面
  172. replace(url, params = {}) {
  173. const query = Object.keys(params).map(key =>
  174. `${key}=${encodeURIComponent(params[key])}`
  175. ).join('&')
  176. const fullUrl = query ? `${url}?${query}` : url
  177. uni.redirectTo({ url: fullUrl })
  178. },
  179. // 返回上一页
  180. back(delta = 1) {
  181. uni.navigateBack({ delta })
  182. },
  183. // 跳转到 tabBar 页面
  184. switchTab(url) {
  185. uni.switchTab({ url })
  186. }
  187. }
  188. ```
  189. #### 状态管理约定
  190. ```javascript
  191. // store/index.js
  192. import { createStore } from 'vuex'
  193. export default createStore({
  194. state: {
  195. user: null,
  196. token: uni.getStorageSync('token') || '',
  197. systemInfo: null
  198. },
  199. mutations: {
  200. SET_USER(state, user) {
  201. state.user = user
  202. },
  203. SET_TOKEN(state, token) {
  204. state.token = token
  205. uni.setStorageSync('token', token)
  206. },
  207. CLEAR_AUTH(state) {
  208. state.user = null
  209. state.token = ''
  210. uni.removeStorageSync('token')
  211. }
  212. },
  213. actions: {
  214. // 登录
  215. async login({ commit }, { username, password }) {
  216. const result = await loginApi({ username, password })
  217. commit('SET_TOKEN', result.token)
  218. commit('SET_USER', result.user)
  219. return result
  220. },
  221. // 退出登录
  222. logout({ commit }) {
  223. commit('CLEAR_AUTH')
  224. uni.reLaunch({ url: '/pages/login/login' })
  225. }
  226. }
  227. })
  228. ```
  229. #### 错误处理约定
  230. ```javascript
  231. // utils/error.js
  232. export const errorHandler = {
  233. // 全局错误处理
  234. handleError(error, context = '') {
  235. console.error(`[${context}] 错误:`, error)
  236. let message = '操作失败'
  237. if (error.statusCode) {
  238. switch (error.statusCode) {
  239. case 401:
  240. message = '登录已过期,请重新登录'
  241. // 跳转到登录页
  242. uni.reLaunch({ url: '/pages/login/login' })
  243. return
  244. case 403:
  245. message = '暂无权限'
  246. break
  247. case 404:
  248. message = '请求的资源不存在'
  249. break
  250. case 500:
  251. message = '服务器错误,请稍后重试'
  252. break
  253. default:
  254. message = error.data?.message || '网络错误'
  255. }
  256. } else if (error.message) {
  257. message = error.message
  258. }
  259. uni.showToast({
  260. title: message,
  261. icon: 'none',
  262. duration: 2000
  263. })
  264. }
  265. }
  266. ```
  267. #### 代码风格约定
  268. **文件命名**
  269. - 页面文件:kebab-case,如 `order-list.vue`
  270. - 组件文件:PascalCase,如 `OrderCard.vue`
  271. - 工具文件:camelCase,如 `dateUtils.js`
  272. - 常量文件:SCREAMING_SNAKE_CASE,如 `API_CONSTANTS.js`
  273. **注释规范**
  274. ```javascript
  275. /**
  276. * 获取订单列表
  277. * @param {Object} params 查询参数
  278. * @param {number} params.page 页码
  279. * @param {number} params.pageSize 每页数量
  280. * @param {string} params.status 订单状态
  281. * @returns {Promise<Object>} 订单列表数据
  282. */
  283. export async function getOrderList(params) {
  284. return request.get('/order/list', params)
  285. }
  286. ```
  287. #### TypeScript 配置(如果使用)
  288. ```json
  289. // tsconfig.json
  290. {
  291. "compilerOptions": {
  292. "target": "es5",
  293. "lib": ["dom", "dom.iterable", "es6"],
  294. "allowJs": true,
  295. "skipLibCheck": true,
  296. "esModuleInterop": true,
  297. "allowSyntheticDefaultImports": true,
  298. "strict": true,
  299. "forceConsistentCasingInFileNames": true,
  300. "moduleResolution": "node",
  301. "resolveJsonModule": true,
  302. "isolatedModules": true,
  303. "noEmit": true,
  304. "baseUrl": ".",
  305. "paths": {
  306. "@/*": ["src/*"],
  307. "@/components/*": ["src/components/*"],
  308. "@/utils/*": ["src/utils/*"],
  309. "@/api/*": ["src/api/*"]
  310. }
  311. },
  312. "include": [
  313. "src/**/*"
  314. ],
  315. "exclude": [
  316. "node_modules"
  317. ]
  318. }
  319. ```