整合營銷服務商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          「就業(yè)」上海商學院招聘45名工作人員,3月11日前報

          「就業(yè)」上海商學院招聘45名工作人員,3月11日前報名
          市人社局表示,上海商學院擬公開招聘專任教師34名、專職學生輔導員2名、專職心理健康教育教師1名、大學生藝術中心教師1名、其他專業(yè)技術崗位人員3名、綜合管理崗位人員4名,共計45名。有意者請于3月11日前登錄https://zhaopin.sbs.edu.cn/zp.html#/進行應聘。詳見↓



          招聘崗位及要求

          業(yè)工作的需求:寫接口

          接口第一個含義是:寫http請求 或者其他如webservice ,hessian這些

          接口第二個含義:寫的就是個java的interface接口

          基于serverlet請求一般對應響應 request 對應響應 response; 返回的參數(shù)最終都是string的形式返回,一般都喜歡用比如fastJSON Gson這樣的toString一下返回;默認是使用jackson的序列化操作的;其他的如protobufuff? xml這樣的,遇到xml這樣的返回也無需擔心,實在不會了直接用StringBuilder這樣的類進行append拼接,另外一種方式就是模板化格式返回或者一些工具類轉(zhuǎn)換

          通常操作都是增刪改查 外加導入導出和統(tǒng)計;多一點就是寫個byXX

          addXXX

          updateXXX

          deleteXXX

          searchXXList

          importXXX

          exportXXX

          countXXX

          注意:請求參數(shù)不要帶一些特殊的東西,如delete update等等特殊的,框架中可能會影藏一些過濾的來過濾這些特殊字符;如果方法命名不允許這樣的,可以改成其他方式的命名,但大體是符合項目要求(符合當前項目規(guī)定的)


          那寫接口需要注意哪些,http的"接口",即請求url,盡量使用post請求,見名知意(項目規(guī)范來,有些不一定是按這個來的)下面實例一個

          一個是寫在controller返回的,一個是寫在方法上的,一般都是@RequestMapping 有些指定方法的如:@PostMapping 需要看具體工程規(guī)范一般兩個都可以用

          value值,避免重復

          SpringMVC中:這個地方是被處理器映射器解析


          http請求


          需要try catch 么 看項目,有些做了全局異常解析器統(tǒng)一返回異常,有些則是項目中的,如返回一個構造對象


          interface接口

          /**
           * 校驗服務
           */
          public interface ICheckService {
              boolean checkParam(CheckConfig checkConfig, Map<String,String> map);
          }

          方法命名規(guī)范,可以看前面中關于方法的介紹 :此處略提: 返回值 方法名(動詞開頭,代表行動) 參數(shù)列表(有些地方使用map會更通用一些(個人習慣),另外就是對象充分使用,java語言本身就是個對象語言)

          接口盡量遵循一些原則,比較多書籍寫到的

          開閉原則:對擴展開放,對修改關閉

          依賴倒置:抽象不應依賴細節(jié),細節(jié)依賴抽象

          單一職責:接口功能職責明確,不寫一個接口對個職責,不利于維護即做什么比較單一

          接口隔離:用多個專門的接口,而不是單一的接口 (主要有多實現(xiàn)這個implements),寫小的接口不寫大的(大的指方法賊多的接口)

          迪米特:最少知道原則

          里氏替換:一句話,多態(tài)運用,其他寫的比這里多

          合成復用:主要將的是盡量組合,達到內(nèi)聚 常用Autowired Resource注解作用理解就是這個

          一句話總結(jié):就是盡量寫的簡單的,小的接口 這樣避免工作踩坑;可能有時你的確無法避免這樣大的接口,那可能都是寫古董代碼

          萬不得已不要輕易改別人的接口,因為沒出問題好,出問題就是你背鍋,搞不好造成重大生產(chǎn)問題被開除(見過別人干過這樣的事情)


          其他的需要考慮的可能會涉及設計模式,此處不再引申,如果要實戰(zhàn)的話,建議可以看看《研磨設計模式》,或者多看看spring的源碼設計以及常用的工具類中的一些寫法,這樣對于寫代碼的提升會是比較快的

          w3cschool,菜鳥教程等等都有這些講解

          https://www.w3cschool.cn/shejimoshi/flyweight-pattern.html


          好了,即將踏入工作的你異或是已經(jīng)工作的你,將逐步領悟

          題背景

          網(wǎng)站更新后,解決了某些bug,但是用戶未刷新網(wǎng)頁,還在瀏覽網(wǎng)站更新前內(nèi)容……

          然后用戶說:“bug根本沒解決啊!”

          我說:“你刷新下頁面啊”

          用戶說:“嗯,好了”

          那么,有沒有一種方式,可以直接通知用戶網(wǎng)站有更新,提示用戶主動刷新頁面呢?

          有!當然有

          說明

          本項目以vue2舉例,其他的Vue3、React等,請自行實現(xiàn)。

          假設你基于git提交代碼,以下從git的commit head中獲取唯一值

          (注:或者其他可行方式替代,自行實現(xiàn))


          解決方案 - 純前端檢測

          還有其他解決方案,如:從服務器獲取版本號,輪詢查詢等。

          但上述都有性能問題、或需要服務端配合、或需要添加一些配置項,顯得麻煩,讀者可自行選擇

          1.生成唯一標識

          在vue打包的時候,編寫一個腳本,存儲提交的commit head作為hash值,也就是唯一標識。

          在vue.config.js的同級,新建一個release.js文件:

          const execSync=require('child_process').execSync;
          const fs=require('fs');
          const path=require('path');
          
          const dirName=path.dirname(__filename);
          
          // 執(zhí)行git命令,獲取當前HEAD指針所指向的提交的完整哈希值
          const gitHead=execSync('git rev-parse HEAD', {
            cwd: path.resolve(dirName, './')
          }).toString().trim()
          // 只取前十個數(shù)字或字母
          const hash=gitHead.substring(0, 10);
          
          // 版本號:時間戳+git的hash值
          const version=Date.now() + '_' + hash;
          
          // .env.production文件路徑
          const envFile=path.join(dirName, './.env.production');
          
          // 讀取目標文件,并通過正則判斷.env.production文件中是否有VITE_APP_VERSION開頭的環(huán)境變量
          try {
            const data=fs.readFileSync(envFile, {
              encoding: 'utf-8',
            });
            const reg=/VUE_APP_VERSION=\d+_[\w-_+:]{7,14}/g;
            const releaseStr=`VUE_APP_VERSION=${version}`;
            let newData='';
            if (reg.test(data)) {
              newData=data.replace(reg, releaseStr);
              fs.writeFileSync(envFile, newData);
            } else {
              newData=`${data}\n${releaseStr}`;
              fs.writeFileSync(envFile, newData);
            }
            console.log(`插入release版本信息到 env.production 完成,版本號:${version}`);
          } catch (e) {
            console.error(e);
          }
          
          

          上述代碼,把提交的git commit head值取前10位數(shù),再加上時間戳組成hash值。

          并且把該值寫入.env.production文件,變量名為VUE_APP_VERSION

          2.hash對比

          用戶登錄的時候,把版本號的hash值本地存儲

          import Cookies from "js-cookie";
          Cookies.set('app_version', process.env.VUE_APP_VERSION)

          然后在路由守衛(wèi)中,比較緩存值app_version、與當前獲取的process.env.VUE_APP_VERSION值是否相等

          • 相等:說明沒更新,
          • 不相等:則說明網(wǎng)站更新了,因為網(wǎng)站發(fā)布后會重新生成一個VUE_APP_VERSION值,那么這時候就要提示用戶更新了

          路由守衛(wèi)permisssion.js的關鍵代碼如下

          import Cookies from "js-cookie";
          import { Message, MessageBox } from 'element-ui'
          import NProgress from 'nprogress'
          import 'nprogress/nprogress.css'
          import { getToken } from '@/utils/auth'
          
          // 是否首次進入網(wǎng)頁,首次不校驗刷新
          let isFirstEntry=true;
          
          // 檢測網(wǎng)站更新
          function checkUpdate() {
            // 系統(tǒng)的版本號
            const system_app_version=process.env.VUE_APP_VERSION
            // 瀏覽器的版本號
            const web_app_version=Cookies.get('app_version')
            if(isFirstEntry) {
              isFirstEntry=false
            } else {
              // 如果不存在系統(tǒng)的版本號,則設置系統(tǒng)版本號,第一次不提示刷新,否則換個瀏覽器又提示了
              if(!web_app_version) {
                Cookies.set('app_version', system_app_version)
              } else {
                // 如果瀏覽器的版本號不等于系統(tǒng)的版本號,則重設瀏覽器的版本號,并提示刷新
                if (system_app_version !==web_app_version) {
                  console.log('版本號不一致')
                  refreshTip(system_app_version)
                }
              }
            }
          }
          
          // 刷新提示
          function refreshTip(system_app_version) {
            MessageBox.confirm('當前網(wǎng)站內(nèi)容有更新,是否刷新頁面?', '提示', {
              confirmButtonText: '立即刷新',
              cancelButtonText: '忽略',
              type: 'warning'
            }).then(()=> {
              Cookies.set('app_version', system_app_version)
              window.location.reload()
            }).catch(()=> {
              console.log('取消了')
              Cookies.set('app_version', system_app_version)
            })
          }
          
          router.beforeEach((to, from, next)=> {
            NProgress.start()
            if (getToken()) {
          	to.meta.title && store.dispatch('settings/setTitle', to.meta.title)
              /* has token*/
              if (to.path==='/login') {
                next({ path: '/' })
                NProgress.done()
              } else { 
                // 只在生產(chǎn)環(huán)境檢測是否有版本更新
          	  if(process.env.NODE_ENV==='production') {
                  checkUpdate()
                }
          	}
          }

          上述方法是在在用戶切換菜單時,監(jiān)聽路由變化來檢測是否更新,這是比較常用的方法。

          此外,有的人會輪詢檢測是否有更新,這樣會損耗性能且不優(yōu)雅。

          請讀者自行選擇觸發(fā)的時機。

          最后

          最后,在打包時,修改一下打包命令,執(zhí)行release.js并打包

          修改package.json文件:

          'scripts': {
          	"build:prod": "node ./release.js && vue-cli-service build",
          }

          恭喜你,大功告成了!

          關于作者

          作者在CSDN社區(qū)叫:“前端沒錢”

          CSDN主頁地址:https://blog.csdn.net/yan1915766026

          作者是前端開發(fā)人員,會經(jīng)常發(fā)布一些好用的工具、方法,并且持續(xù)更新《若依nodejs全棧教程》希望幫助更多的前端開發(fā)人員。

          感謝關注!


          主站蜘蛛池模板: 国产精品毛片VA一区二区三区| 久久久久无码国产精品一区| 91秒拍国产福利一区| 日韩成人一区ftp在线播放| 久久精品综合一区二区三区| 日本一区免费电影| 国产精品毛片一区二区三区| 亚洲视频一区在线播放| 国产成人精品视频一区| 中文字幕无线码一区| 国偷自产Av一区二区三区吞精| 亚洲熟妇av一区二区三区漫画| 亚洲AV无码一区二区乱子仑| 精品成人一区二区三区免费视频| 日韩免费视频一区| 春暖花开亚洲性无区一区二区| 亚洲色偷偷偷网站色偷一区| 国产伦精品一区二区三区在线观看| 东京热无码一区二区三区av| 日韩最新视频一区二区三| 日韩免费视频一区二区| 成人毛片无码一区二区| 肉色超薄丝袜脚交一区二区| 亚洲国产一区二区三区| 狠狠爱无码一区二区三区| 亚洲AV成人精品一区二区三区| 无码人妻精品一区二区三区久久 | 亚洲乱码av中文一区二区| 无码AV中文一区二区三区| 久久国产精品一区| 视频一区精品自拍| 亚洲一区二区三区香蕉| 国产综合无码一区二区三区| 日韩精品中文字幕视频一区| 老熟妇高潮一区二区三区| 成人丝袜激情一区二区| 国产在线精品一区在线观看| 一区二区三区午夜| 日本一区二区三区在线观看 | 国产福利一区二区在线视频| 精品日本一区二区三区在线观看|